Deserialize meta field for remaining APIs

This commit is contained in:
Timo Reimann 2019-12-11 20:52:04 +01:00
parent 1fb315cb2d
commit 38b71c3469
35 changed files with 582 additions and 129 deletions

View File

@ -3,7 +3,7 @@
## unreleased
- #288 Add Balance Get method - @rbutler
- #286 Deserialize meta - @timoreimann
- #286,#289 Deserialize meta field - @timoreimann
## [v1.28.0] - 2019-12-04

View File

@ -34,6 +34,7 @@ var _ ActionsService = &ActionsServiceOp{}
type actionsRoot struct {
Actions []Action `json:"actions"`
Links *Links `json:"links"`
Meta *Meta `json:"meta"`
}
type actionRoot struct {
@ -74,6 +75,9 @@ func (s *ActionsServiceOp) List(ctx context.Context, opt *ListOptions) ([]Action
if l := root.Links; l != nil {
resp.Links = l
}
if m := root.Meta; m != nil {
resp.Meta = m
}
return root.Actions, resp, err
}

View File

@ -13,18 +13,36 @@ func TestAction_List(t *testing.T) {
defer teardown()
mux.HandleFunc("/v2/actions", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, `{"actions": [{"id":1},{"id":2}]}`)
fmt.Fprint(w, `{
"actions": [
{
"id": 1
},
{
"id": 2
}
],
"meta": {
"total": 2
}
},
`)
testMethod(t, r, http.MethodGet)
})
actions, _, err := client.Actions.List(ctx, nil)
actions, resp, err := client.Actions.List(ctx, nil)
if err != nil {
t.Fatalf("unexpected error: %s", err)
}
expected := []Action{{ID: 1}, {ID: 2}}
if len(actions) != len(expected) || actions[0].ID != expected[0].ID || actions[1].ID != expected[1].ID {
t.Fatalf("unexpected response")
expectedActions := []Action{{ID: 1}, {ID: 2}}
if !reflect.DeepEqual(actions, expectedActions) {
t.Errorf("Actions.List returned actions %+v, expected %+v", actions, expectedActions)
}
expectedMeta := &Meta{Total: 2}
if !reflect.DeepEqual(resp.Meta, expectedMeta) {
t.Errorf("Actions.List returned meta %+v, expected %+v", resp.Meta, expectedMeta)
}
}

4
cdn.go
View File

@ -47,6 +47,7 @@ type cdnRoot struct {
type cdnsRoot struct {
Endpoints []CDN `json:"endpoints"`
Links *Links `json:"links"`
Meta *Meta `json:"meta"`
}
// CDNCreateRequest represents a request to create a CDN.
@ -93,6 +94,9 @@ func (c CDNServiceOp) List(ctx context.Context, opt *ListOptions) ([]CDN, *Respo
if l := root.Links; l != nil {
resp.Links = l
}
if m := root.Meta; m != nil {
resp.Meta = m
}
return root.Endpoints, resp, err
}

View File

@ -32,17 +32,20 @@ func TestCDN_ListCDN(t *testing.T) {
"ttl": 3600,
"created_at": "2012-10-03T15:00:01.05Z"
}
]
],
"meta": {
"total": 2
}
}`,
)
})
cdns, _, err := client.CDNs.List(ctx, nil)
cdns, resp, err := client.CDNs.List(ctx, nil)
if err != nil {
t.Errorf("CDNs.List returned error: %v", err)
}
expected := []CDN{
expectedCDNs := []CDN{
{
ID: "892071a0-bb95-49bc-8021-3afd67a210bf",
Origin: "my-space.nyc3.digitaloceanspaces.com",
@ -59,8 +62,15 @@ func TestCDN_ListCDN(t *testing.T) {
},
}
if !reflect.DeepEqual(cdns, expected) {
t.Errorf("CDNs.List returned %+v, expected %+v", cdns, expected)
if !reflect.DeepEqual(cdns, expectedCDNs) {
t.Errorf("CDNs.List returned CDNs %+v, expected %+v", cdns, expectedCDNs)
}
expectedMeta := &Meta{
Total: 2,
}
if !reflect.DeepEqual(resp.Meta, expectedMeta) {
t.Errorf("CDNs.List returned meta %+v, expected %+v", resp.Meta, expectedMeta)
}
}

View File

@ -46,6 +46,7 @@ type certificateRoot struct {
type certificatesRoot struct {
Certificates []Certificate `json:"certificates"`
Links *Links `json:"links"`
Meta *Meta `json:"meta"`
}
// CertificatesServiceOp handles communication with certificates methods of the DigitalOcean API.
@ -93,6 +94,9 @@ func (c *CertificatesServiceOp) List(ctx context.Context, opt *ListOptions) ([]C
if l := root.Links; l != nil {
resp.Links = l
}
if m := root.Meta; m != nil {
resp.Meta = m
}
return root.Certificates, resp, nil
}

View File

@ -57,7 +57,7 @@ var certsJSONResponse = `
],
"links": {},
"meta": {
"total": 1
"total": 2
}
}
`
@ -103,13 +103,13 @@ func TestCertificates_List(t *testing.T) {
fmt.Fprint(w, certsJSONResponse)
})
certificates, _, err := client.Certificates.List(ctx, nil)
certificates, resp, err := client.Certificates.List(ctx, nil)
if err != nil {
t.Errorf("Certificates.List returned error: %v", err)
}
expected := []Certificate{
expectedCertificates := []Certificate{
{
ID: "892071a0-bb95-49bc-8021-3afd67a210bf",
Name: "web-cert-01",
@ -132,7 +132,12 @@ func TestCertificates_List(t *testing.T) {
},
}
assert.Equal(t, expected, certificates)
assert.Equal(t, expectedCertificates, certificates)
expectedMeta := &Meta{
Total: 2,
}
assert.Equal(t, expectedMeta, resp.Meta)
}
func TestCertificates_Create(t *testing.T) {

View File

@ -47,6 +47,7 @@ type domainRoot struct {
type domainsRoot struct {
Domains []Domain `json:"domains"`
Links *Links `json:"links"`
Meta *Meta `json:"meta"`
}
// DomainCreateRequest respresents a request to create a domain.
@ -122,6 +123,9 @@ func (s DomainsServiceOp) List(ctx context.Context, opt *ListOptions) ([]Domain,
if l := root.Links; l != nil {
resp.Links = l
}
if m := root.Meta; m != nil {
resp.Meta = m
}
return root.Domains, resp, err
}

View File

@ -14,17 +14,34 @@ func TestDomains_ListDomains(t *testing.T) {
mux.HandleFunc("/v2/domains", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, http.MethodGet)
fmt.Fprint(w, `{"domains": [{"name":"foo.com"},{"name":"bar.com"}]}`)
fmt.Fprint(w, `{
"domains": [
{
"name":"foo.com"
},
{
"name":"bar.com"
}
],
"meta": {
"total": 2
}
}`)
})
domains, _, err := client.Domains.List(ctx, nil)
domains, resp, err := client.Domains.List(ctx, nil)
if err != nil {
t.Errorf("Domains.List returned error: %v", err)
}
expected := []Domain{{Name: "foo.com"}, {Name: "bar.com"}}
if !reflect.DeepEqual(domains, expected) {
t.Errorf("Domains.List returned %+v, expected %+v", domains, expected)
expectedDomains := []Domain{{Name: "foo.com"}, {Name: "bar.com"}}
if !reflect.DeepEqual(domains, expectedDomains) {
t.Errorf("Domains.List returned domains %+v, expected %+v", domains, expectedDomains)
}
expectedMeta := &Meta{Total: 2}
if !reflect.DeepEqual(resp.Meta, expectedMeta) {
t.Errorf("Domains.List returned meta %+v, expected %+v", resp.Meta, expectedMeta)
}
}
@ -59,6 +76,9 @@ func TestDomains_RetrievePageByNumber(t *testing.T) {
"last":"http://example.com/v2/domains/?page=3",
"first":"http://example.com/v2/domains/?page=1"
}
},
"meta":{
"total":2
}
}`

View File

@ -139,21 +139,25 @@ type dropletRoot struct {
type dropletsRoot struct {
Droplets []Droplet `json:"droplets"`
Links *Links `json:"links"`
Meta *Meta `json:"meta"`
}
type kernelsRoot struct {
Kernels []Kernel `json:"kernels,omitempty"`
Links *Links `json:"links"`
Meta *Meta `json:"meta"`
}
type dropletSnapshotsRoot struct {
Snapshots []Image `json:"snapshots,omitempty"`
Links *Links `json:"links"`
Meta *Meta `json:"meta"`
}
type backupsRoot struct {
Backups []Image `json:"backups,omitempty"`
Links *Links `json:"links"`
Meta *Meta `json:"meta"`
}
// DropletCreateImage identifies an image for the create request. It prefers slug over ID.
@ -295,6 +299,9 @@ func (s *DropletsServiceOp) list(ctx context.Context, path string) ([]Droplet, *
if l := root.Links; l != nil {
resp.Links = l
}
if m := root.Meta; m != nil {
resp.Meta = m
}
return root.Droplets, resp, err
}
@ -449,6 +456,9 @@ func (s *DropletsServiceOp) Kernels(ctx context.Context, dropletID int, opt *Lis
if l := root.Links; l != nil {
resp.Links = l
}
if m := root.Meta; m != nil {
resp.Meta = m
}
return root.Kernels, resp, err
}
@ -478,6 +488,9 @@ func (s *DropletsServiceOp) Actions(ctx context.Context, dropletID int, opt *Lis
if l := root.Links; l != nil {
resp.Links = l
}
if m := root.Meta; m != nil {
resp.Meta = m
}
return root.Actions, resp, err
}
@ -507,6 +520,9 @@ func (s *DropletsServiceOp) Backups(ctx context.Context, dropletID int, opt *Lis
if l := root.Links; l != nil {
resp.Links = l
}
if m := root.Meta; m != nil {
resp.Meta = m
}
return root.Backups, resp, err
}
@ -536,6 +552,9 @@ func (s *DropletsServiceOp) Snapshots(ctx context.Context, dropletID int, opt *L
if l := root.Links; l != nil {
resp.Links = l
}
if m := root.Meta; m != nil {
resp.Meta = m
}
return root.Snapshots, resp, err
}

View File

@ -14,17 +14,33 @@ func TestDroplets_ListDroplets(t *testing.T) {
mux.HandleFunc("/v2/droplets", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, http.MethodGet)
fmt.Fprint(w, `{"droplets": [{"id":1},{"id":2}]}`)
fmt.Fprint(w, `{
"droplets": [
{
"id": 1
},
{
"id": 2
}
],
"meta": {
"total": 2
}
}`)
})
droplets, _, err := client.Droplets.List(ctx, nil)
droplets, resp, err := client.Droplets.List(ctx, nil)
if err != nil {
t.Errorf("Droplets.List returned error: %v", err)
}
expected := []Droplet{{ID: 1}, {ID: 2}}
if !reflect.DeepEqual(droplets, expected) {
t.Errorf("Droplets.List\n got=%#v\nwant=%#v", droplets, expected)
expectedDroplets := []Droplet{{ID: 1}, {ID: 2}}
if !reflect.DeepEqual(droplets, expectedDroplets) {
t.Errorf("Droplets.List\nDroplets: got=%#v\nwant=%#v", droplets, expectedDroplets)
}
expectedMeta := &Meta{Total: 2}
if !reflect.DeepEqual(resp.Meta, expectedMeta) {
t.Errorf("Droplets.List\nMeta: got=%#v\nwant=%#v", resp.Meta, expectedMeta)
}
}
@ -38,17 +54,33 @@ func TestDroplets_ListDropletsByTag(t *testing.T) {
}
testMethod(t, r, http.MethodGet)
fmt.Fprint(w, `{"droplets": [{"id":1},{"id":2}]}`)
fmt.Fprint(w, `{
"droplets": [
{
"id": 1
},
{
"id": 2
}
],
"meta": {
"total": 2
}
}`)
})
droplets, _, err := client.Droplets.ListByTag(ctx, "testing-1", nil)
droplets, resp, err := client.Droplets.ListByTag(ctx, "testing-1", nil)
if err != nil {
t.Errorf("Droplets.ListByTag returned error: %v", err)
}
expected := []Droplet{{ID: 1}, {ID: 2}}
if !reflect.DeepEqual(droplets, expected) {
t.Errorf("Droplets.ListByTag returned %+v, expected %+v", droplets, expected)
expectedDroplets := []Droplet{{ID: 1}, {ID: 2}}
if !reflect.DeepEqual(droplets, expectedDroplets) {
t.Errorf("Droplets.ListByTag returned droplets %+v, expected %+v", droplets, expectedDroplets)
}
expectedMeta := &Meta{Total: 2}
if !reflect.DeepEqual(resp.Meta, expectedMeta) {
t.Errorf("Droplets.ListByTag returned meta %+v, expected %+v", resp.Meta, expectedMeta)
}
}
@ -354,18 +386,34 @@ func TestDroplets_Kernels(t *testing.T) {
mux.HandleFunc("/v2/droplets/12345/kernels", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, http.MethodGet)
fmt.Fprint(w, `{"kernels": [{"id":1},{"id":2}]}`)
fmt.Fprint(w, `{
"kernels": [
{
"id": 1
},
{
"id": 2
}
],
"meta": {
"total": 2
}
}`)
})
opt := &ListOptions{Page: 2}
kernels, _, err := client.Droplets.Kernels(ctx, 12345, opt)
kernels, resp, err := client.Droplets.Kernels(ctx, 12345, opt)
if err != nil {
t.Errorf("Droplets.Kernels returned error: %v", err)
}
expected := []Kernel{{ID: 1}, {ID: 2}}
if !reflect.DeepEqual(kernels, expected) {
t.Errorf("Droplets.Kernels\n got=%#v\nwant=%#v", kernels, expected)
expectedKernels := []Kernel{{ID: 1}, {ID: 2}}
if !reflect.DeepEqual(kernels, expectedKernels) {
t.Errorf("Droplets.Kernels\nKernels got=%#v\nwant=%#v", kernels, expectedKernels)
}
expectedMeta := &Meta{Total: 2}
if !reflect.DeepEqual(resp.Meta, expectedMeta) {
t.Errorf("Droplets.Kernels\nMeta: got=%#v\nwant=%#v", resp.Meta, expectedMeta)
}
}
@ -375,18 +423,34 @@ func TestDroplets_Snapshots(t *testing.T) {
mux.HandleFunc("/v2/droplets/12345/snapshots", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, http.MethodGet)
fmt.Fprint(w, `{"snapshots": [{"id":1},{"id":2}]}`)
fmt.Fprint(w, `{
"snapshots": [
{
"id": 1
},
{
"id": 2
}
],
"meta": {
"total": 2
}
}`)
})
opt := &ListOptions{Page: 2}
snapshots, _, err := client.Droplets.Snapshots(ctx, 12345, opt)
snapshots, resp, err := client.Droplets.Snapshots(ctx, 12345, opt)
if err != nil {
t.Errorf("Droplets.Snapshots returned error: %v", err)
}
expected := []Image{{ID: 1}, {ID: 2}}
if !reflect.DeepEqual(snapshots, expected) {
t.Errorf("Droplets.Snapshots\n got=%#v\nwant=%#v", snapshots, expected)
expectedSnapshots := []Image{{ID: 1}, {ID: 2}}
if !reflect.DeepEqual(snapshots, expectedSnapshots) {
t.Errorf("Droplets.Snapshots\nSnapshots got=%#v\nwant=%#v", snapshots, expectedSnapshots)
}
expectedMeta := &Meta{Total: 2}
if !reflect.DeepEqual(resp.Meta, expectedMeta) {
t.Errorf("Droplets.Snapshots\nMeta: got=%#v\nwant=%#v", resp.Meta, expectedMeta)
}
}
@ -396,18 +460,34 @@ func TestDroplets_Backups(t *testing.T) {
mux.HandleFunc("/v2/droplets/12345/backups", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, http.MethodGet)
fmt.Fprint(w, `{"backups": [{"id":1},{"id":2}]}`)
fmt.Fprint(w, `{
"backups": [
{
"id": 1
},
{
"id": 2
}
],
"meta": {
"total": 2
}
}`)
})
opt := &ListOptions{Page: 2}
backups, _, err := client.Droplets.Backups(ctx, 12345, opt)
backups, resp, err := client.Droplets.Backups(ctx, 12345, opt)
if err != nil {
t.Errorf("Droplets.Backups returned error: %v", err)
}
expected := []Image{{ID: 1}, {ID: 2}}
if !reflect.DeepEqual(backups, expected) {
t.Errorf("Droplets.Backups\n got=%#v\nwant=%#v", backups, expected)
expectedBackups := []Image{{ID: 1}, {ID: 2}}
if !reflect.DeepEqual(backups, expectedBackups) {
t.Errorf("Droplets.Backups\nBackups got=%#v\nwant=%#v", backups, expectedBackups)
}
expectedMeta := &Meta{Total: 2}
if !reflect.DeepEqual(resp.Meta, expectedMeta) {
t.Errorf("Droplets.Backups\nMeta: got=%#v\nwant=%#v", resp.Meta, expectedMeta)
}
}
@ -417,18 +497,34 @@ func TestDroplets_Actions(t *testing.T) {
mux.HandleFunc("/v2/droplets/12345/actions", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, http.MethodGet)
fmt.Fprint(w, `{"actions": [{"id":1},{"id":2}]}`)
fmt.Fprint(w, `{
"actions": [
{
"id": 1
},
{
"id": 2
}
],
"meta": {
"total": 2
}
}`)
})
opt := &ListOptions{Page: 2}
actions, _, err := client.Droplets.Actions(ctx, 12345, opt)
actions, resp, err := client.Droplets.Actions(ctx, 12345, opt)
if err != nil {
t.Errorf("Droplets.Actions returned error: %v", err)
}
expected := []Action{{ID: 1}, {ID: 2}}
if !reflect.DeepEqual(actions, expected) {
t.Errorf("Droplets.Actions\n got=%#v\nwant=%#v", actions, expected)
expectedActions := []Action{{ID: 1}, {ID: 2}}
if !reflect.DeepEqual(actions, expectedActions) {
t.Errorf("Droplets.Actions\nActions got=%#v\nwant=%#v", actions, expectedActions)
}
expectedMeta := &Meta{Total: 2}
if !reflect.DeepEqual(resp.Meta, expectedMeta) {
t.Errorf("Droplets.Actions\nMeta: got=%#v\nwant=%#v", resp.Meta, expectedMeta)
}
}

View File

@ -237,6 +237,7 @@ type firewallRoot struct {
type firewallsRoot struct {
Firewalls []Firewall `json:"firewalls"`
Links *Links `json:"links"`
Meta *Meta `json:"meta"`
}
func (fw *FirewallsServiceOp) createAndDoReq(ctx context.Context, method, path string, v interface{}) (*Response, error) {
@ -262,6 +263,9 @@ func (fw *FirewallsServiceOp) listHelper(ctx context.Context, path string) ([]Fi
if l := root.Links; l != nil {
resp.Links = l
}
if m := root.Meta; m != nil {
resp.Meta = m
}
return root.Firewalls, resp, err
}

View File

@ -500,7 +500,7 @@ func TestFirewalls_List(t *testing.T) {
fmt.Fprint(w, firewallListJSONResponse)
})
actualFirewalls, _, err := client.Firewalls.List(ctx, nil)
actualFirewalls, resp, err := client.Firewalls.List(ctx, nil)
if err != nil {
t.Errorf("Firewalls.List returned error: %v", err)
@ -508,7 +508,11 @@ func TestFirewalls_List(t *testing.T) {
expectedFirewalls := makeExpectedFirewalls()
if !reflect.DeepEqual(actualFirewalls, expectedFirewalls) {
t.Errorf("Firewalls.List returned %+v, expected %+v", actualFirewalls, expectedFirewalls)
t.Errorf("Firewalls.List returned firewalls %+v, expected %+v", actualFirewalls, expectedFirewalls)
}
expectedMeta := &Meta{Total: 1}
if !reflect.DeepEqual(resp.Meta, expectedMeta) {
t.Errorf("Firewalls.List returned meta %+v, expected %+v", resp.Meta, expectedMeta)
}
}
@ -521,7 +525,7 @@ func TestFirewalls_ListByDroplet(t *testing.T) {
fmt.Fprint(w, firewallListJSONResponse)
})
actualFirewalls, _, err := client.Firewalls.ListByDroplet(ctx, 123, nil)
actualFirewalls, resp, err := client.Firewalls.ListByDroplet(ctx, 123, nil)
if err != nil {
t.Errorf("Firewalls.List returned error: %v", err)
@ -529,7 +533,11 @@ func TestFirewalls_ListByDroplet(t *testing.T) {
expectedFirewalls := makeExpectedFirewalls()
if !reflect.DeepEqual(actualFirewalls, expectedFirewalls) {
t.Errorf("Firewalls.List returned %+v, expected %+v", actualFirewalls, expectedFirewalls)
t.Errorf("Firewalls.List returned firewalls %+v, expected %+v", actualFirewalls, expectedFirewalls)
}
expectedMeta := &Meta{Total: 1}
if !reflect.DeepEqual(resp.Meta, expectedMeta) {
t.Errorf("Firewalls.List returned meta %+v, expected %+v", resp.Meta, expectedMeta)
}
}

View File

@ -44,6 +44,7 @@ func (f FloatingIP) URN() string {
type floatingIPsRoot struct {
FloatingIPs []FloatingIP `json:"floating_ips"`
Links *Links `json:"links"`
Meta *Meta `json:"meta"`
}
type floatingIPRoot struct {
@ -80,6 +81,9 @@ func (f *FloatingIPsServiceOp) List(ctx context.Context, opt *ListOptions) ([]Fl
if l := root.Links; l != nil {
resp.Links = l
}
if m := root.Meta; m != nil {
resp.Meta = m
}
return root.FloatingIPs, resp, err
}

View File

@ -14,20 +14,27 @@ func TestFloatingIPs_ListFloatingIPs(t *testing.T) {
mux.HandleFunc("/v2/floating_ips", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, http.MethodGet)
fmt.Fprint(w, `{"floating_ips": [{"region":{"slug":"nyc3"},"droplet":{"id":1},"ip":"192.168.0.1"},{"region":{"slug":"nyc3"},"droplet":{"id":2},"ip":"192.168.0.2"}]}`)
fmt.Fprint(w, `{"floating_ips": [{"region":{"slug":"nyc3"},"droplet":{"id":1},"ip":"192.168.0.1"},{"region":{"slug":"nyc3"},"droplet":{"id":2},"ip":"192.168.0.2"}],"meta":{"total":2}}`)
})
floatingIPs, _, err := client.FloatingIPs.List(ctx, nil)
floatingIPs, resp, err := client.FloatingIPs.List(ctx, nil)
if err != nil {
t.Errorf("FloatingIPs.List returned error: %v", err)
}
expected := []FloatingIP{
expectedFloatingIPs := []FloatingIP{
{Region: &Region{Slug: "nyc3"}, Droplet: &Droplet{ID: 1}, IP: "192.168.0.1"},
{Region: &Region{Slug: "nyc3"}, Droplet: &Droplet{ID: 2}, IP: "192.168.0.2"},
}
if !reflect.DeepEqual(floatingIPs, expected) {
t.Errorf("FloatingIPs.List returned %+v, expected %+v", floatingIPs, expected)
if !reflect.DeepEqual(floatingIPs, expectedFloatingIPs) {
t.Errorf("FloatingIPs.List returned floating IPs %+v, expected %+v", floatingIPs, expectedFloatingIPs)
}
expectedMeta := &Meta{
Total: 2,
}
if !reflect.DeepEqual(resp.Meta, expectedMeta) {
t.Errorf("FloatingIPs.List returned meta %+v, expected %+v", resp.Meta, expectedMeta)
}
}

View File

@ -72,6 +72,7 @@ type imageRoot struct {
type imagesRoot struct {
Images []Image
Links *Links `json:"links"`
Meta *Meta `json:"meta"`
}
type listImageOptions struct {
@ -236,6 +237,9 @@ func (s *ImagesServiceOp) list(ctx context.Context, opt *ListOptions, listOpt *l
if l := root.Links; l != nil {
resp.Links = l
}
if m := root.Meta; m != nil {
resp.Meta = m
}
return root.Images, resp, err
}

View File

@ -14,17 +14,34 @@ func TestImages_List(t *testing.T) {
mux.HandleFunc("/v2/images", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, http.MethodGet)
fmt.Fprint(w, `{"images":[{"id":1},{"id":2}]}`)
fmt.Fprint(w, `{
"images": [
{
"id": 1
},
{
"id": 2
}
],
"meta": {
"total": 2
}
}`)
})
images, _, err := client.Images.List(ctx, nil)
images, resp, err := client.Images.List(ctx, nil)
if err != nil {
t.Errorf("Images.List returned error: %v", err)
}
expected := []Image{{ID: 1}, {ID: 2}}
if !reflect.DeepEqual(images, expected) {
t.Errorf("Images.List returned %+v, expected %+v", images, expected)
expectedImages := []Image{{ID: 1}, {ID: 2}}
if !reflect.DeepEqual(images, expectedImages) {
t.Errorf("Images.List returned images %+v, expected %+v", images, expectedImages)
}
expectedMeta := &Meta{Total: 2}
if !reflect.DeepEqual(resp.Meta, expectedMeta) {
t.Errorf("Images.List returned meta %+v, expected %+v", resp.Meta, expectedMeta)
}
}
@ -39,17 +56,34 @@ func TestImages_ListDistribution(t *testing.T) {
if actual != expected {
t.Errorf("'type' query = %v, expected %v", actual, expected)
}
fmt.Fprint(w, `{"images":[{"id":1},{"id":2}]}`)
fmt.Fprint(w, `{
"images": [
{
"id": 1
},
{
"id": 2
}
],
"meta": {
"total": 2
}
}`)
})
images, _, err := client.Images.ListDistribution(ctx, nil)
images, resp, err := client.Images.ListDistribution(ctx, nil)
if err != nil {
t.Errorf("Images.ListDistribution returned error: %v", err)
}
expected := []Image{{ID: 1}, {ID: 2}}
if !reflect.DeepEqual(images, expected) {
t.Errorf("Images.ListDistribution returned %+v, expected %+v", images, expected)
expectedImages := []Image{{ID: 1}, {ID: 2}}
if !reflect.DeepEqual(images, expectedImages) {
t.Errorf("Images.ListDistribution returned images %+v, expected %+v", images, expectedImages)
}
expectedMeta := &Meta{Total: 2}
if !reflect.DeepEqual(resp.Meta, expectedMeta) {
t.Errorf("Images.ListDistribution returned meta %+v, expected %+v", resp.Meta, expectedMeta)
}
}
@ -64,17 +98,34 @@ func TestImages_ListApplication(t *testing.T) {
if actual != expected {
t.Errorf("'type' query = %v, expected %v", actual, expected)
}
fmt.Fprint(w, `{"images":[{"id":1},{"id":2}]}`)
fmt.Fprint(w, `{
"images": [
{
"id": 1
},
{
"id": 2
}
],
"meta": {
"total": 2
}
}`)
})
images, _, err := client.Images.ListApplication(ctx, nil)
images, resp, err := client.Images.ListApplication(ctx, nil)
if err != nil {
t.Errorf("Images.ListApplication returned error: %v", err)
}
expected := []Image{{ID: 1}, {ID: 2}}
if !reflect.DeepEqual(images, expected) {
t.Errorf("Images.ListApplication returned %+v, expected %+v", images, expected)
expectedImages := []Image{{ID: 1}, {ID: 2}}
if !reflect.DeepEqual(images, expectedImages) {
t.Errorf("Images.ListApplication returned images %+v, expected %+v", images, expectedImages)
}
expectedMeta := &Meta{Total: 2}
if !reflect.DeepEqual(resp.Meta, expectedMeta) {
t.Errorf("Images.ListApplication returned meta %+v, expected %+v", resp.Meta, expectedMeta)
}
}
@ -90,17 +141,34 @@ func TestImages_ListUser(t *testing.T) {
t.Errorf("'private' query = %v, expected %v", actual, expected)
}
fmt.Fprint(w, `{"images":[{"id":1},{"id":2}]}`)
fmt.Fprint(w, `{
"images": [
{
"id": 1
},
{
"id": 2
}
],
"meta": {
"total": 2
}
}`)
})
images, _, err := client.Images.ListUser(ctx, nil)
images, resp, err := client.Images.ListUser(ctx, nil)
if err != nil {
t.Errorf("Images.ListUser returned error: %v", err)
}
expected := []Image{{ID: 1}, {ID: 2}}
if !reflect.DeepEqual(images, expected) {
t.Errorf("Images.ListUser returned %+v, expected %+v", images, expected)
expectedImages := []Image{{ID: 1}, {ID: 2}}
if !reflect.DeepEqual(images, expectedImages) {
t.Errorf("Images.ListUser returned images %+v, expected %+v", images, expectedImages)
}
expectedMeta := &Meta{Total: 2}
if !reflect.DeepEqual(resp.Meta, expectedMeta) {
t.Errorf("Images.ListUser returned meta %+v, expected %+v", resp.Meta, expectedMeta)
}
}
@ -116,17 +184,34 @@ func TestImages_ListByTag(t *testing.T) {
t.Errorf("'tag_name' query = %v, expected %v", actual, expected)
}
fmt.Fprint(w, `{"images":[{"id":1},{"id":2}]}`)
fmt.Fprint(w, `{
"images": [
{
"id": 1
},
{
"id":2
}
],
"meta": {
"total": 2
}
}`)
})
images, _, err := client.Images.ListByTag(ctx, "foo", nil)
images, resp, err := client.Images.ListByTag(ctx, "foo", nil)
if err != nil {
t.Errorf("Images.ListByTag returned error: %v", err)
}
expected := []Image{{ID: 1}, {ID: 2}}
if !reflect.DeepEqual(images, expected) {
t.Errorf("Images.ListByTag returned %+v, expected %+v", images, expected)
expectedImages := []Image{{ID: 1}, {ID: 2}}
if !reflect.DeepEqual(images, expectedImages) {
t.Errorf("Images.ListByTag returned images %+v, expected %+v", images, expectedImages)
}
expectedMeta := &Meta{Total: 2}
if !reflect.DeepEqual(resp.Meta, expectedMeta) {
t.Errorf("Images.ListByTag returned meta %+v, expected %+v", resp.Meta, expectedMeta)
}
}

View File

@ -46,6 +46,7 @@ type KeyUpdateRequest struct {
type keysRoot struct {
SSHKeys []Key `json:"ssh_keys"`
Links *Links `json:"links"`
Meta *Meta `json:"meta"`
}
type keyRoot struct {
@ -83,6 +84,9 @@ func (s *KeysServiceOp) List(ctx context.Context, opt *ListOptions) ([]Key, *Res
if l := root.Links; l != nil {
resp.Links = l
}
if m := root.Meta; m != nil {
resp.Meta = m
}
return root.SSHKeys, resp, err
}

View File

@ -14,17 +14,34 @@ func TestKeys_List(t *testing.T) {
mux.HandleFunc("/v2/account/keys", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, http.MethodGet)
fmt.Fprint(w, `{"ssh_keys":[{"id":1},{"id":2}]}`)
fmt.Fprint(w, `{
"ssh_keys": [
{
"id": 1
},
{
"id": 2
}
],
"meta": {
"total": 2
}
}`)
})
keys, _, err := client.Keys.List(ctx, nil)
keys, resp, err := client.Keys.List(ctx, nil)
if err != nil {
t.Errorf("Keys.List returned error: %v", err)
}
expected := []Key{{ID: 1}, {ID: 2}}
if !reflect.DeepEqual(keys, expected) {
t.Errorf("Keys.List returned %+v, expected %+v", keys, expected)
expectedKeys := []Key{{ID: 1}, {ID: 2}}
if !reflect.DeepEqual(keys, expectedKeys) {
t.Errorf("Keys.List returned keys %+v, expected %+v", keys, expectedKeys)
}
expectedMeta := &Meta{Total: 2}
if !reflect.DeepEqual(resp.Meta, expectedMeta) {
t.Errorf("Keys.List returned meta %+v, expected %+v", resp.Meta, expectedMeta)
}
}

View File

@ -354,6 +354,7 @@ type KubernetesRegion struct {
type kubernetesClustersRoot struct {
Clusters []*KubernetesCluster `json:"kubernetes_clusters,omitempty"`
Links *Links `json:"links,omitempty"`
Meta *Meta `json:"meta"`
}
type kubernetesClusterRoot struct {
@ -469,6 +470,14 @@ func (svc *KubernetesServiceOp) List(ctx context.Context, opts *ListOptions) ([]
if err != nil {
return nil, resp, err
}
if l := root.Links; l != nil {
resp.Links = l
}
if m := root.Meta; m != nil {
resp.Meta = m
}
return root.Clusters, resp, nil
}

View File

@ -4,6 +4,7 @@ import (
"bytes"
"encoding/json"
"fmt"
"github.com/stretchr/testify/assert"
"net/http"
"testing"
"time"
@ -17,7 +18,7 @@ func TestKubernetesClusters_ListClusters(t *testing.T) {
kubeSvc := client.Kubernetes
want := []*KubernetesCluster{
wantClusters := []*KubernetesCluster{
&KubernetesCluster{
ID: "8d91899c-0739-4a1a-acc5-deadbeefbb8f",
Name: "blablabla",
@ -201,7 +202,16 @@ func TestKubernetesClusters_ListClusters(t *testing.T) {
"created_at": "2018-06-15T07:10:23Z",
"updated_at": "2018-06-15T07:11:26Z"
}
]
],
"links": {
"pages": {
"next": "https://api.digitalocean.com/v2/kubernetes/clusters?page=2",
"last": "https://api.digitalocean.com/v2/kubernetes/clusters?page=2"
}
},
"meta": {
"total": 2
}
}`
mux.HandleFunc("/v2/kubernetes/clusters", func(w http.ResponseWriter, r *http.Request) {
@ -209,9 +219,24 @@ func TestKubernetesClusters_ListClusters(t *testing.T) {
fmt.Fprint(w, jBlob)
})
got, _, err := kubeSvc.List(ctx, nil)
gotClusters, resp, err := kubeSvc.List(ctx, nil)
require.NoError(t, err)
require.Equal(t, want, got)
assert.Equal(t, wantClusters, gotClusters)
gotRespLinks := resp.Links
wantRespLinks := &Links{
Pages: &Pages{
Next: "https://api.digitalocean.com/v2/kubernetes/clusters?page=2",
Last: "https://api.digitalocean.com/v2/kubernetes/clusters?page=2",
},
}
assert.Equal(t, wantRespLinks, gotRespLinks)
gotRespMeta := resp.Meta
wantRespMeta := &Meta{
Total: 2,
}
assert.Equal(t, wantRespMeta, gotRespMeta)
}
func TestKubernetesClusters_Get(t *testing.T) {

View File

@ -167,6 +167,7 @@ func (l dropletIDsRequest) String() string {
type loadBalancersRoot struct {
LoadBalancers []LoadBalancer `json:"load_balancers"`
Links *Links `json:"links"`
Meta *Meta `json:"meta"`
}
type loadBalancerRoot struct {
@ -218,6 +219,9 @@ func (l *LoadBalancersServiceOp) List(ctx context.Context, opt *ListOptions) ([]
if l := root.Links; l != nil {
resp.Links = l
}
if m := root.Meta; m != nil {
resp.Meta = m
}
return root.LoadBalancers, resp, err
}

View File

@ -563,13 +563,13 @@ func TestLoadBalancers_List(t *testing.T) {
fmt.Fprint(w, lbListJSONResponse)
})
loadBalancers, _, err := client.LoadBalancers.List(ctx, nil)
loadBalancers, resp, err := client.LoadBalancers.List(ctx, nil)
if err != nil {
t.Errorf("LoadBalancers.List returned error: %v", err)
}
expected := []LoadBalancer{
expectedLBs := []LoadBalancer{
{
ID: "37e6be88-01ec-4ec7-9bc6-a514d4719057",
Name: "example-lb-01",
@ -611,7 +611,10 @@ func TestLoadBalancers_List(t *testing.T) {
},
}
assert.Equal(t, expected, loadBalancers)
assert.Equal(t, expectedLBs, loadBalancers)
expectedMeta := &Meta{Total: 3}
assert.Equal(t, expectedMeta, resp.Meta)
}
func TestLoadBalancers_List_Pagination(t *testing.T) {

View File

@ -125,6 +125,7 @@ type ProjectResourceLinks struct {
type projectsRoot struct {
Projects []Project `json:"projects"`
Links *Links `json:"links"`
Meta *Meta `json:"meta"`
}
type projectRoot struct {
@ -134,6 +135,7 @@ type projectRoot struct {
type projectResourcesRoot struct {
Resources []ProjectResource `json:"resources"`
Links *Links `json:"links,omitempty"`
Meta *Meta `json:"meta"`
}
var _ ProjectsService = &ProjectsServiceOp{}
@ -158,6 +160,9 @@ func (p *ProjectsServiceOp) List(ctx context.Context, opts *ListOptions) ([]Proj
if l := root.Links; l != nil {
resp.Links = l
}
if m := root.Meta; m != nil {
resp.Meta = m
}
return root.Projects, resp, err
}
@ -238,6 +243,9 @@ func (p *ProjectsServiceOp) ListResources(ctx context.Context, projectID string,
if l := root.Links; l != nil {
resp.Links = l
}
if m := root.Meta; m != nil {
resp.Meta = m
}
return root.Resources, resp, err
}

View File

@ -14,7 +14,7 @@ func TestProjects_List(t *testing.T) {
setup()
defer teardown()
projects := []Project{
expectedProjects := []Project{
{
ID: "project-1",
Name: "project-1",
@ -27,17 +27,22 @@ func TestProjects_List(t *testing.T) {
mux.HandleFunc("/v2/projects", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, http.MethodGet)
resp, _ := json.Marshal(projects)
fmt.Fprint(w, fmt.Sprintf(`{"projects":%s}`, string(resp)))
resp, _ := json.Marshal(expectedProjects)
fmt.Fprint(w, fmt.Sprintf(`{"projects":%s, "meta": {"total": 2}}`, string(resp)))
})
resp, _, err := client.Projects.List(ctx, nil)
projects, resp, err := client.Projects.List(ctx, nil)
if err != nil {
t.Errorf("Projects.List returned error: %v", err)
}
if !reflect.DeepEqual(resp, projects) {
t.Errorf("Projects.List returned %+v, expected %+v", resp, projects)
if !reflect.DeepEqual(projects, expectedProjects) {
t.Errorf("Projects.List returned projects %+v, expected %+v", projects, expectedProjects)
}
expectedMeta := &Meta{Total: 2}
if !reflect.DeepEqual(resp.Meta, expectedMeta) {
t.Errorf("Projects.List returned meta %+v, expected %+v", resp.Meta, expectedMeta)
}
}
@ -315,7 +320,7 @@ func TestProjects_ListResources(t *testing.T) {
setup()
defer teardown()
resources := []ProjectResource{
expectedResources := []ProjectResource{
{
URN: "do:droplet:1",
AssignedAt: "2018-09-27 00:00:00",
@ -334,17 +339,22 @@ func TestProjects_ListResources(t *testing.T) {
mux.HandleFunc("/v2/projects/project-1/resources", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, http.MethodGet)
resp, _ := json.Marshal(resources)
fmt.Fprint(w, fmt.Sprintf(`{"resources":%s}`, string(resp)))
resp, _ := json.Marshal(expectedResources)
fmt.Fprint(w, fmt.Sprintf(`{"resources":%s, "meta": {"total": 2}}`, string(resp)))
})
resp, _, err := client.Projects.ListResources(ctx, "project-1", nil)
resources, resp, err := client.Projects.ListResources(ctx, "project-1", nil)
if err != nil {
t.Errorf("Projects.List returned error: %v", err)
}
if !reflect.DeepEqual(resp, resources) {
t.Errorf("Projects.ListResources returned %+v, expected %+v", resp, resources)
if !reflect.DeepEqual(resources, expectedResources) {
t.Errorf("Projects.ListResources returned resources %+v, expected %+v", resources, expectedResources)
}
expectedMeta := &Meta{Total: 2}
if !reflect.DeepEqual(resp.Meta, expectedMeta) {
t.Errorf("Projects.ListResources returned meta %+v, expected %+v", resp.Meta, expectedMeta)
}
}

View File

@ -32,6 +32,7 @@ type Region struct {
type regionsRoot struct {
Regions []Region
Links *Links `json:"links"`
Meta *Meta `json:"meta"`
}
func (r Region) String() string {
@ -59,6 +60,9 @@ func (s *RegionsServiceOp) List(ctx context.Context, opt *ListOptions) ([]Region
if l := root.Links; l != nil {
resp.Links = l
}
if m := root.Meta; m != nil {
resp.Meta = m
}
return root.Regions, resp, err
}

View File

@ -13,17 +13,34 @@ func TestRegions_List(t *testing.T) {
mux.HandleFunc("/v2/regions", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, http.MethodGet)
fmt.Fprint(w, `{"regions":[{"slug":"1"},{"slug":"2"}]}`)
fmt.Fprint(w, `{
"regions": [
{
"slug": "1"
},
{
"slug": "2"
}
],
"meta": {
"total": 2
}
}`)
})
regions, _, err := client.Regions.List(ctx, nil)
regions, resp, err := client.Regions.List(ctx, nil)
if err != nil {
t.Errorf("Regions.List returned error: %v", err)
}
expected := []Region{{Slug: "1"}, {Slug: "2"}}
if !reflect.DeepEqual(regions, expected) {
t.Errorf("Regions.List returned %+v, expected %+v", regions, expected)
expectedRegions := []Region{{Slug: "1"}, {Slug: "2"}}
if !reflect.DeepEqual(regions, expectedRegions) {
t.Errorf("Regions.List returned regions %+v, expected %+v", regions, expectedRegions)
}
expectedMeta := &Meta{Total: 2}
if !reflect.DeepEqual(resp.Meta, expectedMeta) {
t.Errorf("Regions.List returned meta %+v, expected %+v", resp.Meta, expectedMeta)
}
}

View File

@ -40,6 +40,7 @@ func (s Size) String() string {
type sizesRoot struct {
Sizes []Size
Links *Links `json:"links"`
Meta *Meta `json:"meta"`
}
// List all images
@ -63,6 +64,9 @@ func (s *SizesServiceOp) List(ctx context.Context, opt *ListOptions) ([]Size, *R
if l := root.Links; l != nil {
resp.Links = l
}
if m := root.Meta; m != nil {
resp.Meta = m
}
return root.Sizes, resp, err
}

View File

@ -13,17 +13,34 @@ func TestSizes_List(t *testing.T) {
mux.HandleFunc("/v2/sizes", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, http.MethodGet)
fmt.Fprint(w, `{"sizes":[{"slug":"1"},{"slug":"2"}]}`)
fmt.Fprint(w, `{
"sizes": [
{
"slug": "1"
},
{
"slug": "2"
}
],
"meta": {
"total": 2
}
}`)
})
sizes, _, err := client.Sizes.List(ctx, nil)
sizes, resp, err := client.Sizes.List(ctx, nil)
if err != nil {
t.Errorf("Sizes.List returned error: %v", err)
}
expected := []Size{{Slug: "1"}, {Slug: "2"}}
if !reflect.DeepEqual(sizes, expected) {
t.Errorf("Sizes.List returned %+v, expected %+v", sizes, expected)
expectedSizes := []Size{{Slug: "1"}, {Slug: "2"}}
if !reflect.DeepEqual(sizes, expectedSizes) {
t.Errorf("Sizes.List returned sizes %+v, expected %+v", sizes, expectedSizes)
}
expectedMeta := &Meta{Total: 2}
if !reflect.DeepEqual(resp.Meta, expectedMeta) {
t.Errorf("Sizes.List returned meta %+v, expected %+v", resp.Meta, expectedMeta)
}
}

View File

@ -120,6 +120,9 @@ func (s *StorageActionsServiceOp) list(ctx context.Context, path string) ([]Acti
if l := root.Links; l != nil {
resp.Links = l
}
if m := root.Meta; m != nil {
resp.Meta = m
}
return root.Actions, resp, err
}

View File

@ -102,17 +102,31 @@ func TestStorageActions_List(t *testing.T) {
mux.HandleFunc("/v2/volumes/"+volumeID+"/actions", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, http.MethodGet)
fmt.Fprintf(w, `{"actions":[{"status":"in-progress"}]}`)
fmt.Fprintf(w, `{
"actions": [
{
"status": "in-progress"
}
],
"meta": {
"total": 1
}
}`)
})
actions, _, err := client.StorageActions.List(ctx, volumeID, nil)
actions, resp, err := client.StorageActions.List(ctx, volumeID, nil)
if err != nil {
t.Errorf("StorageActions.List returned error: %v", err)
}
expected := []Action{{Status: "in-progress"}}
if !reflect.DeepEqual(actions, expected) {
t.Errorf("StorageActions.List returned %+v, expected %+v", actions, expected)
expectedActions := []Action{{Status: "in-progress"}}
if !reflect.DeepEqual(actions, expectedActions) {
t.Errorf("StorageActions.List returned actions %+v, expected %+v", actions, expectedActions)
}
expectedMeta := &Meta{Total: 1}
if !reflect.DeepEqual(resp.Meta, expectedMeta) {
t.Errorf("StorageActions.List returned meta %+v, expected %+v", resp.Meta, expectedMeta)
}
}

View File

@ -113,6 +113,7 @@ type UntagResourcesRequest struct {
type tagsRoot struct {
Tags []Tag `json:"tags"`
Links *Links `json:"links"`
Meta *Meta `json:"meta"`
}
type tagRoot struct {
@ -141,6 +142,9 @@ func (s *TagsServiceOp) List(ctx context.Context, opt *ListOptions) ([]Tag, *Res
if l := root.Links; l != nil {
resp.Links = l
}
if m := root.Meta; m != nil {
resp.Meta = m
}
return root.Tags, resp, err
}

View File

@ -231,17 +231,22 @@ func TestTags_List(t *testing.T) {
fmt.Fprint(w, listJSON)
})
tags, _, err := client.Tags.List(ctx, nil)
tags, resp, err := client.Tags.List(ctx, nil)
if err != nil {
t.Errorf("Tags.List returned error: %v", err)
}
expected := []Tag{
expectedTags := []Tag{
{Name: "testing-1", Resources: &TaggedResources{Count: 0, Droplets: &TaggedDropletsResources{Count: 0, LastTagged: nil}, Images: &TaggedImagesResources{Count: 0}, Volumes: &TaggedVolumesResources{Count: 0}, VolumeSnapshots: &TaggedVolumeSnapshotsResources{Count: 0}, Databases: &TaggedDatabasesResources{Count: 0}}},
{Name: "testing-2", Resources: &TaggedResources{Count: 0, Droplets: &TaggedDropletsResources{Count: 0, LastTagged: nil}, Images: &TaggedImagesResources{Count: 0}, Volumes: &TaggedVolumesResources{Count: 0}, VolumeSnapshots: &TaggedVolumeSnapshotsResources{Count: 0}, Databases: &TaggedDatabasesResources{Count: 0}}},
}
if !reflect.DeepEqual(tags, expected) {
t.Errorf("Tags.List returned %+v, expected %+v", tags, expected)
if !reflect.DeepEqual(tags, expectedTags) {
t.Errorf("Tags.List returned tags %+v, expected %+v", tags, expectedTags)
}
expectedMeta := &Meta{Total: 2}
if !reflect.DeepEqual(resp.Meta, expectedMeta) {
t.Errorf("Tags.List returned meta %+v, expected %+v", resp.Meta, expectedMeta)
}
}

View File

@ -63,6 +63,7 @@ type vpcRoot struct {
type vpcsRoot struct {
VPCs []*VPC `json:"vpcs"`
Links *Links `json:"links"`
Meta *Meta `json:"meta"`
}
// Get returns the details of a Virtual Private Cloud.
@ -118,6 +119,9 @@ func (v *VPCsServiceOp) List(ctx context.Context, opt *ListOptions) ([]*VPC, *Re
if l := root.Links; l != nil {
resp.Links = l
}
if m := root.Meta; m != nil {
resp.Meta = m
}
return root.VPCs, resp, nil
}

View File

@ -3,6 +3,7 @@ package godo
import (
"encoding/json"
"fmt"
"github.com/stretchr/testify/assert"
"net/http"
"testing"
"time"
@ -68,6 +69,9 @@ func TestVPCs_List(t *testing.T) {
Next: "http://localhost/v2/vpcs?page=2&per_page=1",
},
}
meta := &Meta{
Total: 3,
}
jsonBlob := `
{
"vpcs": [
@ -89,8 +93,9 @@ func TestVPCs_List(t *testing.T) {
got, resp, err := svc.List(ctx, nil)
require.NoError(t, err)
require.Equal(t, want, got)
require.Equal(t, resp.Links, links)
assert.Equal(t, want, got)
assert.Equal(t, resp.Links, links)
assert.Equal(t, resp.Meta, meta)
}
func TestVPCs_Create(t *testing.T) {