github.com/goreleaser/goreleaser@v1.25.1/internal/archivefiles/archivefiles_test.go (about)

     1  package archivefiles
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	"github.com/goreleaser/goreleaser/internal/testctx"
     8  	"github.com/goreleaser/goreleaser/internal/testlib"
     9  	"github.com/goreleaser/goreleaser/internal/tmpl"
    10  	"github.com/goreleaser/goreleaser/pkg/config"
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  func TestEval(t *testing.T) {
    15  	now := time.Now().Truncate(time.Second)
    16  	ctx := testctx.NewWithCfg(config.Project{
    17  		Env: []string{"OWNER=carlos", "FOLDER=d"},
    18  	})
    19  	ctx.Git.CommitDate = now
    20  	tmpl := tmpl.New(ctx)
    21  
    22  	t.Run("invalid glob", func(t *testing.T) {
    23  		_, err := Eval(tmpl, []config.File{
    24  			{
    25  				Source:      "../testdata/**/nope.txt",
    26  				Destination: "var/foobar/d.txt",
    27  			},
    28  		})
    29  		require.Error(t, err)
    30  	})
    31  
    32  	t.Run("templated src", func(t *testing.T) {
    33  		result, err := Eval(tmpl, []config.File{
    34  			{
    35  				Source:      "./testdata/**/{{ .Env.FOLDER }}.txt",
    36  				Destination: "var/foobar/",
    37  			},
    38  		})
    39  		require.NoError(t, err)
    40  		require.Equal(t, []config.File{
    41  			{
    42  				Source:      "testdata/a/b/c/d.txt",
    43  				Destination: "var/foobar/d.txt",
    44  			},
    45  		}, result)
    46  	})
    47  
    48  	t.Run("templated src error", func(t *testing.T) {
    49  		_, err := Eval(tmpl, []config.File{
    50  			{
    51  				Source:      "./testdata/**/{{ .Env.NOPE }}.txt",
    52  				Destination: "var/foobar/d.txt",
    53  			},
    54  		})
    55  		testlib.RequireTemplateError(t, err)
    56  	})
    57  
    58  	t.Run("templated info", func(t *testing.T) {
    59  		result, err := Eval(tmpl, []config.File{
    60  			{
    61  				Source:      "./testdata/**/d.txt",
    62  				Destination: "var/foobar/",
    63  				Info: config.FileInfo{
    64  					MTime: "{{.CommitDate}}",
    65  					Owner: "{{ .Env.OWNER }}",
    66  					Group: "{{ .Env.OWNER }}",
    67  				},
    68  			},
    69  		})
    70  
    71  		require.NoError(t, err)
    72  		require.Equal(t, []config.File{
    73  			{
    74  				Source:      "testdata/a/b/c/d.txt",
    75  				Destination: "var/foobar/d.txt",
    76  				Info: config.FileInfo{
    77  					MTime:       now.UTC().Format(time.RFC3339),
    78  					ParsedMTime: now.UTC(),
    79  					Owner:       "carlos",
    80  					Group:       "carlos",
    81  				},
    82  			},
    83  		}, result)
    84  	})
    85  
    86  	t.Run("template info errors", func(t *testing.T) {
    87  		t.Run("owner", func(t *testing.T) {
    88  			_, err := Eval(tmpl, []config.File{{
    89  				Source:      "./testdata/**/d.txt",
    90  				Destination: "var/foobar",
    91  				Info: config.FileInfo{
    92  					Owner: "{{ .Env.NOPE }}",
    93  				},
    94  			}})
    95  			testlib.RequireTemplateError(t, err)
    96  		})
    97  		t.Run("group", func(t *testing.T) {
    98  			_, err := Eval(tmpl, []config.File{{
    99  				Source:      "./testdata/**/d.txt",
   100  				Destination: "var/foobar",
   101  				Info: config.FileInfo{
   102  					Group: "{{ .Env.NOPE }}",
   103  				},
   104  			}})
   105  			testlib.RequireTemplateError(t, err)
   106  		})
   107  		t.Run("mtime", func(t *testing.T) {
   108  			_, err := Eval(tmpl, []config.File{{
   109  				Source:      "./testdata/**/d.txt",
   110  				Destination: "var/foobar",
   111  				Info: config.FileInfo{
   112  					MTime: "{{ .Env.NOPE }}",
   113  				},
   114  			}})
   115  			testlib.RequireTemplateError(t, err)
   116  		})
   117  		t.Run("mtime format", func(t *testing.T) {
   118  			_, err := Eval(tmpl, []config.File{{
   119  				Source:      "./testdata/**/d.txt",
   120  				Destination: "var/foobar",
   121  				Info: config.FileInfo{
   122  					MTime: "2005-123-123",
   123  				},
   124  			}})
   125  			require.Error(t, err)
   126  		})
   127  	})
   128  
   129  	t.Run("single file", func(t *testing.T) {
   130  		result, err := Eval(tmpl, []config.File{
   131  			{
   132  				Source:      "./testdata/**/d.txt",
   133  				Destination: "var/foobar",
   134  			},
   135  		})
   136  
   137  		require.NoError(t, err)
   138  		require.Equal(t, []config.File{
   139  			{
   140  				Source:      "testdata/a/b/c/d.txt",
   141  				Destination: "var/foobar/d.txt",
   142  			},
   143  		}, result)
   144  	})
   145  
   146  	t.Run("rlcp", func(t *testing.T) {
   147  		result, err := Eval(tmpl, []config.File{{
   148  			Source:      "./testdata/a/**/*",
   149  			Destination: "foo/bar",
   150  		}})
   151  
   152  		require.NoError(t, err)
   153  		require.Equal(t, []config.File{
   154  			{Source: "testdata/a/b/a.txt", Destination: "foo/bar/a.txt"},
   155  			{Source: "testdata/a/b/c/d.txt", Destination: "foo/bar/c/d.txt"},
   156  		}, result)
   157  	})
   158  
   159  	t.Run("rlcp empty destination", func(t *testing.T) {
   160  		result, err := Eval(tmpl, []config.File{{
   161  			Source: "./testdata/a/**/*",
   162  		}})
   163  
   164  		require.NoError(t, err)
   165  		require.Equal(t, []config.File{
   166  			{Source: "testdata/a/b/a.txt", Destination: "testdata/a/b/a.txt"},
   167  			{Source: "testdata/a/b/c/d.txt", Destination: "testdata/a/b/c/d.txt"},
   168  		}, result)
   169  	})
   170  
   171  	t.Run("rlcp no results", func(t *testing.T) {
   172  		result, err := Eval(tmpl, []config.File{{
   173  			Source:      "./testdata/abc/**/*",
   174  			Destination: "foo/bar",
   175  		}})
   176  
   177  		require.NoError(t, err)
   178  		require.Empty(t, result)
   179  	})
   180  
   181  	t.Run("strip parent plays nicely with destination omitted", func(t *testing.T) {
   182  		result, err := Eval(tmpl, []config.File{{Source: "./testdata/a/b", StripParent: true}})
   183  
   184  		require.NoError(t, err)
   185  		require.Equal(t, []config.File{
   186  			{Source: "testdata/a/b/a.txt", Destination: "a.txt"},
   187  			{Source: "testdata/a/b/c/d.txt", Destination: "d.txt"},
   188  		}, result)
   189  	})
   190  
   191  	t.Run("strip parent plays nicely with destination as an empty string", func(t *testing.T) {
   192  		result, err := Eval(tmpl, []config.File{{Source: "./testdata/a/b", Destination: "", StripParent: true}})
   193  
   194  		require.NoError(t, err)
   195  		require.Equal(t, []config.File{
   196  			{Source: "testdata/a/b/a.txt", Destination: "a.txt"},
   197  			{Source: "testdata/a/b/c/d.txt", Destination: "d.txt"},
   198  		}, result)
   199  	})
   200  
   201  	t.Run("match multiple files within tree without destination", func(t *testing.T) {
   202  		result, err := Eval(tmpl, []config.File{{Source: "./testdata/a"}})
   203  
   204  		require.NoError(t, err)
   205  		require.Equal(t, []config.File{
   206  			{Source: "testdata/a/a.txt", Destination: "testdata/a/a.txt"},
   207  			{Source: "testdata/a/b/a.txt", Destination: "testdata/a/b/a.txt"},
   208  			{Source: "testdata/a/b/c/d.txt", Destination: "testdata/a/b/c/d.txt"},
   209  		}, result)
   210  	})
   211  
   212  	t.Run("match multiple files within tree specific destination", func(t *testing.T) {
   213  		result, err := Eval(tmpl, []config.File{
   214  			{
   215  				Source:      "./testdata/a",
   216  				Destination: "usr/local/test",
   217  				Info: config.FileInfo{
   218  					Owner:       "carlos",
   219  					Group:       "users",
   220  					Mode:        0o755,
   221  					ParsedMTime: now,
   222  				},
   223  			},
   224  		})
   225  
   226  		require.NoError(t, err)
   227  		require.Equal(t, []config.File{
   228  			{
   229  				Source:      "testdata/a/a.txt",
   230  				Destination: "usr/local/test/a.txt",
   231  				Info: config.FileInfo{
   232  					Owner:       "carlos",
   233  					Group:       "users",
   234  					Mode:        0o755,
   235  					ParsedMTime: now,
   236  				},
   237  			},
   238  			{
   239  				Source:      "testdata/a/b/a.txt",
   240  				Destination: "usr/local/test/b/a.txt",
   241  				Info: config.FileInfo{
   242  					Owner:       "carlos",
   243  					Group:       "users",
   244  					Mode:        0o755,
   245  					ParsedMTime: now,
   246  				},
   247  			},
   248  			{
   249  				Source:      "testdata/a/b/c/d.txt",
   250  				Destination: "usr/local/test/b/c/d.txt",
   251  				Info: config.FileInfo{
   252  					Owner:       "carlos",
   253  					Group:       "users",
   254  					Mode:        0o755,
   255  					ParsedMTime: now,
   256  				},
   257  			},
   258  		}, result)
   259  	})
   260  
   261  	t.Run("match multiple files within tree specific destination stripping parents", func(t *testing.T) {
   262  		result, err := Eval(tmpl, []config.File{
   263  			{
   264  				Source:      "./testdata/a",
   265  				Destination: "usr/local/test",
   266  				StripParent: true,
   267  				Info: config.FileInfo{
   268  					Owner:       "carlos",
   269  					Group:       "users",
   270  					Mode:        0o755,
   271  					ParsedMTime: now,
   272  				},
   273  			},
   274  		})
   275  
   276  		require.NoError(t, err)
   277  		require.Equal(t, []config.File{
   278  			{
   279  				Source:      "testdata/a/a.txt",
   280  				Destination: "usr/local/test/a.txt",
   281  				Info: config.FileInfo{
   282  					Owner:       "carlos",
   283  					Group:       "users",
   284  					Mode:        0o755,
   285  					ParsedMTime: now,
   286  				},
   287  			},
   288  			{
   289  				Source:      "testdata/a/b/c/d.txt",
   290  				Destination: "usr/local/test/d.txt",
   291  				Info: config.FileInfo{
   292  					Owner:       "carlos",
   293  					Group:       "users",
   294  					Mode:        0o755,
   295  					ParsedMTime: now,
   296  				},
   297  			},
   298  		}, result)
   299  	})
   300  }
   301  
   302  func TestStrlcp(t *testing.T) {
   303  	for k, v := range map[string][2]string{
   304  		"/var/":       {"/var/lib/foo", "/var/share/aaa"},
   305  		"/var/lib/":   {"/var/lib/foo", "/var/lib/share/aaa"},
   306  		"/usr/share/": {"/usr/share/lib", "/usr/share/bin"},
   307  		"/usr/":       {"/usr/share/lib", "/usr/bin"},
   308  	} {
   309  		t.Run(k, func(t *testing.T) {
   310  			require.Equal(t, k, strlcp(v[0], v[1]))
   311  		})
   312  	}
   313  }