|
# retoor <retoor@molodetz.nl>
|
|
|
|
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
|