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  }