gogreen/invoices_test.go

313 lines
8.3 KiB
Go

package godo
import (
"bytes"
"fmt"
"net/http"
"reflect"
"testing"
"time"
)
func TestInvoices_GetInvoices(t *testing.T) {
setup()
defer teardown()
mux.HandleFunc("/v2/customers/my/invoices/example-invoice-uuid", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, http.MethodGet)
fmt.Fprint(w, `{
"invoice_items": [
{
"product": "Droplets",
"resource_id": "1234",
"resource_uuid": "droplet-1234-uuid",
"group_description": "",
"description": "My Example Droplet",
"amount": "12.34",
"duration": "672",
"duration_unit": "Hours",
"start_time": "2018-06-20T08:44:38Z",
"end_time": "2018-06-21T08:44:38Z",
"project_name": "My project"
},
{
"product": "Load Balancers",
"resource_id": "2345",
"resource_uuid": "load-balancer-2345-uuid",
"group_description": "",
"description": "My Example Load Balancer",
"amount": "23.45",
"duration": "744",
"duration_unit": "Hours",
"start_time": "2018-06-20T08:44:38Z",
"end_time": "2018-06-21T08:44:38Z",
"project_name": "My Second Project"
}
],
"meta": {
"total": 2
}
}`)
})
invoice, resp, err := client.Invoices.Get(ctx, "example-invoice-uuid", nil)
if err != nil {
t.Errorf("Invoices.Get returned error: %v", err)
}
expectedInvoiceItems := []InvoiceItem{
{
Product: "Droplets",
ResourceID: "1234",
ResourceUUID: "droplet-1234-uuid",
GroupDescription: "",
Description: "My Example Droplet",
Amount: "12.34",
Duration: "672",
DurationUnit: "Hours",
StartTime: time.Date(2018, 6, 20, 8, 44, 38, 0, time.UTC),
EndTime: time.Date(2018, 6, 21, 8, 44, 38, 0, time.UTC),
ProjectName: "My project",
},
{
Product: "Load Balancers",
ResourceID: "2345",
ResourceUUID: "load-balancer-2345-uuid",
GroupDescription: "",
Description: "My Example Load Balancer",
Amount: "23.45",
Duration: "744",
DurationUnit: "Hours",
StartTime: time.Date(2018, 6, 20, 8, 44, 38, 0, time.UTC),
EndTime: time.Date(2018, 6, 21, 8, 44, 38, 0, time.UTC),
ProjectName: "My Second Project",
},
}
actualItems := invoice.InvoiceItems
if !reflect.DeepEqual(actualItems, expectedInvoiceItems) {
t.Errorf("Invoices.Get\nInvoiceItems: got=%#v\nwant=%#v", actualItems, expectedInvoiceItems)
}
expectedMeta := &Meta{Total: 2}
if !reflect.DeepEqual(resp.Meta, expectedMeta) {
t.Errorf("Invoices.Get\nMeta: got=%#v\nwant=%#v", resp.Meta, expectedMeta)
}
}
func TestInvoices_ListInvoices(t *testing.T) {
setup()
defer teardown()
mux.HandleFunc("/v2/customers/my/invoices", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, http.MethodGet)
fmt.Fprint(w, `{
"invoices": [
{
"invoice_uuid": "example-invoice-uuid-1",
"amount": "12.34",
"invoice_period": "2020-01"
},
{
"invoice_uuid": "example-invoice-uuid-2",
"amount": "23.45",
"invoice_period": "2019-12"
}
],
"invoice_preview": {
"invoice_uuid": "example-invoice-uuid-preview",
"amount": "34.56",
"invoice_period": "2020-02",
"updated_at": "2020-02-05T05:43:10Z"
},
"meta": {
"total": 2
}
}`)
})
invoiceListResponse, resp, err := client.Invoices.List(ctx, nil)
if err != nil {
t.Errorf("Invoices.List returned error: %v", err)
}
expectedInvoiceListItems := []InvoiceListItem{
{
InvoiceUUID: "example-invoice-uuid-1",
Amount: "12.34",
InvoicePeriod: "2020-01",
},
{
InvoiceUUID: "example-invoice-uuid-2",
Amount: "23.45",
InvoicePeriod: "2019-12",
},
}
actualItems := invoiceListResponse.Invoices
if !reflect.DeepEqual(actualItems, expectedInvoiceListItems) {
t.Errorf("Invoices.List\nInvoiceListItems: got=%#v\nwant=%#v", actualItems, expectedInvoiceListItems)
}
expectedPreview := InvoiceListItem{
InvoiceUUID: "example-invoice-uuid-preview",
Amount: "34.56",
InvoicePeriod: "2020-02",
UpdatedAt: time.Date(2020, 2, 5, 5, 43, 10, 0, time.UTC),
}
if !reflect.DeepEqual(invoiceListResponse.InvoicePreview, expectedPreview) {
t.Errorf("Invoices.List\nInvoicePreview: got=%#v\nwant=%#v", invoiceListResponse.InvoicePreview, expectedPreview)
}
expectedMeta := &Meta{Total: 2}
if !reflect.DeepEqual(resp.Meta, expectedMeta) {
t.Errorf("Invoices.List\nMeta: got=%#v\nwant=%#v", resp.Meta, expectedMeta)
}
}
func TestInvoices_GetSummary(t *testing.T) {
setup()
defer teardown()
mux.HandleFunc("/v2/customers/my/invoices/example-invoice-uuid/summary", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, http.MethodGet)
fmt.Fprint(w, `{
"invoice_uuid": "example-invoice-uuid",
"billing_period": "2020-01",
"amount": "27.13",
"user_name": "Frodo Baggins",
"user_billing_address": {
"address_line1": "101 Bagshot Row",
"address_line2": "#2",
"city": "Hobbiton",
"region": "Shire",
"postal_code": "12345",
"country_iso2_code": "ME",
"created_at": "2018-06-20T08:44:38Z",
"updated_at": "2018-06-21T08:44:38Z"
},
"user_company": "DigitalOcean",
"user_email": "fbaggins@example.com",
"product_charges": {
"name": "Product usage charges",
"amount": "12.34",
"items": [
{
"amount": "10.00",
"name": "Spaces Subscription",
"count": "1"
},
{
"amount": "2.34",
"name": "Database Clusters",
"count": "1"
}
]
},
"overages": {
"name": "Overages",
"amount": "3.45"
},
"taxes": {
"name": "Taxes",
"amount": "4.56"
},
"credits_and_adjustments": {
"name": "Credits & adjustments",
"amount": "6.78"
}
}`)
})
invoiceSummaryResponse, _, err := client.Invoices.GetSummary(ctx, "example-invoice-uuid")
if err != nil {
t.Errorf("Invoices.GetSummary returned error: %v", err)
}
expectedSummary := InvoiceSummary{
InvoiceUUID: "example-invoice-uuid",
BillingPeriod: "2020-01",
Amount: "27.13",
UserName: "Frodo Baggins",
UserBillingAddress: Address{
AddressLine1: "101 Bagshot Row",
AddressLine2: "#2",
City: "Hobbiton",
Region: "Shire",
PostalCode: "12345",
CountryISO2Code: "ME",
CreatedAt: time.Date(2018, 6, 20, 8, 44, 38, 0, time.UTC),
UpdatedAt: time.Date(2018, 6, 21, 8, 44, 38, 0, time.UTC),
},
UserCompany: "DigitalOcean",
UserEmail: "fbaggins@example.com",
ProductCharges: InvoiceSummaryBreakdown{
Name: "Product usage charges",
Amount: "12.34",
Items: []InvoiceSummaryBreakdownItem{
{
Name: "Spaces Subscription",
Amount: "10.00",
Count: "1",
},
{
Name: "Database Clusters",
Amount: "2.34",
Count: "1",
},
},
},
Overages: InvoiceSummaryBreakdown{
Name: "Overages",
Amount: "3.45",
},
Taxes: InvoiceSummaryBreakdown{
Name: "Taxes",
Amount: "4.56",
},
CreditsAndAdjustments: InvoiceSummaryBreakdown{
Name: "Credits & adjustments",
Amount: "6.78",
},
}
if !reflect.DeepEqual(invoiceSummaryResponse, &expectedSummary) {
t.Errorf("Invoices.GetSummary\nInvoiceSummary: got=%#v\nwant=%#v", invoiceSummaryResponse, &expectedSummary)
}
}
func TestInvoices_GetPDF(t *testing.T) {
setup()
defer teardown()
mux.HandleFunc("/v2/customers/my/invoices/example-invoice-uuid/pdf", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, http.MethodGet)
fmt.Fprint(w, `some pdf content`)
})
invoicePDFResponse, _, err := client.Invoices.GetPDF(ctx, "example-invoice-uuid")
if err != nil {
t.Errorf("Invoices.GetPDF returned error: %v", err)
}
expected := []byte("some pdf content")
if !bytes.Equal(invoicePDFResponse, expected) {
t.Errorf("Invoices.GetPDF\n got=%#v\nwant=%#v", invoicePDFResponse, expected)
}
}
func TestInvoices_GetCSV(t *testing.T) {
setup()
defer teardown()
mux.HandleFunc("/v2/customers/my/invoices/example-invoice-uuid/csv", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, http.MethodGet)
fmt.Fprint(w, `some csv content`)
})
invoiceCSVResponse, _, err := client.Invoices.GetCSV(ctx, "example-invoice-uuid")
if err != nil {
t.Errorf("Invoices.GetCSV returned error: %v", err)
}
expected := []byte("some csv content")
if !bytes.Equal(invoiceCSVResponse, expected) {
t.Errorf("Invoices.GetCSV\n got=%#v\nwant=%#v", invoiceCSVResponse, expected)
}
}