spb/company-atlas
Public
Python 66.3%
TypeScript 22.7%
JavaScript 8.6%
HTML 1.4%
CSS 0.7%
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