github.com/amane3/goreleaser@v0.182.0/internal/tmpl/tmpl_test.go (about) 1 package tmpl 2 3 import ( 4 "os" 5 "path/filepath" 6 "testing" 7 "text/template" 8 9 "github.com/amane3/goreleaser/internal/artifact" 10 "github.com/amane3/goreleaser/pkg/config" 11 "github.com/amane3/goreleaser/pkg/context" 12 "github.com/stretchr/testify/require" 13 ) 14 15 func TestWithArtifact(t *testing.T) { 16 var ctx = context.New(config.Project{ 17 ProjectName: "proj", 18 }) 19 ctx.Env = map[string]string{ 20 "FOO": "bar", 21 } 22 ctx.Version = "1.2.3" 23 ctx.Git.CurrentTag = "v1.2.3" 24 ctx.Semver = context.Semver{ 25 Major: 1, 26 Minor: 2, 27 Patch: 3, 28 } 29 ctx.Git.Branch = "test-branch" 30 ctx.Git.Commit = "commit" 31 ctx.Git.FullCommit = "fullcommit" 32 ctx.Git.ShortCommit = "shortcommit" 33 for expect, tmpl := range map[string]string{ 34 "bar": "{{.Env.FOO}}", 35 "Linux": "{{.Os}}", 36 "amd64": "{{.Arch}}", 37 "6": "{{.Arm}}", 38 "softfloat": "{{.Mips}}", 39 "1.2.3": "{{.Version}}", 40 "v1.2.3": "{{.Tag}}", 41 "1-2-3": "{{.Major}}-{{.Minor}}-{{.Patch}}", 42 "test-branch": "{{.Branch}}", 43 "commit": "{{.Commit}}", 44 "fullcommit": "{{.FullCommit}}", 45 "shortcommit": "{{.ShortCommit}}", 46 "binary": "{{.Binary}}", 47 "proj": "{{.ProjectName}}", 48 "": "{{.ArtifactUploadHash}}", 49 } { 50 tmpl := tmpl 51 expect := expect 52 t.Run(expect, func(tt *testing.T) { 53 tt.Parallel() 54 result, err := New(ctx).WithArtifact( 55 &artifact.Artifact{ 56 Name: "not-this-binary", 57 Goarch: "amd64", 58 Goos: "linux", 59 Goarm: "6", 60 Gomips: "softfloat", 61 Extra: map[string]interface{}{ 62 "Binary": "binary", 63 }, 64 }, 65 map[string]string{"linux": "Linux"}, 66 ).Apply(tmpl) 67 require.NoError(tt, err) 68 require.Equal(tt, expect, result) 69 }) 70 } 71 72 t.Run("artifact with gitlab ArtifactUploadHash", func(tt *testing.T) { 73 tt.Parallel() 74 uploadHash := "820ead5d9d2266c728dce6d4d55b6460" 75 result, err := New(ctx).WithArtifact( 76 &artifact.Artifact{ 77 Name: "another-binary", 78 Goarch: "amd64", 79 Goos: "linux", 80 Goarm: "6", 81 Extra: map[string]interface{}{ 82 "ArtifactUploadHash": uploadHash, 83 }, 84 }, map[string]string{}, 85 ).Apply("{{ .ArtifactUploadHash }}") 86 require.NoError(tt, err) 87 require.Equal(tt, uploadHash, result) 88 }) 89 90 t.Run("artifact without binary name", func(tt *testing.T) { 91 tt.Parallel() 92 result, err := New(ctx).WithArtifact( 93 &artifact.Artifact{ 94 Name: "another-binary", 95 Goarch: "amd64", 96 Goos: "linux", 97 Goarm: "6", 98 }, map[string]string{}, 99 ).Apply("{{ .Binary }}") 100 require.NoError(tt, err) 101 require.Equal(tt, ctx.Config.ProjectName, result) 102 }) 103 104 t.Run("template using artifact Fields with no artifact", func(tt *testing.T) { 105 tt.Parallel() 106 result, err := New(ctx).Apply("{{ .Os }}") 107 require.EqualError(tt, err, `template: tmpl:1:3: executing "tmpl" at <.Os>: map has no entry for key "Os"`) 108 require.Empty(tt, result) 109 }) 110 } 111 112 func TestEnv(t *testing.T) { 113 testCases := []struct { 114 desc string 115 in string 116 out string 117 }{ 118 { 119 desc: "with env", 120 in: "{{ .Env.FOO }}", 121 out: "BAR", 122 }, 123 { 124 desc: "with env", 125 in: "{{ .Env.BAR }}", 126 out: "", 127 }, 128 } 129 var ctx = context.New(config.Project{}) 130 ctx.Env = map[string]string{ 131 "FOO": "BAR", 132 } 133 ctx.Git.CurrentTag = "v1.2.3" 134 for _, tC := range testCases { 135 t.Run(tC.desc, func(t *testing.T) { 136 out, _ := New(ctx).Apply(tC.in) 137 require.Equal(t, tC.out, out) 138 }) 139 } 140 } 141 142 func TestWithEnv(t *testing.T) { 143 var ctx = context.New(config.Project{}) 144 ctx.Env = map[string]string{ 145 "FOO": "BAR", 146 } 147 ctx.Git.CurrentTag = "v1.2.3" 148 out, err := New(ctx).WithEnvS([]string{ 149 "FOO=foo", 150 "BAR=bar", 151 }).Apply("{{ .Env.FOO }}-{{ .Env.BAR }}") 152 require.NoError(t, err) 153 require.Equal(t, "foo-bar", out) 154 } 155 156 func TestFuncMap(t *testing.T) { 157 var ctx = context.New(config.Project{ 158 ProjectName: "proj", 159 }) 160 wd, err := os.Getwd() 161 require.NoError(t, err) 162 163 ctx.Git.CurrentTag = "v1.2.4" 164 for _, tc := range []struct { 165 Template string 166 Name string 167 Expected string 168 }{ 169 { 170 Template: `{{ replace "v1.24" "v" "" }}`, 171 Name: "replace", 172 Expected: "1.24", 173 }, 174 { 175 Template: `{{ time "2006-01-02" }}`, 176 Name: "time YYYY-MM-DD", 177 }, 178 { 179 Template: `{{ time "01/02/2006" }}`, 180 Name: "time MM/DD/YYYY", 181 }, 182 { 183 Template: `{{ time "01/02/2006" }}`, 184 Name: "time MM/DD/YYYY", 185 }, 186 { 187 Template: `{{ tolower "TEST" }}`, 188 Name: "tolower", 189 Expected: "test", 190 }, 191 { 192 Template: `{{ toupper "test" }}`, 193 Name: "toupper", 194 Expected: "TEST", 195 }, 196 { 197 Template: `{{ trim " test " }}`, 198 Name: "trim", 199 Expected: "test", 200 }, 201 { 202 Template: `{{ abs "file" }}`, 203 Name: "abs", 204 Expected: filepath.Join(wd, "file"), 205 }, 206 } { 207 out, err := New(ctx).Apply(tc.Template) 208 require.NoError(t, err) 209 if tc.Expected != "" { 210 require.Equal(t, tc.Expected, out) 211 } else { 212 require.NotEmpty(t, out) 213 } 214 } 215 } 216 217 func TestApplySingleEnvOnly(t *testing.T) { 218 ctx := context.New(config.Project{ 219 Env: []string{ 220 "FOO=value", 221 "BAR=another", 222 }, 223 }) 224 225 testCases := []struct { 226 name string 227 tpl string 228 expectedErr error 229 }{ 230 { 231 "empty tpl", 232 "", 233 nil, 234 }, 235 { 236 "whitespaces", 237 " ", 238 nil, 239 }, 240 { 241 "plain-text only", 242 "raw-token", 243 ExpectedSingleEnvErr{}, 244 }, 245 { 246 "variable with spaces", 247 "{{ .Env.FOO }}", 248 nil, 249 }, 250 { 251 "variable without spaces", 252 "{{.Env.FOO}}", 253 nil, 254 }, 255 { 256 "variable with outer spaces", 257 " {{ .Env.FOO }} ", 258 nil, 259 }, 260 { 261 "unknown variable", 262 "{{ .Env.UNKNOWN }}", 263 template.ExecError{}, 264 }, 265 { 266 "other interpolation", 267 "{{ .ProjectName }}", 268 ExpectedSingleEnvErr{}, 269 }, 270 } 271 for _, tc := range testCases { 272 t.Run(tc.name, func(t *testing.T) { 273 _, err := New(ctx).ApplySingleEnvOnly(tc.tpl) 274 if tc.expectedErr != nil { 275 require.Error(t, err) 276 } else { 277 require.NoError(t, err) 278 } 279 }) 280 } 281 } 282 283 func TestInvalidTemplate(t *testing.T) { 284 ctx := context.New(config.Project{}) 285 ctx.Git.CurrentTag = "v1.1.1" 286 _, err := New(ctx).Apply("{{{.Foo}") 287 require.EqualError(t, err, "template: tmpl:1: unexpected \"{\" in command") 288 } 289 290 func TestEnvNotFound(t *testing.T) { 291 var ctx = context.New(config.Project{}) 292 ctx.Git.CurrentTag = "v1.2.4" 293 result, err := New(ctx).Apply("{{.Env.FOO}}") 294 require.Empty(t, result) 295 require.EqualError(t, err, `template: tmpl:1:6: executing "tmpl" at <.Env.FOO>: map has no entry for key "FOO"`) 296 } 297 298 func TestWithExtraFields(t *testing.T) { 299 var ctx = context.New(config.Project{}) 300 out, _ := New(ctx).WithExtraFields(Fields{ 301 "MyCustomField": "foo", 302 }).Apply("{{ .MyCustomField }}") 303 require.Equal(t, "foo", out) 304 305 }