github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/pkg/cnbutils/registry/search_test.go (about) 1 //go:build unit 2 // +build unit 3 4 package registry 5 6 import ( 7 "net/http" 8 "testing" 9 10 piperhttp "github.com/SAP/jenkins-library/pkg/http" 11 "github.com/jarcoal/httpmock" 12 "github.com/stretchr/testify/assert" 13 ) 14 15 func TestSearchBuildpack(t *testing.T) { 16 t.Run("returns image URL for specific version", func(t *testing.T) { 17 18 fakeResponse := "{\"latest\":{\"version\":\"1.1.1\",\"namespace\":\"test\",\"name\":\"test\",\"description\":\"\",\"homepage\":\"\",\"licenses\":null,\"stacks\":[\"test\",\"test\"],\"id\":\"test\"},\"versions\":[{\"version\":\"1.1.1\",\"_link\":\"https://test/1.1.1\"}]}" 19 20 httpmock.Activate() 21 defer httpmock.DeactivateAndReset() 22 httpmock.RegisterResponder(http.MethodGet, "https://registry.buildpacks.io/api/v1/buildpacks/test", httpmock.NewStringResponder(200, fakeResponse)) 23 httpmock.RegisterResponder(http.MethodGet, "https://test/1.1.1", httpmock.NewStringResponder(200, "{\"addr\": \"index.docker.io/test@1.1.1\"}")) 24 client := &piperhttp.Client{} 25 client.SetOptions(piperhttp.ClientOptions{MaxRetries: -1, UseDefaultTransport: true}) 26 27 img, err := SearchBuildpack("test", "1.1.1", client, "") 28 29 assert.NoError(t, err) 30 assert.Equal(t, "index.docker.io/test@1.1.1", img) 31 }) 32 33 t.Run("returns image URL for the latest", func(t *testing.T) { 34 fakeResponse := "{\"latest\":{\"version\":\"1.1.1\",\"namespace\":\"test\",\"name\":\"test\",\"description\":\"\",\"homepage\":\"\",\"licenses\":null,\"stacks\":[\"test\",\"test\"],\"id\":\"test\"},\"versions\":[{\"version\":\"1.1.1\",\"_link\":\"https://test/1.1.1\"}]}" 35 36 httpmock.Activate() 37 defer httpmock.DeactivateAndReset() 38 httpmock.RegisterResponder(http.MethodGet, "https://registry.buildpacks.io/api/v1/buildpacks/test", httpmock.NewStringResponder(200, fakeResponse)) 39 httpmock.RegisterResponder(http.MethodGet, "https://test/1.1.1", httpmock.NewStringResponder(200, "{\"addr\": \"index.docker.io/test@1.1.1\"}")) 40 client := &piperhttp.Client{} 41 client.SetOptions(piperhttp.ClientOptions{MaxRetries: -1, UseDefaultTransport: true}) 42 43 img, err := SearchBuildpack("test", "", client, "") 44 45 assert.NoError(t, err) 46 assert.Equal(t, "index.docker.io/test@1.1.1", img) 47 }) 48 49 t.Run("fails with the version not found", func(t *testing.T) { 50 fakeResponse := "{\"latest\":{\"version\":\"1.1.1\",\"namespace\":\"test\",\"name\":\"test\",\"description\":\"\",\"homepage\":\"\",\"licenses\":null,\"stacks\":[\"test\",\"test\"],\"id\":\"test\"},\"versions\":[{\"version\":\"1.1.1\",\"_link\":\"https://test/1.1.1\"}]}" 51 52 httpmock.Activate() 53 defer httpmock.DeactivateAndReset() 54 httpmock.RegisterResponder(http.MethodGet, "https://registry.buildpacks.io/api/v1/buildpacks/test", httpmock.NewStringResponder(200, fakeResponse)) 55 httpmock.RegisterResponder(http.MethodGet, "https://test/1.1.1", httpmock.NewStringResponder(200, "{\"addr\": \"index.docker.io/test@1.1.1\"}")) 56 client := &piperhttp.Client{} 57 client.SetOptions(piperhttp.ClientOptions{MaxRetries: -1, UseDefaultTransport: true}) 58 59 img, err := SearchBuildpack("test", "1.1.2", client, "") 60 61 assert.Error(t, err) 62 assert.Equal(t, "version '1.1.2' was not found for the buildpack 'test'", err.Error()) 63 assert.Equal(t, "", img) 64 }) 65 66 t.Run("fails with the HTTP error", func(t *testing.T) { 67 httpmock.Activate() 68 defer httpmock.DeactivateAndReset() 69 httpmock.RegisterResponder(http.MethodGet, "https://registry.buildpacks.io/api/v1/buildpacks/test", httpmock.NewStringResponder(404, "not_found")) 70 client := &piperhttp.Client{} 71 client.SetOptions(piperhttp.ClientOptions{MaxRetries: -1, UseDefaultTransport: true}) 72 73 img, err := SearchBuildpack("test", "1.1.2", client, "") 74 75 assert.Error(t, err) 76 assert.Contains(t, err.Error(), "returned with response 404") 77 assert.Equal(t, "", img) 78 }) 79 80 t.Run("fails with the invalid response object", func(t *testing.T) { 81 httpmock.Activate() 82 defer httpmock.DeactivateAndReset() 83 httpmock.RegisterResponder(http.MethodGet, "https://registry.buildpacks.io/api/v1/buildpacks/test", httpmock.NewStringResponder(200, "not_a_json")) 84 client := &piperhttp.Client{} 85 client.SetOptions(piperhttp.ClientOptions{MaxRetries: -1, UseDefaultTransport: true}) 86 87 img, err := SearchBuildpack("test", "1.1.2", client, "") 88 89 assert.Error(t, err) 90 assert.Contains(t, err.Error(), "unable to parse response from the https://registry.buildpacks.io/api/v1/buildpacks/test, error: invalid character") 91 assert.Equal(t, "", img) 92 }) 93 }