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  }