Skip to content

Commit 9c7e857

Browse files
committed
test(ci): validate pr26 interactive prompt
1 parent 6c77e26 commit 9c7e857

1 file changed

Lines changed: 202 additions & 0 deletions

File tree

Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
name: PR 26 Interactive Smoke
2+
3+
on:
4+
push:
5+
branches:
6+
- codex/validate-pr26-interactive
7+
workflow_dispatch: {}
8+
9+
permissions:
10+
contents: read
11+
12+
jobs:
13+
startup-update-prompt:
14+
name: startup update prompt uses a real pty
15+
runs-on: ubuntu-latest
16+
timeout-minutes: 10
17+
steps:
18+
- name: Checkout PR 26 head
19+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
20+
with:
21+
ref: 6c77e26f02bed5586784f824ecd495d64d7d3a70
22+
23+
- name: Set up Go
24+
uses: actions/setup-go@40f1582b2485089dde7abd97c1529aa768e1baff # v5.6.0
25+
with:
26+
go-version-file: go.mod
27+
28+
- name: Build PR 26 binary
29+
run: |
30+
set -euo pipefail
31+
test "$(git rev-parse HEAD)" = "6c77e26f02bed5586784f824ecd495d64d7d3a70"
32+
./scripts/build
33+
./dedalus --version
34+
35+
- name: Declining prompt continues to original command
36+
run: |
37+
set -euo pipefail
38+
python3 - <<'PY'
39+
import datetime
40+
import json
41+
import os
42+
import pathlib
43+
import pty
44+
import select
45+
import subprocess
46+
import time
47+
48+
home = pathlib.Path(os.environ["RUNNER_TEMP"]) / "dedalus-home-decline"
49+
home.mkdir(parents=True, exist_ok=True)
50+
(home / "version.json").write_text(json.dumps({
51+
"latest_version": "v9.9.9",
52+
"last_checked_at": datetime.datetime.now(datetime.timezone.utc).isoformat().replace("+00:00", "Z"),
53+
}) + "\n")
54+
55+
master, slave = pty.openpty()
56+
env = dict(os.environ, DEDALUS_HOME=str(home))
57+
env.pop("CI", None)
58+
process = subprocess.Popen(["./dedalus"], stdin=slave, stdout=slave, stderr=slave, env=env, close_fds=True)
59+
os.close(slave)
60+
61+
output = bytearray()
62+
sent = False
63+
deadline = time.time() + 20
64+
while process.poll() is None:
65+
if time.time() > deadline:
66+
process.kill()
67+
raise TimeoutError("dedalus did not finish after declining startup prompt")
68+
readable, _, _ = select.select([master], [], [], 0.1)
69+
if readable:
70+
try:
71+
chunk = os.read(master, 4096)
72+
except OSError:
73+
break
74+
output.extend(chunk)
75+
if not sent and b"Press Enter to update" in output:
76+
os.write(master, b"n\n")
77+
sent = True
78+
79+
if process.poll() is None:
80+
process.wait(timeout=5)
81+
82+
while True:
83+
readable, _, _ = select.select([master], [], [], 0)
84+
if not readable:
85+
break
86+
try:
87+
output.extend(os.read(master, 4096))
88+
except OSError:
89+
break
90+
91+
text = output.decode(errors="replace")
92+
print(text)
93+
assert process.returncode == 0, process.returncode
94+
for expected in [
95+
"A new Dedalus CLI is available.",
96+
"Current: v0.4.0",
97+
"Latest: v9.9.9",
98+
"Update now?",
99+
"> Yes",
100+
" Not now",
101+
"NAME:",
102+
]:
103+
assert expected in text, expected
104+
PY
105+
106+
- name: Accepting prompt enters update flow
107+
run: |
108+
set -euo pipefail
109+
python3 - <<'PY'
110+
import datetime
111+
import json
112+
import os
113+
import pathlib
114+
import pty
115+
import re
116+
import select
117+
import subprocess
118+
import time
119+
120+
home = pathlib.Path(os.environ["RUNNER_TEMP"]) / "dedalus-home-accept"
121+
home.mkdir(parents=True, exist_ok=True)
122+
(home / "version.json").write_text(json.dumps({
123+
"latest_version": "v9.9.9",
124+
"last_checked_at": datetime.datetime.now(datetime.timezone.utc).isoformat().replace("+00:00", "Z"),
125+
}) + "\n")
126+
127+
master, slave = pty.openpty()
128+
env = dict(os.environ, DEDALUS_HOME=str(home))
129+
env.pop("CI", None)
130+
process = subprocess.Popen(["./dedalus"], stdin=slave, stdout=slave, stderr=slave, env=env, close_fds=True)
131+
os.close(slave)
132+
133+
output = bytearray()
134+
sent = False
135+
deadline = time.time() + 20
136+
while process.poll() is None:
137+
if time.time() > deadline:
138+
process.kill()
139+
raise TimeoutError("dedalus did not finish after accepting startup prompt")
140+
readable, _, _ = select.select([master], [], [], 0.1)
141+
if readable:
142+
try:
143+
chunk = os.read(master, 4096)
144+
except OSError:
145+
break
146+
output.extend(chunk)
147+
if not sent and b"Press Enter to update" in output:
148+
os.write(master, b"\n")
149+
sent = True
150+
151+
if process.poll() is None:
152+
process.wait(timeout=5)
153+
154+
while True:
155+
readable, _, _ = select.select([master], [], [], 0)
156+
if not readable:
157+
break
158+
try:
159+
output.extend(os.read(master, 4096))
160+
except OSError:
161+
break
162+
163+
text = output.decode(errors="replace")
164+
print(text)
165+
assert process.returncode == 0, process.returncode
166+
for expected in [
167+
"A new Dedalus CLI is available.",
168+
"Current: v0.4.0",
169+
"Latest: v9.9.9",
170+
"Current version: v0.4.0",
171+
]:
172+
assert expected in text, expected
173+
assert re.search(r"Latest version:\s+v[0-9]+\.[0-9]+\.[0-9]+", text), text
174+
assert (
175+
"dedalus is already at" in text
176+
or "Could not determine how this dedalus binary was installed." in text
177+
or "Running installer with DEDALUS_INSTALL_DIR=" in text
178+
), text
179+
PY
180+
181+
- name: Help path skips prompt
182+
run: |
183+
set -euo pipefail
184+
home="$RUNNER_TEMP/dedalus-home-help"
185+
mkdir -p "$home"
186+
python3 - "$home/version.json" <<'PY'
187+
import datetime
188+
import json
189+
import pathlib
190+
import sys
191+
192+
pathlib.Path(sys.argv[1]).write_text(json.dumps({
193+
"latest_version": "v9.9.9",
194+
"last_checked_at": datetime.datetime.now(datetime.timezone.utc).isoformat().replace("+00:00", "Z"),
195+
}) + "\n")
196+
PY
197+
198+
env DEDALUS_HOME="$home" ./dedalus --help >"$RUNNER_TEMP/help.out" 2>"$RUNNER_TEMP/help.err"
199+
cat "$RUNNER_TEMP/help.out"
200+
cat "$RUNNER_TEMP/help.err"
201+
test ! -s "$RUNNER_TEMP/help.err"
202+
! grep -q 'A new Dedalus CLI is available.' "$RUNNER_TEMP/help.out"

0 commit comments

Comments
 (0)