from uuid import uuid4

from app.audit import compute_audit_hash, verify_audit_chain
from app.models import AuditEvent


def make_event(sequence, previous_hash, workspace_id):
    event_id, actor_id = uuid4(), uuid4()
    data = {"sequence": sequence, "result": "recorded"}
    event_hash = compute_audit_hash(
        previous_hash=previous_hash, sequence=sequence, event_id=event_id,
        workspace_id=workspace_id, actor_id=actor_id, event_type="test.event",
        request_id="test-request", data=data)
    return AuditEvent(id=event_id, workspace_id=workspace_id, sequence=sequence,
                      event_type="test.event", actor_type="user", actor_id=actor_id,
                      request_id="test-request", data=data, previous_hash=previous_hash,
                      event_hash=event_hash)


def test_audit_chain_detects_content_tampering_and_forks():
    workspace_id = uuid4()
    first = make_event(1, None, workspace_id)
    second = make_event(2, first.event_hash, workspace_id)
    assert verify_audit_chain([second, first], second.event_hash)

    second.data["result"] = "rewritten"
    assert not verify_audit_chain([first, second], second.event_hash)

    fork = make_event(2, first.event_hash, workspace_id)
    assert not verify_audit_chain([first, second, fork], fork.event_hash)
