Spaces:
Sleeping
Sleeping
| """Sequential play saves on a fresh user (guards starter deck API + play keys).""" | |
| from __future__ import annotations | |
| import shutil | |
| import sys | |
| from pathlib import Path | |
| import pytest | |
| from fastapi.testclient import TestClient | |
| _SEED = Path(__file__).resolve().parent.parent / "deploy/hf/seed/hf_bundled_store.db" | |
| def api_client(tmp_path: Path, monkeypatch: pytest.MonkeyPatch): | |
| assert _SEED.is_file(), f"Missing seed DB: {_SEED}" | |
| dest = tmp_path / "starter_saves_store.db" | |
| shutil.copyfile(_SEED, dest) | |
| monkeypatch.setenv("KINK_STORE_PATH", str(dest)) | |
| monkeypatch.setenv("KINK_SKIP_HEAVY_WARM", "1") | |
| monkeypatch.setenv("KINK_HF_REQUIRE_FULL_CATALOG", "0") | |
| sys.modules.pop("api", None) | |
| import api as api_mod | |
| api_mod._backend_impl = None | |
| api_mod._get_backend() | |
| return api_mod | |
| def test_two_distinct_likes_increment_play_count(api_client) -> None: | |
| client = TestClient(api_client.app) | |
| u = client.post("/users", json={}).json() | |
| uid, tok = u["id"], u["private_token"] | |
| h = {"x-private-token": tok} | |
| rec = client.get(f"/users/{uid}/recommendations?limit=8", headers=h).json() | |
| items = rec.get("items") or [] | |
| assert len(items) >= 2, items | |
| a = items[0]["kink"]["id"] | |
| b = items[1]["kink"]["id"] | |
| assert a != b | |
| body = {"kink_id": a, "interest_state": "like", "directions": ["together"]} | |
| r1 = client.post(f"/users/{uid}/plays", json=body, headers=h) | |
| assert r1.status_code == 200, r1.text | |
| r2 = client.post( | |
| f"/users/{uid}/plays", | |
| json={"kink_id": b, "interest_state": "like", "directions": ["together"]}, | |
| headers=h, | |
| ) | |
| assert r2.status_code == 200, r2.text | |
| plays = r2.json().get("plays") or {} | |
| assert len(plays) == 2, plays | |
| def test_recommendations_after_first_save_exclude_that_kink(api_client) -> None: | |
| client = TestClient(api_client.app) | |
| u = client.post("/users", json={}).json() | |
| uid, tok = u["id"], u["private_token"] | |
| h = {"x-private-token": tok} | |
| rec0 = client.get(f"/users/{uid}/recommendations?limit=8", headers=h).json() | |
| top = (rec0.get("items") or [])[0]["kink"]["id"] | |
| client.post( | |
| f"/users/{uid}/plays", | |
| json={"kink_id": top, "interest_state": "like", "directions": ["together"]}, | |
| headers=h, | |
| ) | |
| rec1 = client.get(f"/users/{uid}/recommendations?limit=8", headers=h).json() | |
| ids = [row["kink"]["id"] for row in (rec1.get("items") or [])] | |
| assert top not in ids, (top, ids[:5]) | |