github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/pkg/cnbutils/order_test.go (about) 1 //go:build unit 2 // +build unit 3 4 package cnbutils_test 5 6 import ( 7 "fmt" 8 "testing" 9 10 "github.com/SAP/jenkins-library/pkg/cnbutils" 11 "github.com/SAP/jenkins-library/pkg/mock" 12 v1 "github.com/google/go-containerregistry/pkg/v1" 13 "github.com/google/go-containerregistry/pkg/v1/fake" 14 "github.com/stretchr/testify/assert" 15 ) 16 17 func TestOrderSave(t *testing.T) { 18 t.Run("successfully Encode struct to toml format (multiple buildpacks)", func(t *testing.T) { 19 mockUtils := &cnbutils.MockUtils{ 20 ExecMockRunner: &mock.ExecMockRunner{}, 21 FilesMock: &mock.FilesMock{}, 22 } 23 24 testBuildpacks := []cnbutils.BuildPackMetadata{ 25 { 26 ID: "paketo-buildpacks/sap-machine", 27 Version: "1.1.1", 28 }, 29 { 30 ID: "paketo-buildpacks/java", 31 Version: "2.2.2", 32 }, 33 } 34 testOrder := cnbutils.Order{ 35 Utils: mockUtils, 36 } 37 38 var testEntry cnbutils.OrderEntry 39 testEntry.Group = append(testEntry.Group, testBuildpacks...) 40 testOrder.Order = []cnbutils.OrderEntry{testEntry} 41 42 err := testOrder.Save("/tmp/order.toml") 43 44 assert.NoError(t, err) 45 assert.True(t, mockUtils.HasWrittenFile("/tmp/order.toml")) 46 result, err := mockUtils.FileRead("/tmp/order.toml") 47 assert.NoError(t, err) 48 assert.Equal(t, "[[order]]\n\n [[order.group]]\n id = \"paketo-buildpacks/sap-machine\"\n version = \"1.1.1\"\n\n [[order.group]]\n id = \"paketo-buildpacks/java\"\n version = \"2.2.2\"\n", string(result)) 49 }) 50 51 t.Run("raises an error if unable to write the file", func(t *testing.T) { 52 mockUtils := &cnbutils.MockUtils{ 53 ExecMockRunner: &mock.ExecMockRunner{}, 54 FilesMock: &mock.FilesMock{}, 55 } 56 mockUtils.FileWriteErrors = map[string]error{ 57 "/tmp/order.toml": fmt.Errorf("unable to write to file"), 58 } 59 testOrder := cnbutils.Order{ 60 Utils: mockUtils, 61 } 62 63 err := testOrder.Save("/tmp/order.toml") 64 65 assert.Error(t, err, "unable to write to file") 66 assert.False(t, mockUtils.HasWrittenFile("/tmp/order.toml")) 67 }) 68 } 69 70 func TestCreateOrder(t *testing.T) { 71 imageStub := func(imageRef, target string) (v1.Image, error) { 72 fakeImage := &fake.FakeImage{} 73 var imageConfig v1.Config 74 switch imageRef { 75 case "pre-buildpack": 76 imageConfig = v1.Config{ 77 Labels: map[string]string{ 78 "io.buildpacks.buildpackage.metadata": "{\"id\": \"pre-testbuildpack\", \"version\": \"0.0.1\"}", 79 }, 80 } 81 case "post-buildpack": 82 imageConfig = v1.Config{ 83 Labels: map[string]string{ 84 "io.buildpacks.buildpackage.metadata": "{\"id\": \"post-testbuildpack\", \"version\": \"0.0.1\"}", 85 }, 86 } 87 default: 88 imageConfig = v1.Config{ 89 Labels: map[string]string{ 90 "io.buildpacks.buildpackage.metadata": "{\"id\": \"testbuildpack\", \"version\": \"0.0.1\"}", 91 }, 92 } 93 } 94 95 fakeImage.ConfigFileReturns(&v1.ConfigFile{ 96 Config: imageConfig, 97 }, nil) 98 99 return fakeImage, nil 100 } 101 102 mockUtils := &cnbutils.MockUtils{ 103 FilesMock: &mock.FilesMock{}, 104 DownloadMock: &mock.DownloadMock{ 105 ImageContentStub: imageStub, 106 ImageInfoStub: func(imageRef string) (v1.Image, error) { 107 return imageStub(imageRef, "") 108 }, 109 }, 110 } 111 112 mockUtils.AddFile(cnbutils.DefaultOrderPath, []byte(`[[order]] 113 [[order.group]] 114 id = "buildpacks/java" 115 version = "1.8.0" 116 [[order]] 117 [[order.group]] 118 id = "buildpacks/nodejs" 119 version = "1.6.0"`)) 120 121 t.Run("successfully loads baked in order.toml", func(t *testing.T) { 122 order, err := cnbutils.CreateOrder(nil, nil, nil, "", mockUtils) 123 assert.NoError(t, err) 124 assert.Equal(t, []cnbutils.OrderEntry{ 125 { 126 Group: []cnbutils.BuildPackMetadata{ 127 { 128 ID: "buildpacks/java", 129 Version: "1.8.0", 130 }, 131 }, 132 }, 133 { 134 Group: []cnbutils.BuildPackMetadata{ 135 { 136 ID: "buildpacks/nodejs", 137 Version: "1.6.0", 138 }, 139 }, 140 }, 141 }, order.Order) 142 }) 143 144 t.Run("successfully loads baked in order.toml and adds pre/post buildpacks", func(t *testing.T) { 145 order, err := cnbutils.CreateOrder(nil, []string{"pre-buildpack"}, []string{"post-buildpack"}, "", mockUtils) 146 assert.NoError(t, err) 147 assert.Equal(t, []cnbutils.OrderEntry{ 148 { 149 Group: []cnbutils.BuildPackMetadata{ 150 { 151 ID: "pre-testbuildpack", 152 Version: "0.0.1", 153 }, 154 { 155 ID: "buildpacks/java", 156 Version: "1.8.0", 157 }, 158 { 159 ID: "post-testbuildpack", 160 Version: "0.0.1", 161 }, 162 }, 163 }, 164 { 165 Group: []cnbutils.BuildPackMetadata{ 166 { 167 ID: "pre-testbuildpack", 168 Version: "0.0.1", 169 }, 170 { 171 ID: "buildpacks/nodejs", 172 Version: "1.6.0", 173 }, 174 { 175 ID: "post-testbuildpack", 176 Version: "0.0.1", 177 }, 178 }, 179 }, 180 }, order.Order) 181 }) 182 183 t.Run("successfully creates new order with custom buildpacks", func(t *testing.T) { 184 order, err := cnbutils.CreateOrder([]string{"testbuildpack"}, nil, nil, "", mockUtils) 185 assert.NoError(t, err) 186 assert.Equal(t, []cnbutils.OrderEntry{ 187 { 188 Group: []cnbutils.BuildPackMetadata{ 189 { 190 ID: "testbuildpack", 191 Version: "0.0.1", 192 }, 193 }, 194 }, 195 }, order.Order) 196 }) 197 198 t.Run("successfully creates new order with custom buildpacks and adds pre/post buildpacks", func(t *testing.T) { 199 order, err := cnbutils.CreateOrder([]string{"testbuildpack"}, []string{"pre-buildpack"}, []string{"post-buildpack"}, "", mockUtils) 200 assert.NoError(t, err) 201 assert.Equal(t, []cnbutils.OrderEntry{ 202 { 203 Group: []cnbutils.BuildPackMetadata{ 204 { 205 ID: "pre-testbuildpack", 206 Version: "0.0.1", 207 }, 208 { 209 ID: "testbuildpack", 210 Version: "0.0.1", 211 }, 212 { 213 ID: "post-testbuildpack", 214 Version: "0.0.1", 215 }, 216 }, 217 }, 218 }, order.Order) 219 }) 220 }