github.com/triarius/goreleaser@v1.12.5/internal/pipe/sourcearchive/source_test.go (about)

     1  package sourcearchive
     2  
     3  import (
     4  	"archive/zip"
     5  	"os"
     6  	"path/filepath"
     7  	"testing"
     8  
     9  	"github.com/triarius/goreleaser/internal/artifact"
    10  	"github.com/triarius/goreleaser/internal/testlib"
    11  	"github.com/triarius/goreleaser/pkg/config"
    12  	"github.com/triarius/goreleaser/pkg/context"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  func TestArchive(t *testing.T) {
    17  	for _, format := range []string{"tar.gz", "tar", "zip"} {
    18  		t.Run(format, func(t *testing.T) {
    19  			tmp := testlib.Mktmp(t)
    20  			require.NoError(t, os.Mkdir("dist", 0o744))
    21  
    22  			testlib.GitInit(t)
    23  			require.NoError(t, os.WriteFile("code.txt", []byte("not really code"), 0o655))
    24  			require.NoError(t, os.WriteFile("code.py", []byte("print 1"), 0o655))
    25  			require.NoError(t, os.WriteFile("README.md", []byte("# my dope fake project"), 0o655))
    26  			testlib.GitAdd(t)
    27  			testlib.GitCommit(t, "feat: first")
    28  			require.NoError(t, os.WriteFile("added-later.txt", []byte("this file was added later"), 0o655))
    29  			require.NoError(t, os.WriteFile("ignored.md", []byte("never added"), 0o655))
    30  			require.NoError(t, os.MkdirAll("subfolder", 0o755))
    31  			require.NoError(t, os.WriteFile("subfolder/file.md", []byte("a file within a folder, added later"), 0o655))
    32  
    33  			ctx := context.New(config.Project{
    34  				ProjectName: "foo",
    35  				Dist:        "dist",
    36  				Source: config.Source{
    37  					Format:         format,
    38  					Enabled:        true,
    39  					PrefixTemplate: "{{ .ProjectName }}-{{ .Version }}/",
    40  					Files: []config.File{
    41  						{Source: "*.txt"},
    42  						{Source: "subfolder/*"},
    43  					},
    44  				},
    45  			})
    46  			ctx.Git.FullCommit = "HEAD"
    47  			ctx.Version = "1.0.0"
    48  
    49  			require.NoError(t, Pipe{}.Default(ctx))
    50  			require.NoError(t, Pipe{}.Run(ctx))
    51  
    52  			artifacts := ctx.Artifacts.List()
    53  			require.Len(t, artifacts, 1)
    54  			require.Equal(t, artifact.Artifact{
    55  				Type: artifact.UploadableSourceArchive,
    56  				Name: "foo-1.0.0." + format,
    57  				Path: "dist/foo-1.0.0." + format,
    58  				Extra: map[string]interface{}{
    59  					artifact.ExtraFormat: format,
    60  				},
    61  			}, *artifacts[0])
    62  			path := filepath.Join(tmp, "dist", "foo-1.0.0."+format)
    63  			stat, err := os.Stat(path)
    64  			require.NoError(t, err)
    65  			require.Greater(t, stat.Size(), int64(100))
    66  
    67  			if format != "zip" {
    68  				return
    69  			}
    70  
    71  			require.ElementsMatch(t, []string{
    72  				"foo-1.0.0/README.md",
    73  				"foo-1.0.0/code.py",
    74  				"foo-1.0.0/code.txt",
    75  				"foo-1.0.0/added-later.txt",
    76  				"foo-1.0.0/subfolder/file.md",
    77  			}, lsZip(t, path))
    78  		})
    79  	}
    80  }
    81  
    82  func TestInvalidFormat(t *testing.T) {
    83  	ctx := context.New(config.Project{
    84  		Dist:        t.TempDir(),
    85  		ProjectName: "foo",
    86  		Source: config.Source{
    87  			Format:         "7z",
    88  			Enabled:        true,
    89  			PrefixTemplate: "{{ .ProjectName }}-{{ .Version }}/",
    90  		},
    91  	})
    92  	require.NoError(t, Pipe{}.Default(ctx))
    93  	require.EqualError(t, Pipe{}.Run(ctx), "invalid archive format: 7z")
    94  }
    95  
    96  func TestDefault(t *testing.T) {
    97  	ctx := context.New(config.Project{})
    98  	require.NoError(t, Pipe{}.Default(ctx))
    99  	require.Equal(t, config.Source{
   100  		NameTemplate: "{{ .ProjectName }}-{{ .Version }}",
   101  		Format:       "tar.gz",
   102  	}, ctx.Config.Source)
   103  }
   104  
   105  func TestInvalidNameTemplate(t *testing.T) {
   106  	ctx := context.New(config.Project{
   107  		Source: config.Source{
   108  			Enabled:      true,
   109  			NameTemplate: "{{ .foo }-asdda",
   110  		},
   111  	})
   112  	testlib.RequireTemplateError(t, Pipe{}.Run(ctx))
   113  }
   114  
   115  func TestInvalidInvalidFileTemplate(t *testing.T) {
   116  	testlib.Mktmp(t)
   117  	require.NoError(t, os.Mkdir("dist", 0o744))
   118  
   119  	testlib.GitInit(t)
   120  	require.NoError(t, os.WriteFile("code.txt", []byte("not really code"), 0o655))
   121  	testlib.GitAdd(t)
   122  	testlib.GitCommit(t, "feat: first")
   123  
   124  	ctx := context.New(config.Project{
   125  		ProjectName: "foo",
   126  		Dist:        "dist",
   127  		Source: config.Source{
   128  			Format:  "tar.gz",
   129  			Enabled: true,
   130  			Files: []config.File{
   131  				{Source: "{{.Test}"},
   132  			},
   133  		},
   134  	})
   135  	ctx.Git.FullCommit = "HEAD"
   136  	ctx.Version = "1.0.0"
   137  	require.NoError(t, Pipe{}.Default(ctx))
   138  	testlib.RequireTemplateError(t, Pipe{}.Run(ctx))
   139  }
   140  
   141  func TestInvalidPrefixTemplate(t *testing.T) {
   142  	ctx := context.New(config.Project{
   143  		Dist: t.TempDir(),
   144  		Source: config.Source{
   145  			Enabled:        true,
   146  			PrefixTemplate: "{{ .ProjectName }/",
   147  		},
   148  	})
   149  	require.NoError(t, Pipe{}.Default(ctx))
   150  	testlib.RequireTemplateError(t, Pipe{}.Run(ctx))
   151  }
   152  
   153  func TestDisabled(t *testing.T) {
   154  	require.True(t, Pipe{}.Skip(context.New(config.Project{})))
   155  }
   156  
   157  func TestSkip(t *testing.T) {
   158  	t.Run("skip", func(t *testing.T) {
   159  		require.True(t, Pipe{}.Skip(context.New(config.Project{})))
   160  	})
   161  
   162  	t.Run("dont skip", func(t *testing.T) {
   163  		ctx := context.New(config.Project{
   164  			Source: config.Source{
   165  				Enabled: true,
   166  			},
   167  		})
   168  		require.False(t, Pipe{}.Skip(ctx))
   169  	})
   170  }
   171  
   172  func TestString(t *testing.T) {
   173  	require.NotEmpty(t, Pipe{}.String())
   174  }
   175  
   176  func lsZip(tb testing.TB, path string) []string {
   177  	tb.Helper()
   178  
   179  	stat, err := os.Stat(path)
   180  	require.NoError(tb, err)
   181  	f, err := os.Open(path)
   182  	require.NoError(tb, err)
   183  	z, err := zip.NewReader(f, stat.Size())
   184  	require.NoError(tb, err)
   185  
   186  	var paths []string
   187  	for _, zf := range z.File {
   188  		paths = append(paths, zf.Name)
   189  	}
   190  	return paths
   191  }