Skip to content

Commit 0e77392

Browse files
committed
Refactor regression testing setup; replace discovery test script and add arrays test script
1 parent df69966 commit 0e77392

5 files changed

Lines changed: 225 additions & 13 deletions

File tree

.github/workflows/publish.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ jobs:
2626
uses: actions/checkout@v4
2727

2828
- name: Regression tests
29-
run: bash src/test/discovery.sh
29+
run: bash src/test/regression.sh
3030

3131
- name: Log in to the Container registry
3232
uses: docker/login-action@v3.1.0

src/test/arrays.sh

Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
#!/bin/bash
2+
3+
set -euo pipefail
4+
5+
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/lib.sh"
6+
src_dir=${src_dir:?}
7+
workdir=${workdir:?}
8+
9+
assert_json_array() {
10+
[ "$(jq -r 'type' "$1")" = "array" ] || fail "Expected array root in $1"
11+
}
12+
13+
assert_json_length() {
14+
local actual
15+
actual=$(jq 'length' "$1")
16+
[ "$actual" -eq "$2" ] || fail "Expected $1 to contain $2 items, got $actual"
17+
}
18+
19+
assert_repo_only() {
20+
jq -e --arg repo "$2" 'all(.[]; .repo == $repo)' "$1" >/dev/null || fail "Expected $1 to contain only repo $2"
21+
}
22+
23+
assert_size_lt() {
24+
local size
25+
size=$(stat -c %s "$1")
26+
[ "$size" -lt "$2" ] || fail "Expected $1 to be smaller than $2 bytes, got $size"
27+
}
28+
29+
assert_size_gt() {
30+
local size
31+
size=$(stat -c %s "$1")
32+
[ "$size" -gt "$2" ] || fail "Expected $1 to be larger than $2 bytes, got $size"
33+
}
34+
35+
version_total() {
36+
jq '[ .[] | ((.version // []) | length) ] | add' "$1"
37+
}
38+
39+
write_package_json() {
40+
local file=$1
41+
local owner=$2
42+
local repo=$3
43+
local package=$4
44+
local version_count=$5
45+
local payload_file=$6
46+
47+
jq -nc \
48+
--arg owner "$owner" \
49+
--arg repo "$repo" \
50+
--arg package "$package" \
51+
--arg date "2026-03-30" \
52+
--argjson version_count "$version_count" \
53+
--rawfile payload "$payload_file" '
54+
{
55+
owner: $owner,
56+
repo: $repo,
57+
package: $package,
58+
downloads: "1",
59+
raw_downloads: 1,
60+
date: $date,
61+
version: [
62+
range(0; $version_count) | {
63+
id: (100000 + .),
64+
name: ("v" + (. | tostring)),
65+
tags: [if . == ($version_count - 1) then "latest" else ("tag-" + (. | tostring)) end],
66+
downloads: "1",
67+
raw_downloads: 1,
68+
date: $date,
69+
notes: $payload
70+
}
71+
]
72+
}' >"$file"
73+
}
74+
75+
build_owner_arrays() {
76+
local owner_dir=$1
77+
local repo
78+
79+
find "$owner_dir" -type f -name '*.json' ! -name '.*' -print0 | xargs -0 jq -cs '.' >"$owner_dir/.json.tmp"
80+
mv -f "$owner_dir/.json.tmp" "$owner_dir/.json"
81+
bash "$src_dir/lib/ytoxt.sh" "$owner_dir/.json" >/dev/null
82+
83+
while IFS= read -r repo; do
84+
[ -n "$repo" ] || continue
85+
jq -c --arg repo "$repo" '[.[] | select(.repo == $repo)]' "$owner_dir/.json" >"$owner_dir/$repo/.json.tmp"
86+
mv -f "$owner_dir/$repo/.json.tmp" "$owner_dir/$repo/.json"
87+
bash "$src_dir/lib/ytoxt.sh" "$owner_dir/$repo/.json" >/dev/null
88+
done < <(find "$owner_dir" -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | sort)
89+
}
90+
91+
test_small_owner_and_repo_arrays() {
92+
local owner_dir="$workdir/small/Lazztech"
93+
local empty_payload="$workdir/empty.txt"
94+
95+
: >"$empty_payload"
96+
mkdir -p "$owner_dir/Libre-Closet" "$owner_dir/SideRepo"
97+
98+
write_package_json "$owner_dir/Libre-Closet/libre-closet.json" "Lazztech" "Libre-Closet" "libre-closet" 3 "$empty_payload"
99+
write_package_json "$owner_dir/Libre-Closet/libre-closet-dev.json" "Lazztech" "Libre-Closet" "libre-closet-dev" 2 "$empty_payload"
100+
write_package_json "$owner_dir/SideRepo/sidecar.json" "Lazztech" "SideRepo" "sidecar" 1 "$empty_payload"
101+
102+
build_owner_arrays "$owner_dir"
103+
104+
assert_file_exists "$owner_dir/.json"
105+
assert_file_exists "$owner_dir/.xml"
106+
assert_json_array "$owner_dir/.json"
107+
assert_json_length "$owner_dir/.json" 3
108+
assert_size_lt "$owner_dir/.json" 50000000
109+
assert_size_lt "$owner_dir/.xml" 50000000
110+
assert_contains "$owner_dir/.xml" "libre-closet"
111+
assert_contains "$owner_dir/.xml" "sidecar"
112+
113+
assert_file_exists "$owner_dir/Libre-Closet/.json"
114+
assert_file_exists "$owner_dir/Libre-Closet/.xml"
115+
assert_json_array "$owner_dir/Libre-Closet/.json"
116+
assert_json_length "$owner_dir/Libre-Closet/.json" 2
117+
assert_repo_only "$owner_dir/Libre-Closet/.json" "Libre-Closet"
118+
assert_contains "$owner_dir/Libre-Closet/.xml" "libre-closet"
119+
assert_not_contains "$owner_dir/Libre-Closet/.xml" "sidecar"
120+
121+
assert_file_exists "$owner_dir/SideRepo/.json"
122+
assert_file_exists "$owner_dir/SideRepo/.xml"
123+
assert_json_array "$owner_dir/SideRepo/.json"
124+
assert_json_length "$owner_dir/SideRepo/.json" 1
125+
assert_repo_only "$owner_dir/SideRepo/.json" "SideRepo"
126+
assert_contains "$owner_dir/SideRepo/.xml" "sidecar"
127+
assert_not_contains "$owner_dir/SideRepo/.xml" "libre-closet"
128+
}
129+
130+
test_large_array_trimming() {
131+
local payload_file="$workdir/payload.txt"
132+
local empty_payload="$workdir/empty-large.txt"
133+
local base_dir="$workdir/large"
134+
local owner_array="$base_dir/owner-large.json"
135+
local repo_array="$base_dir/repo-large.json"
136+
local owner_versions_before
137+
local owner_versions_after
138+
local repo_versions_before
139+
local repo_versions_after
140+
141+
: >"$empty_payload"
142+
mkdir -p "$base_dir"
143+
head -c 700000 /dev/zero | tr '\0' 'a' >"$payload_file"
144+
145+
write_package_json "$base_dir/libre-closet.json" "Lazztech" "Libre-Closet" "libre-closet" 75 "$payload_file"
146+
write_package_json "$base_dir/sidecar.json" "Lazztech" "SideRepo" "sidecar" 1 "$empty_payload"
147+
148+
jq -cs '.' "$base_dir/libre-closet.json" "$base_dir/sidecar.json" >"$owner_array"
149+
jq -c '[.[] | select(.repo == "Libre-Closet")]' "$owner_array" >"$repo_array"
150+
151+
assert_json_array "$owner_array"
152+
assert_json_array "$repo_array"
153+
assert_size_gt "$owner_array" 50000000
154+
assert_size_gt "$repo_array" 50000000
155+
156+
owner_versions_before=$(version_total "$owner_array")
157+
repo_versions_before=$(version_total "$repo_array")
158+
159+
bash "$src_dir/lib/ytoxt.sh" "$owner_array" >/dev/null
160+
bash "$src_dir/lib/ytoxt.sh" "$repo_array" >/dev/null
161+
162+
assert_file_exists "${owner_array%.*}.xml"
163+
assert_file_exists "${repo_array%.*}.xml"
164+
assert_json_array "$owner_array"
165+
assert_json_array "$repo_array"
166+
assert_size_lt "$owner_array" 50000000
167+
assert_size_lt "${owner_array%.*}.xml" 50000000
168+
assert_size_lt "$repo_array" 50000000
169+
assert_size_lt "${repo_array%.*}.xml" 50000000
170+
assert_contains "${owner_array%.*}.xml" "libre-closet"
171+
assert_contains "${repo_array%.*}.xml" "libre-closet"
172+
assert_repo_only "$repo_array" "Libre-Closet"
173+
174+
owner_versions_after=$(version_total "$owner_array")
175+
repo_versions_after=$(version_total "$repo_array")
176+
[ "$owner_versions_after" -lt "$owner_versions_before" ] || fail "Expected owner array trimming to remove versions"
177+
[ "$repo_versions_after" -lt "$repo_versions_before" ] || fail "Expected repo array trimming to remove versions"
178+
}
179+
180+
trap cleanup EXIT
181+
182+
test_small_owner_and_repo_arrays
183+
test_large_array_trimming
184+
185+
echo "Array creation regression tests passed"

src/test/discovery.sh

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,9 @@
44

55
set -euo pipefail
66

7-
script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
8-
src_dir=$(cd "$script_dir/.." && pwd)
9-
workdir=$(mktemp -d)
10-
11-
cleanup() {
12-
rm -rf "$workdir"
13-
}
14-
15-
fail() {
16-
echo "$1" >&2
17-
exit 1
18-
}
7+
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/lib.sh"
8+
src_dir=${src_dir:?}
9+
workdir=${workdir:?}
1910

2011
init_bkg_state() {
2112
local now

src/test/lib.sh

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#!/bin/bash
2+
3+
# shellcheck disable=SC2034
4+
5+
test_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
6+
src_dir=$(cd "$test_dir/.." && pwd)
7+
workdir=$(mktemp -d)
8+
9+
cleanup() {
10+
rm -rf "$workdir"
11+
}
12+
13+
fail() {
14+
echo "$1" >&2
15+
exit 1
16+
}
17+
18+
assert_file_exists() {
19+
[ -f "$1" ] || fail "Expected file to exist: $1"
20+
}
21+
22+
assert_contains() {
23+
grep -Fq "$2" "$1" || fail "Expected $1 to contain $2"
24+
}
25+
26+
assert_not_contains() {
27+
! grep -Fq "$2" "$1" || fail "Expected $1 to not contain $2"
28+
}

src/test/regression.sh

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#!/bin/bash
2+
3+
set -euo pipefail
4+
5+
test_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
6+
7+
bash "$test_dir/discovery.sh"
8+
bash "$test_dir/arrays.sh"

0 commit comments

Comments
 (0)