Skip to content

Commit

Permalink
Merge a6efe8a into c77b42e
Browse files Browse the repository at this point in the history
  • Loading branch information
nukosuke committed Mar 19, 2019
2 parents c77b42e + a6efe8a commit 0c03a5e
Show file tree
Hide file tree
Showing 4 changed files with 158 additions and 17 deletions.
1 change: 1 addition & 0 deletions zendesk/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ func Provider() terraform.ResourceProvider {
},

ResourcesMap: map[string]*schema.Resource{
"zendesk_group": resourceZendeskGroup(),
"zendesk_ticket_field": resourceZendeskTicketField(),
"zendesk_ticket_form": resourceZendeskTicketForm(),
"zendesk_trigger": resourceZendeskTrigger(),
Expand Down
82 changes: 65 additions & 17 deletions zendesk/resource_zendesk_group.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,20 @@ import (
// https://developer.zendesk.com/rest_api/docs/support/groups
func resourceZendeskGroup() *schema.Resource {
return &schema.Resource{
Create: resourceZendeskGroupCreate,
Read: resourceZendeskGroupRead,
Update: resourceZendeskGroupUpdate,
Delete: resourceZendeskGroupDelete,
Create: func(d *schema.ResourceData, meta interface{}) error {
zd := meta.(*client.Client)
return createGroup(d, zd)
},
Read: func(d *schema.ResourceData, meta interface{}) error {
zd := meta.(*client.Client)
return readGroup(d, zd)
},
Update: func(d *schema.ResourceData, meta interface{}) error {
return nil
},
Delete: func(d *schema.ResourceData, meta interface{}) error {
return nil
},
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},
Expand All @@ -31,30 +41,68 @@ func resourceZendeskGroup() *schema.Resource {
}
}

func resourceZendeskGroupCreate(d *schema.ResourceData, meta interface{}) error {
zd := meta.(*client.Client)
group := client.Group{
Name: d.Get("name").(string),
func marshalGroup(group client.Group, d identifiableGetterSetter) error {
fields := map[string]interface{}{
"url": group.URL,
"name": group.Name,
}

// Actual API request
group, err := zd.CreateGroup(group)
err := setSchemaFields(d, fields)
if err != nil {
return err
}

d.SetId(fmt.Sprintf("%d", group.ID))
return nil
}

func resourceZendeskGroupRead(d *schema.ResourceData, meta interface{}) error {
return nil
func unmarshalGroup(d identifiableGetterSetter) (client.Group, error) {
group := client.Group{}

if v := d.Id(); v != "" {
id, err := atoi64(v)
if err != nil {
return group, fmt.Errorf("could not parse group id %s: %v", v, err)
}
group.ID = id
}

if v, ok := d.GetOk("url"); ok {
group.URL = v.(string)
}

if v, ok := d.GetOk("name"); ok {
group.Name = v.(string)
}

return group, nil
}

func resourceZendeskGroupUpdate(d *schema.ResourceData, meta interface{}) error {
return nil
func createGroup(d identifiableGetterSetter, zd client.GroupAPI) error {
group, err := unmarshalGroup(d)
if err != nil {
return err
}

// Actual API request
group, err = zd.CreateGroup(group)
if err != nil {
return err
}

d.SetId(fmt.Sprintf("%d", group.ID))
return marshalGroup(group, d)
}

func resourceZendeskGroupDelete(d *schema.ResourceData, meta interface{}) error {
return nil
func readGroup(d identifiableGetterSetter, zd client.GroupAPI) error {
id, err := atoi64(d.Id())
if err != nil {
return err
}

group, err := zd.GetGroup(id)
if err != nil {
return err
}

return marshalGroup(group, d)
}
87 changes: 87 additions & 0 deletions zendesk/resource_zendesk_group_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package zendesk

import (
"strconv"
"testing"

. "github.com/golang/mock/gomock"
"github.com/nukosuke/go-zendesk/zendesk"
"github.com/nukosuke/go-zendesk/zendesk/mock"
)

func TestReadGroup(t *testing.T) {
ctrl := NewController(t)
defer ctrl.Finish()

m := mock.NewClient(ctrl)
id := 1234
gs := &identifiableMapGetterSetter{
mapGetterSetter: make(mapGetterSetter),
id: strconv.Itoa(id),
}

field := zendesk.Group{
ID: int64(id),
URL: "foo",
Name: "bar",
}

m.EXPECT().GetGroup(Any()).Return(field, nil)
if err := readGroup(gs, m); err != nil {
t.Fatal("readGroup returned an error")
}

if v := gs.mapGetterSetter["url"]; v != field.URL {
t.Fatalf("url field %v does not have expected value %v", v, field.URL)
}

if v := gs.mapGetterSetter["name"]; v != field.Name {
t.Fatalf("name field %v does not have expected value %v", v, field.Name)
}
}

func TestCreateGroup(t *testing.T) {
ctrl := NewController(t)
defer ctrl.Finish()

m := mock.NewClient(ctrl)
i := &identifiableMapGetterSetter{
mapGetterSetter: make(mapGetterSetter),
}

out := zendesk.Group{
ID: 12345,
}

m.EXPECT().CreateGroup(Any()).Return(out, nil)
if err := createGroup(i, m); err != nil {
t.Fatal("create group returned an error")
}

if v := i.Id(); v != "12345" {
t.Fatalf("Create did not set resource id. Id was %s", v)
}
}

func TestUnmarshalGroup(t *testing.T) {
m := &identifiableMapGetterSetter{
id: "1234",
mapGetterSetter: mapGetterSetter{
"url": "https://example.zendesk.com/api/v2/ticket_fields/360011737434.json",
"name": "name",
},
}

g, err := unmarshalGroup(m)
if err != nil {
t.Fatalf("Could marshal map %v", err)
}

if v := m.Get("url"); g.URL != v {
t.Fatalf("group had url value %v. should have been %v", g.URL, v)
}

if v := m.Get("name"); g.Name != v {
t.Fatalf("group had name value %v. should have been %v", g.Name, v)
}
}
5 changes: 5 additions & 0 deletions zendesk/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package zendesk
import (
"fmt"
"os"
"strconv"

"github.com/hashicorp/terraform/helper/schema"
)
Expand Down Expand Up @@ -94,3 +95,7 @@ func setSchemaFields(d setter, m map[string]interface{}) error {

return nil
}

func atoi64(anum string) (int64, error) {
return strconv.ParseInt(anum, 10, 64)
}

0 comments on commit 0c03a5e

Please sign in to comment.