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 }