# retoor import pytest from devplacepy.database import ( CONSENTS_TABLE, consent_granted, get_setting, get_table, set_consent, set_setting, ) from devplacepy.services.acceptance.agreements import agreement_for from devplacepy.services.acceptance.grant import converge_user from devplacepy.services.audit.store import AUDIT_TABLE from devplacepy.utils import generate_uid TERMS = agreement_for("terms") AI = agreement_for("ai_third_party") @pytest.fixture def account(local_db): uid = generate_uid() get_table("users").insert( { "uid": uid, "username": f"grantprobe_{uid[:8]}", "email": f"grantprobe_{uid[:8]}@example.com", "password_hash": "x", "role": "Member", "terms_version": "", "terms_accepted_at": "", "deletion_requested_at": "", "created_at": "2020-01-01T00:00:00", } ) yield get_table("users").find_one(uid=uid) get_table("users").delete(uid=uid) get_table(CONSENTS_TABLE).delete(owner_id=uid) get_table(AUDIT_TABLE).delete(target_uid=uid) @pytest.fixture def versions(): before = get_setting("terms_version", "1") yield set_setting("terms_version", before) def consent_rows(uid, kind): return list( get_table(CONSENTS_TABLE).find( owner_kind="user", owner_id=uid, kind=kind, deleted_at=None ) ) def audit_rows(uid, event_key): return list( get_table(AUDIT_TABLE).find( target_uid=uid, event_key=event_key, actor_kind="service" ) ) def test_a_won_terms_claim_writes_the_gate_column_and_the_ledger(account, versions): set_setting("terms_version", "5") assert converge_user(TERMS, account, "5") is True row = get_table("users").find_one(uid=account["uid"]) assert row["terms_version"] == "5" assert row["terms_accepted_at"] written = consent_rows(account["uid"], "terms") assert len(written) == 1 assert written[0]["state"] == "granted" assert written[0]["version"] == "5" def test_a_second_claim_at_the_same_version_writes_nothing(account, versions): set_setting("terms_version", "5") assert converge_user(TERMS, account, "5") is True assert converge_user(TERMS, account, "5") is False assert len(consent_rows(account["uid"], "terms")) == 1 assert len(audit_rows(account["uid"], "terms.accept")) == 1 def test_a_withdrawn_terms_consent_is_never_converged(account, versions): set_setting("terms_version", "5") set_consent("user", account["uid"], "terms", False, version="5") assert converge_user(TERMS, account, "5") is False assert get_table("users").find_one(uid=account["uid"])["terms_version"] == "" def test_a_withdrawn_ledger_agreement_is_never_converged(account): set_consent("user", account["uid"], "ai_third_party", False) assert converge_user(AI, account, "1") is False assert not consent_granted("user", account["uid"], "ai_third_party") def test_a_ledger_agreement_converges_once(account): assert converge_user(AI, account, "1") is True assert consent_granted("user", account["uid"], "ai_third_party") assert converge_user(AI, account, "1") is False granted = [ row for row in consent_rows(account["uid"], "ai_third_party") if row["state"] == "granted" ] assert len(granted) == 1 def test_the_written_row_matches_the_human_path_field_for_field(account): reference = set_consent("user", account["uid"], "container_credentials", True) get_table(CONSENTS_TABLE).delete(uid=reference["uid"]) assert converge_user(AI, account, "1") is True written = consent_rows(account["uid"], "ai_third_party")[0] assert set(written.keys()) == set(reference.keys()) assert written["owner_kind"] == reference["owner_kind"] assert written["state"] == reference["state"] assert written["withdrawn_at"] == reference["withdrawn_at"] assert written["deleted_at"] is None assert written["deleted_by"] is None assert written["granted_at"] == written["created_at"] def test_a_won_claim_records_an_existing_event_key_as_a_service_actor(account, versions): set_setting("terms_version", "5") converge_user(TERMS, account, "5") converge_user(AI, account, "1") accepted = audit_rows(account["uid"], "terms.accept") granted = audit_rows(account["uid"], "consent.grant") assert len(accepted) == 1 assert len(granted) == 1 assert accepted[0]["actor_username"] == "acceptance" assert accepted[0]["origin"] == "service" assert accepted[0]["new_value"] == "5" assert granted[0]["new_value"] == "granted" def test_a_lost_claim_records_nothing(account, versions): set_setting("terms_version", "5") converge_user(TERMS, account, "5") converge_user(TERMS, account, "5") assert len(audit_rows(account["uid"], "terms.accept")) == 1 def test_an_account_without_a_uid_is_refused(): assert converge_user(AI, {}, "1") is False