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

     1  package client
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	"testing"
     7  
     8  	"github.com/buildpacks/imgutil/fakes"
     9  	"github.com/heroku/color"
    10  	"github.com/sclevine/spec"
    11  	"github.com/sclevine/spec/report"
    12  
    13  	ifakes "github.com/buildpacks/pack/internal/fakes"
    14  	"github.com/buildpacks/pack/internal/registry"
    15  	"github.com/buildpacks/pack/pkg/logging"
    16  	h "github.com/buildpacks/pack/testhelpers"
    17  )
    18  
    19  func TestRegisterBuildpack(t *testing.T) {
    20  	color.Disable(true)
    21  	defer color.Disable(false)
    22  	spec.Run(t, "register_buildpack", testRegisterBuildpack, spec.Parallel(), spec.Report(report.Terminal{}))
    23  }
    24  
    25  func testRegisterBuildpack(t *testing.T, when spec.G, it spec.S) {
    26  	when("#RegisterBuildpack", func() {
    27  		var (
    28  			fakeImageFetcher *ifakes.FakeImageFetcher
    29  			fakeAppImage     *fakes.Image
    30  			subject          *Client
    31  			out              bytes.Buffer
    32  		)
    33  
    34  		it.Before(func() {
    35  			fakeImageFetcher = ifakes.NewFakeImageFetcher()
    36  			fakeAppImage = fakes.NewImage("buildpack/image", "", &fakeIdentifier{name: "buildpack-image"})
    37  
    38  			h.AssertNil(t, fakeAppImage.SetLabel("io.buildpacks.buildpackage.metadata",
    39  				`{"id":"heroku/java-function","version":"1.1.1","stacks":[{"id":"heroku-18"},{"id":"io.buildpacks.stacks.jammy"},{"id":"org.cloudfoundry.stacks.cflinuxfs3"}]}`))
    40  			fakeImageFetcher.RemoteImages["buildpack/image"] = fakeAppImage
    41  
    42  			fakeLogger := logging.NewLogWithWriters(&out, &out)
    43  			subject = &Client{
    44  				logger:       fakeLogger,
    45  				imageFetcher: fakeImageFetcher,
    46  			}
    47  		})
    48  
    49  		it.After(func() {
    50  			_ = fakeAppImage.Cleanup()
    51  		})
    52  
    53  		it("should return error for an invalid image (github)", func() {
    54  			fakeAppImage = fakes.NewImage("invalid/image", "", &fakeIdentifier{name: "buildpack-image"})
    55  			h.AssertNil(t, fakeAppImage.SetLabel("io.buildpacks.buildpackage.metadata", `{}`))
    56  
    57  			h.AssertNotNil(t, subject.RegisterBuildpack(context.TODO(),
    58  				RegisterBuildpackOptions{
    59  					ImageName: "invalid/image",
    60  					Type:      "github",
    61  					URL:       registry.DefaultRegistryURL,
    62  					Name:      registry.DefaultRegistryName,
    63  				}))
    64  		})
    65  
    66  		it("should return error for missing image label (github)", func() {
    67  			fakeAppImage = fakes.NewImage("missinglabel/image", "", &fakeIdentifier{name: "buildpack-image"})
    68  			h.AssertNil(t, fakeAppImage.SetLabel("io.buildpacks.buildpackage.metadata", `{}`))
    69  			fakeImageFetcher.RemoteImages["missinglabel/image"] = fakeAppImage
    70  
    71  			h.AssertNotNil(t, subject.RegisterBuildpack(context.TODO(),
    72  				RegisterBuildpackOptions{
    73  					ImageName: "missinglabel/image",
    74  					Type:      "github",
    75  					URL:       registry.DefaultRegistryURL,
    76  					Name:      registry.DefaultRegistryName,
    77  				}))
    78  		})
    79  
    80  		it("should throw error if missing URL (github)", func() {
    81  			h.AssertError(t, subject.RegisterBuildpack(context.TODO(),
    82  				RegisterBuildpackOptions{
    83  					ImageName: "buildpack/image",
    84  					Type:      "github",
    85  					URL:       "",
    86  					Name:      "official",
    87  				}), "missing github URL")
    88  		})
    89  
    90  		it("should throw error if missing URL (git)", func() {
    91  			h.AssertError(t, subject.RegisterBuildpack(context.TODO(),
    92  				RegisterBuildpackOptions{
    93  					ImageName: "buildpack/image",
    94  					Type:      "git",
    95  					URL:       "",
    96  					Name:      "official",
    97  				}), "invalid url: cannot parse username from url")
    98  		})
    99  
   100  		it("should throw error if using malformed URL (git)", func() {
   101  			h.AssertError(t, subject.RegisterBuildpack(context.TODO(),
   102  				RegisterBuildpackOptions{
   103  					ImageName: "buildpack/image",
   104  					Type:      "git",
   105  					URL:       "https://github.com//buildpack-registry/",
   106  					Name:      "official",
   107  				}), "invalid url: username is empty")
   108  		})
   109  
   110  		it("should return error for an invalid image (git)", func() {
   111  			fakeAppImage = fakes.NewImage("invalid/image", "", &fakeIdentifier{name: "buildpack-image"})
   112  			h.AssertNil(t, fakeAppImage.SetLabel("io.buildpacks.buildpackage.metadata", `{}`))
   113  
   114  			h.AssertNotNil(t, subject.RegisterBuildpack(context.TODO(),
   115  				RegisterBuildpackOptions{
   116  					ImageName: "invalid/image",
   117  					Type:      "git",
   118  					URL:       registry.DefaultRegistryURL,
   119  					Name:      registry.DefaultRegistryName,
   120  				}))
   121  		})
   122  
   123  		it("should return error for missing image label (git)", func() {
   124  			fakeAppImage = fakes.NewImage("missinglabel/image", "", &fakeIdentifier{name: "buildpack-image"})
   125  			h.AssertNil(t, fakeAppImage.SetLabel("io.buildpacks.buildpackage.metadata", `{}`))
   126  			fakeImageFetcher.RemoteImages["missinglabel/image"] = fakeAppImage
   127  
   128  			h.AssertNotNil(t, subject.RegisterBuildpack(context.TODO(),
   129  				RegisterBuildpackOptions{
   130  					ImageName: "missinglabel/image",
   131  					Type:      "git",
   132  					URL:       registry.DefaultRegistryURL,
   133  					Name:      registry.DefaultRegistryName,
   134  				}))
   135  		})
   136  	})
   137  }