github.com/goreleaser/goreleaser@v1.25.1/internal/pipe/release/body_test.go (about)

     1  package release
     2  
     3  import (
     4  	"os"
     5  	"path/filepath"
     6  	"testing"
     7  
     8  	"github.com/goreleaser/goreleaser/internal/artifact"
     9  	"github.com/goreleaser/goreleaser/internal/golden"
    10  	"github.com/goreleaser/goreleaser/internal/testctx"
    11  	"github.com/goreleaser/goreleaser/internal/testlib"
    12  	"github.com/goreleaser/goreleaser/pkg/config"
    13  	"github.com/goreleaser/goreleaser/pkg/context"
    14  	"github.com/stretchr/testify/require"
    15  )
    16  
    17  func TestDescribeBody(t *testing.T) {
    18  	changelog := "feature1: description\nfeature2: other description"
    19  	ctx := testctx.New()
    20  	ctx.ReleaseNotes = changelog
    21  	out, err := describeBody(ctx)
    22  	require.NoError(t, err)
    23  
    24  	golden.RequireEqual(t, out.Bytes())
    25  }
    26  
    27  func TestDontEscapeHTML(t *testing.T) {
    28  	changelog := "<h1>test</h1>"
    29  	ctx := testctx.New()
    30  	ctx.ReleaseNotes = changelog
    31  
    32  	out, err := describeBody(ctx)
    33  	require.NoError(t, err)
    34  	require.Contains(t, out.String(), changelog)
    35  }
    36  
    37  func TestDescribeBodyMultipleChecksums(t *testing.T) {
    38  	ctx := testctx.NewWithCfg(
    39  		config.Project{
    40  			Release: config.Release{
    41  				Header: "## Yada yada yada\nsomething\n",
    42  				Footer: `
    43  ---
    44  
    45  ## Checksums
    46  
    47  ` + "```\n{{ range $key, $value := .Checksums }}{{ $value }} {{ $key }}\n{{ end }}```\n",
    48  			},
    49  		},
    50  		testctx.WithCurrentTag("v1.0"),
    51  		func(ctx *context.Context) { ctx.ReleaseNotes = "nothing" },
    52  	)
    53  
    54  	checksums := map[string]string{
    55  		"bar.zip": "f674623cf1edd0f753e620688cedee4e7c0e837ac1e53c0cbbce132ffe35fd52",
    56  		"foo.zip": "271a74b75a12f6c3affc88df101f9ef29af79717b1b2f4bdd5964aacf65bcf40",
    57  	}
    58  	for name, check := range checksums {
    59  		name := name
    60  		check := check
    61  		checksumPath := filepath.Join(t.TempDir(), name+".sha256")
    62  		ctx.Artifacts.Add(&artifact.Artifact{
    63  			Name: name + ".sha256",
    64  			Path: checksumPath,
    65  			Type: artifact.Checksum,
    66  			Extra: map[string]interface{}{
    67  				artifact.ExtraChecksumOf: name,
    68  				artifact.ExtraRefresh: func() error {
    69  					return os.WriteFile(checksumPath, []byte(check), 0o644)
    70  				},
    71  			},
    72  		})
    73  	}
    74  
    75  	require.NoError(t, ctx.Artifacts.Refresh())
    76  
    77  	out, err := describeBody(ctx)
    78  	require.NoError(t, err)
    79  
    80  	golden.RequireEqual(t, out.Bytes())
    81  }
    82  
    83  func TestDescribeBodyWithHeaderAndFooter(t *testing.T) {
    84  	changelog := "feature1: description\nfeature2: other description"
    85  	ctx := testctx.NewWithCfg(
    86  		config.Project{
    87  			Release: config.Release{
    88  				Header: "## Yada yada yada\nsomething\n",
    89  				Footer: `
    90  ---
    91  
    92  Get images at docker.io/foo/bar:{{.Tag}}
    93  
    94  ---
    95  
    96  Get GoReleaser Pro at https://goreleaser.com/pro
    97  
    98  ---
    99  
   100  ## Checksums
   101  
   102  ` + "```\n{{ .Checksums }}\n```" + `
   103  				`,
   104  			},
   105  		},
   106  		testctx.WithCurrentTag("v1.0"),
   107  		func(ctx *context.Context) { ctx.ReleaseNotes = changelog },
   108  	)
   109  
   110  	checksumPath := filepath.Join(t.TempDir(), "checksums.txt")
   111  	checksumContent := "f674623cf1edd0f753e620688cedee4e7c0e837ac1e53c0cbbce132ffe35fd52  foo.zip"
   112  	ctx.Artifacts.Add(&artifact.Artifact{
   113  		Name: "checksums.txt",
   114  		Path: checksumPath,
   115  		Type: artifact.Checksum,
   116  		Extra: map[string]interface{}{
   117  			artifact.ExtraRefresh: func() error {
   118  				return os.WriteFile(checksumPath, []byte(checksumContent), 0o644)
   119  			},
   120  		},
   121  	})
   122  
   123  	require.NoError(t, ctx.Artifacts.Refresh())
   124  
   125  	out, err := describeBody(ctx)
   126  	require.NoError(t, err)
   127  
   128  	golden.RequireEqual(t, out.Bytes())
   129  }
   130  
   131  func TestDescribeBodyWithInvalidHeaderTemplate(t *testing.T) {
   132  	ctx := testctx.NewWithCfg(config.Project{
   133  		Release: config.Release{
   134  			Header: "## {{ .Nop }\n",
   135  		},
   136  	})
   137  	_, err := describeBody(ctx)
   138  	testlib.RequireTemplateError(t, err)
   139  }
   140  
   141  func TestDescribeBodyWithInvalidFooterTemplate(t *testing.T) {
   142  	ctx := testctx.NewWithCfg(config.Project{
   143  		Release: config.Release{
   144  			Footer: "{{ .Nops }",
   145  		},
   146  	})
   147  	_, err := describeBody(ctx)
   148  	testlib.RequireTemplateError(t, err)
   149  }