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()