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  }