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 }