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