Skip to content

Commit 786ad9f

Browse files
committed
Add tests for Guest Mode and Theme Switcher
- Guest Mode: Comprehensive tests for switching, time persistence, and launching - Theme Switcher: Tests for theme extraction and preview generation - Added guest_mode_helper.bash and theme_helper.bash for test setup
1 parent 785c354 commit 786ad9f

5 files changed

Lines changed: 343 additions & 0 deletions

File tree

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
#!/usr/bin/env bats
2+
3+
load '../../support/test_helper'
4+
load '../../support/mocks'
5+
load 'guest_mode_helper'
6+
7+
setup() {
8+
cleanup_test_data
9+
mock_system_commands
10+
setup_guest_mode
11+
setup_guest_mode_scripts
12+
mock_themeSwitcher
13+
}
14+
15+
# install.sh tests
16+
17+
@test "Guest Mode: install.sh sets configON when MainProfile exists" {
18+
mkdir -p "$SDCARD/Saves/MainProfile"
19+
20+
cd "$SDCARD/App/Guest_Mode"
21+
run sh ./install.sh
22+
23+
assert_success
24+
run diff ./config.json ./data/configON.json
25+
assert_success
26+
}
27+
28+
@test "Guest Mode: install.sh does nothing when MainProfile missing" {
29+
echo '{"original": true}' > "$SDCARD/App/Guest_Mode/config.json"
30+
31+
cd "$SDCARD/App/Guest_Mode"
32+
run sh ./install.sh
33+
34+
assert_success
35+
assert_file_contains "$SDCARD/App/Guest_Mode/config.json" '"original": true'
36+
}
37+
38+
# saveTime.sh tests
39+
40+
@test "Guest Mode: saveTime.sh saves timestamp to currentTime.txt" {
41+
mock_date "1700000000"
42+
43+
cd "$SDCARD/App/Guest_Mode"
44+
run sh ./saveTime.sh
45+
46+
assert_success
47+
assert_file_exists "$SDCARD/Saves/CurrentProfile/saves/currentTime.txt"
48+
assert_file_contains "$SDCARD/Saves/CurrentProfile/saves/currentTime.txt" "1700000000"
49+
}
50+
51+
# loadTime.sh tests
52+
53+
@test "Guest Mode: loadTime.sh adds default 4-hour offset" {
54+
mock_date "1700000000"
55+
echo "1700000000" > "$SDCARD/Saves/CurrentProfile/saves/currentTime.txt"
56+
57+
cd "$SDCARD/App/Guest_Mode"
58+
run sh ./loadTime.sh
59+
60+
assert_success
61+
assert_file_contains "$MOCK_LOG" "date set to: @1700014400"
62+
}
63+
64+
@test "Guest Mode: loadTime.sh uses custom hours offset" {
65+
mock_date "1700000000"
66+
echo "1700000000" > "$SDCARD/Saves/CurrentProfile/saves/currentTime.txt"
67+
echo "2" > "$SDCARD/.tmp_update/config/startup/addHours"
68+
69+
cd "$SDCARD/App/Guest_Mode"
70+
run sh ./loadTime.sh
71+
72+
assert_success
73+
assert_file_contains "$MOCK_LOG" "date set to: @1700007200"
74+
}
75+
76+
@test "Guest Mode: loadTime.sh skips offset when NTP enabled" {
77+
mock_date "1700000000"
78+
echo "1700000000" > "$SDCARD/Saves/CurrentProfile/saves/currentTime.txt"
79+
touch "$SDCARD/.tmp_update/config/.ntpState"
80+
81+
cd "$SDCARD/App/Guest_Mode"
82+
run sh ./loadTime.sh
83+
84+
assert_success
85+
assert_file_contains "$MOCK_LOG" "date set to: @1700000000"
86+
}
87+
88+
@test "Guest Mode: loadTime.sh handles missing currentTime.txt" {
89+
mock_date "1700000000"
90+
rm -f "$SDCARD/Saves/CurrentProfile/saves/currentTime.txt"
91+
92+
cd "$SDCARD/App/Guest_Mode"
93+
run sh ./loadTime.sh
94+
95+
assert_success
96+
assert_file_contains "$MOCK_LOG" "date set to: @14400"
97+
}
98+
99+
# launch.sh tests
100+
101+
@test "Guest Mode: launch.sh switches Main to Guest" {
102+
mkdir -p "$SDCARD/Saves/GuestProfile/theme"
103+
mkdir -p "$SDCARD/Saves/GuestProfile/lists"
104+
echo "/mnt/SDCARD/Themes/GuestTheme/" > "$SDCARD/Saves/GuestProfile/theme/currentTheme"
105+
echo '{"guest": "favorites"}' > "$SDCARD/Saves/GuestProfile/lists/favorites.json"
106+
107+
echo "/mnt/SDCARD/Themes/MainTheme/" > "$SDCARD/Saves/CurrentProfile/theme/currentTheme"
108+
echo '{"main": "recents"}' > "$SDCARD/Roms/recentlist.json"
109+
110+
mock_date "1700000000"
111+
112+
cd "$SDCARD/App/Guest_Mode"
113+
run sh ./launch.sh
114+
115+
assert_success
116+
assert_dir_exists "$SDCARD/Saves/MainProfile"
117+
assert_dir_not_exists "$SDCARD/Saves/GuestProfile"
118+
}
119+
120+
@test "Guest Mode: launch.sh switches Guest to Main" {
121+
mkdir -p "$SDCARD/Saves/MainProfile/theme"
122+
mkdir -p "$SDCARD/Saves/MainProfile/lists"
123+
echo "/mnt/SDCARD/Themes/MainTheme/" > "$SDCARD/Saves/MainProfile/theme/currentTheme"
124+
125+
mock_date "1700000000"
126+
127+
cd "$SDCARD/App/Guest_Mode"
128+
run sh ./launch.sh
129+
130+
assert_success
131+
assert_dir_exists "$SDCARD/Saves/GuestProfile"
132+
assert_dir_not_exists "$SDCARD/Saves/MainProfile"
133+
}
134+
135+
@test "Guest Mode: launch.sh calls themeSwitcher" {
136+
mkdir -p "$SDCARD/Saves/GuestProfile"
137+
mock_date "1700000000"
138+
139+
cd "$SDCARD/App/Guest_Mode"
140+
run sh ./launch.sh
141+
142+
assert_success
143+
assert_file_contains "$MOCK_LOG" "called themeSwitcher with: --reapply_icons"
144+
}
145+
146+
@test "Guest Mode: launch.sh preserves theme via system.json" {
147+
mkdir -p "$SDCARD/Saves/GuestProfile/theme"
148+
echo "/mnt/SDCARD/Themes/GuestTheme/" > "$SDCARD/Saves/GuestProfile/theme/currentTheme"
149+
150+
mock_date "1700000000"
151+
152+
cd "$SDCARD/App/Guest_Mode"
153+
run sh ./launch.sh
154+
155+
assert_success
156+
run jq -r .theme "$SDCARD/system.json"
157+
assert_output "/mnt/SDCARD/Themes/GuestTheme/"
158+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Guest Mode test fixtures and setup
2+
3+
setup_guest_mode() {
4+
setup_sdcard
5+
6+
mkdir -p "$SDCARD/Saves/CurrentProfile/theme"
7+
mkdir -p "$SDCARD/Saves/CurrentProfile/lists"
8+
mkdir -p "$SDCARD/Saves/CurrentProfile/saves"
9+
mkdir -p "$SDCARD/Roms"
10+
mkdir -p "$SDCARD/Themes/Silky by DiMo"
11+
mkdir -p "$SDCARD/.tmp_update/config/startup"
12+
13+
cat > "$SDCARD/system.json" << 'EOF'
14+
{
15+
"theme": "/mnt/SDCARD/Themes/Silky by DiMo/"
16+
}
17+
EOF
18+
}
19+
20+
setup_guest_mode_scripts() {
21+
local script_dir="$SDCARD/App/Guest_Mode"
22+
local src_dir="$PROJECT/static/packages/App/Guest Mode/App/Guest_Mode"
23+
mkdir -p "$script_dir/data"
24+
25+
if [ -d "$src_dir" ]; then
26+
cp "$src_dir/"*.sh "$script_dir/" 2>/dev/null || true
27+
cp "$src_dir/data/"*.json "$script_dir/data/" 2>/dev/null || true
28+
chmod +x "$script_dir/"*.sh 2>/dev/null || true
29+
fi
30+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#!/usr/bin/env bats
2+
3+
load '../support/test_helper'
4+
load '../support/mocks'
5+
load 'theme_helper'
6+
7+
setup() {
8+
setup_sdcard
9+
cleanup_test_data
10+
mock_system_commands
11+
mock_md5sum
12+
13+
mkdir -p "$SDCARD/Themes"
14+
}
15+
16+
@test "themes_extract_previews.sh extracts new previews" {
17+
create_theme_archive "NewTheme" "$SDCARD/Themes"
18+
19+
run sh "$PROJECT/src/themeSwitcher/script/themes_extract_previews.sh"
20+
21+
assert_success
22+
assert_file_exists "$SDCARD/Themes/.previews/NewTheme/config.json"
23+
assert_file_exists "$SDCARD/Themes/.previews/NewTheme/md5hash"
24+
assert_file_exists "$SDCARD/Themes/.previews/NewTheme/source"
25+
assert_file_contains "$SDCARD/Themes/.previews/NewTheme/source" "NewTheme.7z"
26+
}
27+
28+
@test "themes_extract_previews.sh skips if theme already installed" {
29+
create_theme_archive "ExistingTheme" "$SDCARD/Themes"
30+
31+
# Mark as installed
32+
mkdir -p "$SDCARD/Themes/ExistingTheme"
33+
echo "abc123def456" > "$SDCARD/Themes/ExistingTheme/md5hash"
34+
35+
run sh "$PROJECT/src/themeSwitcher/script/themes_extract_previews.sh"
36+
37+
assert_success
38+
assert_file_not_exists "$SDCARD/Themes/ExistingTheme.7z"
39+
assert_output --partial "[IGNORE] theme already installed: ExistingTheme"
40+
}
41+
42+
@test "themes_extract_previews.sh skips if preview already exists" {
43+
create_theme_archive "PreviewedTheme" "$SDCARD/Themes"
44+
45+
# Mark as previewed
46+
mkdir -p "$SDCARD/Themes/.previews/PreviewedTheme"
47+
echo "abc123def456" > "$SDCARD/Themes/.previews/PreviewedTheme/md5hash"
48+
49+
run sh "$PROJECT/src/themeSwitcher/script/themes_extract_previews.sh"
50+
51+
assert_success
52+
assert_output --partial "[IGNORE] found preview for: PreviewedTheme"
53+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#!/usr/bin/env bats
2+
3+
load '../support/test_helper'
4+
load '../support/mocks'
5+
load 'theme_helper'
6+
7+
setup() {
8+
setup_sdcard
9+
cleanup_test_data
10+
mock_system_commands
11+
mock_md5sum
12+
13+
# Setup test directories
14+
mkdir -p "$SDCARD/Themes"
15+
}
16+
17+
teardown() {
18+
rm -f "/tmp/remove_theme_archive"
19+
}
20+
21+
@test "themes_extract_theme.sh extracts theme and generates md5" {
22+
create_theme_archive "GenericTheme" "$TEST_DATA/theme_src" "icons/icon.png"
23+
24+
# Script expects preview_dir as $1 and looks for $1/source
25+
mkdir -p "$SDCARD/Themes/.previews/GenericTheme"
26+
echo "$TEST_DATA/theme_src/GenericTheme.7z" > "$SDCARD/Themes/.previews/GenericTheme/source"
27+
28+
run sh "$PROJECT/src/themeSwitcher/script/themes_extract_theme.sh" \
29+
"$SDCARD/Themes/.previews/GenericTheme"
30+
31+
assert_success
32+
assert_file_exists "$SDCARD/Themes/GenericTheme/md5hash"
33+
assert_file_contains "$SDCARD/Themes/GenericTheme/md5hash" "abc123def456"
34+
assert_file_exists "$SDCARD/Themes/GenericTheme/icons/icon.png"
35+
}
36+
37+
@test "themes_extract_theme.sh removes archive if flag set" {
38+
create_theme_archive "GenericTheme" "$TEST_DATA/theme_src"
39+
40+
touch "/tmp/remove_theme_archive"
41+
mkdir -p "$SDCARD/Themes/.previews/GenericTheme"
42+
echo "$TEST_DATA/theme_src/GenericTheme.7z" > "$SDCARD/Themes/.previews/GenericTheme/source"
43+
44+
# We need the output dir to exist for the script to continue after extraction
45+
mkdir -p "$SDCARD/Themes/GenericTheme"
46+
47+
run sh "$PROJECT/src/themeSwitcher/script/themes_extract_theme.sh" \
48+
"$SDCARD/Themes/.previews/GenericTheme"
49+
50+
assert_success
51+
assert_file_not_exists "$TEST_DATA/theme_src/GenericTheme.7z"
52+
}
53+
54+
@test "themes_extract_theme.sh preserves existing icons if archive has no config.json at depth" {
55+
# Create archive manually here because we need a specific non-standard structure (no config at root)
56+
mkdir -p "$TEST_DATA/no_config/icons"
57+
touch "$TEST_DATA/no_config/icons/new_icon.png"
58+
cd "$TEST_DATA"
59+
7z a NoConfigTheme.7z no_config/ >/dev/null
60+
61+
mkdir -p "$SDCARD/Themes/.previews/NoConfigTheme"
62+
echo "$TEST_DATA/NoConfigTheme.7z" > "$SDCARD/Themes/.previews/NoConfigTheme/source"
63+
64+
mkdir -p "$SDCARD/Themes/NoConfigTheme/icons"
65+
touch "$SDCARD/Themes/NoConfigTheme/icons/old_icon.png"
66+
67+
run sh "$PROJECT/src/themeSwitcher/script/themes_extract_theme.sh" \
68+
"$SDCARD/Themes/.previews/NoConfigTheme"
69+
70+
assert_success
71+
assert_file_exists "$SDCARD/Themes/NoConfigTheme/icons/old_icon.png"
72+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Helper functions for Theme Switcher tests
2+
3+
# Create a standard theme 7z archive
4+
# Usage: create_theme_archive <theme_name> [output_dir] [extra_files...]
5+
create_theme_archive() {
6+
local theme_name="$1"
7+
local output_dir="${2:-$TEST_DATA/theme_src}"
8+
shift 2
9+
10+
local src_dir="$TEST_DATA/tmp_src_$theme_name"
11+
mkdir -p "$src_dir/$theme_name"
12+
touch "$src_dir/$theme_name/config.json"
13+
touch "$src_dir/$theme_name/preview.png"
14+
15+
# Create extra files if specified
16+
# Format: relative/path/to/file
17+
for file in "$@"; do
18+
local dir=$(dirname "$src_dir/$theme_name/$file")
19+
mkdir -p "$dir"
20+
touch "$src_dir/$theme_name/$file"
21+
done
22+
23+
mkdir -p "$output_dir"
24+
local cwd=$(pwd)
25+
cd "$src_dir"
26+
7z a "$output_dir/${theme_name}.7z" "$theme_name/" >/dev/null
27+
cd "$cwd"
28+
29+
rm -rf "$src_dir"
30+
}

0 commit comments

Comments
 (0)