From 0fd46b0bbe0631140d9aaa84ad7c649c4e6ebf27 Mon Sep 17 00:00:00 2001 From: Youjung Kim <126618609+ykim-akamai@users.noreply.github.com> Date: Wed, 5 Feb 2025 09:11:20 -0800 Subject: [PATCH] add domain and domain record unit test coverage (#656) --- go.work.sum | 1 - test/unit/domain_test.go | 189 +++++++++++++++++ test/unit/domainrecord_test.go | 193 ++++++++++++++++++ test/unit/fixtures/domain_create.json | 18 ++ test/unit/fixtures/domain_get.json | 18 ++ .../fixtures/domain_get_domainzonefile.json | 12 ++ test/unit/fixtures/domain_list.json | 25 +++ test/unit/fixtures/domain_update.json | 18 ++ test/unit/fixtures/domainrecord_create.json | 15 ++ test/unit/fixtures/domainrecord_get.json | 15 ++ test/unit/fixtures/domainrecord_list.json | 22 ++ test/unit/fixtures/domainrecord_update.json | 15 ++ 12 files changed, 540 insertions(+), 1 deletion(-) create mode 100644 test/unit/domainrecord_test.go create mode 100644 test/unit/fixtures/domain_create.json create mode 100644 test/unit/fixtures/domain_get.json create mode 100644 test/unit/fixtures/domain_get_domainzonefile.json create mode 100644 test/unit/fixtures/domain_list.json create mode 100644 test/unit/fixtures/domain_update.json create mode 100644 test/unit/fixtures/domainrecord_create.json create mode 100644 test/unit/fixtures/domainrecord_get.json create mode 100644 test/unit/fixtures/domainrecord_list.json create mode 100644 test/unit/fixtures/domainrecord_update.json diff --git a/go.work.sum b/go.work.sum index 117976e91..16ac0ab7f 100644 --- a/go.work.sum +++ b/go.work.sum @@ -52,7 +52,6 @@ golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= diff --git a/test/unit/domain_test.go b/test/unit/domain_test.go index 2bbdac26f..ec35361e9 100644 --- a/test/unit/domain_test.go +++ b/test/unit/domain_test.go @@ -2,12 +2,201 @@ package unit import ( "context" + "fmt" + "github.com/jarcoal/httpmock" "testing" "github.com/linode/linodego" "github.com/stretchr/testify/assert" ) +func TestDomain_List(t *testing.T) { + fixtureData, err := fixtures.GetFixture("domain_list") + assert.NoError(t, err) + + var base ClientBaseCase + base.SetUp(t) + defer base.TearDown(t) + + base.MockGet(formatMockAPIPath("domains"), fixtureData) + + domains, err := base.Client.ListDomains(context.Background(), &linodego.ListOptions{}) + assert.NoError(t, err) + assert.Len(t, domains, 1) + + domain := domains[0] + assert.Equal(t, 1234, domain.ID) + assert.Equal(t, "example.org", domain.Domain) + assert.Equal(t, 300, domain.ExpireSec) + assert.Equal(t, 300, domain.RefreshSec) + assert.Equal(t, 300, domain.RetrySec) + assert.Equal(t, "admin@example.org", domain.SOAEmail) + assert.Equal(t, linodego.DomainStatus("active"), domain.Status) + assert.Equal(t, []string{"example tag", "another example"}, domain.Tags) + assert.Equal(t, 300, domain.TTLSec) + assert.Equal(t, linodego.DomainType("master"), domain.Type) + assert.Empty(t, domain.MasterIPs) + assert.Empty(t, domain.Description) +} + +func TestDomain_Get(t *testing.T) { + fixtureData, err := fixtures.GetFixture("domain_get") + assert.NoError(t, err) + + var base ClientBaseCase + base.SetUp(t) + defer base.TearDown(t) + + domainID := 1234 + base.MockGet(formatMockAPIPath("domains/%d", domainID), fixtureData) + + domain, err := base.Client.GetDomain(context.Background(), domainID) + + assert.NoError(t, err) + + assert.Equal(t, 1234, domain.ID) + assert.Equal(t, "example.org", domain.Domain) + assert.Equal(t, 300, domain.ExpireSec) + assert.Equal(t, 300, domain.RefreshSec) + assert.Equal(t, 300, domain.RetrySec) + assert.Equal(t, "admin@example.org", domain.SOAEmail) + assert.Equal(t, linodego.DomainStatus("active"), domain.Status) + assert.Equal(t, []string{"example tag", "another example"}, domain.Tags) + assert.Equal(t, 300, domain.TTLSec) + assert.Equal(t, linodego.DomainType("master"), domain.Type) + assert.Empty(t, domain.MasterIPs) + assert.Empty(t, domain.Description) +} + +func TestDomain_Create(t *testing.T) { + fixtureData, err := fixtures.GetFixture("domain_create") + assert.NoError(t, err) + + var base ClientBaseCase + base.SetUp(t) + defer base.TearDown(t) + + requestData := linodego.DomainCreateOptions{ + Domain: "example.org", + Type: linodego.DomainType("master"), + Description: "", + SOAEmail: "admin@example.org", + RetrySec: 300, + MasterIPs: []string{}, + AXfrIPs: []string{}, + Tags: []string{"example tag", "another example"}, + ExpireSec: 300, + RefreshSec: 300, + TTLSec: 300, + Status: linodego.DomainStatus("active"), + } + + base.MockPost(formatMockAPIPath("domains"), fixtureData) + + domain, err := base.Client.CreateDomain(context.Background(), requestData) + + assert.NoError(t, err) + + assert.Equal(t, 1234, domain.ID) + assert.Equal(t, "example.org", domain.Domain) + assert.Equal(t, 300, domain.ExpireSec) + assert.Equal(t, 300, domain.RefreshSec) + assert.Equal(t, 300, domain.RetrySec) + assert.Equal(t, "admin@example.org", domain.SOAEmail) + assert.Equal(t, linodego.DomainStatus("active"), domain.Status) + assert.Equal(t, []string{"example tag", "another example"}, domain.Tags) + assert.Equal(t, 300, domain.TTLSec) + assert.Equal(t, linodego.DomainType("master"), domain.Type) + assert.Empty(t, domain.MasterIPs) + assert.Empty(t, domain.Description) +} + +func TestDomain_Update(t *testing.T) { + fixtureData, err := fixtures.GetFixture("domain_update") + assert.NoError(t, err) + + var base ClientBaseCase + base.SetUp(t) + defer base.TearDown(t) + + domainID := 1234 + + requestData := linodego.DomainUpdateOptions{ + Domain: "example.org", + Type: linodego.DomainType("master"), + Description: "", + SOAEmail: "admin@example.org", + RetrySec: 300, + MasterIPs: []string{}, + AXfrIPs: []string{}, + Tags: []string{"example tag", "another example"}, + ExpireSec: 300, + RefreshSec: 300, + TTLSec: 300, + Status: linodego.DomainStatus("active"), + } + + base.MockPut(formatMockAPIPath("domains/%d", domainID), fixtureData) + + domain, err := base.Client.UpdateDomain(context.Background(), domainID, requestData) + + assert.NoError(t, err) + + assert.Equal(t, 1234, domain.ID) + assert.Equal(t, "example.org", domain.Domain) + assert.Equal(t, 300, domain.ExpireSec) + assert.Equal(t, 300, domain.RefreshSec) + assert.Equal(t, 300, domain.RetrySec) + assert.Equal(t, "admin@example.org", domain.SOAEmail) + assert.Equal(t, linodego.DomainStatus("active"), domain.Status) + assert.Equal(t, []string{"example tag", "another example"}, domain.Tags) + assert.Equal(t, 300, domain.TTLSec) + assert.Equal(t, linodego.DomainType("master"), domain.Type) + assert.Empty(t, domain.MasterIPs) + assert.Empty(t, domain.Description) +} + +func TestDomain_Delete(t *testing.T) { + client := createMockClient(t) + + domainID := 1234 + + httpmock.RegisterRegexpResponder("DELETE", mockRequestURL(t, fmt.Sprintf("domains/%d", domainID)), + httpmock.NewStringResponder(200, "{}")) + + if err := client.DeleteDomain(context.Background(), domainID); err != nil { + t.Fatal(err) + } +} + +func TestDomain_GetDomainZoneFile(t *testing.T) { + fixtureData, err := fixtures.GetFixture("domain_get_domainzonefile") + assert.NoError(t, err) + + var base ClientBaseCase + base.SetUp(t) + defer base.TearDown(t) + + domainID := 1234 + base.MockGet(formatMockAPIPath("domains/%d/zone-file", domainID), fixtureData) + + domain, err := base.Client.GetDomainZoneFile(context.Background(), domainID) + assert.NoError(t, err) + + expectedZoneFile := []string{ + "; example.com [123]", + "$TTL 864000", + "@ IN SOA ns1.linode.com. user.example.com. 2021000066 14400 14400 1209600 86400", + "@ NS ns1.linode.com.", + "@ NS ns2.linode.com.", + "@ NS ns3.linode.com.", + "@ NS ns4.linode.com.", + "@ NS ns5.linode.com.", + } + + assert.Equal(t, expectedZoneFile, domain.ZoneFile) +} + func TestDomain_Clone(t *testing.T) { fixtureData, err := fixtures.GetFixture("domain_clone") assert.NoError(t, err) diff --git a/test/unit/domainrecord_test.go b/test/unit/domainrecord_test.go new file mode 100644 index 000000000..5739dcbab --- /dev/null +++ b/test/unit/domainrecord_test.go @@ -0,0 +1,193 @@ +package unit + +import ( + "context" + "fmt" + "github.com/jarcoal/httpmock" + "github.com/linode/linodego" + "github.com/stretchr/testify/assert" + "testing" + "time" +) + +func TestDomainRecord_List(t *testing.T) { + fixtureData, err := fixtures.GetFixture("domainrecord_list") + assert.NoError(t, err) + + var base ClientBaseCase + base.SetUp(t) + defer base.TearDown(t) + + domainID := 1234 + + base.MockGet(formatMockAPIPath("domains/%d/records", domainID), fixtureData) + + domainsRecords, err := base.Client.ListDomainRecords(context.Background(), domainID, &linodego.ListOptions{}) + assert.NoError(t, err) + assert.Len(t, domainsRecords, 1) + + domainRecord := domainsRecords[0] + + assert.Equal(t, 123456, domainRecord.ID) + assert.Equal(t, "test", domainRecord.Name) + assert.Equal(t, 80, domainRecord.Port) + assert.Equal(t, 50, domainRecord.Priority) + assert.Nil(t, domainRecord.Protocol) + assert.Nil(t, domainRecord.Service) + assert.Nil(t, domainRecord.Tag) + assert.Equal(t, "192.0.2.0", domainRecord.Target) + assert.Equal(t, 604800, domainRecord.TTLSec) + assert.Equal(t, linodego.DomainRecordType("A"), domainRecord.Type) + assert.Equal(t, "2018-01-01T00:01:01Z", domainRecord.Created.Format(time.RFC3339)) + assert.Equal(t, "2018-01-01T00:01:01Z", domainRecord.Updated.Format(time.RFC3339)) + assert.Equal(t, 50, domainRecord.Weight) +} + +func TestDomainRecord_Get(t *testing.T) { + fixtureData, err := fixtures.GetFixture("domainrecord_get") + assert.NoError(t, err) + + var base ClientBaseCase + base.SetUp(t) + defer base.TearDown(t) + + domainID := 1234 + + domainRecordID := 123456 + + base.MockGet(formatMockAPIPath("domains/%d/records/%d", domainID, domainRecordID), fixtureData) + + domainRecord, err := base.Client.GetDomainRecord(context.Background(), domainID, domainRecordID) + assert.NoError(t, err) + + assert.Equal(t, 123456, domainRecord.ID) + assert.Equal(t, "test", domainRecord.Name) + assert.Equal(t, 80, domainRecord.Port) + assert.Equal(t, 50, domainRecord.Priority) + assert.Nil(t, domainRecord.Protocol) + assert.Nil(t, domainRecord.Service) + assert.Nil(t, domainRecord.Tag) + assert.Equal(t, "192.0.2.0", domainRecord.Target) + assert.Equal(t, 604800, domainRecord.TTLSec) + assert.Equal(t, linodego.DomainRecordType("A"), domainRecord.Type) + assert.Equal(t, 50, domainRecord.Weight) + assert.Equal(t, "2018-01-01T00:01:01Z", domainRecord.Created.Format(time.RFC3339)) + assert.Equal(t, "2018-01-01T00:01:01Z", domainRecord.Updated.Format(time.RFC3339)) +} + +func TestDomainRecord_Create(t *testing.T) { + fixtureData, err := fixtures.GetFixture("domainrecord_create") + assert.NoError(t, err) + + var base ClientBaseCase + base.SetUp(t) + defer base.TearDown(t) + + domainID := 1234 + + priority := 50 + weight := 50 + port := 80 + service := (*string)(nil) + protocol := (*string)(nil) + tag := (*string)(nil) + + requestData := linodego.DomainRecordCreateOptions{ + Type: linodego.RecordTypeA, + Name: "test", + Target: "192.0.2.0", + Priority: &priority, + Weight: &weight, + Port: &port, + Service: service, + Protocol: protocol, + TTLSec: 604800, + Tag: tag, + } + + base.MockPost(formatMockAPIPath("domains/%d/records", domainID), fixtureData) + + domainRecord, err := base.Client.CreateDomainRecord(context.Background(), domainID, requestData) + assert.NoError(t, err) + + assert.Equal(t, 123456, domainRecord.ID) + assert.Equal(t, "test", domainRecord.Name) + assert.Equal(t, 80, domainRecord.Port) + assert.Equal(t, 50, domainRecord.Priority) + assert.Nil(t, domainRecord.Protocol) + assert.Nil(t, domainRecord.Service) + assert.Nil(t, domainRecord.Tag) + assert.Equal(t, "192.0.2.0", domainRecord.Target) + assert.Equal(t, 604800, domainRecord.TTLSec) + assert.Equal(t, linodego.DomainRecordType("A"), domainRecord.Type) + assert.Equal(t, 50, domainRecord.Weight) + assert.Equal(t, "2018-01-01T00:01:01Z", domainRecord.Created.Format(time.RFC3339)) + assert.Equal(t, "2018-01-01T00:01:01Z", domainRecord.Updated.Format(time.RFC3339)) +} + +func TestDomainRecord_Update(t *testing.T) { + fixtureData, err := fixtures.GetFixture("domainrecord_update") + assert.NoError(t, err) + + var base ClientBaseCase + base.SetUp(t) + defer base.TearDown(t) + + domainID := 1234 + + priority := 50 + weight := 50 + port := 80 + service := (*string)(nil) + protocol := (*string)(nil) + tag := (*string)(nil) + + requestData := linodego.DomainRecordUpdateOptions{ + Type: linodego.RecordTypeA, + Name: "test", + Target: "192.0.2.0", + Priority: &priority, + Weight: &weight, + Port: &port, + Service: service, + Protocol: protocol, + TTLSec: 604800, + Tag: tag, + } + + domainRecordID := 123456 + + base.MockPut(formatMockAPIPath("domains/%d/records/%d", domainID, domainRecordID), fixtureData) + + domainRecord, err := base.Client.UpdateDomainRecord(context.Background(), domainID, domainRecordID, requestData) + assert.NoError(t, err) + + assert.Equal(t, 123456, domainRecord.ID) + assert.Equal(t, "test", domainRecord.Name) + assert.Equal(t, 80, domainRecord.Port) + assert.Equal(t, 50, domainRecord.Priority) + assert.Nil(t, domainRecord.Protocol) + assert.Nil(t, domainRecord.Service) + assert.Nil(t, domainRecord.Tag) + assert.Equal(t, "192.0.2.0", domainRecord.Target) + assert.Equal(t, 604800, domainRecord.TTLSec) + assert.Equal(t, linodego.DomainRecordType("A"), domainRecord.Type) + assert.Equal(t, 50, domainRecord.Weight) + assert.Equal(t, "2018-01-01T00:01:01Z", domainRecord.Created.Format(time.RFC3339)) + assert.Equal(t, "2018-01-01T00:01:01Z", domainRecord.Updated.Format(time.RFC3339)) +} + +func TestDomainRecord_Delete(t *testing.T) { + client := createMockClient(t) + + domainID := 1234 + + domainRecordID := 123456 + + httpmock.RegisterRegexpResponder("DELETE", mockRequestURL(t, fmt.Sprintf("domains/%d/records/%d", domainID, domainRecordID)), + httpmock.NewStringResponder(200, "{}")) + + if err := client.DeleteDomainRecord(context.Background(), domainID, domainRecordID); err != nil { + t.Fatal(err) + } +} diff --git a/test/unit/fixtures/domain_create.json b/test/unit/fixtures/domain_create.json new file mode 100644 index 000000000..81848fbbc --- /dev/null +++ b/test/unit/fixtures/domain_create.json @@ -0,0 +1,18 @@ +{ + "axfr_ips": [], + "description": null, + "domain": "example.org", + "expire_sec": 300, + "id": 1234, + "master_ips": [], + "refresh_sec": 300, + "retry_sec": 300, + "soa_email": "admin@example.org", + "status": "active", + "tags": [ + "example tag", + "another example" + ], + "ttl_sec": 300, + "type": "master" +} \ No newline at end of file diff --git a/test/unit/fixtures/domain_get.json b/test/unit/fixtures/domain_get.json new file mode 100644 index 000000000..81848fbbc --- /dev/null +++ b/test/unit/fixtures/domain_get.json @@ -0,0 +1,18 @@ +{ + "axfr_ips": [], + "description": null, + "domain": "example.org", + "expire_sec": 300, + "id": 1234, + "master_ips": [], + "refresh_sec": 300, + "retry_sec": 300, + "soa_email": "admin@example.org", + "status": "active", + "tags": [ + "example tag", + "another example" + ], + "ttl_sec": 300, + "type": "master" +} \ No newline at end of file diff --git a/test/unit/fixtures/domain_get_domainzonefile.json b/test/unit/fixtures/domain_get_domainzonefile.json new file mode 100644 index 000000000..d4c6d8abb --- /dev/null +++ b/test/unit/fixtures/domain_get_domainzonefile.json @@ -0,0 +1,12 @@ +{ + "zone_file": [ + "; example.com [123]", + "$TTL 864000", + "@ IN SOA ns1.linode.com. user.example.com. 2021000066 14400 14400 1209600 86400", + "@ NS ns1.linode.com.", + "@ NS ns2.linode.com.", + "@ NS ns3.linode.com.", + "@ NS ns4.linode.com.", + "@ NS ns5.linode.com." + ] +} \ No newline at end of file diff --git a/test/unit/fixtures/domain_list.json b/test/unit/fixtures/domain_list.json new file mode 100644 index 000000000..63c684f93 --- /dev/null +++ b/test/unit/fixtures/domain_list.json @@ -0,0 +1,25 @@ +{ + "data": [ + { + "axfr_ips": [], + "description": null, + "domain": "example.org", + "expire_sec": 300, + "id": 1234, + "master_ips": [], + "refresh_sec": 300, + "retry_sec": 300, + "soa_email": "admin@example.org", + "status": "active", + "tags": [ + "example tag", + "another example" + ], + "ttl_sec": 300, + "type": "master" + } + ], + "page": 1, + "pages": 1, + "results": 1 +} \ No newline at end of file diff --git a/test/unit/fixtures/domain_update.json b/test/unit/fixtures/domain_update.json new file mode 100644 index 000000000..81848fbbc --- /dev/null +++ b/test/unit/fixtures/domain_update.json @@ -0,0 +1,18 @@ +{ + "axfr_ips": [], + "description": null, + "domain": "example.org", + "expire_sec": 300, + "id": 1234, + "master_ips": [], + "refresh_sec": 300, + "retry_sec": 300, + "soa_email": "admin@example.org", + "status": "active", + "tags": [ + "example tag", + "another example" + ], + "ttl_sec": 300, + "type": "master" +} \ No newline at end of file diff --git a/test/unit/fixtures/domainrecord_create.json b/test/unit/fixtures/domainrecord_create.json new file mode 100644 index 000000000..d5d36045c --- /dev/null +++ b/test/unit/fixtures/domainrecord_create.json @@ -0,0 +1,15 @@ +{ + "created": "2018-01-01T00:01:01", + "id": 123456, + "name": "test", + "port": 80, + "priority": 50, + "protocol": null, + "service": null, + "tag": null, + "target": "192.0.2.0", + "ttl_sec": 604800, + "type": "A", + "updated": "2018-01-01T00:01:01", + "weight": 50 +} \ No newline at end of file diff --git a/test/unit/fixtures/domainrecord_get.json b/test/unit/fixtures/domainrecord_get.json new file mode 100644 index 000000000..d5d36045c --- /dev/null +++ b/test/unit/fixtures/domainrecord_get.json @@ -0,0 +1,15 @@ +{ + "created": "2018-01-01T00:01:01", + "id": 123456, + "name": "test", + "port": 80, + "priority": 50, + "protocol": null, + "service": null, + "tag": null, + "target": "192.0.2.0", + "ttl_sec": 604800, + "type": "A", + "updated": "2018-01-01T00:01:01", + "weight": 50 +} \ No newline at end of file diff --git a/test/unit/fixtures/domainrecord_list.json b/test/unit/fixtures/domainrecord_list.json new file mode 100644 index 000000000..1fcd48cbd --- /dev/null +++ b/test/unit/fixtures/domainrecord_list.json @@ -0,0 +1,22 @@ +{ + "data": [ + { + "created": "2018-01-01T00:01:01", + "id": 123456, + "name": "test", + "port": 80, + "priority": 50, + "protocol": null, + "service": null, + "tag": null, + "target": "192.0.2.0", + "ttl_sec": 604800, + "type": "A", + "updated": "2018-01-01T00:01:01", + "weight": 50 + } + ], + "page": 1, + "pages": 1, + "results": 1 +} \ No newline at end of file diff --git a/test/unit/fixtures/domainrecord_update.json b/test/unit/fixtures/domainrecord_update.json new file mode 100644 index 000000000..d5d36045c --- /dev/null +++ b/test/unit/fixtures/domainrecord_update.json @@ -0,0 +1,15 @@ +{ + "created": "2018-01-01T00:01:01", + "id": 123456, + "name": "test", + "port": 80, + "priority": 50, + "protocol": null, + "service": null, + "tag": null, + "target": "192.0.2.0", + "ttl_sec": 604800, + "type": "A", + "updated": "2018-01-01T00:01:01", + "weight": 50 +} \ No newline at end of file