github.com/jaylevin/jenkins-library@v1.230.4/pkg/cnbutils/project/descriptor_test.go (about) 1 package project 2 3 import ( 4 "net/http" 5 "testing" 6 7 "github.com/SAP/jenkins-library/pkg/cnbutils" 8 "github.com/SAP/jenkins-library/pkg/mock" 9 "github.com/jarcoal/httpmock" 10 "github.com/stretchr/testify/assert" 11 12 piperhttp "github.com/SAP/jenkins-library/pkg/http" 13 ) 14 15 func TestParseDescriptor(t *testing.T) { 16 t.Run("parses the project.toml file", func(t *testing.T) { 17 projectToml := `[project] 18 id = "io.buildpacks.my-app" 19 version = "0.1" 20 21 [build] 22 include = [ 23 "cmd/", 24 "go.mod", 25 "go.sum", 26 "*.go" 27 ] 28 29 [[build.env]] 30 name = "VAR1" 31 value = "VAL1" 32 33 [[build.env]] 34 name = "VAR2" 35 value = "VAL2" 36 37 [[build.buildpacks]] 38 id = "paketo-buildpacks/java" 39 version = "5.9.1" 40 41 [[build.buildpacks]] 42 id = "paketo-buildpacks/nodejs" 43 ` 44 utils := &cnbutils.MockUtils{ 45 FilesMock: &mock.FilesMock{}, 46 } 47 48 fakeJavaResponse := "{\"latest\":{\"version\":\"1.1.1\",\"namespace\":\"test\",\"name\":\"test\",\"description\":\"\",\"homepage\":\"\",\"licenses\":null,\"stacks\":[\"test\",\"test\"],\"id\":\"test\"},\"versions\":[{\"version\":\"5.9.1\",\"_link\":\"https://test-java/5.9.1\"}]}" 49 fakeNodeJsResponse := "{\"latest\":{\"version\":\"1.1.1\",\"namespace\":\"test\",\"name\":\"test\",\"description\":\"\",\"homepage\":\"\",\"licenses\":null,\"stacks\":[\"test\",\"test\"],\"id\":\"test\"},\"versions\":[{\"version\":\"1.1.1\",\"_link\":\"https://test-nodejs/1.1.1\"}]}" 50 51 utils.AddFile("project.toml", []byte(projectToml)) 52 httpmock.Activate() 53 defer httpmock.DeactivateAndReset() 54 httpmock.RegisterResponder(http.MethodGet, "https://registry.buildpacks.io/api/v1/buildpacks/paketo-buildpacks/java", httpmock.NewStringResponder(200, fakeJavaResponse)) 55 httpmock.RegisterResponder(http.MethodGet, "https://registry.buildpacks.io/api/v1/buildpacks/paketo-buildpacks/nodejs", httpmock.NewStringResponder(200, fakeNodeJsResponse)) 56 57 httpmock.RegisterResponder(http.MethodGet, "https://test-java/5.9.1", httpmock.NewStringResponder(200, "{\"addr\": \"index.docker.io/test-java@5.9.1\"}")) 58 httpmock.RegisterResponder(http.MethodGet, "https://test-nodejs/1.1.1", httpmock.NewStringResponder(200, "{\"addr\": \"index.docker.io/test-nodejs@1.1.1\"}")) 59 client := &piperhttp.Client{} 60 client.SetOptions(piperhttp.ClientOptions{MaxRetries: -1, UseDefaultTransport: true}) 61 62 descriptor, err := ParseDescriptor("project.toml", utils, client) 63 64 assert.NoError(t, err) 65 assert.Equal(t, descriptor.EnvVars["VAR1"], "VAL1") 66 assert.Equal(t, descriptor.EnvVars["VAR2"], "VAL2") 67 68 assert.Equal(t, descriptor.ProjectID, "io.buildpacks.my-app") 69 70 assert.Contains(t, descriptor.Buildpacks, "index.docker.io/test-java@5.9.1") 71 assert.Contains(t, descriptor.Buildpacks, "index.docker.io/test-nodejs@1.1.1") 72 73 assert.NotNil(t, descriptor.Include) 74 75 t3 := descriptor.Include.MatchesPath("cmd/cobra.go") 76 assert.True(t, t3) 77 78 t4 := descriptor.Include.MatchesPath("pkg/test/main.go") 79 assert.True(t, t4) 80 81 t5 := descriptor.Include.MatchesPath("Makefile") 82 assert.False(t, t5) 83 }) 84 85 t.Run("fails with inline buildpack", func(t *testing.T) { 86 projectToml := `[project] 87 id = "io.buildpacks.my-app" 88 version = "0.1" 89 90 [[build.buildpacks]] 91 id = "test/inline" 92 [build.buildpacks.script] 93 api = "0.5" 94 shell = "/bin/bash" 95 inline = "date" 96 ` 97 utils := &cnbutils.MockUtils{ 98 FilesMock: &mock.FilesMock{}, 99 } 100 101 utils.AddFile("project.toml", []byte(projectToml)) 102 103 _, err := ParseDescriptor("project.toml", utils, &piperhttp.Client{}) 104 105 assert.Error(t, err) 106 assert.Equal(t, "inline buildpacks are not supported", err.Error()) 107 }) 108 109 t.Run("fails with both exclude and include specified", func(t *testing.T) { 110 projectToml := `[project] 111 id = "io.buildpacks.my-app" 112 version = "0.1" 113 114 [build] 115 include = [ 116 "test" 117 ] 118 119 exclude = [ 120 "test" 121 ] 122 ` 123 124 utils := &cnbutils.MockUtils{ 125 FilesMock: &mock.FilesMock{}, 126 } 127 utils.AddFile("project.toml", []byte(projectToml)) 128 129 _, err := ParseDescriptor("project.toml", utils, &piperhttp.Client{}) 130 131 assert.Error(t, err) 132 assert.Equal(t, "project descriptor options 'exclude' and 'include' are mutually exclusive", err.Error()) 133 }) 134 135 t.Run("fails with file not found", func(t *testing.T) { 136 utils := &cnbutils.MockUtils{ 137 FilesMock: &mock.FilesMock{}, 138 } 139 140 _, err := ParseDescriptor("project.toml", utils, &piperhttp.Client{}) 141 142 assert.Error(t, err) 143 assert.Equal(t, "could not read 'project.toml'", err.Error()) 144 }) 145 146 t.Run("fails to parse corrupted project.toml", func(t *testing.T) { 147 projectToml := "test123" 148 utils := &cnbutils.MockUtils{ 149 FilesMock: &mock.FilesMock{}, 150 } 151 utils.AddFile("project.toml", []byte(projectToml)) 152 _, err := ParseDescriptor("project.toml", utils, &piperhttp.Client{}) 153 154 assert.Error(t, err) 155 assert.Equal(t, "(1, 8): was expecting token =, but got EOF instead", err.Error()) 156 }) 157 }