github.com/ahmet2mir/goreleaser@v0.180.3-0.20210927151101-8e5ee5a9b8c5/internal/pipe/env/env_test.go (about)

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