#!/usr/bin/env bash set -euo pipefail if [ -z "${BASE_URL:-}" ]; then if curl --silent --fail http://127.0.0.1:8085/api/health >/dev/null 2>&1; then BASE_URL="http://127.0.0.1:8085" elif curl --silent --fail http://host.containers.internal:8085/api/health >/dev/null 2>&1; then BASE_URL="http://host.containers.internal:8085" else echo "ERROR: could not determine BASE_URL. Tried 127.0.0.1 and host.containers.internal." >&2 exit 1 fi fi TMP_DIR="$(mktemp -d)" trap 'rm -rf "$TMP_DIR"' EXIT echo "== Feature test 1: remembered series list can be purged and starts empty ==" curl --fail --silent --show-error \ -X DELETE "${BASE_URL}/api/session/remembered-series" \ -o "${TMP_DIR}/purge.json" curl --fail --silent --show-error \ "${BASE_URL}/api/session/remembered-series" \ -o "${TMP_DIR}/remembered_empty.json" cat "${TMP_DIR}/remembered_empty.json" python3 - "${TMP_DIR}/remembered_empty.json" <<'PY' import json import sys from pathlib import Path data = json.loads(Path(sys.argv[1]).read_text(encoding="utf-8")) items = data.get("items") assert isinstance(items, list), "items must be list" assert len(items) == 0, "items should be empty after purge" print("purge baseline validation passed") PY echo echo "== Feature test 2: MRU and dedupe by series id ==" cat > "${TMP_DIR}/s1.json" <<'JSON' {"item":{"id":"100","name":"Series A","year":"2020","display_name":"Series A (2020)","raw":{"slug":"series-a"}}} JSON cat > "${TMP_DIR}/s2.json" <<'JSON' {"item":{"id":"200","name":"Series B","year":"2021","display_name":"Series B (2021)","raw":{"slug":"series-b"}}} JSON cat > "${TMP_DIR}/s1b.json" <<'JSON' {"item":{"id":"100","name":"Series A","year":"2020","display_name":"Series A (2020)","raw":{"slug":"series-a"}}} JSON curl --fail --silent --show-error -X POST "${BASE_URL}/api/session/remembered-series" -H "Content-Type: application/json" --data @"${TMP_DIR}/s1.json" >/dev/null curl --fail --silent --show-error -X POST "${BASE_URL}/api/session/remembered-series" -H "Content-Type: application/json" --data @"${TMP_DIR}/s2.json" >/dev/null curl --fail --silent --show-error -X POST "${BASE_URL}/api/session/remembered-series" -H "Content-Type: application/json" --data @"${TMP_DIR}/s1b.json" >/dev/null curl --fail --silent --show-error \ "${BASE_URL}/api/session/remembered-series" \ -o "${TMP_DIR}/remembered_mru.json" cat "${TMP_DIR}/remembered_mru.json" python3 - "${TMP_DIR}/remembered_mru.json" <<'PY' import json import sys from pathlib import Path data = json.loads(Path(sys.argv[1]).read_text(encoding="utf-8")) items = data.get("items") or [] assert len(items) == 2, "expected deduped list of 2" assert items[0]["series"]["id"] == "100", "series 100 should be most-recent after reselection" assert items[1]["series"]["id"] == "200", "series 200 should be second" print("MRU and dedupe validation passed") PY echo echo "== Feature test 3: remember_max_series limit evicts oldest ==" cat > "${TMP_DIR}/settings_limit_2.json" <<'JSON' {"remember_max_series":2} JSON curl --fail --silent --show-error \ -X PUT "${BASE_URL}/api/session/settings" \ -H "Content-Type: application/json" \ --data @"${TMP_DIR}/settings_limit_2.json" \ -o "${TMP_DIR}/settings_limit_resp.json" cat > "${TMP_DIR}/s3.json" <<'JSON' {"item":{"id":"300","name":"Series C","year":"2022","display_name":"Series C (2022)","raw":{"slug":"series-c"}}} JSON curl --fail --silent --show-error -X POST "${BASE_URL}/api/session/remembered-series" -H "Content-Type: application/json" --data @"${TMP_DIR}/s3.json" >/dev/null curl --fail --silent --show-error \ "${BASE_URL}/api/session/remembered-series" \ -o "${TMP_DIR}/remembered_limited.json" cat "${TMP_DIR}/remembered_limited.json" python3 - "${TMP_DIR}/remembered_limited.json" <<'PY' import json import sys from pathlib import Path data = json.loads(Path(sys.argv[1]).read_text(encoding="utf-8")) items = data.get("items") or [] ids = [str(i["series"]["id"]) for i in items] assert len(items) == 2, f"limit should keep 2, got {len(items)}" assert ids[0] == "300", "latest should be first" assert "200" not in ids, "oldest series should be evicted" print("limit enforcement validation passed") PY cat > "${TMP_DIR}/settings_reset_10.json" <<'JSON' {"remember_max_series":10} JSON curl --fail --silent --show-error \ -X PUT "${BASE_URL}/api/session/settings" \ -H "Content-Type: application/json" \ --data @"${TMP_DIR}/settings_reset_10.json" \ >/dev/null echo echo "All remembered series feature tests passed."