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  }