github.com/goreleaser/goreleaser@v1.25.1/internal/pipe/metadata/metadata_test.go (about) 1 package metadata 2 3 import ( 4 "fmt" 5 "os" 6 "path/filepath" 7 "strconv" 8 "testing" 9 "time" 10 11 "github.com/goreleaser/goreleaser/internal/artifact" 12 "github.com/goreleaser/goreleaser/internal/golden" 13 "github.com/goreleaser/goreleaser/internal/testctx" 14 "github.com/goreleaser/goreleaser/internal/testlib" 15 "github.com/goreleaser/goreleaser/pkg/config" 16 "github.com/goreleaser/goreleaser/pkg/context" 17 "github.com/stretchr/testify/require" 18 ) 19 20 func TestRunWithError(t *testing.T) { 21 ctx := testctx.NewWithCfg(config.Project{ 22 Dist: "testadata/nope", 23 ProjectName: "foo", 24 }) 25 require.ErrorIs(t, MetaPipe{}.Run(ctx), os.ErrNotExist) 26 require.ErrorIs(t, ArtifactsPipe{}.Run(ctx), os.ErrNotExist) 27 } 28 29 func TestRun(t *testing.T) { 30 modTime := time.Now().AddDate(-1, 0, 0).Round(1 * time.Second).UTC() 31 32 getCtx := func(tmp string) *context.Context { 33 ctx := testctx.NewWithCfg( 34 config.Project{ 35 Dist: tmp, 36 ProjectName: "name", 37 Metadata: config.ProjectMetadata{ 38 ModTimestamp: "{{.Env.MOD_TS}}", 39 }, 40 }, 41 testctx.WithPreviousTag("v1.2.2"), 42 testctx.WithCurrentTag("v1.2.3"), 43 testctx.WithCommit("aef34a"), 44 testctx.WithVersion("1.2.3"), 45 testctx.WithDate(time.Date(2022, 0o1, 22, 10, 12, 13, 0, time.UTC)), 46 testctx.WithFakeRuntime, 47 testctx.WithEnv(map[string]string{ 48 "MOD_TS": fmt.Sprintf("%d", modTime.Unix()), 49 }), 50 ) 51 ctx.Artifacts.Add(&artifact.Artifact{ 52 Name: "foo", 53 Path: "foo.txt", 54 Type: artifact.Binary, 55 Goos: "darwin", 56 Goarch: "amd64", 57 Goarm: "7", 58 Extra: map[string]interface{}{ 59 "foo": "bar", 60 }, 61 }) 62 return ctx 63 } 64 65 t.Run("artifacts", func(t *testing.T) { 66 tmp := t.TempDir() 67 ctx := getCtx(tmp) 68 require.NoError(t, Pipe{}.Run(ctx)) 69 require.NoError(t, ArtifactsPipe{}.Run(ctx)) 70 requireEqualJSONFile(t, filepath.Join(tmp, "artifacts.json"), modTime) 71 }) 72 73 t.Run("metadata", func(t *testing.T) { 74 tmp := t.TempDir() 75 ctx := getCtx(tmp) 76 require.NoError(t, Pipe{}.Run(ctx)) 77 require.NoError(t, MetaPipe{}.Run(ctx)) 78 79 metas := ctx.Artifacts.Filter(artifact.ByType(artifact.Metadata)).List() 80 require.Len(t, metas, 1) 81 require.Equal(t, "metadata.json", metas[0].Name) 82 requireEqualJSONFile(t, metas[0].Path, modTime) 83 }) 84 85 t.Run("invalid mod metadata", func(t *testing.T) { 86 tmp := t.TempDir() 87 ctx := getCtx(tmp) 88 ctx.Config.Metadata.ModTimestamp = "not a number" 89 require.NoError(t, Pipe{}.Run(ctx)) 90 require.ErrorIs(t, MetaPipe{}.Run(ctx), strconv.ErrSyntax) 91 require.ErrorIs(t, ArtifactsPipe{}.Run(ctx), strconv.ErrSyntax) 92 }) 93 94 t.Run("invalid mod metadata tmpl", func(t *testing.T) { 95 tmp := t.TempDir() 96 ctx := getCtx(tmp) 97 ctx.Config.Metadata.ModTimestamp = "{{.Nope}}" 98 testlib.RequireTemplateError(t, Pipe{}.Run(ctx)) 99 }) 100 } 101 102 func requireEqualJSONFile(tb testing.TB, path string, modTime time.Time) { 103 tb.Helper() 104 golden.RequireEqualJSON(tb, golden.RequireReadFile(tb, path)) 105 stat, err := os.Stat(path) 106 require.NoError(tb, err) 107 require.Equal(tb, modTime.Unix(), stat.ModTime().Unix()) 108 }