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