import 'package:drift/drift.dart'; import 'package:drift/native.dart'; import 'package:drift_docs/snippets/migrations/datetime_conversion.dart'; import 'package:test/test.dart'; import 'generated/database.dart'; /// Test for some snippets embedded on https://drift.simonbinder.eu to make sure /// that they are still up to date and work as intended with the latest drift /// version. void main() { group('changing datetime format', () { test('unix timestamp to text', () async { final db = Database.connect(DatabaseConnection(NativeDatabase.memory())); addTearDown(db.close); final time = DateTime.fromMillisecondsSinceEpoch( // Drop milliseconds which are not supported by the old format 1000 * (DateTime.now().millisecondsSinceEpoch ~/ 1000), ); // The database is currently using unix timstamps. Let's add some rows in // that format: await db.users.insertOne( UsersCompanion.insert(name: 'name', createdAt: Value(time))); await db.users.insertOne( UsersCompanion.insert(name: 'name2', createdAt: Value(null))); // Run conversion from unix timestamps to text await db.migrateFromUnixTimestampsToText(db.createMigrator()); // Check that the values are still there! final rows = await (db.select(db.users) ..orderBy([(row) => OrderingTerm.asc(row.rowId)])) .get(); expect(rows, [ User(id: 1, name: 'name', createdAt: time), const User(id: 2, name: 'name2', createdAt: null), ]); }); test('text to unix timestamp', () async { // First, create all tables using text as datetime final db = Database.connect(DatabaseConnection(NativeDatabase.memory())); db.options = const DriftDatabaseOptions(storeDateTimeAsText: true); addTearDown(db.close); final time = DateTime.fromMillisecondsSinceEpoch( 1000 * (DateTime.now().millisecondsSinceEpoch ~/ 1000)); // Add rows, storing date time as text await db.users.insertOne( UsersCompanion.insert(name: 'name', createdAt: Value(time))); await db.users.insertOne( UsersCompanion.insert(name: 'name2', createdAt: Value(null))); // Next, migrate back to unix timestamps db.options = const DriftDatabaseOptions(storeDateTimeAsText: false); final migrator = db.createMigrator(); await db.migrateFromTextDateTimesToUnixTimestamps(migrator); final rows = await (db.select(db.users) ..orderBy([(row) => OrderingTerm.asc(row.rowId)])) .get(); expect(rows, [ User(id: 1, name: 'name', createdAt: time), const User(id: 2, name: 'name2', createdAt: null), ]); }); test('text to unix timestamp, support old sqlite', () async { // First, create all tables using text as datetime final db = Database.connect(DatabaseConnection(NativeDatabase.memory())); db.options = const DriftDatabaseOptions(storeDateTimeAsText: true); addTearDown(db.close); final time = DateTime.fromMillisecondsSinceEpoch( 1000 * (DateTime.now().millisecondsSinceEpoch ~/ 1000)); // Add rows, storing date time as text await db.users.insertOne( UsersCompanion.insert(name: 'name', createdAt: Value(time))); await db.users.insertOne( UsersCompanion.insert(name: 'name2', createdAt: Value(null))); // Next, migrate back to unix timestamps db.options = const DriftDatabaseOptions(storeDateTimeAsText: false); final migrator = db.createMigrator(); await db.migrateFromTextDateTimesToUnixTimestampsPre338(migrator); final rows = await (db.select(db.users) ..orderBy([(row) => OrderingTerm.asc(row.rowId)])) .get(); expect(rows, [ User(id: 1, name: 'name', createdAt: time), const User(id: 2, name: 'name2', createdAt: null), ]); }); }); }