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  }