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 }