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  }