github.com/goreleaser/goreleaser@v1.25.1/cmd/build_test.go (about)

     1  package cmd
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/goreleaser/goreleaser/internal/pipeline"
     7  	"github.com/goreleaser/goreleaser/internal/skips"
     8  	"github.com/goreleaser/goreleaser/internal/testctx"
     9  	"github.com/goreleaser/goreleaser/pkg/config"
    10  	"github.com/goreleaser/goreleaser/pkg/context"
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  func TestBuild(t *testing.T) {
    15  	setup(t)
    16  	cmd := newBuildCmd()
    17  	cmd.cmd.SetArgs([]string{"--snapshot", "--timeout=1m", "--parallelism=2", "--deprecated"})
    18  	require.NoError(t, cmd.cmd.Execute())
    19  }
    20  
    21  func TestBuildSingleTarget(t *testing.T) {
    22  	setup(t)
    23  	cmd := newBuildCmd()
    24  	cmd.cmd.SetArgs([]string{"--snapshot", "--timeout=1m", "--parallelism=2", "--deprecated", "--single-target"})
    25  	require.NoError(t, cmd.cmd.Execute())
    26  }
    27  
    28  func TestBuildInvalidConfig(t *testing.T) {
    29  	setup(t)
    30  	createFile(t, "goreleaser.yml", "foo: bar")
    31  	cmd := newBuildCmd()
    32  	cmd.cmd.SetArgs([]string{"--snapshot", "--timeout=1m", "--parallelism=2", "--deprecated"})
    33  	require.EqualError(t, cmd.cmd.Execute(), "yaml: unmarshal errors:\n  line 1: field foo not found in type config.Project")
    34  }
    35  
    36  func TestBuildBrokenProject(t *testing.T) {
    37  	setup(t)
    38  	createFile(t, "main.go", "not a valid go file")
    39  	cmd := newBuildCmd()
    40  	cmd.cmd.SetArgs([]string{"--snapshot", "--timeout=1m", "--parallelism=2"})
    41  	require.EqualError(t, cmd.cmd.Execute(), "failed to parse dir: .: main.go:1:1: expected 'package', found not")
    42  }
    43  
    44  func TestSetupPipeline(t *testing.T) {
    45  	t.Run("regular", func(t *testing.T) {
    46  		require.Equal(
    47  			t,
    48  			pipeline.BuildCmdPipeline,
    49  			setupPipeline(testctx.New(), buildOpts{}),
    50  		)
    51  	})
    52  
    53  	t.Run("single-target", func(t *testing.T) {
    54  		require.Equal(
    55  			t,
    56  			pipeline.BuildCmdPipeline,
    57  			setupPipeline(testctx.New(), buildOpts{
    58  				singleTarget: true,
    59  			}),
    60  		)
    61  	})
    62  
    63  	t.Run("single-target and id", func(t *testing.T) {
    64  		require.Equal(
    65  			t,
    66  			pipeline.BuildCmdPipeline,
    67  			setupPipeline(testctx.New(), buildOpts{
    68  				singleTarget: true,
    69  				ids:          []string{"foo"},
    70  			}),
    71  		)
    72  	})
    73  
    74  	t.Run("single-target and id, given output", func(t *testing.T) {
    75  		require.Equal(
    76  			t,
    77  			append(pipeline.BuildCmdPipeline, withOutputPipe{"foobar"}),
    78  			setupPipeline(testctx.New(), buildOpts{
    79  				singleTarget: true,
    80  				ids:          []string{"foo"},
    81  				output:       ".",
    82  			}),
    83  		)
    84  	})
    85  
    86  	t.Run("single-target and single build on config", func(t *testing.T) {
    87  		require.Equal(
    88  			t,
    89  			pipeline.BuildCmdPipeline,
    90  			setupPipeline(
    91  				testctx.NewWithCfg(config.Project{
    92  					Builds: []config.Build{{}},
    93  				}),
    94  				buildOpts{
    95  					singleTarget: true,
    96  				},
    97  			),
    98  		)
    99  	})
   100  
   101  	t.Run("single-target, id and output", func(t *testing.T) {
   102  		require.Equal(
   103  			t,
   104  			append(pipeline.BuildCmdPipeline, withOutputPipe{"foobar"}),
   105  			setupPipeline(
   106  				testctx.New(),
   107  				buildOpts{
   108  					singleTarget: true,
   109  					ids:          []string{"foo"},
   110  					output:       "foobar",
   111  				},
   112  			),
   113  		)
   114  	})
   115  
   116  	t.Run("single-target, single build on config and output", func(t *testing.T) {
   117  		require.Equal(
   118  			t,
   119  			append(pipeline.BuildCmdPipeline, withOutputPipe{"zaz"}),
   120  			setupPipeline(
   121  				testctx.NewWithCfg(config.Project{
   122  					Builds: []config.Build{{}},
   123  				}),
   124  				buildOpts{
   125  					singleTarget: true,
   126  					output:       "zaz",
   127  				},
   128  			),
   129  		)
   130  	})
   131  }
   132  
   133  func TestBuildFlags(t *testing.T) {
   134  	setup := func(opts buildOpts) *context.Context {
   135  		ctx := testctx.New()
   136  		require.NoError(t, setupBuildContext(ctx, opts))
   137  		return ctx
   138  	}
   139  
   140  	t.Run("action", func(t *testing.T) {
   141  		ctx := setup(buildOpts{})
   142  		require.Equal(t, context.ActionBuild, ctx.Action)
   143  	})
   144  
   145  	t.Run("snapshot", func(t *testing.T) {
   146  		ctx := setup(buildOpts{
   147  			snapshot: true,
   148  		})
   149  		require.True(t, ctx.Snapshot)
   150  		requireAll(t, ctx, skips.Validate)
   151  		require.True(t, ctx.SkipTokenCheck)
   152  	})
   153  
   154  	t.Run("skips (old)", func(t *testing.T) {
   155  		ctx := setup(buildOpts{
   156  			skipValidate:  true,
   157  			skipPostHooks: true,
   158  		})
   159  		requireAll(t, ctx, skips.Validate, skips.PostBuildHooks)
   160  		require.True(t, ctx.SkipTokenCheck)
   161  	})
   162  
   163  	t.Run("skips", func(t *testing.T) {
   164  		ctx := setup(buildOpts{
   165  			skips: []string{
   166  				string(skips.Validate),
   167  				string(skips.PostBuildHooks),
   168  			},
   169  		})
   170  		requireAll(t, ctx, skips.Validate, skips.PostBuildHooks)
   171  		require.True(t, ctx.SkipTokenCheck)
   172  	})
   173  
   174  	t.Run("parallelism", func(t *testing.T) {
   175  		require.Equal(t, 1, setup(buildOpts{
   176  			parallelism: 1,
   177  		}).Parallelism)
   178  	})
   179  
   180  	t.Run("rm dist", func(t *testing.T) {
   181  		require.True(t, setup(buildOpts{
   182  			clean: true,
   183  		}).Clean)
   184  	})
   185  
   186  	t.Run("id", func(t *testing.T) {
   187  		t.Run("match", func(t *testing.T) {
   188  			ctx := testctx.NewWithCfg(config.Project{
   189  				Builds: []config.Build{
   190  					{
   191  						ID: "default",
   192  					},
   193  					{
   194  						ID: "foo",
   195  					},
   196  				},
   197  			})
   198  			require.NoError(t, setupBuildContext(ctx, buildOpts{
   199  				ids: []string{"foo"},
   200  			}))
   201  		})
   202  
   203  		t.Run("match-multiple", func(t *testing.T) {
   204  			ctx := testctx.NewWithCfg(config.Project{
   205  				Builds: []config.Build{
   206  					{
   207  						ID: "default",
   208  					},
   209  					{
   210  						ID: "foo",
   211  					},
   212  				},
   213  			})
   214  			require.NoError(t, setupBuildContext(ctx, buildOpts{
   215  				ids: []string{"foo", "default"},
   216  			}))
   217  		})
   218  
   219  		t.Run("match-partial", func(t *testing.T) {
   220  			ctx := testctx.NewWithCfg(config.Project{
   221  				Builds: []config.Build{
   222  					{
   223  						ID: "default",
   224  					},
   225  					{
   226  						ID: "foo",
   227  					},
   228  				},
   229  			})
   230  			require.NoError(t, setupBuildContext(ctx, buildOpts{
   231  				ids: []string{"foo", "notdefault"},
   232  			}))
   233  		})
   234  
   235  		t.Run("dont match", func(t *testing.T) {
   236  			ctx := testctx.NewWithCfg(config.Project{
   237  				Builds: []config.Build{
   238  					{
   239  						ID: "foo",
   240  					},
   241  					{
   242  						ID: "bazz",
   243  					},
   244  				},
   245  			})
   246  			require.EqualError(t, setupBuildContext(ctx, buildOpts{
   247  				ids: []string{"bar", "fooz"},
   248  			}), "no builds with ids bar, fooz")
   249  		})
   250  
   251  		t.Run("default config", func(t *testing.T) {
   252  			ctx := testctx.New()
   253  			require.NoError(t, setupBuildContext(ctx, buildOpts{
   254  				ids: []string{"aaa"},
   255  			}))
   256  		})
   257  
   258  		t.Run("single build config", func(t *testing.T) {
   259  			ctx := testctx.NewWithCfg(config.Project{
   260  				Builds: []config.Build{
   261  					{
   262  						ID: "foo",
   263  					},
   264  				},
   265  			})
   266  			require.NoError(t, setupBuildContext(ctx, buildOpts{
   267  				ids: []string{"not foo but doesnt matter"},
   268  			}))
   269  		})
   270  	})
   271  }