f14d780f29
Build and Push Docker Container / build-and-push (push) Successful in 7m53s
- Stream compact live replay updates across local and clustered dashboards. - Render responsive snake bodies as SVG paths with aligned custom icons. - Add cache-busted assets, replay fallback routes, and live-follow playback. - Support PostgreSQL benchmark sampling and idempotent SQLite migration. - Add dry-run cleanup for old low-quality PostgreSQL replay payloads. - Reward safe perimeter lanes and bump Prism to version 1.5.0. - Add backend, migration, dashboard, and perimeter regression coverage.
35 lines
1.3 KiB
Python
35 lines
1.3 KiB
Python
import unittest
|
|
|
|
from scripts.migrate_sqlite_to_postgresql import parse_json, parse_timestamp, transform_row
|
|
|
|
class TestMigrateSqliteToPostgresql(unittest.TestCase):
|
|
def test_transform_row_converts_timestamp_boolean_and_json(self):
|
|
columns = ("started_at", "winner_you", "quality_reasons", "game_id")
|
|
row = ("2026-08-01T10:20:30+00:00", 1, '["complete"]', "game-1")
|
|
|
|
transformed = transform_row(columns, row)
|
|
|
|
self.assertEqual(transformed[0].isoformat(), "2026-08-01T10:20:30+00:00")
|
|
self.assertIs(transformed[1], True)
|
|
self.assertEqual(transformed[2], '["complete"]')
|
|
self.assertEqual(transformed[3], "game-1")
|
|
|
|
def test_json_defaults_match_not_null_postgresql_columns(self):
|
|
columns = ("customizations", "board_state", "snakes", "you", "food", "hazards", "body")
|
|
self.assertEqual(
|
|
transform_row(columns, (None,) * len(columns)),
|
|
("{}", "{}", "[]", "{}", "[]", "[]", "[]"),
|
|
)
|
|
|
|
def test_invalid_json_aborts_instead_of_silently_losing_data(self):
|
|
with self.assertRaisesRegex(ValueError, "Invalid JSON"):
|
|
parse_json("{invalid")
|
|
|
|
def test_z_suffix_timestamp_is_timezone_aware(self):
|
|
parsed = parse_timestamp("2026-08-01T10:20:30Z")
|
|
self.assertIsNotNone(parsed.tzinfo)
|
|
self.assertEqual(parsed.utcoffset().total_seconds(), 0)
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|