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 }