github.com/buildpacks/pack@v0.33.3-0.20240516162812-884dd1837311/pkg/client/yank_buildpack_test.go (about)

     1  package client
     2  
     3  import (
     4  	"bytes"
     5  	"testing"
     6  
     7  	"github.com/buildpacks/imgutil/fakes"
     8  	"github.com/heroku/color"
     9  	"github.com/sclevine/spec"
    10  	"github.com/sclevine/spec/report"
    11  
    12  	ifakes "github.com/buildpacks/pack/internal/fakes"
    13  	"github.com/buildpacks/pack/pkg/logging"
    14  	h "github.com/buildpacks/pack/testhelpers"
    15  )
    16  
    17  func TestYankBuildpack(t *testing.T) {
    18  	color.Disable(true)
    19  	defer color.Disable(false)
    20  	spec.Run(t, "yank_buildpack", testYankBuildpack, spec.Parallel(), spec.Report(report.Terminal{}))
    21  }
    22  
    23  func testYankBuildpack(t *testing.T, when spec.G, it spec.S) {
    24  	when("#YankBuildpack", func() {
    25  		var (
    26  			fakeImageFetcher *ifakes.FakeImageFetcher
    27  			fakeAppImage     *fakes.Image
    28  			subject          *Client
    29  			out              bytes.Buffer
    30  		)
    31  
    32  		it.Before(func() {
    33  			fakeImageFetcher = ifakes.NewFakeImageFetcher()
    34  			fakeAppImage = fakes.NewImage("buildpack/image", "", &fakeIdentifier{name: "buildpack-image"})
    35  
    36  			h.AssertNil(t, fakeAppImage.SetLabel("io.buildpacks.buildpackage.metadata",
    37  				`{"id":"heroku/java-function","version":"1.1.1","stacks":[{"id":"heroku-18"},{"id":"io.buildpacks.stacks.jammy"},{"id":"org.cloudfoundry.stacks.cflinuxfs3"}]}`))
    38  			fakeImageFetcher.RemoteImages["buildpack/image"] = fakeAppImage
    39  
    40  			fakeLogger := logging.NewLogWithWriters(&out, &out)
    41  			subject = &Client{
    42  				logger:       fakeLogger,
    43  				imageFetcher: fakeImageFetcher,
    44  			}
    45  		})
    46  
    47  		it.After(func() {
    48  			_ = fakeAppImage.Cleanup()
    49  		})
    50  
    51  		it("should return error for missing namespace id", func() {
    52  			err := subject.YankBuildpack(YankBuildpackOptions{
    53  				ID: "hello",
    54  			})
    55  			h.AssertError(t, err, "invalid id 'hello' does not contain a namespace")
    56  		})
    57  
    58  		it("should return error for invalid id", func() {
    59  			err := subject.YankBuildpack(YankBuildpackOptions{
    60  				ID: "bad/id/name",
    61  			})
    62  			h.AssertError(t, err, "invalid id 'bad/id/name' contains unexpected characters")
    63  		})
    64  
    65  		it("should return error when URL is missing", func() {
    66  			err := subject.YankBuildpack(YankBuildpackOptions{
    67  				ID:      "heroku/java",
    68  				Version: "0.2.1",
    69  				Type:    "github",
    70  				URL:     "",
    71  			})
    72  			h.AssertError(t, err, "missing github URL")
    73  		})
    74  
    75  		it("should return error when URL is invalid", func() {
    76  			err := subject.YankBuildpack(YankBuildpackOptions{
    77  				ID:      "heroku/java",
    78  				Version: "0.2.1",
    79  				Type:    "github",
    80  				URL:     "bad url",
    81  			})
    82  			h.AssertNotNil(t, err)
    83  			h.AssertContains(t, err.Error(), "invalid URI for request")
    84  		})
    85  	})
    86  }