github.com/ahmet2mir/goreleaser@v0.180.3-0.20210927151101-8e5ee5a9b8c5/internal/pipe/checksums/checksums_test.go (about)

     1  package checksums
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"path/filepath"
     7  	"testing"
     8  
     9  	"github.com/goreleaser/goreleaser/internal/artifact"
    10  	"github.com/goreleaser/goreleaser/pkg/config"
    11  	"github.com/goreleaser/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  			folder := t.TempDir()
    50  			file := filepath.Join(folder, binary)
    51  			require.NoError(t, os.WriteFile(file, []byte("some string"), 0o644))
    52  			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 := os.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  func TestPipeFileNotExist(t *testing.T) {
   105  	folder := t.TempDir()
   106  	ctx := context.New(
   107  		config.Project{
   108  			Dist: folder,
   109  			Checksum: config.Checksum{
   110  				NameTemplate: "checksums.txt",
   111  			},
   112  		},
   113  	)
   114  	ctx.Git.CurrentTag = "1.2.3"
   115  	ctx.Artifacts.Add(&artifact.Artifact{
   116  		Name: "nope",
   117  		Path: "/nope",
   118  		Type: artifact.UploadableBinary,
   119  	})
   120  	err := Pipe{}.Run(ctx)
   121  	require.Error(t, err)
   122  	require.Contains(t, err.Error(), "/nope: no such file or directory")
   123  }
   124  
   125  func TestPipeInvalidNameTemplate(t *testing.T) {
   126  	binFile, err := ioutil.TempFile(t.TempDir(), "goreleasertest-bin")
   127  	require.NoError(t, err)
   128  	t.Cleanup(func() { require.NoError(t, binFile.Close()) })
   129  	_, err = binFile.WriteString("fake artifact")
   130  	require.NoError(t, err)
   131  
   132  	for template, eerr := range map[string]string{
   133  		"{{ .Pro }_checksums.txt": `template: tmpl:1: unexpected "}" in operand`,
   134  		"{{.Env.NOPE}}":           `template: tmpl:1:6: executing "tmpl" at <.Env.NOPE>: map has no entry for key "NOPE"`,
   135  	} {
   136  		t.Run(template, func(t *testing.T) {
   137  			folder := t.TempDir()
   138  			ctx := context.New(
   139  				config.Project{
   140  					Dist:        folder,
   141  					ProjectName: "name",
   142  					Checksum: config.Checksum{
   143  						NameTemplate: template,
   144  						Algorithm:    "sha256",
   145  					},
   146  				},
   147  			)
   148  			ctx.Git.CurrentTag = "1.2.3"
   149  			ctx.Artifacts.Add(&artifact.Artifact{
   150  				Name: "whatever",
   151  				Type: artifact.UploadableBinary,
   152  				Path: binFile.Name(),
   153  			})
   154  			err = Pipe{}.Run(ctx)
   155  			require.Error(t, err)
   156  			require.Equal(t, eerr, err.Error())
   157  		})
   158  	}
   159  }
   160  
   161  func TestPipeCouldNotOpenChecksumsTxt(t *testing.T) {
   162  	folder := t.TempDir()
   163  	binFile, err := ioutil.TempFile(folder, "goreleasertest-bin")
   164  	require.NoError(t, err)
   165  	t.Cleanup(func() { require.NoError(t, binFile.Close()) })
   166  	_, err = binFile.WriteString("fake artifact")
   167  	require.NoError(t, err)
   168  
   169  	file := filepath.Join(folder, "checksums.txt")
   170  	require.NoError(t, os.WriteFile(file, []byte("some string"), 0o000))
   171  	ctx := context.New(
   172  		config.Project{
   173  			Dist: folder,
   174  			Checksum: config.Checksum{
   175  				NameTemplate: "checksums.txt",
   176  				Algorithm:    "sha256",
   177  			},
   178  		},
   179  	)
   180  	ctx.Git.CurrentTag = "1.2.3"
   181  	ctx.Artifacts.Add(&artifact.Artifact{
   182  		Name: "whatever",
   183  		Type: artifact.UploadableBinary,
   184  		Path: binFile.Name(),
   185  	})
   186  	err = Pipe{}.Run(ctx)
   187  	require.Error(t, err)
   188  	require.Contains(t, err.Error(), "/checksums.txt: permission denied")
   189  }
   190  
   191  func TestPipeWhenNoArtifacts(t *testing.T) {
   192  	ctx := &context.Context{}
   193  	require.NoError(t, Pipe{}.Run(ctx))
   194  	require.Len(t, ctx.Artifacts.List(), 0)
   195  }
   196  
   197  func TestDefault(t *testing.T) {
   198  	ctx := &context.Context{
   199  		Config: config.Project{
   200  			Checksum: config.Checksum{},
   201  		},
   202  	}
   203  	require.NoError(t, Pipe{}.Default(ctx))
   204  	require.Equal(
   205  		t,
   206  		"{{ .ProjectName }}_{{ .Version }}_checksums.txt",
   207  		ctx.Config.Checksum.NameTemplate,
   208  	)
   209  	require.Equal(t, "sha256", ctx.Config.Checksum.Algorithm)
   210  }
   211  
   212  func TestDefaultSet(t *testing.T) {
   213  	ctx := &context.Context{
   214  		Config: config.Project{
   215  			Checksum: config.Checksum{
   216  				NameTemplate: "checksums.txt",
   217  			},
   218  		},
   219  	}
   220  	require.NoError(t, Pipe{}.Default(ctx))
   221  	require.Equal(t, "checksums.txt", ctx.Config.Checksum.NameTemplate)
   222  }
   223  
   224  func TestPipeCheckSumsWithExtraFiles(t *testing.T) {
   225  	const binary = "binary"
   226  	const checksums = "checksums.txt"
   227  	const extraFileFooRelPath = "./testdata/foo.txt"
   228  	const extraFileBarRelPath = "./testdata/**/bar.txt"
   229  	const extraFileFoo = "foo.txt"
   230  	const extraFileBar = "bar.txt"
   231  
   232  	tests := map[string]struct {
   233  		extraFiles []config.ExtraFile
   234  		want       []string
   235  	}{
   236  		"default": {
   237  			extraFiles: nil,
   238  			want: []string{
   239  				binary,
   240  			},
   241  		},
   242  		"one extra file": {
   243  			extraFiles: []config.ExtraFile{
   244  				{Glob: extraFileFooRelPath},
   245  			},
   246  			want: []string{
   247  				extraFileFoo,
   248  			},
   249  		},
   250  		"multiple extra files": {
   251  			extraFiles: []config.ExtraFile{
   252  				{Glob: extraFileFooRelPath},
   253  				{Glob: extraFileBarRelPath},
   254  			},
   255  			want: []string{
   256  				extraFileFoo,
   257  				extraFileBar,
   258  			},
   259  		},
   260  	}
   261  
   262  	for name, tt := range tests {
   263  		t.Run(name, func(t *testing.T) {
   264  			folder := t.TempDir()
   265  			file := filepath.Join(folder, binary)
   266  			require.NoError(t, os.WriteFile(file, []byte("some string"), 0o644))
   267  			ctx := context.New(
   268  				config.Project{
   269  					Dist:        folder,
   270  					ProjectName: binary,
   271  					Checksum: config.Checksum{
   272  						Algorithm:    "sha256",
   273  						NameTemplate: "checksums.txt",
   274  						ExtraFiles:   tt.extraFiles,
   275  					},
   276  				},
   277  			)
   278  
   279  			ctx.Artifacts.Add(&artifact.Artifact{
   280  				Name: binary,
   281  				Path: file,
   282  				Type: artifact.UploadableBinary,
   283  				Extra: map[string]interface{}{
   284  					"ID": "id-1",
   285  				},
   286  			})
   287  
   288  			require.NoError(t, Pipe{}.Run(ctx))
   289  
   290  			bts, err := os.ReadFile(filepath.Join(folder, checksums))
   291  
   292  			require.NoError(t, err)
   293  			for _, want := range tt.want {
   294  				if tt.extraFiles == nil {
   295  					require.Contains(t, string(bts), "61d034473102d7dac305902770471fd50f4c5b26f6831a56dd90b5184b3c30fc  "+want)
   296  				} else {
   297  					require.Contains(t, string(bts), "3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855  "+want)
   298  				}
   299  			}
   300  		})
   301  	}
   302  }
   303  
   304  func TestExtraFilesNoMatch(t *testing.T) {
   305  	dir := t.TempDir()
   306  	ctx := context.New(
   307  		config.Project{
   308  			Dist:        dir,
   309  			ProjectName: "fake",
   310  			Checksum: config.Checksum{
   311  				Algorithm:    "sha256",
   312  				NameTemplate: "checksums.txt",
   313  				ExtraFiles:   []config.ExtraFile{{Glob: "./nope/nope.txt"}},
   314  			},
   315  		},
   316  	)
   317  
   318  	ctx.Artifacts.Add(&artifact.Artifact{
   319  		Name: "fake",
   320  		Path: "fake-path",
   321  		Type: artifact.UploadableBinary,
   322  	})
   323  
   324  	require.NoError(t, Pipe{}.Default(ctx))
   325  	require.EqualError(t, Pipe{}.Run(ctx), `globbing failed for pattern ./nope/nope.txt: matching "./nope/nope.txt": file does not exist`)
   326  }
   327  
   328  func TestSkip(t *testing.T) {
   329  	t.Run("skip", func(t *testing.T) {
   330  		ctx := context.New(config.Project{
   331  			Checksum: config.Checksum{
   332  				Disable: true,
   333  			},
   334  		})
   335  		require.True(t, Pipe{}.Skip(ctx))
   336  	})
   337  
   338  	t.Run("dont skip", func(t *testing.T) {
   339  		require.False(t, Pipe{}.Skip(context.New(config.Project{})))
   340  	})
   341  }
   342  
   343  // TODO: add tests for LinuxPackage and UploadableSourceArchive