No behaviour change. - Deleted, unused or one-line wrappers: panes.RuneIndexes, Detail.Refresh (SetDescribed does it), SecretValue.Len, Query.Empty, Clipboard.Native, config.Load, get's value, Model.done, providerOf (cachefile.ProviderOf), contextWithTimeout, searchCoverage, startCrawl, showKeybindings, the expiry aliases and daysLeft. - cmp.Or instead of the two cmpOr copies; slices.Sorted(maps.Keys(…)), maps.Copy, wg.Go, utf8.RuneCountInString and new(true) instead of loops and helpers that do the same. - A container's pane title is set once, not twice; a redundant length check in share links and a no-op assignment in linkhandler.Launch are gone. - Tests call ansi.Strip and lastLines directly; gofmt -s on links.go.
81 lines
2.7 KiB
Go
81 lines
2.7 KiB
Go
package app
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"git.kebcloud.no/keb/lazysecrets/internal/commands"
|
|
"github.com/charmbracelet/x/ansi"
|
|
)
|
|
|
|
func commandDriver(t *testing.T, cmds ...commands.Command) *driver {
|
|
t.Setenv("SHELL", "/bin/sh")
|
|
d := newDriverOpts(t, Options{Commands: cmds})
|
|
d.wait = 5 * time.Second
|
|
return d
|
|
}
|
|
|
|
func TestCommandGetsValueOnInput(t *testing.T) {
|
|
out := filepath.Join(t.TempDir(), "out")
|
|
d := commandDriver(t, commands.Command{
|
|
Key: "K", Context: commands.Secrets, Description: "Save it",
|
|
Command: "cat > " + out + " && echo {{.Name}} {{.Prompt.ns}} >> " + out,
|
|
Value: "stdin", Prompts: []commands.Prompt{{Name: "ns", Title: "Namespace", Default: "team a"}},
|
|
})
|
|
d.keys("3", "K") // db-password
|
|
if !strings.Contains(d.screen(), "Namespace: team a") {
|
|
t.Fatalf("no prompt:\n%s", d.screen())
|
|
}
|
|
d.keys("enter")
|
|
scr := d.screen()
|
|
// The command as shown, unwrapped: where it wraps depends on the
|
|
// temporary path's length.
|
|
shown := ""
|
|
if d.m.prompt != nil {
|
|
shown = ansi.Strip(strings.Join(d.m.prompt.lines, ""))
|
|
}
|
|
if !strings.Contains(scr, "Run Save it?") || !strings.Contains(shown, "db-password 'team a'") || !strings.Contains(shown, "on its input") {
|
|
t.Fatalf("no confirmation with the command %q:\n%s", shown, scr)
|
|
}
|
|
if strings.Contains(scr, "correct-horse") {
|
|
t.Fatal("value shown in the confirmation")
|
|
}
|
|
d.keys("y")
|
|
b, err := os.ReadFile(out)
|
|
if err != nil {
|
|
t.Fatalf("command didn't run: %v\n%s", err, d.screen())
|
|
}
|
|
if got := string(b); got != "correct-horse-battery-staple"+"db-password team a\n" {
|
|
t.Errorf("command got %q", got)
|
|
}
|
|
if !strings.Contains(d.screen(), "✓ Save it") {
|
|
t.Errorf("no confirmation message:\n%s", d.screen())
|
|
}
|
|
}
|
|
|
|
func TestCommandPopupAndMenu(t *testing.T) {
|
|
d := commandDriver(t,
|
|
commands.Command{Context: commands.Vaults, Description: "Show vault", Command: "echo vault={{.Vault}} url={{.VaultURL}}", Output: commands.Popup},
|
|
commands.Command{Context: commands.Secrets, Description: "Secrets only", Command: "true"},
|
|
)
|
|
d.keys("2", "x")
|
|
if !strings.Contains(d.screen(), "Show vault") || strings.Contains(d.screen(), "Secrets only") {
|
|
t.Fatalf("commands menu for the Vaults pane:\n%s", d.screen())
|
|
}
|
|
d.keys("enter")
|
|
if !strings.Contains(d.screen(), "vault=kv-app-prod url=https://kv-app-prod.vault.azure.net") {
|
|
t.Errorf("popup output:\n%s", d.screen())
|
|
}
|
|
}
|
|
|
|
func TestCommandNeedsItsSelection(t *testing.T) {
|
|
d := commandDriver(t, commands.Command{Key: "K", Context: commands.Secrets, Description: "Secret thing", Command: "true"})
|
|
d.keys("1", "K") // Sources pane: not a secrets command's context
|
|
if d.m.prompt != nil {
|
|
t.Error("ran from the wrong pane")
|
|
}
|
|
}
|