github.com/ahmet2mir/goreleaser@v0.180.3-0.20210927151101-8e5ee5a9b8c5/internal/exec/exec_test.go (about)

     1  package exec
     2  
     3  import (
     4  	"fmt"
     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 TestExecute(t *testing.T) {
    16  	ctx := context.New(config.Project{
    17  		ProjectName: "blah",
    18  		Archives: []config.Archive{
    19  			{
    20  				Replacements: map[string]string{
    21  					"linux": "Linux",
    22  				},
    23  			},
    24  		},
    25  	})
    26  	ctx.Env["TEST_A_SECRET"] = "x"
    27  	ctx.Env["TEST_A_USERNAME"] = "u2"
    28  	ctx.Version = "2.1.0"
    29  
    30  	// Preload artifacts
    31  	ctx.Artifacts = artifact.New()
    32  	folder := t.TempDir()
    33  	for _, a := range []struct {
    34  		id  string
    35  		ext string
    36  		typ artifact.Type
    37  	}{
    38  		{"debpkg", "deb", artifact.LinuxPackage},
    39  		{"binary", "bin", artifact.Binary},
    40  		{"archive", "tar", artifact.UploadableArchive},
    41  		{"ubinary", "ubi", artifact.UploadableBinary},
    42  		{"checksum", "sum", artifact.Checksum},
    43  		{"signature", "sig", artifact.Signature},
    44  	} {
    45  		file := filepath.Join(folder, "a."+a.ext)
    46  		require.NoError(t, os.WriteFile(file, []byte("lorem ipsum"), 0o644))
    47  		ctx.Artifacts.Add(&artifact.Artifact{
    48  			Name:   "a." + a.ext,
    49  			Goos:   "linux",
    50  			Goarch: "amd64",
    51  			Path:   file,
    52  			Type:   a.typ,
    53  			Extra: map[string]interface{}{
    54  				"ID": a.id,
    55  			},
    56  		})
    57  	}
    58  
    59  	ctx.Artifacts.Add(&artifact.Artifact{
    60  		Name:   "foo/bar:amd64",
    61  		Goos:   "linux",
    62  		Goarch: "amd64",
    63  		Path:   "foo/bar:amd64",
    64  		Type:   artifact.DockerImage,
    65  		Extra: map[string]interface{}{
    66  			"ID": "img",
    67  		},
    68  	})
    69  	ctx.Artifacts.Add(&artifact.Artifact{
    70  		Name: "foo/bar",
    71  		Path: "foo/bar",
    72  		Type: artifact.DockerManifest,
    73  		Extra: map[string]interface{}{
    74  			"ID": "mnf",
    75  		},
    76  	})
    77  
    78  	osEnv := func(ignores ...string) []string {
    79  		var result []string
    80  	outer:
    81  		for _, key := range passthroughEnvVars {
    82  			for _, ignore := range ignores {
    83  				if key == ignore {
    84  					continue outer
    85  				}
    86  			}
    87  			if value := os.Getenv(key); value != "" {
    88  				result = append(result, key+"="+value)
    89  			}
    90  		}
    91  		return result
    92  	}
    93  
    94  	testCases := []struct {
    95  		name       string
    96  		publishers []config.Publisher
    97  		expectErr  error
    98  	}{
    99  		{
   100  			"filter by IDs",
   101  			[]config.Publisher{
   102  				{
   103  					Name: "test",
   104  					IDs:  []string{"archive"},
   105  					Cmd:  MockCmd + " {{ .ArtifactName }}",
   106  					Env: []string{
   107  						MarshalMockEnv(&MockData{
   108  							AnyOf: []MockCall{
   109  								{ExpectedArgs: []string{"a.tar"}, ExitCode: 0, ExpectedEnv: osEnv()},
   110  							},
   111  						}),
   112  					},
   113  				},
   114  			},
   115  			nil,
   116  		},
   117  		{
   118  			"no filter",
   119  			[]config.Publisher{
   120  				{
   121  					Name: "test",
   122  					Cmd:  MockCmd + " {{ .ArtifactName }}",
   123  					Env: []string{
   124  						MarshalMockEnv(&MockData{
   125  							AnyOf: []MockCall{
   126  								{ExpectedArgs: []string{"a.deb"}, ExitCode: 0, ExpectedEnv: osEnv()},
   127  								{ExpectedArgs: []string{"a.ubi"}, ExitCode: 0, ExpectedEnv: osEnv()},
   128  								{ExpectedArgs: []string{"a.tar"}, ExitCode: 0, ExpectedEnv: osEnv()},
   129  								{ExpectedArgs: []string{"foo/bar"}, ExitCode: 0, ExpectedEnv: osEnv()},
   130  								{ExpectedArgs: []string{"foo/bar:amd64"}, ExitCode: 0, ExpectedEnv: osEnv()},
   131  							},
   132  						}),
   133  					},
   134  				},
   135  			},
   136  			nil,
   137  		},
   138  		{
   139  			"include checksum",
   140  			[]config.Publisher{
   141  				{
   142  					Name:     "test",
   143  					Checksum: true,
   144  					Cmd:      MockCmd + " {{ .ArtifactName }}",
   145  					Env: []string{
   146  						MarshalMockEnv(&MockData{
   147  							AnyOf: []MockCall{
   148  								{ExpectedArgs: []string{"a.deb"}, ExitCode: 0, ExpectedEnv: osEnv()},
   149  								{ExpectedArgs: []string{"a.ubi"}, ExitCode: 0, ExpectedEnv: osEnv()},
   150  								{ExpectedArgs: []string{"a.tar"}, ExitCode: 0, ExpectedEnv: osEnv()},
   151  								{ExpectedArgs: []string{"a.sum"}, ExitCode: 0, ExpectedEnv: osEnv()},
   152  								{ExpectedArgs: []string{"foo/bar"}, ExitCode: 0, ExpectedEnv: osEnv()},
   153  								{ExpectedArgs: []string{"foo/bar:amd64"}, ExitCode: 0, ExpectedEnv: osEnv()},
   154  							},
   155  						}),
   156  					},
   157  				},
   158  			},
   159  			nil,
   160  		},
   161  		{
   162  			"include signatures",
   163  			[]config.Publisher{
   164  				{
   165  					Name:      "test",
   166  					Signature: true,
   167  					Cmd:       MockCmd + " {{ .ArtifactName }}",
   168  					Env: []string{
   169  						MarshalMockEnv(&MockData{
   170  							AnyOf: []MockCall{
   171  								{ExpectedArgs: []string{"a.deb"}, ExitCode: 0, ExpectedEnv: osEnv()},
   172  								{ExpectedArgs: []string{"a.ubi"}, ExitCode: 0, ExpectedEnv: osEnv()},
   173  								{ExpectedArgs: []string{"a.tar"}, ExitCode: 0, ExpectedEnv: osEnv()},
   174  								{ExpectedArgs: []string{"a.sig"}, ExitCode: 0, ExpectedEnv: osEnv()},
   175  								{ExpectedArgs: []string{"foo/bar"}, ExitCode: 0, ExpectedEnv: osEnv()},
   176  								{ExpectedArgs: []string{"foo/bar:amd64"}, ExitCode: 0, ExpectedEnv: osEnv()},
   177  							},
   178  						}),
   179  					},
   180  				},
   181  			},
   182  			nil,
   183  		},
   184  		{
   185  			"docker",
   186  			[]config.Publisher{
   187  				{
   188  					Name: "test",
   189  					IDs:  []string{"img", "mnf"},
   190  					Cmd:  MockCmd + " {{ .ArtifactName }}",
   191  					Env: []string{
   192  						MarshalMockEnv(&MockData{
   193  							AnyOf: []MockCall{
   194  								{ExpectedArgs: []string{"foo/bar"}, ExitCode: 0, ExpectedEnv: osEnv()},
   195  								{ExpectedArgs: []string{"foo/bar:amd64"}, ExitCode: 0, ExpectedEnv: osEnv()},
   196  							},
   197  						}),
   198  					},
   199  				},
   200  			},
   201  			nil,
   202  		},
   203  		{
   204  			"try dir templating",
   205  			[]config.Publisher{
   206  				{
   207  					Name:      "test",
   208  					Signature: true,
   209  					IDs:       []string{"debpkg"},
   210  					Dir:       "{{ dir .ArtifactPath }}",
   211  					Cmd:       MockCmd + " {{ .ArtifactName }}",
   212  					Env: []string{
   213  						MarshalMockEnv(&MockData{
   214  							AnyOf: []MockCall{
   215  								{ExpectedArgs: []string{"a.deb"}, ExitCode: 0, ExpectedEnv: osEnv()},
   216  							},
   217  						}),
   218  					},
   219  				},
   220  			},
   221  			nil,
   222  		},
   223  		{
   224  			"check env templating",
   225  			[]config.Publisher{
   226  				{
   227  					Name: "test",
   228  					IDs:  []string{"debpkg"},
   229  					Cmd:  MockCmd,
   230  					Env: []string{
   231  						"PROJECT={{.ProjectName}}",
   232  						"ARTIFACT={{.ArtifactName}}",
   233  						"SECRET={{.Env.TEST_A_SECRET}}",
   234  						MarshalMockEnv(&MockData{
   235  							AnyOf: []MockCall{
   236  								{
   237  									ExpectedEnv: append(
   238  										[]string{"PROJECT=blah", "ARTIFACT=a.deb", "SECRET=x"},
   239  										osEnv()...,
   240  									),
   241  									ExitCode: 0,
   242  								},
   243  							},
   244  						}),
   245  					},
   246  				},
   247  			},
   248  			nil,
   249  		},
   250  		{
   251  			"override path",
   252  			[]config.Publisher{
   253  				{
   254  					Name: "test",
   255  					IDs:  []string{"debpkg"},
   256  					Cmd:  MockCmd,
   257  					Env: []string{
   258  						"PATH=/something-else",
   259  						MarshalMockEnv(&MockData{
   260  							AnyOf: []MockCall{
   261  								{
   262  									ExpectedEnv: append(
   263  										[]string{"PATH=/something-else"},
   264  										osEnv("PATH")...,
   265  									),
   266  									ExitCode: 0,
   267  								},
   268  							},
   269  						}),
   270  					},
   271  				},
   272  			},
   273  			nil,
   274  		},
   275  		{
   276  			"command error",
   277  			[]config.Publisher{
   278  				{
   279  					Name: "test",
   280  					IDs:  []string{"debpkg"},
   281  					Cmd:  MockCmd + " {{.ArtifactName}}",
   282  					Env: []string{
   283  						MarshalMockEnv(&MockData{
   284  							AnyOf: []MockCall{
   285  								{
   286  									ExpectedArgs: []string{"a.deb"},
   287  									ExpectedEnv:  osEnv(),
   288  									Stderr:       "test error",
   289  									ExitCode:     1,
   290  								},
   291  							},
   292  						}),
   293  					},
   294  				},
   295  			},
   296  			// stderr is sent to output via logger
   297  			fmt.Errorf(`publishing: %s failed: exit status 1: test error`, MockCmd),
   298  		},
   299  	}
   300  
   301  	for i, tc := range testCases {
   302  		t.Run(fmt.Sprintf("%d-%s", i, tc.name), func(t *testing.T) {
   303  			err := Execute(ctx, tc.publishers)
   304  			if tc.expectErr == nil {
   305  				require.NoError(t, err)
   306  				return
   307  			}
   308  			require.Error(t, err)
   309  			require.Equal(t, tc.expectErr.Error(), err.Error())
   310  		})
   311  	}
   312  }