github.com/triarius/goreleaser@v1.12.5/internal/pipe/env/env_test.go (about) 1 package env 2 3 import ( 4 "fmt" 5 "os" 6 "testing" 7 8 "github.com/triarius/goreleaser/pkg/config" 9 "github.com/triarius/goreleaser/pkg/context" 10 "github.com/stretchr/testify/require" 11 ) 12 13 func TestDescription(t *testing.T) { 14 require.NotEmpty(t, Pipe{}.String()) 15 } 16 17 func TestSetDefaultTokenFiles(t *testing.T) { 18 t.Run("empty config", func(t *testing.T) { 19 ctx := context.New(config.Project{}) 20 setDefaultTokenFiles(ctx) 21 require.Equal(t, "~/.config/goreleaser/github_token", ctx.Config.EnvFiles.GitHubToken) 22 require.Equal(t, "~/.config/goreleaser/gitlab_token", ctx.Config.EnvFiles.GitLabToken) 23 require.Equal(t, "~/.config/goreleaser/gitea_token", ctx.Config.EnvFiles.GiteaToken) 24 }) 25 t.Run("custom config config", func(t *testing.T) { 26 cfg := "what" 27 ctx := context.New(config.Project{ 28 EnvFiles: config.EnvFiles{ 29 GitHubToken: cfg, 30 }, 31 }) 32 setDefaultTokenFiles(ctx) 33 require.Equal(t, cfg, ctx.Config.EnvFiles.GitHubToken) 34 }) 35 t.Run("templates", func(t *testing.T) { 36 ctx := context.New(config.Project{ 37 ProjectName: "foobar", 38 Env: []string{ 39 "FOO=FOO_{{ .Env.BAR }}", 40 "FOOBAR={{.ProjectName}}", 41 "EMPTY_VAL=", 42 }, 43 }) 44 ctx.Env["FOOBAR"] = "old foobar" 45 os.Setenv("BAR", "lebar") 46 os.Setenv("GITHUB_TOKEN", "fake") 47 require.NoError(t, Pipe{}.Run(ctx)) 48 require.Equal(t, "FOO_lebar", ctx.Env["FOO"]) 49 require.Equal(t, "foobar", ctx.Env["FOOBAR"]) 50 require.Equal(t, "", ctx.Env["EMPTY_VAL"]) 51 }) 52 53 t.Run("template error", func(t *testing.T) { 54 ctx := context.New(config.Project{ 55 Env: []string{ 56 "FOO={{ .Asss }", 57 }, 58 }) 59 require.EqualError(t, Pipe{}.Run(ctx), `template: tmpl:1: unexpected "}" in operand`) 60 }) 61 62 t.Run("no token", func(t *testing.T) { 63 ctx := context.New(config.Project{}) 64 require.NoError(t, Pipe{}.Run(ctx)) 65 require.Equal(t, ctx.TokenType, context.TokenTypeGitHub) 66 }) 67 } 68 69 func TestValidGithubEnv(t *testing.T) { 70 require.NoError(t, os.Setenv("GITHUB_TOKEN", "asdf")) 71 ctx := &context.Context{ 72 Config: config.Project{}, 73 } 74 require.NoError(t, Pipe{}.Run(ctx)) 75 require.Equal(t, "asdf", ctx.Token) 76 require.Equal(t, context.TokenTypeGitHub, ctx.TokenType) 77 // so the tests do not depend on each other 78 require.NoError(t, os.Unsetenv("GITHUB_TOKEN")) 79 } 80 81 func TestValidGitlabEnv(t *testing.T) { 82 require.NoError(t, os.Setenv("GITLAB_TOKEN", "qwertz")) 83 ctx := &context.Context{ 84 Config: config.Project{}, 85 } 86 require.NoError(t, Pipe{}.Run(ctx)) 87 require.Equal(t, "qwertz", ctx.Token) 88 require.Equal(t, context.TokenTypeGitLab, ctx.TokenType) 89 // so the tests do not depend on each other 90 require.NoError(t, os.Unsetenv("GITLAB_TOKEN")) 91 } 92 93 func TestValidGiteaEnv(t *testing.T) { 94 require.NoError(t, os.Setenv("GITEA_TOKEN", "token")) 95 ctx := &context.Context{ 96 Config: config.Project{}, 97 } 98 require.NoError(t, Pipe{}.Run(ctx)) 99 require.Equal(t, "token", ctx.Token) 100 require.Equal(t, context.TokenTypeGitea, ctx.TokenType) 101 // so the tests do not depend on each other 102 require.NoError(t, os.Unsetenv("GITEA_TOKEN")) 103 } 104 105 func TestInvalidEnv(t *testing.T) { 106 require.NoError(t, os.Unsetenv("GITHUB_TOKEN")) 107 require.NoError(t, os.Unsetenv("GITLAB_TOKEN")) 108 ctx := &context.Context{ 109 Config: config.Project{}, 110 } 111 require.Error(t, Pipe{}.Run(ctx)) 112 require.EqualError(t, Pipe{}.Run(ctx), ErrMissingToken.Error()) 113 } 114 115 func TestMultipleEnvTokens(t *testing.T) { 116 require.NoError(t, os.Setenv("GITHUB_TOKEN", "asdf")) 117 require.NoError(t, os.Setenv("GITLAB_TOKEN", "qwertz")) 118 require.NoError(t, os.Setenv("GITEA_TOKEN", "token")) 119 ctx := &context.Context{ 120 Config: config.Project{}, 121 } 122 require.Error(t, Pipe{}.Run(ctx)) 123 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") 124 // so the tests do not depend on each other 125 require.NoError(t, os.Unsetenv("GITHUB_TOKEN")) 126 require.NoError(t, os.Unsetenv("GITLAB_TOKEN")) 127 require.NoError(t, os.Unsetenv("GITEA_TOKEN")) 128 } 129 130 func TestEmptyGithubFileEnv(t *testing.T) { 131 require.NoError(t, os.Unsetenv("GITHUB_TOKEN")) 132 ctx := &context.Context{ 133 Config: config.Project{}, 134 } 135 require.Error(t, Pipe{}.Run(ctx)) 136 } 137 138 func TestEmptyGitlabFileEnv(t *testing.T) { 139 require.NoError(t, os.Unsetenv("GITLAB_TOKEN")) 140 ctx := &context.Context{ 141 Config: config.Project{}, 142 } 143 require.Error(t, Pipe{}.Run(ctx)) 144 } 145 146 func TestEmptyGiteaFileEnv(t *testing.T) { 147 require.NoError(t, os.Unsetenv("GITEA_TOKEN")) 148 ctx := &context.Context{ 149 Config: config.Project{}, 150 } 151 require.Error(t, Pipe{}.Run(ctx)) 152 } 153 154 func TestEmptyGithubEnvFile(t *testing.T) { 155 require.NoError(t, os.Unsetenv("GITHUB_TOKEN")) 156 f, err := os.CreateTemp(t.TempDir(), "token") 157 require.NoError(t, err) 158 require.NoError(t, f.Close()) 159 require.NoError(t, os.Chmod(f.Name(), 0o377)) 160 ctx := &context.Context{ 161 Config: config.Project{ 162 EnvFiles: config.EnvFiles{ 163 GitHubToken: f.Name(), 164 }, 165 }, 166 } 167 require.EqualError(t, Pipe{}.Run(ctx), fmt.Sprintf("failed to load github token: open %s: permission denied", f.Name())) 168 } 169 170 func TestEmptyGitlabEnvFile(t *testing.T) { 171 require.NoError(t, os.Unsetenv("GITLAB_TOKEN")) 172 f, err := os.CreateTemp(t.TempDir(), "token") 173 require.NoError(t, err) 174 require.NoError(t, f.Close()) 175 require.NoError(t, os.Chmod(f.Name(), 0o377)) 176 ctx := &context.Context{ 177 Config: config.Project{ 178 EnvFiles: config.EnvFiles{ 179 GitLabToken: f.Name(), 180 }, 181 }, 182 } 183 require.EqualError(t, Pipe{}.Run(ctx), fmt.Sprintf("failed to load gitlab token: open %s: permission denied", f.Name())) 184 } 185 186 func TestEmptyGiteaEnvFile(t *testing.T) { 187 require.NoError(t, os.Unsetenv("GITEA_TOKEN")) 188 f, err := os.CreateTemp(t.TempDir(), "token") 189 require.NoError(t, err) 190 require.NoError(t, f.Close()) 191 require.NoError(t, os.Chmod(f.Name(), 0o377)) 192 ctx := &context.Context{ 193 Config: config.Project{ 194 EnvFiles: config.EnvFiles{ 195 GiteaToken: f.Name(), 196 }, 197 }, 198 } 199 require.EqualError(t, Pipe{}.Run(ctx), fmt.Sprintf("failed to load gitea token: open %s: permission denied", f.Name())) 200 } 201 202 func TestInvalidEnvChecksSkipped(t *testing.T) { 203 require.NoError(t, os.Unsetenv("GITHUB_TOKEN")) 204 ctx := &context.Context{ 205 Config: config.Project{}, 206 SkipPublish: true, 207 } 208 require.NoError(t, Pipe{}.Run(ctx)) 209 } 210 211 func TestInvalidEnvReleaseDisabled(t *testing.T) { 212 require.NoError(t, os.Unsetenv("GITHUB_TOKEN")) 213 ctx := &context.Context{ 214 Config: config.Project{ 215 Release: config.Release{ 216 Disable: true, 217 }, 218 }, 219 } 220 require.NoError(t, Pipe{}.Run(ctx)) 221 } 222 223 func TestLoadEnv(t *testing.T) { 224 t.Run("env exists", func(t *testing.T) { 225 env := "SUPER_SECRET_ENV" 226 require.NoError(t, os.Setenv(env, "1")) 227 v, err := loadEnv(env, "nope") 228 require.NoError(t, err) 229 require.Equal(t, "1", v) 230 }) 231 t.Run("env file exists", func(t *testing.T) { 232 env := "SUPER_SECRET_ENV_NOPE" 233 require.NoError(t, os.Unsetenv(env)) 234 f, err := os.CreateTemp(t.TempDir(), "token") 235 require.NoError(t, err) 236 fmt.Fprintf(f, "123") 237 require.NoError(t, f.Close()) 238 v, err := loadEnv(env, f.Name()) 239 require.NoError(t, err) 240 require.Equal(t, "123", v) 241 }) 242 t.Run("env file with an empty line at the end", func(t *testing.T) { 243 env := "SUPER_SECRET_ENV_NOPE" 244 require.NoError(t, os.Unsetenv(env)) 245 f, err := os.CreateTemp(t.TempDir(), "token") 246 require.NoError(t, err) 247 fmt.Fprintf(f, "123\n") 248 require.NoError(t, f.Close()) 249 v, err := loadEnv(env, f.Name()) 250 require.NoError(t, err) 251 require.Equal(t, "123", v) 252 }) 253 t.Run("env file is not readable", func(t *testing.T) { 254 env := "SUPER_SECRET_ENV_NOPE" 255 require.NoError(t, os.Unsetenv(env)) 256 f, err := os.CreateTemp(t.TempDir(), "token") 257 require.NoError(t, err) 258 fmt.Fprintf(f, "123") 259 require.NoError(t, f.Close()) 260 err = os.Chmod(f.Name(), 0o377) 261 require.NoError(t, err) 262 v, err := loadEnv(env, f.Name()) 263 require.EqualError(t, err, fmt.Sprintf("open %s: permission denied", f.Name())) 264 require.Equal(t, "", v) 265 }) 266 }