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