gophers.dev/cmds/new-cl@v0.0.3/tool/tool_test.go (about) 1 package tool 2 3 import ( 4 "bytes" 5 "errors" 6 "fmt" 7 "io/ioutil" 8 "os" 9 "path/filepath" 10 "testing" 11 12 "github.com/stretchr/testify/require" 13 "gophers.dev/pkgs/extractors/env" 14 ) 15 16 func setup(t *testing.T, clDir string) string { 17 tmpDir, err := ioutil.TempDir("", "new-cl-values") 18 require.NoError(t, err) 19 20 clPath := filepath.Join(tmpDir, clDir) 21 err = os.Mkdir(clPath, 0770) 22 require.NoError(t, err) 23 24 err = os.Chdir(tmpDir) 25 require.NoError(t, err) 26 27 return tmpDir 28 } 29 30 func cleanup(t *testing.T, path string) { 31 err := os.RemoveAll(path) 32 require.NoError(t, err) 33 } 34 35 func Test_findTargetDir(t *testing.T) { 36 curDir, err := os.Getwd() 37 require.NoError(t, err) 38 defer func() { 39 _ = os.Chdir(curDir) 40 }() 41 42 root := setup(t, ".changelog") 43 defer cleanup(t, root) 44 45 t.Run("missing", func(t *testing.T) { 46 _, err = findTargetDir("_changelog") 47 require.Contains(t, err.Error(), "no such file or directory") 48 }) 49 50 t.Run("exists", func(t *testing.T) { 51 path, findErr := findTargetDir(".changelog") 52 require.NoError(t, findErr) 53 require.Equal(t, ".changelog", filepath.Base(path)) 54 require.Equal(t, byte('/'), path[0]) // abs path when using parent dir 55 }) 56 57 t.Run("internal", func(t *testing.T) { 58 chErr := os.Chdir(filepath.Join(root, ".changelog")) 59 require.NoError(t, chErr) 60 path, findErr := findTargetDir(".changelog") 61 require.NoError(t, findErr) 62 require.Equal(t, ".", filepath.Base(path)) // local relative when local 63 }) 64 } 65 66 func TestRunner_getChangelogDir(t *testing.T) { 67 t.Run("default", func(t *testing.T) { 68 environ := env.NewEnvironmentMock(t) 69 environ.GetenvMock.When(changelogDirEnv).Then("") 70 71 dir, err := (&Runner{ 72 Env: environ, 73 }).getChangelogDir() 74 75 require.NoError(t, err) 76 require.Equal(t, ".changelog", dir) 77 78 environ.MinimockFinish() 79 }) 80 81 t.Run("custom", func(t *testing.T) { 82 environ := env.NewEnvironmentMock(t) 83 environ.GetenvMock.When(changelogDirEnv).Then(".custom") 84 85 dir, err := (&Runner{ 86 Env: environ, 87 }).getChangelogDir() 88 89 require.NoError(t, err) 90 require.Equal(t, ".custom", dir) 91 92 environ.MinimockFinish() 93 }) 94 } 95 96 func TestRunner_extractArgs(t *testing.T) { 97 environ := env.NewEnvironmentMock(t) 98 environ.GetenvMock.When(changelogKindEnv).Then(ChangelogKinds) 99 100 try := func(args []string, expParams *Params, expErr error) { 101 params, err := (&Runner{ 102 Args: args, 103 Env: environ, 104 }).extractArgs() 105 106 if expErr != nil { 107 require.Nil(t, params) 108 require.Equal(t, expErr, err) 109 } else { 110 require.Equal(t, expParams, params) 111 } 112 } 113 114 // too few arguments 115 try(nil, nil, ArgErr) 116 117 // too many arguments 118 try([]string{"1", "2", "3", "4"}, nil, ArgErr) 119 120 // not acceptable kind 121 try([]string{"feature", "12345"}, nil, errors.New(`unknown kind "feature"`)) 122 123 // not a acceptable number 124 try([]string{"bug", "xxx"}, nil, errors.New("pr must be a number")) 125 126 // no message set 127 try([]string{"bug", "12345"}, &Params{ 128 Type: "bug", 129 PR: 12345, 130 Note: "", 131 }, nil) 132 133 // with message set 134 try([]string{"bug", "12345", "values: fixed a bug"}, &Params{ 135 Type: "bug", 136 PR: 12345, 137 Note: "values: fixed a bug", 138 }, nil) 139 140 environ.MinimockFinish() 141 } 142 143 func TestRunner_checkKind(t *testing.T) { 144 tests := []struct { 145 kinds string 146 values []string 147 expOK bool 148 }{{ 149 kinds: "", 150 values: []string{"bug", "improvement", "security", "breaking-change", "deprecation", "note"}, 151 expOK: true, 152 }, { 153 kinds: "", 154 values: []string{"foo", "bar", "baz"}, 155 expOK: false, 156 }, { 157 kinds: "feature,regression,test", 158 values: []string{"feature", "regression", "test"}, 159 expOK: true, 160 }, { 161 kinds: "feature,regression,test", 162 values: []string{"bug", "improvement", "security", "breaking-change", "deprecation", "note"}, 163 expOK: false, 164 }} 165 166 for _, test := range tests { 167 environ := env.NewEnvironmentMock(t) 168 environ.GetenvMock.When(changelogKindEnv).Then(test.kinds) 169 for _, value := range test.values { 170 err := (&Runner{ 171 Env: environ, 172 }).checkKind(value) 173 if test.expOK { 174 require.NoError(t, err) 175 } else { 176 require.EqualError(t, err, fmt.Sprintf("unknown kind %q", value)) 177 } 178 } 179 environ.MinimockFinish() 180 } 181 } 182 183 func Test_createFile(t *testing.T) { 184 dir, err := ioutil.TempDir("", "new-cl") 185 require.NoError(t, err) 186 defer func() { 187 _ = os.RemoveAll(dir) 188 }() 189 190 path, err := createFile(dir, &Params{ 191 Type: "bug", 192 PR: 12345, 193 Note: "test: Hello, world!", 194 }) 195 require.NoError(t, err) 196 require.Equal(t, "12345.txt", filepath.Base(path)) 197 198 b, err := ioutil.ReadFile(path) 199 require.NoError(t, err) 200 require.Equal(t, "```release-note:bug\ntest: Hello, world!\n```\n", string(b)) 201 } 202 203 func TestRunner_Run(t *testing.T) { 204 curDir, err := os.Getwd() 205 require.NoError(t, err) 206 defer require.NoError(t, os.Chdir(curDir)) 207 208 root := setup(t, ".changelog") 209 defer cleanup(t, root) 210 211 environ := env.NewEnvironmentMock(t) 212 environ.GetenvMock.When(changelogDirEnv).Then(ChangelogDir) 213 environ.GetenvMock.When(changelogKindEnv).Then(ChangelogKinds) 214 215 out := bytes.NewBuffer([]byte{}) 216 217 err = (&Runner{ 218 Output: out, 219 Env: environ, 220 Args: []string{"improvement", "11358", `"test: Updated a dependency"`}, 221 }).Run() 222 require.NoError(t, err) 223 result := out.String() 224 require.Equal(t, "created note: 11358.txt\n", result) 225 226 environ.MinimockFinish() 227 }