github.com/goreleaser/goreleaser@v1.25.1/internal/pipe/env/env_test.go (about) 1 package env 2 3 import ( 4 "fmt" 5 "os" 6 "syscall" 7 "testing" 8 9 "github.com/goreleaser/goreleaser/internal/skips" 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 TestMain(m *testing.M) { 18 restores := map[string]string{} 19 for _, key := range []string{"GITHUB_TOKEN", "GITEA_TOKEN", "GITLAB_TOKEN"} { 20 prevValue, ok := os.LookupEnv(key) 21 if ok { 22 _ = os.Unsetenv(key) 23 restores[key] = prevValue 24 } 25 } 26 27 code := m.Run() 28 29 for k, v := range restores { 30 _ = os.Setenv(k, v) 31 } 32 33 os.Exit(code) 34 } 35 36 func TestDescription(t *testing.T) { 37 require.NotEmpty(t, Pipe{}.String()) 38 } 39 40 func TestSetDefaultTokenFiles(t *testing.T) { 41 t.Run("empty config", func(t *testing.T) { 42 ctx := testctx.New() 43 setDefaultTokenFiles(ctx) 44 require.Equal(t, "~/.config/goreleaser/github_token", ctx.Config.EnvFiles.GitHubToken) 45 require.Equal(t, "~/.config/goreleaser/gitlab_token", ctx.Config.EnvFiles.GitLabToken) 46 require.Equal(t, "~/.config/goreleaser/gitea_token", ctx.Config.EnvFiles.GiteaToken) 47 }) 48 t.Run("custom config config", func(t *testing.T) { 49 cfg := "what" 50 ctx := testctx.NewWithCfg(config.Project{ 51 EnvFiles: config.EnvFiles{ 52 GitHubToken: cfg, 53 }, 54 }) 55 setDefaultTokenFiles(ctx) 56 require.Equal(t, cfg, ctx.Config.EnvFiles.GitHubToken) 57 }) 58 t.Run("templates", func(t *testing.T) { 59 ctx := testctx.NewWithCfg(config.Project{ 60 ProjectName: "foobar", 61 Env: []string{ 62 "FOO=FOO_{{ .Env.BAR }}", 63 "FOOBAR={{.ProjectName}}", 64 "EMPTY_VAL=", 65 }, 66 }) 67 ctx.Env["FOOBAR"] = "old foobar" 68 t.Setenv("BAR", "lebar") 69 t.Setenv("GITHUB_TOKEN", "fake") 70 require.NoError(t, Pipe{}.Run(ctx)) 71 require.Equal(t, "FOO_lebar", ctx.Env["FOO"]) 72 require.Equal(t, "foobar", ctx.Env["FOOBAR"]) 73 require.Equal(t, "", ctx.Env["EMPTY_VAL"]) 74 }) 75 76 t.Run("template error", func(t *testing.T) { 77 ctx := testctx.NewWithCfg(config.Project{ 78 Env: []string{ 79 "FOO={{ .Asss }", 80 }, 81 }) 82 testlib.RequireTemplateError(t, Pipe{}.Run(ctx)) 83 }) 84 85 t.Run("no token", func(t *testing.T) { 86 ctx := testctx.New() 87 require.EqualError(t, Pipe{}.Run(ctx), ErrMissingToken.Error()) 88 }) 89 } 90 91 func TestForceToken(t *testing.T) { 92 t.Run("github", func(t *testing.T) { 93 t.Setenv("GITHUB_TOKEN", "fake") 94 t.Setenv("GORELEASER_FORCE_TOKEN", "github") 95 ctx := testctx.New() 96 require.NoError(t, Pipe{}.Run(ctx)) 97 require.Equal(t, context.TokenTypeGitHub, ctx.TokenType) 98 }) 99 t.Run("gitlab", func(t *testing.T) { 100 t.Setenv("GITLAB_TOKEN", "fake") 101 t.Setenv("GORELEASER_FORCE_TOKEN", "gitlab") 102 ctx := testctx.New() 103 require.NoError(t, Pipe{}.Run(ctx)) 104 require.Equal(t, context.TokenTypeGitLab, ctx.TokenType) 105 }) 106 t.Run("gitea", func(t *testing.T) { 107 t.Setenv("GITEA_TOKEN", "fake") 108 t.Setenv("GORELEASER_FORCE_TOKEN", "gitea") 109 ctx := testctx.New() 110 require.NoError(t, Pipe{}.Run(ctx)) 111 require.Equal(t, context.TokenTypeGitea, ctx.TokenType) 112 }) 113 } 114 115 func TestValidGithubEnv(t *testing.T) { 116 t.Setenv("GITHUB_TOKEN", "asdf") 117 ctx := testctx.New() 118 require.NoError(t, Pipe{}.Run(ctx)) 119 require.Equal(t, "asdf", ctx.Token) 120 require.Equal(t, context.TokenTypeGitHub, ctx.TokenType) 121 } 122 123 func TestValidGitlabEnv(t *testing.T) { 124 t.Setenv("GITLAB_TOKEN", "qwertz") 125 ctx := testctx.New() 126 require.NoError(t, Pipe{}.Run(ctx)) 127 require.Equal(t, "qwertz", ctx.Token) 128 require.Equal(t, context.TokenTypeGitLab, ctx.TokenType) 129 } 130 131 func TestValidGiteaEnv(t *testing.T) { 132 t.Setenv("GITEA_TOKEN", "token") 133 ctx := testctx.New() 134 require.NoError(t, Pipe{}.Run(ctx)) 135 require.Equal(t, "token", ctx.Token) 136 require.Equal(t, context.TokenTypeGitea, ctx.TokenType) 137 } 138 139 func TestInvalidEnv(t *testing.T) { 140 ctx := testctx.New() 141 require.Error(t, Pipe{}.Run(ctx)) 142 require.EqualError(t, Pipe{}.Run(ctx), ErrMissingToken.Error()) 143 } 144 145 func TestMultipleEnvTokens(t *testing.T) { 146 t.Setenv("GITHUB_TOKEN", "asdf") 147 t.Setenv("GITLAB_TOKEN", "qwertz") 148 t.Setenv("GITEA_TOKEN", "token") 149 ctx := testctx.New() 150 require.Error(t, Pipe{}.Run(ctx)) 151 require.EqualError(t, Pipe{}.Run(ctx), "multiple tokens found, but only one is allowed: GITHUB_TOKEN, GITLAB_TOKEN, GITEA_TOKEN\n\nLearn more at https://goreleaser.com/errors/multiple-tokens\n") 152 } 153 154 func TestMultipleEnvTokensForce(t *testing.T) { 155 t.Setenv("GITHUB_TOKEN", "asdf") 156 t.Setenv("GITLAB_TOKEN", "qwertz") 157 t.Setenv("GITEA_TOKEN", "token") 158 ctx := testctx.New() 159 require.Error(t, Pipe{}.Run(ctx)) 160 require.EqualError(t, Pipe{}.Run(ctx), "multiple tokens found, but only one is allowed: GITHUB_TOKEN, GITLAB_TOKEN, GITEA_TOKEN\n\nLearn more at https://goreleaser.com/errors/multiple-tokens\n") 161 } 162 163 func TestEmptyGithubFileEnv(t *testing.T) { 164 ctx := testctx.New() 165 require.Error(t, Pipe{}.Run(ctx)) 166 } 167 168 func TestEmptyGitlabFileEnv(t *testing.T) { 169 ctx := testctx.New() 170 require.Error(t, Pipe{}.Run(ctx)) 171 } 172 173 func TestEmptyGiteaFileEnv(t *testing.T) { 174 ctx := testctx.New() 175 require.Error(t, Pipe{}.Run(ctx)) 176 } 177 178 func TestEmptyGithubEnvFile(t *testing.T) { 179 f, err := os.CreateTemp(t.TempDir(), "token") 180 require.NoError(t, err) 181 require.NoError(t, f.Close()) 182 require.NoError(t, os.Chmod(f.Name(), 0o377)) 183 ctx := testctx.NewWithCfg(config.Project{ 184 EnvFiles: config.EnvFiles{ 185 GitHubToken: f.Name(), 186 }, 187 }) 188 err = Pipe{}.Run(ctx) 189 require.ErrorIs(t, err, syscall.EACCES) 190 require.ErrorContains(t, err, "failed to load github token") 191 } 192 193 func TestEmptyGitlabEnvFile(t *testing.T) { 194 f, err := os.CreateTemp(t.TempDir(), "token") 195 require.NoError(t, err) 196 require.NoError(t, f.Close()) 197 require.NoError(t, os.Chmod(f.Name(), 0o377)) 198 ctx := testctx.NewWithCfg(config.Project{ 199 EnvFiles: config.EnvFiles{ 200 GitLabToken: f.Name(), 201 }, 202 }) 203 err = Pipe{}.Run(ctx) 204 require.ErrorIs(t, err, syscall.EACCES) 205 require.ErrorContains(t, err, "failed to load gitlab token") 206 } 207 208 func TestEmptyGiteaEnvFile(t *testing.T) { 209 f, err := os.CreateTemp(t.TempDir(), "token") 210 require.NoError(t, err) 211 require.NoError(t, f.Close()) 212 require.NoError(t, os.Chmod(f.Name(), 0o377)) 213 ctx := testctx.NewWithCfg(config.Project{ 214 EnvFiles: config.EnvFiles{ 215 GiteaToken: f.Name(), 216 }, 217 }) 218 err = Pipe{}.Run(ctx) 219 require.ErrorIs(t, err, syscall.EACCES) 220 require.ErrorContains(t, err, "failed to load gitea token") 221 } 222 223 func TestInvalidEnvChecksSkipped(t *testing.T) { 224 ctx := testctx.New(testctx.Skip(skips.Publish)) 225 require.NoError(t, Pipe{}.Run(ctx)) 226 } 227 228 func TestInvalidEnvReleaseDisabled(t *testing.T) { 229 t.Run("true", func(t *testing.T) { 230 ctx := testctx.NewWithCfg(config.Project{ 231 Env: []string{}, 232 Release: config.Release{ 233 Disable: "true", 234 }, 235 }) 236 require.NoError(t, Pipe{}.Run(ctx)) 237 }) 238 239 t.Run("tmpl true", func(t *testing.T) { 240 ctx := testctx.NewWithCfg(config.Project{ 241 Env: []string{"FOO=true"}, 242 Release: config.Release{ 243 Disable: "{{ .Env.FOO }}", 244 }, 245 }) 246 require.NoError(t, Pipe{}.Run(ctx)) 247 }) 248 249 t.Run("tmpl false", func(t *testing.T) { 250 ctx := testctx.NewWithCfg(config.Project{ 251 Env: []string{"FOO=true"}, 252 Release: config.Release{ 253 Disable: "{{ .Env.FOO }}-nope", 254 }, 255 }) 256 require.EqualError(t, Pipe{}.Run(ctx), ErrMissingToken.Error()) 257 }) 258 259 t.Run("tmpl error", func(t *testing.T) { 260 ctx := testctx.NewWithCfg(config.Project{ 261 Release: config.Release{ 262 Disable: "{{ .Env.FOO }}", 263 }, 264 }) 265 testlib.RequireTemplateError(t, Pipe{}.Run(ctx)) 266 }) 267 } 268 269 func TestLoadEnv(t *testing.T) { 270 const env = "SUPER_SECRET_ENV_NOPE" 271 272 t.Run("env exists", func(t *testing.T) { 273 t.Setenv(env, "1") 274 v, err := loadEnv(env, "nope") 275 require.NoError(t, err) 276 require.Equal(t, "1", v) 277 }) 278 t.Run("env file exists", func(t *testing.T) { 279 f, err := os.CreateTemp(t.TempDir(), "token") 280 require.NoError(t, err) 281 fmt.Fprintf(f, "123") 282 require.NoError(t, f.Close()) 283 v, err := loadEnv(env, f.Name()) 284 require.NoError(t, err) 285 require.Equal(t, "123", v) 286 }) 287 t.Run("env file with an empty line at the end", func(t *testing.T) { 288 f, err := os.CreateTemp(t.TempDir(), "token") 289 require.NoError(t, err) 290 fmt.Fprintf(f, "123\n") 291 require.NoError(t, f.Close()) 292 v, err := loadEnv(env, f.Name()) 293 require.NoError(t, err) 294 require.Equal(t, "123", v) 295 }) 296 t.Run("env file is not readable", func(t *testing.T) { 297 f, err := os.CreateTemp(t.TempDir(), "token") 298 require.NoError(t, err) 299 fmt.Fprintf(f, "123") 300 require.NoError(t, f.Close()) 301 err = os.Chmod(f.Name(), 0o377) 302 require.NoError(t, err) 303 v, err := loadEnv(env, f.Name()) 304 require.EqualError(t, err, fmt.Sprintf("open %s: permission denied", f.Name())) 305 require.Equal(t, "", v) 306 }) 307 }