SPB Git forge
28commits 1branches 0releases
7.7 MBsize
maindefault branch
10 days agolast push
Python 66.3% TypeScript 22.7% JavaScript 8.6% HTML 1.4% CSS 0.7%
4.4 KB · 73 lines python
Raw Blame History
1"""Provenance chain: sensors → snapshots (text/blocks from the archive) → diffs → changes → events."""2from __future__ import annotations34import pytest5import test_api_support as support67client = support.client8fixture_data = support.fixture_data910pytestmark = pytest.mark.asyncio(loop_scope="session")11V = "/api/v1"121314async def test_sensor_detail_snapshots_changes(client, fixture_data):  # type: ignore[no-untyped-def]15    sid = fixture_data["sensor_home"]16    r = await client.get(f"{V}/sensors/{sid}")17    body = r.json()18    assert r.status_code == 200 and body["company"]["slug"] == fixture_data["alpha_slug"] and body["latest_snapshot"]["id"] == fixture_data["snap3"]19    assert body["tier"] == "C" and body["surface"] == "pricing"20    snaps = (await client.get(f"{V}/sensors/{sid}/snapshots")).json()["items"]21    assert [s["version_no"] for s in snaps] == [3, 2, 1]22    assert {"id", "sensor_id", "version_no", "fetched_at", "title", "language", "text_length", "block_count", "extracted_summary", "content_hash", "previous_snapshot_id"} <= set(snaps[0])23    assert snaps[1]["previous_snapshot_id"] == fixture_data["snap1"]24    changes = (await client.get(f"{V}/sensors/{sid}/changes")).json()["items"]25    assert changes[0]["id"] == fixture_data["change"] and changes[0]["kind"] == "major" and "diff" not in changes[0]26    assert (await client.get(f"{V}/sensors/{sid}/changes?min_significance=0.9")).json()["items"] == []27    assert (await client.get(f"{V}/sensors/sen_nope")).status_code == 404282930async def test_snapshot_detail_reads_archive(client, fixture_data):  # type: ignore[no-untyped-def]31    r = await client.get(f"{V}/snapshots/{fixture_data['snap2']}")32    body = r.json()33    assert r.status_code == 20034    assert "Starter plan $12 per month" in body["text"] and body["text_truncated"] is False35    assert [b["key"] for b in body["blocks"]] == ["b1", "b2", "b3", "b4"] and body["blocks"][1]["kind"] == "pricing_plan"36    assert body["extracted"] == {"plans": [{"plan_name": "Starter"}]} and body["extracted_summary"] == {"plan_count": 3}37    assert body["sensor"]["surface"] == "pricing"38    lite = (await client.get(f"{V}/snapshots/{fixture_data['snap2']}?include=extracted")).json()39    assert "text" not in lite and "blocks" not in lite40    assert (await client.get(f"{V}/snapshots/snap_nope")).status_code == 404414243async def test_snapshot_diff_stored_and_computed(client, fixture_data):  # type: ignore[no-untyped-def]44    r = await client.get(f"{V}/snapshots/{fixture_data['snap1']}/diff/{fixture_data['snap2']}")45    body = r.json()46    assert r.status_code == 200 and body["source"] == "change" and body["change_id"] == fixture_data["change"]47    assert body["before"]["id"] == fixture_data["snap1"] and body["after"]["id"] == fixture_data["snap2"]48    assert body["diff"]["counts"] == {"added": 1, "removed": 0, "modified": 1, "moved": 0} and body["diff"]["significance"] == 0.7249    reverse = (await client.get(f"{V}/snapshots/{fixture_data['snap2']}/diff/{fixture_data['snap1']}")).json()50    assert reverse["before"]["id"] == fixture_data["snap1"]51    r = await client.get(f"{V}/snapshots/{fixture_data['snap2']}/diff/{fixture_data['snap3']}")52    assert r.status_code in (200, 501)53    if r.status_code == 200:54        d = r.json()55        assert d["source"] == "computed"56        for key in ("added", "removed", "modified", "moved", "counts", "text_delta_ratio", "similarity", "reasons"):57            assert key in d["diff"], key58        assert any(x["key"] == "b5" for x in d["diff"]["added"])59    assert (await client.get(f"{V}/snapshots/{fixture_data['snap1']}/diff/snap_nope")).status_code == 404606162async def test_change_detail(client, fixture_data):  # type: ignore[no-untyped-def]63    r = await client.get(f"{V}/changes/{fixture_data['change']}")64    body = r.json()65    assert r.status_code == 20066    for key in ("id", "sensor_id", "surface", "company_id", "detected_at", "significance", "kind", "blocks_added", "blocks_removed", "blocks_modified", "text_delta_ratio",67                "similarity", "snapshot_before", "snapshot_after", "diff", "structured_delta", "events"):68        assert key in body, key69    assert body["structured_delta"]["plans"]["price_changed"][0]["pct"] == 2070    assert [e["id"] for e in body["events"]] == [fixture_data["ev_pricing"]]71    assert body["company"]["slug"] == fixture_data["alpha_slug"]72    assert (await client.get(f"{V}/changes/chg_nope")).status_code == 40473