Skip to content

Commit 07d5cde

Browse files
committed
fix(test): route ios release wrappers
1 parent f5f23e7 commit 07d5cde

5 files changed

Lines changed: 95 additions & 0 deletions

File tree

scripts/ios-release-archive.sh

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,24 @@ BUILD_NUMBER="${IOS_RELEASE_BUILD_NUMBER:-}"
1414
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
1515
source "${ROOT_DIR}/scripts/lib/ios-fastlane.sh"
1616

17+
require_option_value() {
18+
local option="$1"
19+
local value="${2-}"
20+
21+
if [[ -z "${value}" || "${value}" == --* ]]; then
22+
echo "Missing value for ${option}." >&2
23+
usage >&2
24+
exit 1
25+
fi
26+
}
27+
1728
while [[ $# -gt 0 ]]; do
1829
case "$1" in
1930
--)
2031
shift
2132
;;
2233
--build-number)
34+
require_option_value "$1" "${2-}"
2335
BUILD_NUMBER="${2:-}"
2436
shift 2
2537
;;

scripts/ios-release-prepare.sh

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,16 +86,29 @@ validate_push_relay_base_url() {
8686
fi
8787
}
8888

89+
require_option_value() {
90+
local option="$1"
91+
local value="${2-}"
92+
93+
if [[ -z "${value}" || "${value}" == --* ]]; then
94+
echo "Missing value for ${option}." >&2
95+
usage >&2
96+
exit 1
97+
fi
98+
}
99+
89100
while [[ $# -gt 0 ]]; do
90101
case "$1" in
91102
--)
92103
shift
93104
;;
94105
--build-number)
106+
require_option_value "$1" "${2-}"
95107
BUILD_NUMBER="${2:-}"
96108
shift 2
97109
;;
98110
--team-id)
111+
require_option_value "$1" "${2-}"
99112
TEAM_ID="${2:-}"
100113
shift 2
101114
;;

scripts/ios-release-upload.sh

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,24 @@ BUILD_NUMBER="${IOS_RELEASE_BUILD_NUMBER:-}"
1616
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
1717
source "${ROOT_DIR}/scripts/lib/ios-fastlane.sh"
1818

19+
require_option_value() {
20+
local option="$1"
21+
local value="${2-}"
22+
23+
if [[ -z "${value}" || "${value}" == --* ]]; then
24+
echo "Missing value for ${option}." >&2
25+
usage >&2
26+
exit 1
27+
fi
28+
}
29+
1930
while [[ $# -gt 0 ]]; do
2031
case "$1" in
2132
--)
2233
shift
2334
;;
2435
--build-number)
36+
require_option_value "$1" "${2-}"
2537
BUILD_NUMBER="${2:-}"
2638
shift 2
2739
;;

scripts/test-projects.test-support.mjs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -960,6 +960,9 @@ const TOOLING_SOURCE_TEST_TARGETS = new Map([
960960
"scripts/github/run-openclaw-cross-os-release-checks.sh",
961961
["test/scripts/openclaw-cross-os-release-workflow.test.ts"],
962962
],
963+
["scripts/ios-release-archive.sh", ["test/scripts/ios-release-wrapper-args.test.ts"]],
964+
["scripts/ios-release-prepare.sh", ["test/scripts/ios-release-wrapper-args.test.ts"]],
965+
["scripts/ios-release-upload.sh", ["test/scripts/ios-release-wrapper-args.test.ts"]],
963966
["scripts/lib/restart-mac-gateway.sh", ["test/scripts/restart-mac.test.ts"]],
964967
[
965968
"scripts/openclaw-release-clawhub-runtime-state.ts",
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
// iOS release wrapper tests keep release args fail-closed before Fastlane work.
2+
import { execFileSync } from "node:child_process";
3+
import path from "node:path";
4+
import { describe, expect, it } from "vitest";
5+
6+
const BASH_BIN = process.platform === "win32" ? "bash" : "/bin/bash";
7+
8+
type WrapperCase = readonly [scriptPath: string, args: readonly string[], option: string];
9+
10+
function runScript(
11+
scriptPath: string,
12+
args: readonly string[],
13+
): { ok: boolean; stdout: string; stderr: string } {
14+
const scriptArgs =
15+
process.platform === "win32" ? [scriptPath] : ["--noprofile", "--norc", scriptPath];
16+
try {
17+
const stdout = execFileSync(BASH_BIN, [...scriptArgs, ...args], {
18+
cwd: process.cwd(),
19+
encoding: "utf8",
20+
stdio: ["ignore", "pipe", "pipe"],
21+
});
22+
return { ok: true, stdout, stderr: "" };
23+
} catch (error) {
24+
const e = error as { stdout?: unknown; stderr?: unknown };
25+
const stdout = Buffer.isBuffer(e.stdout) ? e.stdout.toString("utf8") : String(e.stdout ?? "");
26+
const stderr = Buffer.isBuffer(e.stderr) ? e.stderr.toString("utf8") : String(e.stderr ?? "");
27+
return { ok: false, stdout, stderr };
28+
}
29+
}
30+
31+
describe("iOS release shell wrapper arguments", () => {
32+
const missingValueCases: readonly WrapperCase[] = [
33+
["scripts/ios-release-upload.sh", ["--build-number", "--bogus"], "--build-number"],
34+
["scripts/ios-release-archive.sh", ["--build-number", "--bogus"], "--build-number"],
35+
["scripts/ios-release-prepare.sh", ["--build-number", "--team-id"], "--build-number"],
36+
[
37+
"scripts/ios-release-prepare.sh",
38+
["--build-number", "7", "--team-id", "--bogus"],
39+
"--team-id",
40+
],
41+
];
42+
43+
it.each(missingValueCases)(
44+
"rejects missing %s option values before release work",
45+
(scriptPath, args, option) => {
46+
const result = runScript(path.join(process.cwd(), scriptPath), args);
47+
48+
expect(result.ok).toBe(false);
49+
expect(result.stderr).toContain(`Missing value for ${option}.`);
50+
expect(result.stderr).not.toContain("No such file or directory");
51+
expect(result.stderr).not.toContain("fastlane");
52+
expect(result.stdout).toBe("");
53+
},
54+
);
55+
});

0 commit comments

Comments
 (0)