From 4d5453d375278554aa44e6476da66c3f241c1e74 Mon Sep 17 00:00:00 2001 From: ykim-1 Date: Mon, 24 Feb 2025 09:15:39 -0800 Subject: [PATCH 1/3] add unit tests on images --- test/unit/fixtures/image_create.json | 31 ++++ test/unit/fixtures/image_get.json | 31 ++++ test/unit/fixtures/image_update.json | 31 ++++ test/unit/fixtures/image_upload.json | 34 +++++ test/unit/fixtures/images_list.json | 38 +++++ test/unit/images_test.go | 203 +++++++++++++++++++++++++++ 6 files changed, 368 insertions(+) create mode 100644 test/unit/fixtures/image_create.json create mode 100644 test/unit/fixtures/image_get.json create mode 100644 test/unit/fixtures/image_update.json create mode 100644 test/unit/fixtures/image_upload.json create mode 100644 test/unit/fixtures/images_list.json diff --git a/test/unit/fixtures/image_create.json b/test/unit/fixtures/image_create.json new file mode 100644 index 000000000..9d9042f31 --- /dev/null +++ b/test/unit/fixtures/image_create.json @@ -0,0 +1,31 @@ +{ + "capabilities": [ + "cloud-init", + "distributed-sites" + ], + "created": "2021-08-14T22:44:02", + "created_by": "linode", + "deprecated": false, + "description": "Example image description.", + "eol": "2026-07-01T04:00:00", + "expiry": null, + "id": "linode/debian11", + "is_public": true, + "label": "Debian 11", + "regions": [ + { + "region": "us-iad", + "status": "available" + } + ], + "size": 2500, + "status": "available", + "tags": [ + "repair-image", + "fix-1" + ], + "total_size": 1234567, + "type": "manual", + "updated": "2021-08-14T22:44:02", + "vendor": "Debian" +} \ No newline at end of file diff --git a/test/unit/fixtures/image_get.json b/test/unit/fixtures/image_get.json new file mode 100644 index 000000000..9d9042f31 --- /dev/null +++ b/test/unit/fixtures/image_get.json @@ -0,0 +1,31 @@ +{ + "capabilities": [ + "cloud-init", + "distributed-sites" + ], + "created": "2021-08-14T22:44:02", + "created_by": "linode", + "deprecated": false, + "description": "Example image description.", + "eol": "2026-07-01T04:00:00", + "expiry": null, + "id": "linode/debian11", + "is_public": true, + "label": "Debian 11", + "regions": [ + { + "region": "us-iad", + "status": "available" + } + ], + "size": 2500, + "status": "available", + "tags": [ + "repair-image", + "fix-1" + ], + "total_size": 1234567, + "type": "manual", + "updated": "2021-08-14T22:44:02", + "vendor": "Debian" +} \ No newline at end of file diff --git a/test/unit/fixtures/image_update.json b/test/unit/fixtures/image_update.json new file mode 100644 index 000000000..9d9042f31 --- /dev/null +++ b/test/unit/fixtures/image_update.json @@ -0,0 +1,31 @@ +{ + "capabilities": [ + "cloud-init", + "distributed-sites" + ], + "created": "2021-08-14T22:44:02", + "created_by": "linode", + "deprecated": false, + "description": "Example image description.", + "eol": "2026-07-01T04:00:00", + "expiry": null, + "id": "linode/debian11", + "is_public": true, + "label": "Debian 11", + "regions": [ + { + "region": "us-iad", + "status": "available" + } + ], + "size": 2500, + "status": "available", + "tags": [ + "repair-image", + "fix-1" + ], + "total_size": 1234567, + "type": "manual", + "updated": "2021-08-14T22:44:02", + "vendor": "Debian" +} \ No newline at end of file diff --git a/test/unit/fixtures/image_upload.json b/test/unit/fixtures/image_upload.json new file mode 100644 index 000000000..73b4a8036 --- /dev/null +++ b/test/unit/fixtures/image_upload.json @@ -0,0 +1,34 @@ +{ + "image": { + "capabilities": [ + "cloud-init", + "distributed-sites" + ], + "created": "2021-08-14T22:44:02", + "created_by": "linode", + "deprecated": false, + "description": "Example image description.", + "eol": "2026-07-01T04:00:00", + "expiry": null, + "id": "linode/debian11", + "is_public": true, + "label": "Debian 11", + "regions": [ + { + "region": "us-iad", + "status": "available" + } + ], + "size": 2500, + "status": "available", + "tags": [ + "repair-image", + "fix-1" + ], + "total_size": 1234567, + "type": "manual", + "updated": "2021-08-14T22:44:02", + "vendor": "Debian" + }, + "upload_to": "https://example.com/upload-endpoint" +} \ No newline at end of file diff --git a/test/unit/fixtures/images_list.json b/test/unit/fixtures/images_list.json new file mode 100644 index 000000000..7bc454fb2 --- /dev/null +++ b/test/unit/fixtures/images_list.json @@ -0,0 +1,38 @@ +{ + "data": [ + { + "capabilities": [ + "cloud-init", + "distributed-sites" + ], + "created": "2021-08-14T22:44:02", + "created_by": "linode", + "deprecated": false, + "description": "Example image description.", + "eol": "2026-07-01T04:00:00", + "expiry": null, + "id": "linode/debian11", + "is_public": true, + "label": "Debian 11", + "regions": [ + { + "region": "us-iad", + "status": "available" + } + ], + "size": 2500, + "status": "available", + "tags": [ + "repair-image", + "fix-1" + ], + "total_size": 1234567, + "type": "manual", + "updated": "2021-08-14T22:44:02", + "vendor": "Debian" + } + ], + "page": 1, + "pages": 1, + "results": 1 +} \ No newline at end of file diff --git a/test/unit/images_test.go b/test/unit/images_test.go index 7e43603a9..1f7dabbd5 100644 --- a/test/unit/images_test.go +++ b/test/unit/images_test.go @@ -2,6 +2,7 @@ package unit import ( "context" + "strings" "testing" "time" @@ -10,6 +11,208 @@ import ( "github.com/linode/linodego" ) +func TestImage_List(t *testing.T) { + fixtureData, err := fixtures.GetFixture("images_list") + assert.NoError(t, err) + + var base ClientBaseCase + base.SetUp(t) + defer base.TearDown(t) + + base.MockGet("images", fixtureData) + + images, err := base.Client.ListImages(context.Background(), &linodego.ListOptions{}) + assert.NoError(t, err) + + image := images[0] + assert.Equal(t, "linode/debian11", image.ID) + assert.Equal(t, "Debian 11", image.Label) + assert.Equal(t, "manual", image.Type) + assert.Equal(t, "Example image description.", image.Description) + assert.Equal(t, 2500, image.Size) + assert.Equal(t, linodego.ImageStatus("available"), image.Status) + assert.Equal(t, true, image.IsPublic) + assert.Equal(t, "2026-07-01T04:00:00Z", image.EOL.Format(time.RFC3339)) + assert.ElementsMatch(t, []string{"repair-image", "fix-1"}, image.Tags) + assert.Equal(t, "Debian", image.Vendor) + assert.False(t, image.Deprecated) + expectedCapabilities := []string{"cloud-init", "distributed-sites"} + assert.ElementsMatch(t, expectedCapabilities, image.Capabilities) + assert.Len(t, image.Regions, 1) + assert.Equal(t, "us-iad", image.Regions[0].Region) + assert.Equal(t, linodego.ImageRegionStatus("available"), image.Regions[0].Status) +} + +func TestImage_Get(t *testing.T) { + fixtureData, err := fixtures.GetFixture("image_get") + assert.NoError(t, err) + + var base ClientBaseCase + base.SetUp(t) + defer base.TearDown(t) + + imageID := "123" + + base.MockGet(formatMockAPIPath("images/%s", imageID), fixtureData) + + image, err := base.Client.GetImage(context.Background(), imageID) + assert.NoError(t, err) + + assert.Equal(t, "linode/debian11", image.ID) + assert.Equal(t, "Debian 11", image.Label) + assert.Equal(t, "Example image description.", image.Description) + assert.Equal(t, "Debian", image.Vendor) + assert.Equal(t, true, image.IsPublic) + assert.Equal(t, false, image.Deprecated) + assert.Equal(t, "available", string(image.Status)) + assert.Equal(t, "2021-08-14T22:44:02Z", image.Created.Format(time.RFC3339)) + assert.Equal(t, "2021-08-14T22:44:02Z", image.Updated.Format(time.RFC3339)) + assert.Equal(t, "2026-07-01T04:00:00Z", image.EOL.Format(time.RFC3339)) + assert.Equal(t, 2500, image.Size) + assert.Equal(t, 1234567, image.TotalSize) + + assert.ElementsMatch(t, []string{"cloud-init", "distributed-sites"}, image.Capabilities) + + assert.Len(t, image.Regions, 1) + assert.Equal(t, "us-iad", image.Regions[0].Region) + assert.Equal(t, "available", string(image.Regions[0].Status)) + + assert.ElementsMatch(t, []string{"repair-image", "fix-1"}, image.Tags) +} + +func TestImage_Create(t *testing.T) { + fixtureData, err := fixtures.GetFixture("image_create") + assert.NoError(t, err) + + var base ClientBaseCase + base.SetUp(t) + defer base.TearDown(t) + + requestData := linodego.ImageCreateOptions{ + DiskID: 123456, + Label: "Debian 11", + Description: "Example image description.", + CloudInit: true, + Tags: &[]string{"repair-image", "fix-1"}, + } + + base.MockPost("images", fixtureData) + + image, err := base.Client.CreateImage(context.Background(), requestData) + assert.NoError(t, err) + + assert.Equal(t, "linode/debian11", image.ID) + assert.Equal(t, "Debian 11", image.Label) + assert.Equal(t, "Example image description.", image.Description) + assert.Equal(t, "Debian", image.Vendor) + assert.Equal(t, true, image.IsPublic) + assert.Equal(t, false, image.Deprecated) + assert.Equal(t, "available", string(image.Status)) + assert.Equal(t, "2021-08-14T22:44:02Z", image.Created.Format(time.RFC3339)) + assert.Equal(t, "2021-08-14T22:44:02Z", image.Updated.Format(time.RFC3339)) + assert.Equal(t, "2026-07-01T04:00:00Z", image.EOL.Format(time.RFC3339)) + assert.Equal(t, 2500, image.Size) + assert.Equal(t, 1234567, image.TotalSize) + + assert.ElementsMatch(t, []string{"cloud-init", "distributed-sites"}, image.Capabilities) + + assert.Len(t, image.Regions, 1) + assert.Equal(t, "us-iad", image.Regions[0].Region) + assert.Equal(t, "available", string(image.Regions[0].Status)) + + assert.ElementsMatch(t, []string{"repair-image", "fix-1"}, image.Tags) +} + +func TestImage_Update(t *testing.T) { + fixtureData, err := fixtures.GetFixture("image_create") + assert.NoError(t, err) + + var base ClientBaseCase + base.SetUp(t) + defer base.TearDown(t) + + desc := "Example image description." + requestData := linodego.ImageUpdateOptions{ + Label: "Debian 11", + Description: &desc, + Tags: &[]string{"repair-image", "fix-1"}, + } + + imageID := "123" + + base.MockPut(formatMockAPIPath("images/%s", imageID), fixtureData) + + image, err := base.Client.UpdateImage(context.Background(), imageID, requestData) + assert.NoError(t, err) + + assert.Equal(t, "linode/debian11", image.ID) + assert.Equal(t, "Debian 11", image.Label) + assert.Equal(t, "Example image description.", image.Description) + assert.Equal(t, "Debian", image.Vendor) + assert.Equal(t, true, image.IsPublic) + assert.Equal(t, false, image.Deprecated) + assert.Equal(t, "available", string(image.Status)) + assert.Equal(t, "2021-08-14T22:44:02Z", image.Created.Format(time.RFC3339)) + assert.Equal(t, "2021-08-14T22:44:02Z", image.Updated.Format(time.RFC3339)) + assert.Equal(t, "2026-07-01T04:00:00Z", image.EOL.Format(time.RFC3339)) + assert.Equal(t, 2500, image.Size) + assert.Equal(t, 1234567, image.TotalSize) + + assert.ElementsMatch(t, []string{"cloud-init", "distributed-sites"}, image.Capabilities) + + assert.Len(t, image.Regions, 1) + assert.Equal(t, "us-iad", image.Regions[0].Region) + assert.Equal(t, "available", string(image.Regions[0].Status)) + + assert.ElementsMatch(t, []string{"repair-image", "fix-1"}, image.Tags) +} + +func TestImage_Upload(t *testing.T) { + fixtureData, err := fixtures.GetFixture("image_upload") + assert.NoError(t, err) + + var base ClientBaseCase + base.SetUp(t) + defer base.TearDown(t) + + requestData := linodego.ImageUploadOptions{ + Region: "us-iad", + Label: "Debian 11", + Description: "Example image description.", + CloudInit: true, + Tags: &[]string{"repair-image", "fix-1"}, + Image: strings.NewReader("mock image data"), + } + + base.MockPost("images/upload", fixtureData) + + image, err := base.Client.UploadImage(context.Background(), requestData) + assert.NoError(t, err) + + assert.Equal(t, "linode/debian11", image.ID) + assert.Equal(t, "Debian 11", image.Label) + assert.Equal(t, "manual", image.Type) + assert.Equal(t, "Example image description.", image.Description) + assert.Equal(t, 2500, image.Size) + assert.Equal(t, linodego.ImageStatus("available"), image.Status) + assert.Equal(t, true, image.IsPublic) + assert.Equal(t, "2026-07-01T04:00:00Z", image.EOL.Format(time.RFC3339)) + assert.ElementsMatch(t, []string{"repair-image", "fix-1"}, image.Tags) + assert.Equal(t, "Debian", image.Vendor) + assert.False(t, image.Deprecated) + expectedCapabilities := []string{"cloud-init", "distributed-sites"} + assert.ElementsMatch(t, expectedCapabilities, image.Capabilities) + assert.Len(t, image.Regions, 1) + assert.Equal(t, "us-iad", image.Regions[0].Region) + assert.Equal(t, linodego.ImageRegionStatus("available"), image.Regions[0].Status) + + // Ensure total_size is set correctly + assert.Equal(t, 1234567, image.TotalSize) +} + +func TestImage_Delete(t *testing.T) { +} + func TestImage_Replicate(t *testing.T) { fixtureData, err := fixtures.GetFixture("image_replicate") assert.NoError(t, err) From 5132abff77e8a9948ebdfba92fd5a1b84911d8b6 Mon Sep 17 00:00:00 2001 From: ykim-1 Date: Mon, 24 Feb 2025 09:18:30 -0800 Subject: [PATCH 2/3] add delete unit test --- test/unit/images_test.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/unit/images_test.go b/test/unit/images_test.go index 1f7dabbd5..53f2346aa 100644 --- a/test/unit/images_test.go +++ b/test/unit/images_test.go @@ -2,6 +2,8 @@ package unit import ( "context" + "fmt" + "github.com/jarcoal/httpmock" "strings" "testing" "time" @@ -211,6 +213,16 @@ func TestImage_Upload(t *testing.T) { } func TestImage_Delete(t *testing.T) { + client := createMockClient(t) + + imageID := "123" + + httpmock.RegisterRegexpResponder("DELETE", mockRequestURL(t, fmt.Sprintf("images/%s", imageID)), + httpmock.NewStringResponder(200, "{}")) + + if err := client.DeleteImage(context.Background(), imageID); err != nil { + t.Fatal(err) + } } func TestImage_Replicate(t *testing.T) { From 87d3657cf8522b81b116a0251a58790de757912b Mon Sep 17 00:00:00 2001 From: ykim-1 Date: Mon, 24 Feb 2025 09:19:45 -0800 Subject: [PATCH 3/3] lint --- test/unit/images_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/unit/images_test.go b/test/unit/images_test.go index 53f2346aa..0eac4b45a 100644 --- a/test/unit/images_test.go +++ b/test/unit/images_test.go @@ -3,11 +3,12 @@ package unit import ( "context" "fmt" - "github.com/jarcoal/httpmock" "strings" "testing" "time" + "github.com/jarcoal/httpmock" + "github.com/stretchr/testify/assert" "github.com/linode/linodego"