# retoor import time import requests from devplacepy.database import ( CONSENT_KINDS, consent_granted, get_table, refresh_snapshot, ) from tests.conftest import BASE_URL JSON = {"Accept": "application/json"} _counter = [0] def _unique(prefix="cons"): _counter[0] += 1 return f"{prefix}{int(time.time() * 1000)}{_counter[0]}" def _member(): name = _unique() session = requests.Session() session.post( f"{BASE_URL}/auth/signup", data={ "username": name, "email": f"{name}@t.dev", "password": "secret123", "confirm_password": "secret123", "birth_date": "1990-01-01", "accept_terms": "1", }, allow_redirects=True, ) refresh_snapshot() return session, name, get_table("users").find_one(username=name) def test_the_privacy_tab_lists_every_consent(app_server): session, name, _ = _member() payload = session.get( f"{BASE_URL}/profile/{name}?tab=privacy", headers=JSON ).json() kinds = {entry["kind"] for entry in payload["consents"]} assert set(CONSENT_KINDS) == kinds states = {entry["kind"]: entry["state"] for entry in payload["consents"]} assert states["ai_third_party"] == "withdrawn" assert states["terms"] == "granted" def test_granting_and_withdrawing_takes_effect_immediately(app_server): session, name, user = _member() granted = session.post( f"{BASE_URL}/profile/{name}/consent", data={"kind": "ai_third_party", "granted": "1"}, headers=JSON, ) assert granted.status_code == 200 refresh_snapshot() assert consent_granted("user", user["uid"], "ai_third_party") is True withdrawn = session.post( f"{BASE_URL}/profile/{name}/consent", data={"kind": "ai_third_party", "granted": "0"}, headers=JSON, ) assert withdrawn.status_code == 200 refresh_snapshot() assert consent_granted("user", user["uid"], "ai_third_party") is False def test_consent_history_is_never_rewritten(app_server): session, name, user = _member() for granted in ("1", "0", "1"): session.post( f"{BASE_URL}/profile/{name}/consent", data={"kind": "ai_third_party", "granted": granted}, headers=JSON, ) refresh_snapshot() rows = list( get_table("user_consents").find( owner_kind="user", owner_id=user["uid"], kind="ai_third_party" ) ) assert len(rows) == 3 def test_an_unknown_consent_kind_is_refused(app_server): session, name, _ = _member() response = session.post( f"{BASE_URL}/profile/{name}/consent", data={"kind": "not_a_consent", "granted": "1"}, headers=JSON, ) assert response.status_code == 422 def test_the_gateway_refuses_user_content_without_consent(app_server): session, name, user = _member() refresh_snapshot() api_key = get_table("users").find_one(uid=user["uid"])["api_key"] headers = {**JSON, "Authorization": f"Bearer {api_key}"} body = {"model": "molodetz", "messages": [{"role": "user", "content": "hi"}]} refused = requests.post( f"{BASE_URL}/openai/v1/chat/completions", json=body, headers=headers ) assert refused.status_code == 403 assert "consent" in refused.text.lower() session.post( f"{BASE_URL}/profile/{name}/consent", data={"kind": "ai_third_party", "granted": "1"}, headers=JSON, ) allowed = requests.post( f"{BASE_URL}/openai/v1/chat/completions", json=body, headers=headers ) assert allowed.status_code != 403 def _admin(): session = requests.Session() session.post( f"{BASE_URL}/auth/login", data={"email": "alice@test.devplace", "password": "secret123"}, allow_redirects=True, ) return session def test_an_admin_cannot_grant_a_consent_for_someone_else(app_server, seeded_db): _, name, user = _member() response = _admin().post( f"{BASE_URL}/profile/{name}/consent", data={"kind": "ai_third_party", "granted": "1"}, headers=JSON, ) assert response.status_code == 403 assert "account holder" in response.text refresh_snapshot() assert consent_granted("user", user["uid"], "ai_third_party") is False def test_an_admin_cannot_withdraw_a_consent_for_someone_else(app_server, seeded_db): session, name, user = _member() session.post( f"{BASE_URL}/profile/{name}/consent", data={"kind": "ai_third_party", "granted": "1"}, headers=JSON, ) response = _admin().post( f"{BASE_URL}/profile/{name}/consent", data={"kind": "ai_third_party", "granted": "0"}, headers=JSON, ) assert response.status_code == 403 refresh_snapshot() assert consent_granted("user", user["uid"], "ai_third_party") is True def test_an_admin_cannot_change_someone_elses_mature_preference(app_server, seeded_db): _, name, user = _member() before = get_table("users").find_one(uid=user["uid"])["mature_opt_in"] response = _admin().post( f"{BASE_URL}/profile/{name}/mature-content", data={"mature_opt_in": "1"}, headers=JSON, ) assert response.status_code == 403 assert "account holder" in response.text refresh_snapshot() assert get_table("users").find_one(uid=user["uid"])["mature_opt_in"] == before def test_a_stranger_cannot_change_another_members_consent(app_server): _, name, user = _member() stranger, _, _ = _member() response = stranger.post( f"{BASE_URL}/profile/{name}/consent", data={"kind": "ai_third_party", "granted": "1"}, headers=JSON, ) assert response.status_code == 403 refresh_snapshot() assert consent_granted("user", user["uid"], "ai_third_party") is False def test_the_mature_preference_round_trips(app_server): session, name, user = _member() response = session.post( f"{BASE_URL}/profile/{name}/mature-content", data={"mature_opt_in": "1"}, headers=JSON, ) assert response.status_code == 200 refresh_snapshot() assert get_table("users").find_one(uid=user["uid"])["mature_opt_in"] in (1, True) session.post( f"{BASE_URL}/profile/{name}/mature-content", data={"mature_opt_in": "0"}, headers=JSON, ) refresh_snapshot() assert get_table("users").find_one(uid=user["uid"])["mature_opt_in"] in (0, False)