github.com/amane3/goreleaser@v0.182.0/internal/pipe/checksums/checksums_test.go (about) 1 package checksums 2 3 import ( 4 "io/ioutil" 5 "path/filepath" 6 "testing" 7 8 "github.com/amane3/goreleaser/internal/artifact" 9 "github.com/amane3/goreleaser/internal/testlib" 10 "github.com/amane3/goreleaser/pkg/config" 11 "github.com/amane3/goreleaser/pkg/context" 12 "github.com/stretchr/testify/require" 13 ) 14 15 func TestDescription(t *testing.T) { 16 require.NotEmpty(t, Pipe{}.String()) 17 } 18 19 func TestPipe(t *testing.T) { 20 const binary = "binary" 21 const archive = binary + ".tar.gz" 22 const linuxPackage = binary + ".rpm" 23 const checksums = binary + "_bar_checksums.txt" 24 25 tests := map[string]struct { 26 ids []string 27 want []string 28 }{ 29 "default": { 30 want: []string{ 31 binary, 32 archive, 33 linuxPackage, 34 }, 35 }, 36 "select ids": { 37 ids: []string{ 38 "id-1", 39 "id-2", 40 }, 41 want: []string{ 42 binary, 43 archive, 44 }, 45 }, 46 } 47 for name, tt := range tests { 48 t.Run(name, func(t *testing.T) { 49 var folder = t.TempDir() 50 var file = filepath.Join(folder, binary) 51 require.NoError(t, ioutil.WriteFile(file, []byte("some string"), 0644)) 52 var ctx = context.New( 53 config.Project{ 54 Dist: folder, 55 ProjectName: binary, 56 Checksum: config.Checksum{ 57 NameTemplate: "{{ .ProjectName }}_{{ .Env.FOO }}_checksums.txt", 58 Algorithm: "sha256", 59 IDs: tt.ids, 60 }, 61 }, 62 ) 63 ctx.Git.CurrentTag = "1.2.3" 64 ctx.Env = map[string]string{"FOO": "bar"} 65 ctx.Artifacts.Add(&artifact.Artifact{ 66 Name: binary, 67 Path: file, 68 Type: artifact.UploadableBinary, 69 Extra: map[string]interface{}{ 70 "ID": "id-1", 71 }, 72 }) 73 ctx.Artifacts.Add(&artifact.Artifact{ 74 Name: archive, 75 Path: file, 76 Type: artifact.UploadableArchive, 77 Extra: map[string]interface{}{ 78 "ID": "id-2", 79 }, 80 }) 81 ctx.Artifacts.Add(&artifact.Artifact{ 82 Name: linuxPackage, 83 Path: file, 84 Type: artifact.LinuxPackage, 85 Extra: map[string]interface{}{ 86 "ID": "id-3", 87 }, 88 }) 89 require.NoError(t, Pipe{}.Run(ctx)) 90 var artifacts []string 91 for _, a := range ctx.Artifacts.List() { 92 artifacts = append(artifacts, a.Name) 93 } 94 require.Contains(t, artifacts, checksums, binary) 95 bts, err := ioutil.ReadFile(filepath.Join(folder, checksums)) 96 require.NoError(t, err) 97 for _, want := range tt.want { 98 require.Contains(t, string(bts), "61d034473102d7dac305902770471fd50f4c5b26f6831a56dd90b5184b3c30fc "+want) 99 } 100 }) 101 } 102 103 } 104 105 func TestPipeSkipTrue(t *testing.T) { 106 var folder = t.TempDir() 107 var ctx = context.New( 108 config.Project{ 109 Dist: folder, 110 Checksum: config.Checksum{ 111 Disable: true, 112 }, 113 }, 114 ) 115 var err = Pipe{}.Run(ctx) 116 testlib.AssertSkipped(t, err) 117 require.EqualError(t, err, `checksum.disable is set`) 118 } 119 120 func TestPipeFileNotExist(t *testing.T) { 121 var folder = t.TempDir() 122 var ctx = context.New( 123 config.Project{ 124 Dist: folder, 125 Checksum: config.Checksum{ 126 NameTemplate: "checksums.txt", 127 }, 128 }, 129 ) 130 ctx.Git.CurrentTag = "1.2.3" 131 ctx.Artifacts.Add(&artifact.Artifact{ 132 Name: "nope", 133 Path: "/nope", 134 Type: artifact.UploadableBinary, 135 }) 136 var err = Pipe{}.Run(ctx) 137 require.Error(t, err) 138 require.Contains(t, err.Error(), "/nope: no such file or directory") 139 } 140 141 func TestPipeInvalidNameTemplate(t *testing.T) { 142 binFile, err := ioutil.TempFile(t.TempDir(), "goreleasertest-bin") 143 require.NoError(t, err) 144 t.Cleanup(func() { binFile.Close() }) 145 _, err = binFile.WriteString("fake artifact") 146 require.NoError(t, err) 147 148 for template, eerr := range map[string]string{ 149 "{{ .Pro }_checksums.txt": `template: tmpl:1: unexpected "}" in operand`, 150 "{{.Env.NOPE}}": `template: tmpl:1:6: executing "tmpl" at <.Env.NOPE>: map has no entry for key "NOPE"`, 151 } { 152 t.Run(template, func(tt *testing.T) { 153 var folder = t.TempDir() 154 var ctx = context.New( 155 config.Project{ 156 Dist: folder, 157 ProjectName: "name", 158 Checksum: config.Checksum{ 159 NameTemplate: template, 160 Algorithm: "sha256", 161 }, 162 }, 163 ) 164 ctx.Git.CurrentTag = "1.2.3" 165 ctx.Artifacts.Add(&artifact.Artifact{ 166 Name: "whatever", 167 Type: artifact.UploadableBinary, 168 Path: binFile.Name(), 169 }) 170 err = Pipe{}.Run(ctx) 171 require.Error(tt, err) 172 require.Equal(tt, eerr, err.Error()) 173 }) 174 } 175 } 176 177 func TestPipeCouldNotOpenChecksumsTxt(t *testing.T) { 178 var folder = t.TempDir() 179 binFile, err := ioutil.TempFile(folder, "goreleasertest-bin") 180 require.NoError(t, err) 181 t.Cleanup(func() { binFile.Close() }) 182 _, err = binFile.WriteString("fake artifact") 183 require.NoError(t, err) 184 185 var file = filepath.Join(folder, "checksums.txt") 186 require.NoError(t, ioutil.WriteFile(file, []byte("some string"), 0000)) 187 var ctx = context.New( 188 config.Project{ 189 Dist: folder, 190 Checksum: config.Checksum{ 191 NameTemplate: "checksums.txt", 192 Algorithm: "sha256", 193 }, 194 }, 195 ) 196 ctx.Git.CurrentTag = "1.2.3" 197 ctx.Artifacts.Add(&artifact.Artifact{ 198 Name: "whatever", 199 Type: artifact.UploadableBinary, 200 Path: binFile.Name(), 201 }) 202 err = Pipe{}.Run(ctx) 203 require.Error(t, err) 204 require.Contains(t, err.Error(), "/checksums.txt: permission denied") 205 } 206 207 func TestPipeWhenNoArtifacts(t *testing.T) { 208 var ctx = &context.Context{} 209 require.NoError(t, Pipe{}.Run(ctx)) 210 require.Len(t, ctx.Artifacts.List(), 0) 211 } 212 213 func TestDefault(t *testing.T) { 214 var ctx = &context.Context{ 215 Config: config.Project{ 216 Checksum: config.Checksum{}, 217 }, 218 } 219 require.NoError(t, Pipe{}.Default(ctx)) 220 require.Equal( 221 t, 222 "{{ .ProjectName }}_{{ .Version }}_checksums.txt", 223 ctx.Config.Checksum.NameTemplate, 224 ) 225 require.Equal(t, "sha256", ctx.Config.Checksum.Algorithm) 226 } 227 228 func TestDefaultSet(t *testing.T) { 229 var ctx = &context.Context{ 230 Config: config.Project{ 231 Checksum: config.Checksum{ 232 NameTemplate: "checksums.txt", 233 }, 234 }, 235 } 236 require.NoError(t, Pipe{}.Default(ctx)) 237 require.Equal(t, "checksums.txt", ctx.Config.Checksum.NameTemplate) 238 } 239 240 // TODO: add tests for LinuxPackage and UploadableSourceArchive