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 }