src.elv.sh@v0.21.0-dev.0.20240515223629-06979efb9a2a/pkg/cli/modes/lastcmd_test.go (about)

     1  package modes
     2  
     3  import (
     4  	"strings"
     5  	"testing"
     6  
     7  	"src.elv.sh/pkg/cli"
     8  	. "src.elv.sh/pkg/cli/clitest"
     9  	"src.elv.sh/pkg/cli/histutil"
    10  	"src.elv.sh/pkg/cli/term"
    11  	"src.elv.sh/pkg/cli/tk"
    12  	"src.elv.sh/pkg/store/storedefs"
    13  	"src.elv.sh/pkg/ui"
    14  )
    15  
    16  func TestNewLastcmd_NoStore(t *testing.T) {
    17  	f := Setup()
    18  	defer f.Stop()
    19  
    20  	_, err := NewLastcmd(f.App, LastcmdSpec{})
    21  	if err != errNoHistoryStore {
    22  		t.Error("expect errNoHistoryStore")
    23  	}
    24  }
    25  
    26  func TestNewLastcmd_FocusedWidgetNotCodeArea(t *testing.T) {
    27  	testFocusedWidgetNotCodeArea(t, func(app cli.App) error {
    28  		st := histutil.NewMemStore("foo")
    29  		_, err := NewLastcmd(app, LastcmdSpec{Store: st})
    30  		return err
    31  	})
    32  }
    33  
    34  func TestNewLastcmd_StoreError(t *testing.T) {
    35  	f := Setup()
    36  	defer f.Stop()
    37  
    38  	db := histutil.NewFaultyInMemoryDB()
    39  	store, err := histutil.NewDBStore(db)
    40  	if err != nil {
    41  		panic(err)
    42  	}
    43  	db.SetOneOffError(errMock)
    44  
    45  	_, err = NewLastcmd(f.App, LastcmdSpec{Store: store})
    46  	if err.Error() != "db error: mock error" {
    47  		t.Error("expect db error")
    48  	}
    49  }
    50  
    51  func TestLastcmd(t *testing.T) {
    52  	f := Setup()
    53  	defer f.Stop()
    54  
    55  	st := histutil.NewMemStore("foo,bar,baz")
    56  	startLastcmd(f.App, LastcmdSpec{
    57  		Store: st,
    58  		Wordifier: func(cmd string) []string {
    59  			return strings.Split(cmd, ",")
    60  		},
    61  	})
    62  
    63  	// Test UI.
    64  	f.TestTTY(t,
    65  		"\n", // empty code area
    66  		" LASTCMD  ", Styles,
    67  		"********* ", term.DotHere, "\n",
    68  		"    foo,bar,baz                                   \n", Styles,
    69  		"++++++++++++++++++++++++++++++++++++++++++++++++++",
    70  		"  0 foo\n",
    71  		"  1 bar\n",
    72  		"  2 baz",
    73  	)
    74  
    75  	// Test negative filtering.
    76  	f.TTY.Inject(term.K('-'))
    77  	f.TestTTY(t,
    78  		"\n", // empty code area
    79  		" LASTCMD  -", Styles,
    80  		"*********  ", term.DotHere, "\n",
    81  		" -3 foo                                           \n", Styles,
    82  		"++++++++++++++++++++++++++++++++++++++++++++++++++",
    83  		" -2 bar\n",
    84  		" -1 baz",
    85  	)
    86  
    87  	// Test automatic submission.
    88  	f.TTY.Inject(term.K('2')) // -2 bar
    89  	f.TestTTY(t, "bar", term.DotHere)
    90  
    91  	// Test submission by Enter.
    92  	f.App.ActiveWidget().(tk.CodeArea).MutateState(func(s *tk.CodeAreaState) {
    93  		*s = tk.CodeAreaState{}
    94  	})
    95  	startLastcmd(f.App, LastcmdSpec{
    96  		Store: st,
    97  		Wordifier: func(cmd string) []string {
    98  			return strings.Split(cmd, ",")
    99  		},
   100  	})
   101  	f.TTY.Inject(term.K(ui.Enter))
   102  	f.TestTTY(t, "foo,bar,baz", term.DotHere)
   103  
   104  	// Default wordifier.
   105  	f.App.ActiveWidget().(tk.CodeArea).MutateState(func(s *tk.CodeAreaState) {
   106  		*s = tk.CodeAreaState{}
   107  	})
   108  	st.AddCmd(storedefs.Cmd{Text: "foo bar baz", Seq: 1})
   109  	startLastcmd(f.App, LastcmdSpec{Store: st})
   110  	f.TTY.Inject(term.K('0'))
   111  	f.TestTTY(t, "foo", term.DotHere)
   112  }
   113  
   114  func startLastcmd(app cli.App, spec LastcmdSpec) {
   115  	w, err := NewLastcmd(app, spec)
   116  	startMode(app, w, err)
   117  }