Improves the existing test suite by splitting the single test file into multiple files. Also adds the ability for other people to use the tests with some example data.
74 lines
3.8 KiB
Python
74 lines
3.8 KiB
Python
from tests.support import * # noqa: F401,F403
|
|
|
|
|
|
class SyntheticNetworkFixtureTests(unittest.TestCase):
|
|
def test_fixture_contains_only_synthetic_network_identity(self):
|
|
fixture = load_network_fixture()
|
|
|
|
self.assertTrue(fixture["privacy"]["synthetic"])
|
|
self.assertFalse(fixture["privacy"]["contains_user_uid"])
|
|
self.assertFalse(fixture["privacy"]["contains_raw_account_session"])
|
|
self.assertEqual(fixture["local_ip"], "192.0.2.10")
|
|
|
|
allowed_ips = {"192.0.2.10", "198.51.100.20"}
|
|
for packet, decoded in zip(fixture["packets"], fixture_packets()):
|
|
with self.subTest(label=packet["label"]):
|
|
self.assertIn(packet["src_ip"], allowed_ips)
|
|
self.assertIn(packet["dst_ip"], allowed_ips)
|
|
self.assertEqual(packet["protocol"], "udp")
|
|
self.assertIsNone(extract_user_uid(decoded.payload))
|
|
|
|
def test_fixture_replays_permanent_and_arc_history(self):
|
|
fixture = load_network_fixture()
|
|
session = fixture_session()
|
|
|
|
permanent = annotate_groups(session.build_rows("permanent"))
|
|
arc = session.build_rows("arc_miracle_box")
|
|
|
|
self.assertIsNone(session.user_uid)
|
|
self.assertEqual(len(permanent), fixture["expected"]["permanent_records"])
|
|
self.assertEqual(len(arc), fixture["expected"]["arc_records"])
|
|
self.assertEqual(permanent[0]["uid"], fixture["expected"]["permanent_first_uid"])
|
|
self.assertEqual(arc[0]["uid"], fixture["expected"]["arc_first_uid"])
|
|
self.assertEqual(sorted({row["page"] for row in permanent}), [1, 2, 3, 4, 5])
|
|
self.assertEqual(sorted({row["page"] for row in arc}), [1, 2, 3, 4, 5])
|
|
self.assertEqual({row["timestamp_decoded"] for row in permanent}, {"2030-01-01 00:00:00"})
|
|
self.assertEqual({row["timestamp_decoded"] for row in arc}, {"2030-01-02 00:00:00"})
|
|
|
|
# Repeating one manufactured record prevents the replay transcript from
|
|
# preserving a real account's pull sequence while still exercising page
|
|
# ordering, timestamp ordinals, UID stability, and export behavior.
|
|
self.assertEqual(len({row["record_hex"] for row in permanent}), 1)
|
|
self.assertEqual(len({row["record_hex"] for row in arc}), 1)
|
|
|
|
def test_fixture_protocol_samples_cover_edge_cases(self):
|
|
points = decode_response_records(fixture_payload("limited-points-gift-1"))
|
|
chase = decode_response_records(fixture_payload("limited-chase-reward"))
|
|
batched = decode_response_records(fixture_payload("limited-batched-pages"))
|
|
aligned = decode_response_records(fixture_payload("limited-bitpacked-source"))
|
|
bitpacked = decode_response_records(fixture_payload("limited-bitpacked-response"))
|
|
|
|
self.assertEqual(len(points), 1)
|
|
self.assertEqual(points[0]["result_type"], "points_gift")
|
|
self.assertEqual(points[0]["reward_id"], "1020")
|
|
self.assertEqual(len(chase), 1)
|
|
self.assertEqual(chase[0]["result_type"], "chase_reward")
|
|
self.assertEqual(chase[0]["reward_id"], "Dice_ticket_01")
|
|
self.assertEqual(chase[0]["quantity"], 30)
|
|
self.assertEqual(len(batched), 10)
|
|
self.assertEqual(len(aligned), 10)
|
|
self.assertEqual(
|
|
[row["record_hex"] for row in bitpacked],
|
|
[row["record_hex"] for row in aligned],
|
|
)
|
|
|
|
def test_fixture_exports_sanitized_json_with_stable_uids(self):
|
|
session = fixture_session()
|
|
rows = annotate_groups(session.build_rows("permanent"))
|
|
export = build_export_json(rows, [])
|
|
|
|
self.assertNotIn("user_uid", export)
|
|
self.assertEqual(export["format_version"], 1)
|
|
self.assertEqual(export["records"][0]["uid"], load_network_fixture()["expected"]["permanent_first_uid"])
|
|
self.assertNotIn("record_hex", export["records"][0])
|
|
self.assertNotIn("timestamp_raw_hex", export["records"][0])
|