browser4-cli 0.1.24 → 0.1.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,322 @@
1
+ #!/usr/bin/env bash
2
+ # install-browser4-cli.tests.sh
3
+ # Test suite for install-browser4-cli.sh
4
+ # Uses only bash builtins and standard Unix tools — no external test frameworks.
5
+ #
6
+ # Run:
7
+ # bash cli/scripts/tests/install-browser4-cli.tests.sh
8
+ # bash cli/scripts/tests/install-browser4-cli.tests.sh -v (verbose)
9
+
10
+ set -euo pipefail
11
+
12
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
13
+ INSTALL_SCRIPT="$(cd "$SCRIPT_DIR/.." && pwd)/install-browser4-cli.sh"
14
+
15
+ PASS=0
16
+ FAIL=0
17
+ VERBOSE=false
18
+
19
+ [[ "${1:-}" == "-v" ]] && VERBOSE=true
20
+
21
+ # ── Helpers ────────────────────────────────────────────
22
+
23
+ green() { echo -e "\033[0;32m$*\033[0m"; }
24
+ red() { echo -e "\033[0;31m$*\033[0m"; }
25
+ cyan() { echo -e "\033[0;36m$*\033[0m"; }
26
+ dim() { echo -e "\033[2m$*\033[0m"; }
27
+
28
+ test() {
29
+ local name="$1"
30
+ local fn="$2"
31
+ if "$fn"; then
32
+ PASS=$((PASS + 1))
33
+ green " PASS $name"
34
+ else
35
+ FAIL=$((FAIL + 1))
36
+ red " FAIL $name"
37
+ fi
38
+ }
39
+
40
+ # Run a command and capture both stdout and stderr.
41
+ # Returns the combined output via stdout; exit code 0 = success metadata only.
42
+ run_script() {
43
+ local args="$*"
44
+ bash "$INSTALL_SCRIPT" $args 2>&1 || true
45
+ }
46
+
47
+ # ── Header ─────────────────────────────────────────────
48
+
49
+ cyan "============================================"
50
+ cyan " install-browser4-cli.sh Test Suite"
51
+ cyan "============================================"
52
+ echo ""
53
+
54
+ # ── Pre-flight ─────────────────────────────────────────
55
+
56
+ echo "--- Pre-flight ---" | cyan
57
+
58
+ test "file exists" bash -c "
59
+ [[ -f '$INSTALL_SCRIPT' ]]
60
+ "
61
+
62
+ test "file is readable" bash -c "
63
+ head -c 1 '$INSTALL_SCRIPT' >/dev/null 2>&1
64
+ "
65
+
66
+ test "starts with shebang" bash -c "
67
+ head -c 20 '$INSTALL_SCRIPT' | grep -q '^#!/usr/bin/env bash'
68
+ "
69
+
70
+ test "bash syntax check passes" bash -c "
71
+ bash -n '$INSTALL_SCRIPT' 2>&1
72
+ "
73
+
74
+ test "no non-ASCII bytes" bash -c "
75
+ ! grep -Pn '[^\\x00-\\x7F]' '$INSTALL_SCRIPT' >/dev/null 2>&1
76
+ "
77
+
78
+ echo ""
79
+
80
+ # ── Argument parsing ──────────────────────────────────
81
+
82
+ echo "--- Argument parsing ---" | cyan
83
+
84
+ test "--help exits 0" bash -c "
85
+ bash '$INSTALL_SCRIPT' --help >/dev/null 2>&1
86
+ "
87
+
88
+ test "--help mentions --skip-if-installed" bash -c "
89
+ bash '$INSTALL_SCRIPT' --help 2>&1 | grep -q 'skip-if-installed'
90
+ "
91
+
92
+ test "--help does NOT mention --force" bash -c "
93
+ ! bash '$INSTALL_SCRIPT' --help 2>&1 | grep -q '\-\-force'
94
+ "
95
+
96
+ test "--version requires value" bash -c "
97
+ bash '$INSTALL_SCRIPT' --version 2>&1 | grep -q 'requires a value'
98
+ "
99
+
100
+ test "--install-dir requires value" bash -c "
101
+ bash '$INSTALL_SCRIPT' --install-dir 2>&1 | grep -q 'requires a value'
102
+ "
103
+
104
+ test "--source requires value" bash -c "
105
+ bash '$INSTALL_SCRIPT' --source 2>&1 | grep -q 'requires a value'
106
+ "
107
+
108
+ test "--source invalid rejected" bash -c "
109
+ bash '$INSTALL_SCRIPT' --source invalid --dry-run 2>&1 | grep -qi 'github.*oss\|must be'
110
+ "
111
+
112
+ test "--dry-run flag accepted" bash -c "
113
+ bash '$INSTALL_SCRIPT' --dry-run 2>&1 | grep -qi 'DRY-RUN\|dry-run\|Install'
114
+ "
115
+
116
+ test "--silent flag accepted" bash -c "
117
+ bash '$INSTALL_SCRIPT' --silent --dry-run 2>&1 | grep -v '^$' | head -1 | grep -qv '→\|step'
118
+ "
119
+
120
+ test "--skip-local flag accepted" bash -c "
121
+ bash '$INSTALL_SCRIPT' --skip-local --dry-run 2>&1 | grep -qi 'skip\|DRY-RUN\|Already\|Install'
122
+ "
123
+
124
+ test "--no-path flag accepted" bash -c "
125
+ bash '$INSTALL_SCRIPT' --no-path --dry-run 2>&1 | grep -vq 'Added to PATH'
126
+ "
127
+
128
+ test "unknown arg rejected" bash -c "
129
+ bash '$INSTALL_SCRIPT' --bogus-flag 2>&1 | grep -q 'Unknown argument'
130
+ "
131
+
132
+ echo ""
133
+
134
+ # ── Locate mode ────────────────────────────────────────
135
+
136
+ echo "--- Locate mode ---" | cyan
137
+
138
+ test "--locate exits 0" bash -c "
139
+ bash '$INSTALL_SCRIPT' --locate >/dev/null 2>&1
140
+ "
141
+
142
+ test "--locate shows Platform key" bash -c "
143
+ bash '$INSTALL_SCRIPT' --locate 2>&1 | grep -q 'Platform key'
144
+ "
145
+
146
+ test "--locate shows Binary name" bash -c "
147
+ bash '$INSTALL_SCRIPT' --locate 2>&1 | grep -q 'Binary name'
148
+ "
149
+
150
+ test "--locate shows Script dir" bash -c "
151
+ bash '$INSTALL_SCRIPT' --locate 2>&1 | grep -q 'Script dir'
152
+ "
153
+
154
+ test "--locate shows Download order" bash -c "
155
+ bash '$INSTALL_SCRIPT' --locate 2>&1 | grep -q 'Download order'
156
+ "
157
+
158
+ test "--locate shows China locale" bash -c "
159
+ bash '$INSTALL_SCRIPT' --locate 2>&1 | grep -q 'China locale'
160
+ "
161
+
162
+ test "--locate shows OS" bash -c "
163
+ bash '$INSTALL_SCRIPT' --locate 2>&1 | grep -q 'OS:'
164
+ "
165
+
166
+ echo ""
167
+
168
+ # ── Download URL patterns ──────────────────────────────
169
+
170
+ echo "--- Download URLs ---" | cyan
171
+
172
+ test "latest mode uses GitHub latest/download pattern" bash -c "
173
+ bash '$INSTALL_SCRIPT' --locate 2>&1 | grep -q 'github.com/platonai/Browser4/releases/latest/download/'
174
+ "
175
+
176
+ test "latest mode uses OSS download/latest pattern" bash -c "
177
+ bash '$INSTALL_SCRIPT' --locate 2>&1 | grep -q 'oss-cn-beijing.*releases/download/latest/'
178
+ "
179
+
180
+ test "versioned mode uses tag-based URLs" bash -c "
181
+ bash '$INSTALL_SCRIPT' --locate --version v4.11.0 2>&1 | grep -q 'releases/download/v4\.11\.0/'
182
+ "
183
+
184
+ test "GitHub URL NOT using broken OSS pattern" bash -c "
185
+ ! bash '$INSTALL_SCRIPT' --locate 2>&1 | grep 'github.com' | grep -q 'releases/download/latest'
186
+ "
187
+
188
+ test "OSS URL NOT using broken GitHub pattern" bash -c "
189
+ ! bash '$INSTALL_SCRIPT' --locate 2>&1 | grep 'oss-cn-beijing' | grep -q 'releases/latest/download'
190
+ "
191
+
192
+ echo ""
193
+
194
+ # ── Functions (extracted via copy without main call) ──
195
+
196
+ echo "--- Functions ---" | cyan
197
+
198
+ # Create a sourceable copy that defines all functions but doesn't call main
199
+ FUNC_TEST_SCRIPT="$(mktemp)"
200
+ trap "rm -f '$FUNC_TEST_SCRIPT'" EXIT
201
+ sed 's/^main$/# main/' "$INSTALL_SCRIPT" > "$FUNC_TEST_SCRIPT"
202
+
203
+ test "get_platform_key returns valid format" bash -c "
204
+ source '$FUNC_TEST_SCRIPT' >/dev/null 2>&1
205
+ key=\$(get_platform_key)
206
+ [[ \"\$key\" =~ ^(win32|linux|darwin)-(x64|arm64)\$ ]] || [[ \"\$key\" =~ ^linux-musl-(x64|arm64)\$ ]]
207
+ "
208
+
209
+ test "get_binary_name adds .exe on win32" bash -c "
210
+ source '$FUNC_TEST_SCRIPT' >/dev/null 2>&1
211
+ name=\$(get_binary_name 'win32-x64')
212
+ [[ \"\$name\" == 'browser4-cli-win32-x64.exe' ]]
213
+ "
214
+
215
+ test "get_binary_name omits .exe on linux" bash -c "
216
+ source '$FUNC_TEST_SCRIPT' >/dev/null 2>&1
217
+ name=\$(get_binary_name 'linux-x64')
218
+ [[ \"\$name\" == 'browser4-cli-linux-x64' ]]
219
+ "
220
+
221
+ test "get_binary_name omits .exe on darwin" bash -c "
222
+ source '$FUNC_TEST_SCRIPT' >/dev/null 2>&1
223
+ name=\$(get_binary_name 'darwin-arm64')
224
+ [[ \"\$name\" == 'browser4-cli-darwin-arm64' ]]
225
+ "
226
+
227
+ test "get_default_install_dir returns non-empty" bash -c "
228
+ source '$FUNC_TEST_SCRIPT' >/dev/null 2>&1
229
+ dir=\$(get_default_install_dir)
230
+ [[ -n \"\$dir\" ]]
231
+ "
232
+
233
+ test "detect_china_locale returns 0 or 1 (no crash)" bash -c "
234
+ source '$FUNC_TEST_SCRIPT' >/dev/null 2>&1
235
+ detect_china_locale && true || true
236
+ "
237
+
238
+ test "detect_os returns valid OS" bash -c "
239
+ source '$FUNC_TEST_SCRIPT' >/dev/null 2>&1
240
+ os=\$(detect_os)
241
+ [[ \"\$os\" =~ ^(linux|darwin|win32)$ ]]
242
+ "
243
+
244
+ test "detect_arch returns x64 or arm64" bash -c "
245
+ source '$FUNC_TEST_SCRIPT' >/dev/null 2>&1
246
+ arch=\$(detect_arch)
247
+ [[ \"\$arch\" == 'x64' || \"\$arch\" == 'arm64' ]]
248
+ "
249
+
250
+ test "find_local_binary returns error for nonexistent" bash -c "
251
+ source '$FUNC_TEST_SCRIPT' >/dev/null 2>&1
252
+ SCRIPT_DIR='$SCRIPT_DIR'
253
+ ! find_local_binary 'nonexistent-binary-xyz' 2>/dev/null
254
+ "
255
+
256
+ test "test_local_binary returns error for empty path" bash -c "
257
+ source '$FUNC_TEST_SCRIPT' >/dev/null 2>&1
258
+ ! test_local_binary '' 2>/dev/null
259
+ "
260
+
261
+ test "test_local_binary returns error for nonexistent" bash -c "
262
+ source '$FUNC_TEST_SCRIPT' >/dev/null 2>&1
263
+ ! test_local_binary '/nonexistent/path/binary' 2>/dev/null
264
+ "
265
+
266
+ echo ""
267
+
268
+ # ── --skip-if-installed behavior ───────────────────────
269
+
270
+ echo "--- --skip-if-installed ---" | cyan
271
+
272
+ test "--skip-if-installed flag accepted" bash -c "
273
+ bash '$INSTALL_SCRIPT' --skip-if-installed --dry-run 2>&1 | grep -qi 'DRY-RUN\|Already\|Install'
274
+ "
275
+
276
+ echo ""
277
+
278
+ # ── Header UX ──────────────────────────────────────────
279
+
280
+ echo "--- Header ---" | cyan
281
+
282
+ test "header is ASCII (no box-drawing chars)" bash -c "
283
+ bash '$INSTALL_SCRIPT' --locate 2>&1 | grep -q '===='
284
+ "
285
+
286
+ test "header does not contain Unicode box-drawing" bash -c "
287
+ ! bash '$INSTALL_SCRIPT' --locate 2>&1 | grep -P '[\x{2500}-\x{257F}]' 2>/dev/null || true
288
+ "
289
+
290
+ echo ""
291
+
292
+ # ── Edge cases ─────────────────────────────────────────
293
+
294
+ echo "--- Edge cases ---" | cyan
295
+
296
+ test "double dash in --version handled (no operator parsing)" bash -c "
297
+ bash '$INSTALL_SCRIPT' --locate 2>&1 | grep -q 'version'
298
+ "
299
+
300
+ test "empty --version with dry-run doesn't download" bash -c "
301
+ bash '$INSTALL_SCRIPT' --dry-run --silent 2>&1 | grep -qi 'DRY-RUN\|Already'
302
+ "
303
+
304
+ echo ""
305
+
306
+ # ── Summary ────────────────────────────────────────────
307
+
308
+ cyan "============================================"
309
+ TOTAL=$((PASS + FAIL))
310
+ if [[ $FAIL -eq 0 ]]; then
311
+ green " Results: $PASS / $TOTAL passed"
312
+ else
313
+ red " Results: $PASS / $TOTAL passed"
314
+ fi
315
+ cyan "============================================"
316
+
317
+ if [[ $FAIL -gt 0 ]]; then
318
+ echo ""
319
+ red "FAILURES: $FAIL tests failed"
320
+ exit 1
321
+ fi
322
+ exit 0