github.com/joshmeranda/wrash@v0.4.2/pkg/builtins_test.go (about)

     1  package wrash
     2  
     3  import (
     4  	"os"
     5  	"path/filepath"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/assert"
    10  	"github.com/stretchr/testify/require"
    11  )
    12  
    13  func TestIsBuiltin(t *testing.T) {
    14  	assert.False(t, isBuiltin(""))
    15  	assert.False(t, isBuiltin("!a"))
    16  	assert.False(t, isBuiltin("something"))
    17  
    18  	assert.True(t, isBuiltin("!!"))
    19  	assert.True(t, isBuiltin("!!something"))
    20  }
    21  
    22  func TestCd(t *testing.T) {
    23  	startDir, err := os.Getwd()
    24  	require.NoError(t, err)
    25  	defer os.Chdir(startDir)
    26  
    27  	session, err := NewSession([]string{"foo"}, OptionInteractive(false))
    28  	require.NoError(t, err)
    29  
    30  	target, err := filepath.Abs("../tests")
    31  	require.NoError(t, err)
    32  
    33  	t.Run("Home", func(t *testing.T) {
    34  		defer os.Chdir(startDir)
    35  
    36  		oldHome := os.Getenv("HOME")
    37  		os.Setenv("HOME", target)
    38  		defer os.Setenv("HOME", oldHome)
    39  
    40  		require.NoError(t, session.apps["cd"].Run([]string{"!!cd"}))
    41  
    42  		dir, err := os.Getwd()
    43  		require.NoError(t, err)
    44  		assert.Equal(t, target, dir)
    45  	})
    46  
    47  	t.Run("TargetGiven", func(t *testing.T) {
    48  		defer os.Chdir(startDir)
    49  
    50  		require.NoError(t, session.apps["cd"].Run([]string{"!!cd", target}))
    51  
    52  		dir, err := os.Getwd()
    53  		require.NoError(t, err)
    54  		assert.Equal(t, target, dir)
    55  	})
    56  
    57  	t.Run("TooManyArgs", func(t *testing.T) {
    58  		defer os.Chdir(startDir)
    59  
    60  		require.Error(t, session.apps["cd"].Run([]string{"!!cd", target, "another"}))
    61  
    62  		dir, err := os.Getwd()
    63  		require.NoError(t, err)
    64  		assert.NotEqual(t, target, dir)
    65  	})
    66  
    67  	t.Run("NoExist", func(t *testing.T) {
    68  		defer os.Chdir(startDir)
    69  
    70  		require.Error(t, session.apps["cd"].Run([]string{"!!cd", "no-exist"}))
    71  	})
    72  }
    73  
    74  func TestExit(t *testing.T) {
    75  	t.Run("NoCodeGiven", func(t *testing.T) {
    76  		session, err := NewSession([]string{"foo"}, OptionInteractive(false))
    77  		require.NoError(t, err)
    78  
    79  		require.NoError(t, session.apps["exit"].Run([]string{"!!exit"}))
    80  		assert.True(t, session.exitCalled)
    81  		assert.Equal(t, 0, session.previousExitCode)
    82  	})
    83  
    84  	t.Run("CodeGiven", func(t *testing.T) {
    85  		session, err := NewSession([]string{"foo"}, OptionInteractive(false))
    86  		require.NoError(t, err)
    87  
    88  		require.NoError(t, session.apps["exit"].Run([]string{"!!exit", "5"}))
    89  		assert.True(t, session.exitCalled)
    90  		assert.Equal(t, 5, session.previousExitCode)
    91  	})
    92  
    93  	t.Run("InvalidCodeGiven", func(t *testing.T) {
    94  		session, err := NewSession([]string{"foo"}, OptionInteractive(false))
    95  		require.NoError(t, err)
    96  
    97  		require.Error(t, session.apps["exit"].Run([]string{"!!exit", "bad"}))
    98  		assert.False(t, session.exitCalled)
    99  	})
   100  
   101  	t.Run("ToomanyArgs", func(t *testing.T) {
   102  		session, err := NewSession([]string{"foo"}, OptionInteractive(false))
   103  		require.NoError(t, err)
   104  
   105  		require.Error(t, session.apps["exit"].Run([]string{"!!exit", "1", "2"}))
   106  		assert.False(t, session.exitCalled)
   107  	})
   108  }
   109  
   110  func TestHelp(t *testing.T) {
   111  	out := strings.Builder{}
   112  	session, err := NewSession([]string{"foo"}, OptionInteractive(false), OptionStdout(&out))
   113  	require.NoError(t, err)
   114  
   115  	require.NoError(t, session.apps["help"].Run([]string{"!!help"}))
   116  	require.NotEmpty(t, out.String())
   117  }
   118  
   119  func TestHistory(t *testing.T) {
   120  	session, err := NewSession([]string{"foo"},
   121  		OptionInteractive(false),
   122  		OptionHistory(NewHistory("foo", sinkWriter{}, []*Entry{
   123  			{
   124  				Base: "foo",
   125  				Cmd:  "bar",
   126  			},
   127  			{
   128  				Base: "foo",
   129  				Cmd:  "baz",
   130  			},
   131  			{
   132  				Base: "bar",
   133  				Cmd:  "baz",
   134  			},
   135  			{
   136  				Base: "foo",
   137  				Cmd:  "baz",
   138  			},
   139  		})),
   140  	)
   141  	require.NoError(t, err)
   142  
   143  	t.Run("NoPattern", func(t *testing.T) {
   144  		out := strings.Builder{}
   145  		session.stdout = &out
   146  
   147  		expected := "bar\nbaz\nbaz\n"
   148  
   149  		require.NoError(t, session.apps["history"].Run([]string{"!!history"}))
   150  		require.Equal(t, expected, out.String())
   151  	})
   152  
   153  	t.Run("WithPattern", func(t *testing.T) {
   154  		out := strings.Builder{}
   155  		session.stdout = &out
   156  
   157  		expected := "bar\n"
   158  
   159  		require.NoError(t, session.apps["history"].Run([]string{"!!history", "bar"}))
   160  		require.Equal(t, expected, out.String())
   161  	})
   162  
   163  	t.Run("Show", func(t *testing.T) {
   164  		out := strings.Builder{}
   165  		session.stdout = &out
   166  
   167  		expected := "foo bar\nfoo baz\nfoo baz\n"
   168  
   169  		require.NoError(t, session.apps["history"].Run([]string{"!!history", "--show"}))
   170  		require.Equal(t, expected, out.String())
   171  	})
   172  
   173  	t.Run("N", func(t *testing.T) {
   174  		out := strings.Builder{}
   175  		session.stdout = &out
   176  
   177  		expected := "baz\nbaz\n"
   178  
   179  		require.NoError(t, session.apps["history"].Run([]string{"!!history", "--number", "2"}))
   180  		require.Equal(t, expected, out.String())
   181  	})
   182  }
   183  
   184  func TestEnv(t *testing.T) {
   185  	t.Run("Ok", func(t *testing.T) {
   186  		session, err := NewSession([]string{"foo"},
   187  			OptionInteractive(false),
   188  		)
   189  		require.NoError(t, err)
   190  
   191  		require.NoError(t, session.apps["env"].Run([]string{"!!env", "set", "foo", "bar"}))
   192  		assert.Equal(t, "bar", session.environ["foo"])
   193  	})
   194  
   195  	t.Run("SetNoArgs", func(*testing.T) {
   196  		session, err := NewSession([]string{"foo"},
   197  			OptionInteractive(false),
   198  		)
   199  		require.NoError(t, err)
   200  
   201  		require.NoError(t, session.apps["env"].Run([]string{"!!env", "set"}))
   202  		assert.Empty(t, session.environ)
   203  	})
   204  
   205  	t.Run("SetNoValue", func(t *testing.T) {
   206  		session, err := NewSession([]string{"foo"},
   207  			OptionInteractive(false),
   208  		)
   209  		require.NoError(t, err)
   210  
   211  		session.environ["foo"] = "bar"
   212  		defer delete(session.environ, "foo")
   213  
   214  		require.NoError(t, session.apps["env"].Run([]string{"!!env", "set", "foo"}))
   215  		assert.Empty(t, session.environ["foo"])
   216  	})
   217  
   218  	t.Run("SetTooManyArgs", func(t *testing.T) {
   219  		session, err := NewSession([]string{"foo"},
   220  			OptionInteractive(false),
   221  		)
   222  
   223  		require.NoError(t, err)
   224  		require.Error(t, session.apps["env"].Run([]string{"!!env", "set", "foo", "bar", "extra"}))
   225  	})
   226  
   227  	t.Run("Show", func(t *testing.T) {
   228  		session, err := NewSession([]string{"foo"},
   229  			OptionEnvironment(map[string]string{
   230  				"foo": "bar",
   231  				"baz": "",
   232  			}),
   233  			OptionInteractive(false),
   234  		)
   235  		require.NoError(t, err)
   236  
   237  		out := strings.Builder{}
   238  		session.stdout = &out
   239  
   240  		expected := "baz=''\nfoo='bar'\n"
   241  		require.NoError(t, session.apps["env"].Run([]string{"!!export", "show"}))
   242  		require.Equal(t, expected, out.String())
   243  	})
   244  
   245  	t.Run("UnsupportedCommand", func(t *testing.T) {
   246  		session, err := NewSession([]string{"foo"},
   247  			OptionInteractive(false),
   248  		)
   249  
   250  		require.NoError(t, err)
   251  		require.Error(t, session.apps["env"].Run([]string{"!!env", "invalid command"}))
   252  	})
   253  }