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  }