1
0
mirror of https://github.com/goreleaser/goreleaser.git synced 2025-01-16 03:52:12 +02:00
goreleaser/cmd/build_test.go
Carlos Alexandro Becker f5c4fce822
feat: build --auto-snapshot (#4917)
closes #4891
2024-06-11 09:34:41 -03:00

287 lines
6.5 KiB
Go

package cmd
import (
"path/filepath"
"testing"
"github.com/goreleaser/goreleaser/v2/internal/pipeline"
"github.com/goreleaser/goreleaser/v2/internal/skips"
"github.com/goreleaser/goreleaser/v2/internal/testctx"
"github.com/goreleaser/goreleaser/v2/pkg/config"
"github.com/goreleaser/goreleaser/v2/pkg/context"
"github.com/stretchr/testify/require"
)
func TestBuild(t *testing.T) {
setup(t)
cmd := newBuildCmd()
cmd.cmd.SetArgs([]string{"--snapshot", "--timeout=1m", "--parallelism=2", "--deprecated"})
require.NoError(t, cmd.cmd.Execute())
}
func TestBuildAutoSnapshot(t *testing.T) {
t.Run("clean", func(t *testing.T) {
setup(t)
cmd := newBuildCmd()
cmd.cmd.SetArgs([]string{"--auto-snapshot"})
require.NoError(t, cmd.cmd.Execute())
matches, err := filepath.Glob("./dist/fake_*/fake")
require.NoError(t, err)
require.Len(t, matches, 1)
})
t.Run("dirty", func(t *testing.T) {
setup(t)
createFile(t, "foo", "force dirty tree")
cmd := newBuildCmd()
cmd.cmd.SetArgs([]string{"--auto-snapshot"})
require.NoError(t, cmd.cmd.Execute())
matches, err := filepath.Glob("./dist/fake_*/fake_snapshot")
require.NoError(t, err)
require.Len(t, matches, 1)
})
}
func TestBuildSingleTarget(t *testing.T) {
setup(t)
cmd := newBuildCmd()
cmd.cmd.SetArgs([]string{"--snapshot", "--timeout=1m", "--parallelism=2", "--deprecated", "--single-target"})
require.NoError(t, cmd.cmd.Execute())
}
func TestBuildInvalidConfig(t *testing.T) {
setup(t)
createFile(t, "goreleaser.yml", "version: 2\nfoo: bar")
cmd := newBuildCmd()
cmd.cmd.SetArgs([]string{"--snapshot", "--timeout=1m", "--parallelism=2", "--deprecated"})
require.EqualError(t, cmd.cmd.Execute(), "yaml: unmarshal errors:\n line 2: field foo not found in type config.Project")
}
func TestBuildBrokenProject(t *testing.T) {
setup(t)
createFile(t, "main.go", "not a valid go file")
cmd := newBuildCmd()
cmd.cmd.SetArgs([]string{"--snapshot", "--timeout=1m", "--parallelism=2"})
require.EqualError(t, cmd.cmd.Execute(), "failed to parse dir: .: main.go:1:1: expected 'package', found not")
}
func TestSetupPipeline(t *testing.T) {
t.Run("regular", func(t *testing.T) {
require.Equal(
t,
pipeline.BuildCmdPipeline,
setupPipeline(testctx.New(), buildOpts{}),
)
})
t.Run("single-target", func(t *testing.T) {
require.Equal(
t,
pipeline.BuildCmdPipeline,
setupPipeline(testctx.New(), buildOpts{
singleTarget: true,
}),
)
})
t.Run("single-target and id", func(t *testing.T) {
require.Equal(
t,
pipeline.BuildCmdPipeline,
setupPipeline(testctx.New(), buildOpts{
singleTarget: true,
ids: []string{"foo"},
}),
)
})
t.Run("single-target and id, given output", func(t *testing.T) {
require.Equal(
t,
append(pipeline.BuildCmdPipeline, withOutputPipe{"foobar"}),
setupPipeline(testctx.New(), buildOpts{
singleTarget: true,
ids: []string{"foo"},
output: ".",
}),
)
})
t.Run("single-target and single build on config", func(t *testing.T) {
require.Equal(
t,
pipeline.BuildCmdPipeline,
setupPipeline(
testctx.NewWithCfg(config.Project{
Builds: []config.Build{{}},
}),
buildOpts{
singleTarget: true,
},
),
)
})
t.Run("single-target, id and output", func(t *testing.T) {
require.Equal(
t,
append(pipeline.BuildCmdPipeline, withOutputPipe{"foobar"}),
setupPipeline(
testctx.New(),
buildOpts{
singleTarget: true,
ids: []string{"foo"},
output: "foobar",
},
),
)
})
t.Run("single-target, single build on config and output", func(t *testing.T) {
require.Equal(
t,
append(pipeline.BuildCmdPipeline, withOutputPipe{"zaz"}),
setupPipeline(
testctx.NewWithCfg(config.Project{
Builds: []config.Build{{}},
}),
buildOpts{
singleTarget: true,
output: "zaz",
},
),
)
})
}
func TestBuildFlags(t *testing.T) {
setup := func(opts buildOpts) *context.Context {
ctx := testctx.New()
require.NoError(t, setupBuildContext(ctx, opts))
return ctx
}
t.Run("action", func(t *testing.T) {
ctx := setup(buildOpts{})
require.Equal(t, context.ActionBuild, ctx.Action)
})
t.Run("snapshot", func(t *testing.T) {
ctx := setup(buildOpts{
snapshot: true,
})
require.True(t, ctx.Snapshot)
requireAll(t, ctx, skips.Validate)
require.True(t, ctx.SkipTokenCheck)
})
t.Run("skips", func(t *testing.T) {
ctx := setup(buildOpts{
skips: []string{
string(skips.Validate),
string(skips.PostBuildHooks),
},
})
requireAll(t, ctx, skips.Validate, skips.PostBuildHooks)
require.True(t, ctx.SkipTokenCheck)
})
t.Run("parallelism", func(t *testing.T) {
require.Equal(t, 1, setup(buildOpts{
parallelism: 1,
}).Parallelism)
})
t.Run("rm dist", func(t *testing.T) {
require.True(t, setup(buildOpts{
clean: true,
}).Clean)
})
t.Run("id", func(t *testing.T) {
t.Run("match", func(t *testing.T) {
ctx := testctx.NewWithCfg(config.Project{
Builds: []config.Build{
{
ID: "default",
},
{
ID: "foo",
},
},
})
require.NoError(t, setupBuildContext(ctx, buildOpts{
ids: []string{"foo"},
}))
})
t.Run("match-multiple", func(t *testing.T) {
ctx := testctx.NewWithCfg(config.Project{
Builds: []config.Build{
{
ID: "default",
},
{
ID: "foo",
},
},
})
require.NoError(t, setupBuildContext(ctx, buildOpts{
ids: []string{"foo", "default"},
}))
})
t.Run("match-partial", func(t *testing.T) {
ctx := testctx.NewWithCfg(config.Project{
Builds: []config.Build{
{
ID: "default",
},
{
ID: "foo",
},
},
})
require.NoError(t, setupBuildContext(ctx, buildOpts{
ids: []string{"foo", "notdefault"},
}))
})
t.Run("dont match", func(t *testing.T) {
ctx := testctx.NewWithCfg(config.Project{
Builds: []config.Build{
{
ID: "foo",
},
{
ID: "bazz",
},
},
})
require.EqualError(t, setupBuildContext(ctx, buildOpts{
ids: []string{"bar", "fooz"},
}), "no builds with ids bar, fooz")
})
t.Run("default config", func(t *testing.T) {
ctx := testctx.New()
require.NoError(t, setupBuildContext(ctx, buildOpts{
ids: []string{"aaa"},
}))
})
t.Run("single build config", func(t *testing.T) {
ctx := testctx.NewWithCfg(config.Project{
Builds: []config.Build{
{
ID: "foo",
},
},
})
require.NoError(t, setupBuildContext(ctx, buildOpts{
ids: []string{"not foo but doesnt matter"},
}))
})
})
}