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  }