github.com/mborho/rem@v0.17.0/rem_test.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "testing" 8 ) 9 10 var ( 11 testRemFile string 12 ) 13 14 func init() { 15 testRemFile = ".rem_test" 16 } 17 18 func removeRemFile(r *Rem) { 19 removeTestFile(r.file) 20 } 21 22 func getRem(t *testing.T, remStr string) *Rem { 23 cmds := []byte(remStr) 24 if err := ioutil.WriteFile(testRemFile, cmds, 0644); err != nil { 25 t.Fatalf("Cannot create rem testfile, %s", err) 26 } 27 28 rem := &Rem{ 29 File: File{ 30 filename: testRemFile, 31 global: false, 32 }, 33 } 34 return rem 35 } 36 37 func getTestRem(t *testing.T) *Rem { 38 remStr := "ls\n#foo#ls -la\necho test\n" 39 return getRem(t, remStr) 40 } 41 42 func getTestEmptyRem(t *testing.T) *Rem { 43 return getRem(t, "") 44 } 45 46 func TestRead(t *testing.T) { 47 rem := getTestRem(t) 48 defer removeRemFile(rem) 49 50 err := rem.read() 51 if err != nil { 52 t.Errorf("Error reading: %s", err) 53 } 54 55 if rem.filepath == "" { 56 t.Error("Filepath not set") 57 } 58 59 if rem.file == nil { 60 t.Error("File not opened") 61 } 62 63 } 64 65 func TestPrintLine(t *testing.T) { 66 rescueStdout := os.Stdout 67 r, w, _ := os.Pipe() 68 os.Stdout = w 69 70 rem := getTestRem(t) 71 defer removeRemFile(rem) 72 rem.read() 73 74 rem.printLine(1) 75 76 w.Close() 77 out, _ := ioutil.ReadAll(r) 78 os.Stdout = rescueStdout 79 80 if string(out) != "ls -la\n" { 81 t.Errorf("Wrong line output, got %s", out) 82 } 83 } 84 85 func TestPrintLineError(t *testing.T) { 86 rem := getTestRem(t) 87 defer removeRemFile(rem) 88 rem.read() 89 90 err := rem.printLine(4) 91 if err == nil { 92 t.Error("No error when calling non existant line.") 93 } 94 } 95 96 func TestPrintTag(t *testing.T) { 97 rescueStdout := os.Stdout 98 r, w, _ := os.Pipe() 99 os.Stdout = w 100 101 rem := getTestRem(t) 102 defer removeRemFile(rem) 103 rem.read() 104 105 rem.printTag("foo") 106 107 w.Close() 108 out, _ := ioutil.ReadAll(r) 109 os.Stdout = rescueStdout 110 111 if string(out) != "ls -la\n" { 112 t.Errorf("Wrong line output, got %s", out) 113 } 114 } 115 116 func TestPrintTagError(t *testing.T) { 117 rem := getTestRem(t) 118 defer removeRemFile(rem) 119 rem.read() 120 121 err := rem.printTag("4") 122 if err == nil { 123 t.Error("No error when calling non existant line.") 124 } 125 } 126 127 func TestPrintAllLines(t *testing.T) { 128 rescueStdout := os.Stdout 129 r, w, _ := os.Pipe() 130 os.Stdout = w 131 132 rem := getTestRem(t) 133 defer removeRemFile(rem) 134 rem.read() 135 136 rem.printAllLines() 137 138 w.Close() 139 out, _ := ioutil.ReadAll(r) 140 os.Stdout = rescueStdout 141 142 if string(out) != " 0 - ls\n 1 foo ls -la\n 2 - echo test\n" { 143 t.Errorf("Wrong line output, got %s", out) 144 } 145 } 146 147 func TestFilterLines(t *testing.T) { 148 rescueStdout := os.Stdout 149 r, w, _ := os.Pipe() 150 os.Stdout = w 151 152 rem := getTestRem(t) 153 defer removeRemFile(rem) 154 rem.read() 155 156 rem.filterLines("ls") 157 158 w.Close() 159 out, _ := ioutil.ReadAll(r) 160 os.Stdout = rescueStdout 161 162 if string(out) != " 0 ls\n 1 ls -la\n" { 163 t.Errorf("Wrong line output, got %s", out) 164 } 165 } 166 167 func TestFilterNoLines(t *testing.T) { 168 rescueStdout := os.Stdout 169 r, w, _ := os.Pipe() 170 os.Stdout = w 171 172 rem := getTestRem(t) 173 defer removeRemFile(rem) 174 rem.read() 175 176 rem.filterLines("nothing") 177 178 w.Close() 179 out, _ := ioutil.ReadAll(r) 180 os.Stdout = rescueStdout 181 182 if string(out) != "" { 183 t.Errorf("Filtered lines, got %s", out) 184 } 185 } 186 187 func TestAddLineWithTag(t *testing.T) { 188 // add line 189 rem := getTestRem(t) 190 defer removeRemFile(rem) 191 rem.read() 192 193 if err := rem.appendLine("pwd", "test"); err != nil { 194 t.Errorf("Error when appending line, got %s", err) 195 } 196 197 // check if line was added 198 rem = &Rem{ 199 File: File{ 200 filename: testRemFile, 201 global: false, 202 }, 203 } 204 rem.read() 205 rescueStdout := os.Stdout 206 r, w, _ := os.Pipe() 207 os.Stdout = w 208 209 rem.printLine(3) 210 211 w.Close() 212 out, _ := ioutil.ReadAll(r) 213 os.Stdout = rescueStdout 214 215 if string(out) != "pwd\n" { 216 t.Errorf("Wrong line output, got %s", out) 217 } 218 219 if rem.lines[3].tag != "test" { 220 t.Errorf("Wrong tag saved, got %s", rem.lines[3].tag) 221 } 222 } 223 224 func TestAddLineWithoutTag(t *testing.T) { 225 // add lines 226 rem := getTestRem(t) 227 defer removeRemFile(rem) 228 rem.read() 229 230 if err := rem.appendLine("pwd", ""); err != nil { 231 t.Errorf("Error when appending line, got %s", err) 232 } 233 234 // check if line was added 235 rem = &Rem{ 236 File: File{ 237 filename: testRemFile, 238 global: false, 239 }, 240 } 241 rem.read() 242 rescueStdout := os.Stdout 243 r, w, _ := os.Pipe() 244 os.Stdout = w 245 246 rem.printLine(3) 247 248 w.Close() 249 out, _ := ioutil.ReadAll(r) 250 os.Stdout = rescueStdout 251 252 if string(out) != "pwd\n" { 253 t.Errorf("Wrong line output, got %s", out) 254 } 255 256 if rem.lines[3].tag != "" { 257 t.Errorf("Tag was saved, got %s", rem.lines[3].tag) 258 } 259 } 260 261 func TestRemoveLine(t *testing.T) { 262 // remove line 263 rem := getTestRem(t) 264 defer removeRemFile(rem) 265 rem.read() 266 267 if rem.lines[2].cmd != "echo test" { 268 t.Error("Line does not exist") 269 } 270 271 err := rem.removeLine(3) 272 if fmt.Sprintf("%s", err) != "Line does not exist!" { 273 t.Error("Non existant line exists.") 274 } 275 276 if err = rem.removeLine(2); err != nil { 277 t.Errorf("Error when removing line, got %s", err) 278 } 279 280 // check if line was removed 281 rem = &Rem{ 282 File: File{ 283 filename: testRemFile, 284 global: false, 285 }, 286 } 287 rem.read() 288 289 if len(rem.lines) != 2 { 290 t.Error("Line was not removed") 291 } 292 if rem.lines[0].cmd != "ls" && rem.lines[1].cmd != "ls -la" { 293 t.Error("Wrong line was not removed") 294 } 295 296 // remove all lines 297 if err = rem.removeLine(0); err != nil { 298 t.Errorf("Error when removing line, got %s", err) 299 } 300 301 // check if line was removed 302 rem = &Rem{ 303 File: File{ 304 filename: testRemFile, 305 global: false, 306 }, 307 } 308 rem.read() 309 310 if err = rem.removeLine(0); err != nil { 311 t.Errorf("Error when removing line, got %s", err) 312 } 313 314 // check if line was removed 315 rem = &Rem{ 316 File: File{ 317 filename: testRemFile, 318 global: false, 319 }, 320 } 321 rem.read() 322 323 if len(rem.lines) > 0 { 324 t.Errorf("Error when removing lines, got %s", err) 325 } 326 } 327 328 func TestReadFromStdIn(t *testing.T) { 329 rem := getTestRem(t) 330 cases := []struct { 331 desc string 332 input string 333 expected string 334 }{ 335 {"TestSinglLine", "date && ls -la", "date && ls -la"}, 336 { 337 desc: "TestMultiline", 338 input: `date && \ 339 ls -la`, 340 expected: "date && ls -la", 341 }, 342 { 343 desc: "TestMultilineNoSpace", 344 input: `date &&\ 345 ls -la | \ 346 wc`, 347 expected: "date && ls -la | wc", 348 }, 349 } 350 for _, tc := range cases { 351 funcDefer, err := mockStdin(t, tc.input) 352 if err != nil { 353 t.Fatal(err) 354 } 355 defer funcDefer() 356 357 input := rem.readFromStdIn() 358 if input != tc.expected { 359 t.Errorf("Wrong input was read from stdIn, want '%s', got '%s'.\n", tc.expected, input) 360 } 361 } 362 } 363 364 // thankfully used from https://gist.github.com/KEINOS/76857bc6339515d7144e00f17adb1090 365 func mockStdin(t *testing.T, dummyInput string) (funcDefer func(), err error) { 366 t.Helper() 367 368 oldOsStdin := os.Stdin 369 tmpfile, err := ioutil.TempFile(t.TempDir(), t.Name()) 370 if err != nil { 371 return nil, err 372 } 373 content := []byte(dummyInput) 374 if _, err := tmpfile.Write(content); err != nil { 375 return nil, err 376 } 377 if _, err := tmpfile.Seek(0, 0); err != nil { 378 return nil, err 379 } 380 // Set stdin to the temp file 381 os.Stdin = tmpfile 382 383 return func() { 384 // clean up 385 os.Stdin = oldOsStdin 386 os.Remove(tmpfile.Name()) 387 }, nil 388 }