github.com/joselitofilho/goreleaser@v0.155.1-0.20210123221854-e4891856c593/internal/exec/exec_test.go (about)

     1  package exec
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     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  	var folder = t.TempDir()
    33  	for _, a := range []struct {
    34  		id  string
    35  		ext string
    36  		typ artifact.Type
    37  	}{
    38  		{"docker", "---", artifact.DockerImage},
    39  		{"debpkg", "deb", artifact.LinuxPackage},
    40  		{"binary", "bin", artifact.Binary},
    41  		{"archive", "tar", artifact.UploadableArchive},
    42  		{"ubinary", "ubi", artifact.UploadableBinary},
    43  		{"checksum", "sum", artifact.Checksum},
    44  		{"signature", "sig", artifact.Signature},
    45  	} {
    46  		var file = filepath.Join(folder, "a."+a.ext)
    47  		require.NoError(t, ioutil.WriteFile(file, []byte("lorem ipsum"), 0644))
    48  		ctx.Artifacts.Add(&artifact.Artifact{
    49  			Name:   "a." + a.ext,
    50  			Goos:   "linux",
    51  			Goarch: "amd64",
    52  			Path:   file,
    53  			Type:   a.typ,
    54  			Extra: map[string]interface{}{
    55  				"ID": a.id,
    56  			},
    57  		})
    58  	}
    59  
    60  	testCases := []struct {
    61  		name       string
    62  		publishers []config.Publisher
    63  		expectErr  error
    64  	}{
    65  		{
    66  			"filter by IDs",
    67  			[]config.Publisher{
    68  				{
    69  					Name: "test",
    70  					IDs:  []string{"archive"},
    71  					Cmd:  MockCmd + " {{ .ArtifactName }}",
    72  					Env: []string{
    73  						MarshalMockEnv(&MockData{
    74  							AnyOf: []MockCall{
    75  								{ExpectedArgs: []string{"a.tar"}, ExitCode: 0},
    76  							},
    77  						}),
    78  					},
    79  				},
    80  			},
    81  			nil,
    82  		},
    83  		{
    84  			"no filter",
    85  			[]config.Publisher{
    86  				{
    87  					Name: "test",
    88  					Cmd:  MockCmd + " {{ .ArtifactName }}",
    89  					Env: []string{
    90  						MarshalMockEnv(&MockData{
    91  							AnyOf: []MockCall{
    92  								{ExpectedArgs: []string{"a.deb"}, ExitCode: 0},
    93  								{ExpectedArgs: []string{"a.ubi"}, ExitCode: 0},
    94  								{ExpectedArgs: []string{"a.tar"}, ExitCode: 0},
    95  							},
    96  						}),
    97  					},
    98  				},
    99  			},
   100  			nil,
   101  		},
   102  		{
   103  			"include checksum",
   104  			[]config.Publisher{
   105  				{
   106  					Name:     "test",
   107  					Checksum: true,
   108  					Cmd:      MockCmd + " {{ .ArtifactName }}",
   109  					Env: []string{
   110  						MarshalMockEnv(&MockData{
   111  							AnyOf: []MockCall{
   112  								{ExpectedArgs: []string{"a.deb"}, ExitCode: 0},
   113  								{ExpectedArgs: []string{"a.ubi"}, ExitCode: 0},
   114  								{ExpectedArgs: []string{"a.tar"}, ExitCode: 0},
   115  								{ExpectedArgs: []string{"a.sum"}, ExitCode: 0},
   116  							},
   117  						}),
   118  					},
   119  				},
   120  			},
   121  			nil,
   122  		},
   123  		{
   124  			"include signatures",
   125  			[]config.Publisher{
   126  				{
   127  					Name:      "test",
   128  					Signature: true,
   129  					Cmd:       MockCmd + " {{ .ArtifactName }}",
   130  					Env: []string{
   131  						MarshalMockEnv(&MockData{
   132  							AnyOf: []MockCall{
   133  								{ExpectedArgs: []string{"a.deb"}, ExitCode: 0},
   134  								{ExpectedArgs: []string{"a.ubi"}, ExitCode: 0},
   135  								{ExpectedArgs: []string{"a.tar"}, ExitCode: 0},
   136  								{ExpectedArgs: []string{"a.sig"}, ExitCode: 0},
   137  							},
   138  						}),
   139  					},
   140  				},
   141  			},
   142  			nil,
   143  		},
   144  		{
   145  			"try dir templating",
   146  			[]config.Publisher{
   147  				{
   148  					Name:      "test",
   149  					Signature: true,
   150  					IDs:       []string{"debpkg"},
   151  					Dir:       "{{ dir .ArtifactPath }}",
   152  					Cmd:       MockCmd + " {{ .ArtifactName }}",
   153  					Env: []string{
   154  						MarshalMockEnv(&MockData{
   155  							AnyOf: []MockCall{
   156  								{ExpectedArgs: []string{"a.deb"}, ExitCode: 0},
   157  							},
   158  						}),
   159  					},
   160  				},
   161  			},
   162  			nil,
   163  		},
   164  		{
   165  			"check env templating",
   166  			[]config.Publisher{
   167  				{
   168  					Name: "test",
   169  					IDs:  []string{"debpkg"},
   170  					Cmd:  MockCmd,
   171  					Env: []string{
   172  						"PROJECT={{.ProjectName}}",
   173  						"ARTIFACT={{.ArtifactName}}",
   174  						"SECRET={{.Env.TEST_A_SECRET}}",
   175  						MarshalMockEnv(&MockData{
   176  							AnyOf: []MockCall{
   177  								{
   178  									ExpectedEnv: []string{
   179  										"PROJECT=blah",
   180  										"ARTIFACT=a.deb",
   181  										"SECRET=x",
   182  									},
   183  									ExitCode: 0,
   184  								},
   185  							},
   186  						}),
   187  					},
   188  				},
   189  			},
   190  			nil,
   191  		},
   192  		{
   193  			"command error",
   194  			[]config.Publisher{
   195  				{
   196  					Name: "test",
   197  					IDs:  []string{"debpkg"},
   198  					Cmd:  MockCmd + " {{.ArtifactName}}",
   199  					Env: []string{
   200  						MarshalMockEnv(&MockData{
   201  							AnyOf: []MockCall{
   202  								{
   203  									ExpectedArgs: []string{"a.deb"},
   204  									Stderr:       "test error",
   205  									ExitCode:     1,
   206  								},
   207  							},
   208  						}),
   209  					},
   210  				},
   211  			},
   212  			// stderr is sent to output via logger
   213  			fmt.Errorf(`publishing: %s failed: exit status 1`, MockCmd),
   214  		},
   215  	}
   216  
   217  	for i, tc := range testCases {
   218  		t.Run(fmt.Sprintf("%d-%s", i, tc.name), func(t *testing.T) {
   219  			err := Execute(ctx, tc.publishers)
   220  			if tc.expectErr == nil {
   221  				require.NoError(t, err)
   222  				return
   223  			}
   224  			require.Error(t, err)
   225  			require.Equal(t, tc.expectErr.Error(), err.Error())
   226  		})
   227  	}
   228  }