Skip to content

Commit

Permalink
Update unit tests for database writer
Browse files Browse the repository at this point in the history
  • Loading branch information
t-unit committed Jun 8, 2021
1 parent b999561 commit 324ccdc
Showing 1 changed file with 208 additions and 45 deletions.
253 changes: 208 additions & 45 deletions floor_generator/test/writer/database_writer_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -47,20 +47,126 @@ void main() {
await callback?.onOpen?.call(database);
},
onUpgrade: (database, startVersion, endVersion) async {
await MigrationAdapter.runMigrations(
database, startVersion, endVersion, migrations);
await _migrate(
database, migrations, startVersion, endVersion, callback);
await callback?.onUpgrade?.call(database, startVersion, endVersion);
},
onCreate: (database, version) async {
await database.execute(
'CREATE TABLE IF NOT EXISTS `Person` (`id` INTEGER NOT NULL, `name` TEXT NOT NULL, PRIMARY KEY (`id`))');
await _create(database);
await callback?.onCreate?.call(database, version);
},
);
return sqfliteDatabaseFactory.openDatabase(path, options: databaseOptions);
}
Future<void> _create(sqflite.Database database) async {
await database.execute(
'CREATE TABLE IF NOT EXISTS `Person` (`id` INTEGER NOT NULL, `name` TEXT NOT NULL, PRIMARY KEY (`id`))');
}
Future<void> _migrate(sqflite.Database database, List<Migration> migrations,
int startVersion, int endVersion, Callback? callback) async {
try {
await MigrationAdapter.runMigrations(
database,
startVersion,
endVersion,
migrations,
);
} on MissingMigrationException catch (_) {
throw StateError(
'There is no migration supplied to update the database to the current version.'
' Aborting the migration.',
);
}
}
}
'''));
});

test('open database for simple entity using fallback migration', () async {
final database = await _createDatabase('''
@Database(version: 1, entities: [Person], fallbackToDestructiveMigration: true)
abstract class TestDatabase extends FloorDatabase {}
@entity
class Person {
@primaryKey
final int id;
final String name;
Person(this.id, this.name);
}
''');

final actual = DatabaseWriter(database).write();

expect(actual, equalsDart(r'''
class _$TestDatabase extends TestDatabase {
_$TestDatabase([StreamController<String>? listener]) {
changeListener = listener ?? StreamController<String>.broadcast();
}
Future<sqflite.Database> open(String path, List<Migration> migrations,
[Callback? callback]) async {
final databaseOptions = sqflite.OpenDatabaseOptions(
version: 1,
onConfigure: (database) async {
await database.execute('PRAGMA foreign_keys = ON');
await callback?.onConfigure?.call(database);
},
onOpen: (database) async {
await callback?.onOpen?.call(database);
},
onUpgrade: (database, startVersion, endVersion) async {
await _migrate(
database, migrations, startVersion, endVersion, callback);
await callback?.onUpgrade?.call(database, startVersion, endVersion);
},
onCreate: (database, version) async {
await _create(database);
await callback?.onCreate?.call(database, version);
},
);
return sqfliteDatabaseFactory.openDatabase(path, options: databaseOptions);
}
Future<void> _create(sqflite.Database database) async {
await database.execute(
'CREATE TABLE IF NOT EXISTS `Person` (`id` INTEGER NOT NULL, `name` TEXT NOT NULL, PRIMARY KEY (`id`))');
}
Future<void> _migrate(sqflite.Database database, List<Migration> migrations,
int startVersion, int endVersion, Callback? callback) async {
try {
await MigrationAdapter.runMigrations(
database,
startVersion,
endVersion,
migrations,
);
} on Exception catch (exception) {
await callback?.onDestructiveUpgrade
?.call(database, startVersion, endVersion, exception);
await _dropAll(database);
await _create(database);
}
}
Future<void> _dropAll(sqflite.Database database) async {
await _drop(database, 'table');
await _drop(database, 'view');
}
Future<void> _drop(sqflite.Database database, String type) async {
final names = await database
.rawQuery('SELECT name FROM sqlite_master WHERE type = ?', [type]);
for (final name in names) {
await database.rawQuery('DROP $type ${name['name']}');
}
}
}
'''));
});
Expand All @@ -71,17 +177,17 @@ void main() {
abstract class TestDatabase extends FloorDatabase {
TestDao get testDao;
}
@entity
class Person {
@primaryKey
final int id;
final String name;
Person(this.id, this.name);
}
@dao
abstract class TestDao {
@insert
Expand All @@ -96,9 +202,9 @@ void main() {
_$TestDatabase([StreamController<String>? listener]) {
changeListener = listener ?? StreamController<String>.broadcast();
}
TestDao? _testDaoInstance;
Future<sqflite.Database> open(String path, List<Migration> migrations,
[Callback? callback]) async {
final databaseOptions = sqflite.OpenDatabaseOptions(
Expand All @@ -111,21 +217,40 @@ void main() {
await callback?.onOpen?.call(database);
},
onUpgrade: (database, startVersion, endVersion) async {
await MigrationAdapter.runMigrations(
database, startVersion, endVersion, migrations);
await _migrate(
database, migrations, startVersion, endVersion, callback);
await callback?.onUpgrade?.call(database, startVersion, endVersion);
},
onCreate: (database, version) async {
await database.execute(
'CREATE TABLE IF NOT EXISTS `Person` (`id` INTEGER NOT NULL, `name` TEXT NOT NULL, PRIMARY KEY (`id`))');
await _create(database);
await callback?.onCreate?.call(database, version);
},
);
return sqfliteDatabaseFactory.openDatabase(path, options: databaseOptions);
}
Future<void> _create(sqflite.Database database) async {
await database.execute(
'CREATE TABLE IF NOT EXISTS `Person` (`id` INTEGER NOT NULL, `name` TEXT NOT NULL, PRIMARY KEY (`id`))');
}
Future<void> _migrate(sqflite.Database database, List<Migration> migrations,
int startVersion, int endVersion, Callback? callback) async {
try {
await MigrationAdapter.runMigrations(
database,
startVersion,
endVersion,
migrations,
);
} on MissingMigrationException catch (_) {
throw StateError(
'There is no migration supplied to update the database to the current version.'
' Aborting the migration.',
);
}
}
@override
TestDao get testDao {
return _testDaoInstance ??= _$TestDao(database, changeListener);
Expand All @@ -138,15 +263,15 @@ void main() {
final database = await _createDatabase('''
@Database(version: 1, entities: [Person])
abstract class TestDatabase extends FloorDatabase {}
@Entity(tableName: 'custom_table_name')
class Person {
@PrimaryKey(autoGenerate: true)
final int? id;
@ColumnInfo(name: 'custom_name')
final String name;
Person(this.id, this.name);
}
''');
Expand All @@ -158,7 +283,7 @@ void main() {
_$TestDatabase([StreamController<String>? listener]) {
changeListener = listener ?? StreamController<String>.broadcast();
}
Future<sqflite.Database> open(String path, List<Migration> migrations,
[Callback? callback]) async {
final databaseOptions = sqflite.OpenDatabaseOptions(
Expand All @@ -171,45 +296,64 @@ void main() {
await callback?.onOpen?.call(database);
},
onUpgrade: (database, startVersion, endVersion) async {
await MigrationAdapter.runMigrations(
database, startVersion, endVersion, migrations);
await _migrate(
database, migrations, startVersion, endVersion, callback);
await callback?.onUpgrade?.call(database, startVersion, endVersion);
},
onCreate: (database, version) async {
await database.execute(
'CREATE TABLE IF NOT EXISTS `custom_table_name` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `custom_name` TEXT NOT NULL)');
await _create(database);
await callback?.onCreate?.call(database, version);
},
);
return sqfliteDatabaseFactory.openDatabase(path, options: databaseOptions);
}
}
Future<void> _create(sqflite.Database database) async {
await database.execute(
'CREATE TABLE IF NOT EXISTS `custom_table_name` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `custom_name` TEXT NOT NULL)');
}
Future<void> _migrate(sqflite.Database database, List<Migration> migrations,
int startVersion, int endVersion, Callback? callback) async {
try {
await MigrationAdapter.runMigrations(
database,
startVersion,
endVersion,
migrations,
);
} on MissingMigrationException catch (_) {
throw StateError(
'There is no migration supplied to update the database to the current version.'
' Aborting the migration.',
);
}
}
}
'''));
});

test('open database with view', () async {
final database = await _createDatabase('''
@Database(version: 1, entities: [Person], views: [Name])
abstract class TestDatabase extends FloorDatabase {}
@DatabaseView(
'SELECT custom_name as name FROM person',
viewName: 'names')
class Name {
final String name;
Name(this.name);
}
@entity
class Person {
@primaryKey
final int id;
final String name;
Person(this.id, this.name);
}
''');
Expand All @@ -221,7 +365,7 @@ void main() {
_$TestDatabase([StreamController<String>? listener]) {
changeListener = listener ?? StreamController<String>.broadcast();
}
Future<sqflite.Database> open(String path, List<Migration> migrations,
[Callback? callback]) async {
final databaseOptions = sqflite.OpenDatabaseOptions(
Expand All @@ -234,24 +378,43 @@ void main() {
await callback?.onOpen?.call(database);
},
onUpgrade: (database, startVersion, endVersion) async {
await MigrationAdapter.runMigrations(
database, startVersion, endVersion, migrations);
await _migrate(
database, migrations, startVersion, endVersion, callback);
await callback?.onUpgrade?.call(database, startVersion, endVersion);
},
onCreate: (database, version) async {
await database.execute(
'CREATE TABLE IF NOT EXISTS `Person` (`id` INTEGER NOT NULL, `name` TEXT NOT NULL, PRIMARY KEY (`id`))');
await database.execute(
'CREATE VIEW IF NOT EXISTS `names` AS SELECT custom_name as name FROM person');
await _create(database);
await callback?.onCreate?.call(database, version);
},
);
return sqfliteDatabaseFactory.openDatabase(path, options: databaseOptions);
}
}
Future<void> _create(sqflite.Database database) async {
await database.execute(
'CREATE TABLE IF NOT EXISTS `Person` (`id` INTEGER NOT NULL, `name` TEXT NOT NULL, PRIMARY KEY (`id`))');
await database.execute(
'CREATE VIEW IF NOT EXISTS `names` AS SELECT custom_name as name FROM person');
}
Future<void> _migrate(sqflite.Database database, List<Migration> migrations,
int startVersion, int endVersion, Callback? callback) async {
try {
await MigrationAdapter.runMigrations(
database,
startVersion,
endVersion,
migrations,
);
} on MissingMigrationException catch (_) {
throw StateError(
'There is no migration supplied to update the database to the current version.'
' Aborting the migration.',
);
}
}
}
"""));
});
}
Expand Down

0 comments on commit 324ccdc

Please sign in to comment.