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 }