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  }