aboutsummaryrefslogtreecommitdiff
path: root/scripts/tests/install-ai.bats
blob: d67a9c6c835e1781c5b7a1b297c971bb87ad2518 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#!/usr/bin/env bats
#
# Tests for scripts/install-ai.sh — bootstrap .ai/ in a fresh project.
#
# Strategy: redirect HOME to a temp dir, scaffold fresh project trees
# under HOME/code/, run install-ai.sh against them. Canonical source
# stays the real one (install-ai.sh resolves it relative to its own
# location). For the fzf-pick form, stub fzf to take the first line.

REAL_REPO="$(cd "$(dirname "$BATS_TEST_FILENAME")/../.." && pwd)"
INSTALL_AI="$REAL_REPO/scripts/install-ai.sh"

setup() {
  TEST_HOME="$(mktemp -d -t install-ai-bats.XXXXXX)"
  HOME_BAK="$HOME"
  export HOME="$TEST_HOME"
  mkdir -p "$TEST_HOME/code" "$TEST_HOME/projects"
}

teardown() {
  export HOME="$HOME_BAK"
  rm -rf "$TEST_HOME"
}

@test "install-ai: happy path with explicit PROJECT + --gitignore" {
  mkdir -p "$TEST_HOME/code/fresh"
  (cd "$TEST_HOME/code/fresh" && git init -q)

  run bash "$INSTALL_AI" --gitignore "$TEST_HOME/code/fresh"

  [ "$status" -eq 0 ]
  [ -d "$TEST_HOME/code/fresh/.ai/workflows" ]
  [ -d "$TEST_HOME/code/fresh/.ai/scripts" ]
  [ -d "$TEST_HOME/code/fresh/.ai/sessions" ]
  [ -d "$TEST_HOME/code/fresh/.ai/references" ]
  [ -d "$TEST_HOME/code/fresh/.ai/retrospectives" ]
  [ -f "$TEST_HOME/code/fresh/.ai/protocols.org" ]
  [ -f "$TEST_HOME/code/fresh/.ai/notes.org" ]
  grep -qFx ".ai/" "$TEST_HOME/code/fresh/.gitignore"
}

@test "install-ai --track: lands .gitkeep stubs in empty dirs" {
  mkdir -p "$TEST_HOME/code/tracked"
  (cd "$TEST_HOME/code/tracked" && git init -q)

  run bash "$INSTALL_AI" --track "$TEST_HOME/code/tracked"

  [ "$status" -eq 0 ]
  [ -f "$TEST_HOME/code/tracked/.ai/sessions/.gitkeep" ]
  [ -f "$TEST_HOME/code/tracked/.ai/references/.gitkeep" ]
  [ -f "$TEST_HOME/code/tracked/.ai/retrospectives/.gitkeep" ]
}

@test "install-ai: refuses on existing .ai/" {
  mkdir -p "$TEST_HOME/code/already/.ai"
  echo "marker" > "$TEST_HOME/code/already/.ai/marker.txt"

  run bash "$INSTALL_AI" --gitignore "$TEST_HOME/code/already"

  [ "$status" -eq 2 ]
  [[ "$output" == *"already exists"* ]]
  # Existing content untouched.
  [ -f "$TEST_HOME/code/already/.ai/marker.txt" ]
}

@test "install-ai: notes.org placeholders get substituted" {
  mkdir -p "$TEST_HOME/code/named-proj"
  (cd "$TEST_HOME/code/named-proj" && git init -q)

  run bash "$INSTALL_AI" --gitignore "$TEST_HOME/code/named-proj"

  [ "$status" -eq 0 ]
  # Project name landed.
  grep -q "named-proj" "$TEST_HOME/code/named-proj/.ai/notes.org"
  # No raw placeholders left.
  ! grep -q "\[Project Name\]" "$TEST_HOME/code/named-proj/.ai/notes.org"
  ! grep -q "\[Date\]" "$TEST_HOME/code/named-proj/.ai/notes.org"
}

@test "install-ai: fzf-pick form selects via stubbed fzf" {
  # Edge case 3 from todo.org:1766. The fzf-pick form is interactive;
  # stubbing fzf to take the first stdin line lets us exercise the
  # discovery+selection path without an interactive terminal.
  mkdir -p "$TEST_HOME/code/pickme" "$TEST_HOME/code/skipme"
  (cd "$TEST_HOME/code/pickme" && git init -q)
  (cd "$TEST_HOME/code/skipme" && git init -q)

  stub_bin="$(mktemp -d)"
  cat > "$stub_bin/fzf" <<'EOF'
#!/bin/bash
# Pass through stdin's first line as the "selection".
head -n 1
EOF
  chmod +x "$stub_bin/fzf"

  PATH="$stub_bin:$PATH" run bash "$INSTALL_AI" --gitignore
  rm -rf "$stub_bin"

  [ "$status" -eq 0 ]
  # Sort order puts pickme first; fzf-stub returns the first line.
  [ -d "$TEST_HOME/code/pickme/.ai" ]
  [ ! -d "$TEST_HOME/code/skipme/.ai" ]
}