gitee.com/mirrors_opencollective/goreleaser@v0.45.0/goreleaserlib/goreleaser_test.go (about)

     1  package goreleaserlib
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"path/filepath"
     7  	"strconv"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/goreleaser/goreleaser/config"
    12  	"github.com/goreleaser/goreleaser/internal/testlib"
    13  	"github.com/stretchr/testify/assert"
    14  	yaml "gopkg.in/yaml.v2"
    15  )
    16  
    17  func init() {
    18  	_ = os.Unsetenv("GITHUB_TOKEN")
    19  }
    20  
    21  func TestRelease(t *testing.T) {
    22  	_, back := setup(t)
    23  	defer back()
    24  	assert.NoError(t, Release(newFlags(t, testParams())))
    25  }
    26  
    27  func TestSnapshotRelease(t *testing.T) {
    28  	_, back := setup(t)
    29  	defer back()
    30  	params := testParams()
    31  	params["snapshot"] = "true"
    32  	assert.NoError(t, Release(newFlags(t, params)))
    33  }
    34  
    35  func TestConfigFileIsSetAndDontExist(t *testing.T) {
    36  	params := testParams()
    37  	params["config"] = "/this/wont/exist"
    38  	assert.Error(t, Release(newFlags(t, params)))
    39  }
    40  
    41  func TestConfigFlagNotSetButExists(t *testing.T) {
    42  	for _, name := range []string{
    43  		".goreleaser.yml",
    44  		".goreleaser.yaml",
    45  		"goreleaser.yml",
    46  		"goreleaser.yaml",
    47  	} {
    48  		t.Run(name, func(t *testing.T) {
    49  			folder, back := setup(t)
    50  			defer back()
    51  			assert.NoError(
    52  				t,
    53  				os.Rename(
    54  					filepath.Join(folder, "goreleaser.yml"),
    55  					filepath.Join(folder, name),
    56  				),
    57  			)
    58  			assert.Equal(t, name, getConfigFile(newFlags(t, testParams())))
    59  		})
    60  	}
    61  }
    62  
    63  func TestReleaseNotesFileDontExist(t *testing.T) {
    64  	params := testParams()
    65  	params["release-notes"] = "/this/also/wont/exist"
    66  	assert.Error(t, Release(newFlags(t, params)))
    67  }
    68  
    69  func TestCustomReleaseNotesFile(t *testing.T) {
    70  	folder, back := setup(t)
    71  	defer back()
    72  	var releaseNotes = filepath.Join(folder, "notes.md")
    73  	createFile(t, releaseNotes, "nothing important at all")
    74  	var params = testParams()
    75  	params["release-notes"] = releaseNotes
    76  	assert.NoError(t, Release(newFlags(t, params)))
    77  }
    78  
    79  func TestBrokenPipe(t *testing.T) {
    80  	_, back := setup(t)
    81  	defer back()
    82  	createFile(t, "main.go", "not a valid go file")
    83  	assert.Error(t, Release(newFlags(t, testParams())))
    84  }
    85  
    86  func TestInitProject(t *testing.T) {
    87  	_, back := setup(t)
    88  	defer back()
    89  	var filename = "test_goreleaser.yml"
    90  	assert.NoError(t, InitProject(filename))
    91  
    92  	file, err := os.Open(filename)
    93  	assert.NoError(t, err)
    94  	out, err := ioutil.ReadAll(file)
    95  	assert.NoError(t, err)
    96  
    97  	var config = config.Project{}
    98  	assert.NoError(t, yaml.Unmarshal(out, &config))
    99  }
   100  
   101  func TestInitProjectFileExist(t *testing.T) {
   102  	_, back := setup(t)
   103  	defer back()
   104  	var filename = "test_goreleaser.yml"
   105  	createFile(t, filename, "")
   106  	assert.Error(t, InitProject(filename))
   107  }
   108  
   109  func TestInitProjectDefaultPipeFails(t *testing.T) {
   110  	_, back := setup(t)
   111  	defer back()
   112  	var filename = "test_goreleaser.yml"
   113  	assert.NoError(t, os.RemoveAll(".git"))
   114  	assert.Error(t, InitProject(filename))
   115  }
   116  
   117  // fakeFlags is a mock of the cli flags
   118  type fakeFlags struct {
   119  	t     *testing.T
   120  	flags map[string]string
   121  }
   122  
   123  func newFlags(t *testing.T, params map[string]string) Flags {
   124  	return fakeFlags{
   125  		t:     t,
   126  		flags: params,
   127  	}
   128  }
   129  
   130  func (f fakeFlags) IsSet(s string) bool {
   131  	return f.flags[s] != ""
   132  }
   133  
   134  func (f fakeFlags) String(s string) string {
   135  	return f.flags[s]
   136  }
   137  
   138  func (f fakeFlags) Int(s string) int {
   139  	i, _ := strconv.ParseInt(f.flags[s], 10, 32)
   140  	return int(i)
   141  }
   142  
   143  func (f fakeFlags) Bool(s string) bool {
   144  	return f.flags[s] == "true"
   145  }
   146  
   147  func (f fakeFlags) Duration(s string) time.Duration {
   148  	result, err := time.ParseDuration(f.flags[s])
   149  	assert.NoError(f.t, err)
   150  	return result
   151  }
   152  
   153  func testParams() map[string]string {
   154  	return map[string]string{
   155  		"debug":         "true",
   156  		"parallelism":   "4",
   157  		"skip-publish":  "true",
   158  		"skip-validate": "true",
   159  		"timeout":       "1m",
   160  	}
   161  }
   162  
   163  func setup(t *testing.T) (current string, back func()) {
   164  	folder, err := ioutil.TempDir("", "goreleaser")
   165  	assert.NoError(t, err)
   166  	previous, err := os.Getwd()
   167  	assert.NoError(t, err)
   168  	assert.NoError(t, os.Chdir(folder))
   169  	createGoreleaserYaml(t)
   170  	createMainGo(t)
   171  	testlib.GitInit(t)
   172  	testlib.GitAdd(t)
   173  	testlib.GitCommit(t, "asdf")
   174  	testlib.GitTag(t, "v0.0.1")
   175  	testlib.GitCommit(t, "asas89d")
   176  	testlib.GitCommit(t, "assssf")
   177  	testlib.GitCommit(t, "assd")
   178  	testlib.GitTag(t, "v0.0.2")
   179  	testlib.GitRemoteAdd(t, "git@github.com:goreleaser/fake.git")
   180  	return folder, func() {
   181  		assert.NoError(t, os.Chdir(previous))
   182  	}
   183  }
   184  
   185  func createFile(t *testing.T, filename, contents string) {
   186  	assert.NoError(t, ioutil.WriteFile(filename, []byte(contents), 0644))
   187  }
   188  
   189  func createMainGo(t *testing.T) {
   190  	createFile(t, "main.go", "package main\nfunc main() {println(0)}")
   191  }
   192  
   193  func createGoreleaserYaml(t *testing.T) {
   194  	var yaml = `build:
   195    binary: fake
   196    goos:
   197      - linux
   198    goarch:
   199      - amd64
   200  release:
   201    github:
   202      owner: goreleaser
   203      name: fake
   204  `
   205  	createFile(t, "goreleaser.yml", yaml)
   206  }