github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/pkg/piperenv/templating_test.go (about) 1 //go:build unit 2 // +build unit 3 4 package piperenv 5 6 import ( 7 "fmt" 8 "os" 9 "path/filepath" 10 "testing" 11 12 "github.com/stretchr/testify/assert" 13 ) 14 15 func TestParseTemplate(t *testing.T) { 16 tt := []struct { 17 template string 18 cpe CPEMap 19 expected string 20 expectedError error 21 }{ 22 {template: `version: {{index .CPE "artifactVersion"}}, sha: {{git "commitId"}}`, expected: "version: 1.2.3, sha: thisIsMyTestSha"}, 23 {template: "version: {{", expectedError: fmt.Errorf("failed to parse cpe template 'version: {{'")}, 24 } 25 26 cpe := CPEMap{ 27 "artifactVersion": "1.2.3", 28 "git/commitId": "thisIsMyTestSha", 29 } 30 31 for _, test := range tt { 32 res, err := cpe.ParseTemplate(test.template) 33 if test.expectedError != nil { 34 assert.Contains(t, fmt.Sprint(err), fmt.Sprint(test.expectedError)) 35 } else { 36 assert.NoError(t, err) 37 assert.Equal(t, test.expected, (*res).String()) 38 } 39 40 } 41 } 42 43 func TestParseTemplateWithDelimiter(t *testing.T) { 44 tt := []struct { 45 template string 46 cpe CPEMap 47 expected string 48 expectedError error 49 }{ 50 {template: `version: [[index .CPE "artifactVersion"]], sha: [[git "commitId"]]`, expected: "version: 1.2.3, sha: thisIsMyTestSha"}, 51 {template: "version: [[", expectedError: fmt.Errorf("failed to parse cpe template 'version: [['")}, 52 {template: `version: [[index .CPE "artifactVersion"]], release: {{ .RELEASE }}`, expected: "version: 1.2.3, release: {{ .RELEASE }}"}, 53 } 54 55 cpe := CPEMap{ 56 "artifactVersion": "1.2.3", 57 "git/commitId": "thisIsMyTestSha", 58 } 59 60 for _, test := range tt { 61 res, err := cpe.ParseTemplateWithDelimiter(test.template, "[[", "]]") 62 if test.expectedError != nil { 63 assert.Contains(t, fmt.Sprint(err), fmt.Sprint(test.expectedError)) 64 } else { 65 assert.NoError(t, err) 66 assert.Equal(t, test.expected, (*res).String()) 67 } 68 69 } 70 } 71 72 func TestTemplateFunctionCpe(t *testing.T) { 73 t.Run("CPE from object", func(t *testing.T) { 74 tt := []struct { 75 element string 76 expected string 77 }{ 78 {element: "artifactVersion", expected: "1.2.3"}, 79 {element: "git/commitId", expected: "thisIsMyTestSha"}, 80 } 81 82 cpe := CPEMap{ 83 "artifactVersion": "1.2.3", 84 "git/commitId": "thisIsMyTestSha", 85 } 86 87 for _, test := range tt { 88 assert.Equal(t, test.expected, cpe.cpe(test.element)) 89 } 90 }) 91 92 t.Run("CPE from files", func(t *testing.T) { 93 theVersion := "1.2.3" 94 dir := t.TempDir() 95 assert.NoError(t, os.WriteFile(filepath.Join(dir, "artifactVersion"), []byte(theVersion), 0o666)) 96 cpe := CPEMap{} 97 assert.NoError(t, cpe.LoadFromDisk(dir)) 98 99 res, err := cpe.ParseTemplate(`{{cpe "artifactVersion"}}`) 100 assert.NoError(t, err) 101 assert.Equal(t, theVersion, (*res).String()) 102 }) 103 } 104 105 func TestTemplateFunctionCustom(t *testing.T) { 106 tt := []struct { 107 element string 108 expected string 109 }{ 110 {element: "repositoryUrl", expected: "https://this.is.the.repo.url"}, 111 {element: "repositoryId", expected: "repoTestId"}, 112 } 113 114 cpe := CPEMap{ 115 "custom/repositoryUrl": "https://this.is.the.repo.url", 116 "custom/repositoryId": "repoTestId", 117 } 118 119 for _, test := range tt { 120 assert.Equal(t, test.expected, cpe.custom(test.element)) 121 } 122 } 123 124 func TestTemplateFunctionGit(t *testing.T) { 125 tt := []struct { 126 element string 127 expected string 128 }{ 129 {element: "commitId", expected: "thisIsMyTestSha"}, 130 {element: "repository", expected: "testRepo"}, 131 } 132 133 cpe := CPEMap{ 134 "git/commitId": "thisIsMyTestSha", 135 "github/repository": "testRepo", 136 } 137 138 for _, test := range tt { 139 assert.Equal(t, test.expected, cpe.git(test.element)) 140 } 141 } 142 143 func TestTemplateFunctionImageDigest(t *testing.T) { 144 t.Run("CPE from object", func(t *testing.T) { 145 tt := []struct { 146 imageName string 147 cpe CPEMap 148 expected string 149 }{ 150 { 151 imageName: "image1", 152 cpe: CPEMap{}, 153 expected: "", 154 }, 155 { 156 imageName: "image2", 157 cpe: CPEMap{ 158 "container/imageDigests": []interface{}{"digest1", "digest2", "digest3"}, 159 "container/imageNames": []interface{}{"image1", "image2", "image3"}, 160 }, 161 expected: "digest2", 162 }, 163 { 164 imageName: "image4", 165 cpe: CPEMap{ 166 "container/imageDigests": []interface{}{"digest1", "digest2", "digest3"}, 167 "container/imageNames": []interface{}{"image1", "image2", "image3"}, 168 }, 169 expected: "", 170 }, 171 { 172 imageName: "image1", 173 cpe: CPEMap{ 174 "container/imageDigests": []interface{}{"digest1", "digest3"}, 175 "container/imageNames": []interface{}{"image1", "image2", "image3"}, 176 }, 177 expected: "", 178 }, 179 } 180 181 for _, test := range tt { 182 assert.Equal(t, test.expected, test.cpe.imageDigest(test.imageName)) 183 } 184 }) 185 186 t.Run("CPE from files", func(t *testing.T) { 187 dir := t.TempDir() 188 189 imageDigests := []string{"digest1", "digest2", "digest3"} 190 imageNames := []string{"image1", "image2", "image3"} 191 cpeOut := CPEMap{"container/imageDigests": imageDigests, "container/imageNames": imageNames} 192 assert.NoError(t, cpeOut.WriteToDisk(dir)) 193 194 cpe := CPEMap{} 195 assert.NoError(t, cpe.LoadFromDisk(dir)) 196 197 res, err := cpe.ParseTemplate(`{{imageDigest "image2"}}`) 198 assert.NoError(t, err) 199 assert.Equal(t, "digest2", (*res).String()) 200 }) 201 } 202 203 func TestTemplateFunctionImageTag(t *testing.T) { 204 t.Run("CPE from object", func(t *testing.T) { 205 tt := []struct { 206 imageName string 207 cpe CPEMap 208 expected string 209 }{ 210 { 211 imageName: "image1", 212 cpe: CPEMap{}, 213 expected: "", 214 }, 215 { 216 imageName: "image2", 217 cpe: CPEMap{ 218 "container/imageNameTags": []interface{}{"image1:tag1", "image2:tag2", "image3:tag3"}, 219 }, 220 expected: "tag2", 221 }, 222 { 223 imageName: "image4", 224 cpe: CPEMap{ 225 "container/imageNameTags": []interface{}{"image1:tag1", "image2:tag2", "image3:tag3"}, 226 }, 227 expected: "", 228 }, 229 } 230 231 for _, test := range tt { 232 assert.Equal(t, test.expected, test.cpe.imageTag(test.imageName)) 233 } 234 }) 235 236 t.Run("CPE from files", func(t *testing.T) { 237 dir := t.TempDir() 238 239 imageNameTags := []string{"image1:tag1", "image2:tag2", "image3:tag3"} 240 imageNames := []string{"image1", "image2", "image3"} 241 cpeOut := CPEMap{"container/imageNameTags": imageNameTags, "container/imageNames": imageNames} 242 assert.NoError(t, cpeOut.WriteToDisk(dir)) 243 244 cpe := CPEMap{} 245 assert.NoError(t, cpe.LoadFromDisk(dir)) 246 247 res, err := cpe.ParseTemplate(`{{imageTag "image2"}}`) 248 assert.NoError(t, err) 249 assert.Equal(t, "tag2", (*res).String()) 250 }) 251 }