1//go:build linux
2
3package systemtest
4
5import (
6 "encoding/json"
7 "os"
8 "path/filepath"
9 "strings"
10 "testing"
11 "time"
12)
13
14func TestDemoDiscardProtection(t *testing.T) {
15 requireHarness(t)
16 bin := demoBinary(t)
17 for _, tc := range []struct {
18 name, input string
19 empty, pending bool
20 }{
21 {"armed", "move 140 24\nclick left\n", false, true},
22 {"cancel", "move 140 24\nclick left\nsleep 300ms\nmove 275 24\nclick left\n", false, false},
23 {"confirmed", "move 140 24\nclick left\nsleep 300ms\nmove 140 24\nclick left\n", true, false},
24 {"edited", "move 140 24\nclick left\nsleep 300ms\nmove 300 120\nclick left\ntype Added\n", false, false},
25 } {
26 t.Run(tc.name, func(t *testing.T) {
27 script := filepath.Join(t.TempDir(), "input.txt")
28 if err := os.WriteFile(script, []byte("sleep 8s\n"+tc.input+"sleep 1s\n"), 0600); err != nil {
29 t.Fatal(err)
30 }
31 res := runDemo(t, bin, 1, 400, script, 11*time.Second)
32 data, err := os.ReadFile(filepath.Join(res.Artifacts["debug"], "demo-state.json"))
33 if err != nil {
34 t.Fatal(err)
35 }
36 var state struct {
37 Notes string
38 NewPending bool
39 }
40 if err := json.Unmarshal(data, &state); err != nil {
41 t.Fatal(err)
42 }
43 if (state.Notes == "") != tc.empty || state.NewPending != tc.pending {
44 t.Fatalf("discard state: %+v", state)
45 }
46 if tc.name == "edited" && !strings.Contains(state.Notes, "Added") {
47 t.Fatal("editor input not delivered")
48 }
49 })
50 }
51}