13 Commits

Author SHA1 Message Date
412cfff9f5 Added methods for inserting list of players, groups, games 2025-11-19 20:21:55 +01:00
f7073a83a4 Added insert mode 2025-11-19 20:21:30 +01:00
9434282ed1 Added createdAt attribute in dto classes and json schema 2025-11-19 20:20:21 +01:00
3e3def0bde Merge remote-tracking branch 'origin/feature/29-timestamp-zu-allen-objekten-hinzufügen' into feature/31-json-import-fuer-testdaten
# Conflicts:
#	lib/data/dao/game_dao.dart
#	lib/data/db/database.g.dart
#	lib/data/db/tables/game_table.dart
#	lib/data/dto/game.dart
#	pubspec.yaml
2025-11-19 19:30:56 +01:00
186d8cf5c9 Merge branch 'development' into feature/29-timestamp-zu-allen-objekten-hinzufügen 2025-11-19 17:34:07 +00:00
3b6a914022 removed uneccessary withClock 2025-11-19 15:52:04 +01:00
c76e193b4d created all objects in setup() funktion to avoid redundant withClock 2025-11-19 15:02:32 +01:00
8150b42dba add clock dependency to pubspec.yaml 2025-11-19 00:27:47 +01:00
75c6f4e01c verify createdAt timestamps in database tests using mocked clock 2025-11-19 00:27:40 +01:00
19c99eef9c use clock.now() instead of DateTime.now() for DTO creation timestamps 2025-11-19 00:27:08 +01:00
2ee8edcf9b add createdAt column to game, group and player tables and DAOs 2025-11-18 23:47:45 +01:00
8cc898cad6 regenerated database.g.dart 2025-11-18 23:38:43 +01:00
67c8a7e181 added createdAt timestamp to Group, Game, and Player DTOs 2025-11-18 23:21:46 +01:00
18 changed files with 594 additions and 126 deletions

View File

@@ -13,6 +13,9 @@
"id": {
"type": "string"
},
"createdAt": {
"type": "string"
},
"name": {
"type": "string"
},
@@ -28,6 +31,7 @@
},
"required": [
"id",
"createdAt",
"name",
"players",
"group",
@@ -45,6 +49,9 @@
"id": {
"type": "string"
},
"createdAt": {
"type": "string"
},
"name": {
"type": "string"
},
@@ -57,19 +64,7 @@
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"required": [
"id",
"name"
]
},
{
"type": "object",
"properties": {
"id": {
"createdAt": {
"type": "string"
},
"name": {
@@ -78,6 +73,7 @@
},
"required": [
"id",
"createdAt",
"name"
]
}
@@ -86,6 +82,7 @@
},
"required": [
"id",
"createdAt",
"name",
"members"
]
@@ -101,19 +98,7 @@
"id": {
"type": "string"
},
"name": {
"type": "string"
}
},
"required": [
"id",
"name"
]
},
{
"type": "object",
"properties": {
"id": {
"createdAt": {
"type": "string"
},
"name": {
@@ -122,16 +107,12 @@
},
"required": [
"id",
"createdAt",
"name"
]
}
]
}
},
"required": [
"games",
"groups",
"players"
]
}
}

View File

@@ -15,7 +15,11 @@ class GameDao extends DatabaseAccessor<AppDatabase> with _$GameDaoMixin {
Future<List<Game>> getAllGames() async {
final query = select(gameTable);
final result = await query.get();
return result.map((row) => Game(id: row.id, name: row.name)).toList();
return result
.map(
(row) => Game(id: row.id, name: row.name, createdAt: row.createdAt),
)
.toList();
}
/// Retrieves a [Game] by its [gameId].
@@ -38,6 +42,7 @@ class GameDao extends DatabaseAccessor<AppDatabase> with _$GameDaoMixin {
players: players,
group: group,
winner: result.winnerId,
createdAt: result.createdAt,
);
}
@@ -45,22 +50,123 @@ class GameDao extends DatabaseAccessor<AppDatabase> with _$GameDaoMixin {
/// Also adds associated players and group if they exist.
Future<void> addGame({required Game game}) async {
await db.transaction(() async {
for (final p in game.players ?? []) {
await db.playerDao.addPlayer(player: p);
await db.playerGameDao.addPlayerToGame(gameId: game.id, playerId: p.id);
}
if (game.group != null) {
await db.groupDao.addGroup(group: game.group!);
await db.groupGameDao.addGroupToGame(game.id, game.group!.id);
}
await into(gameTable).insert(
GameTableCompanion.insert(
id: game.id,
name: game.name,
winnerId: Value(game.winner),
createdAt: game.createdAt,
),
mode: InsertMode.insertOrReplace,
);
if (game.players != null) {
await db.playerDao.addPlayers(players: game.players!);
for (final p in game.players ?? []) {
await db.playerGameDao.addPlayerToGame(
gameId: game.id,
playerId: p.id,
);
}
}
if (game.group != null) {
await db.groupDao.addGroup(group: game.group!);
await db.groupGameDao.addGroupToGame(game.id, game.group!.id);
}
});
}
Future<void> addGames({required List<Game> games}) async {
if (games.isEmpty) return;
await db.transaction(() async {
// Add all games in batch
await db.batch(
(b) => b.insertAll(
gameTable,
games
.map(
(game) => GameTableCompanion.insert(
id: game.id,
name: game.name,
createdAt: game.createdAt,
winnerId: Value(game.winner),
),
)
.toList(),
mode: InsertMode.insertOrReplace,
),
);
// Add all groups of the games in batch
await db.batch(
(b) => b.insertAll(
db.groupTable,
games
.where((game) => game.group != null)
.map(
(game) => GroupTableCompanion.insert(
id: game.group!.id,
name: game.group!.name,
createdAt: game.group!.createdAt,
),
)
.toList(),
mode: InsertMode.insertOrReplace,
),
);
// Add all players of the games in batch
await db.batch((b) async {
for (final game in games) {
if (game.players != null) {
for (final p in game.players ?? []) {
b.insert(
db.playerGameTable,
PlayerGameTableCompanion.insert(
gameId: game.id,
playerId: p.id,
),
mode: InsertMode.insertOrReplace,
);
}
}
}
});
// Add all group-game associations in batch
await db.batch((b) async {
for (final game in games) {
if (game.group != null) {
b.insert(
db.groupGameTable,
GroupGameTableCompanion.insert(
gameId: game.id,
groupId: game.group!.id,
),
mode: InsertMode.insertOrReplace,
);
}
}
});
// Add all player-game associations in batch
await db.batch((b) async {
for (final game in games) {
if (game.players != null) {
for (final p in game.players ?? []) {
b.insert(
db.playerTable,
PlayerTableCompanion.insert(
id: p.id,
name: p.name,
createdAt: p.createdAt,
),
mode: InsertMode.insertOrReplace,
);
}
}
}
});
});
}

View File

@@ -19,7 +19,12 @@ class GroupDao extends DatabaseAccessor<AppDatabase> with _$GroupDaoMixin {
final members = await db.playerGroupDao.getPlayersOfGroupById(
groupId: groupData.id,
);
return Group(id: groupData.id, name: groupData.name, members: members);
return Group(
id: groupData.id,
name: groupData.name,
members: members,
createdAt: groupData.createdAt,
);
}),
);
}
@@ -33,7 +38,12 @@ class GroupDao extends DatabaseAccessor<AppDatabase> with _$GroupDaoMixin {
groupId: groupId,
);
return Group(id: result.id, name: result.name, members: members);
return Group(
id: result.id,
name: result.name,
members: members,
createdAt: result.createdAt,
);
}
/// Adds a new group with the given [id] and [name] to the database.
@@ -41,9 +51,17 @@ class GroupDao extends DatabaseAccessor<AppDatabase> with _$GroupDaoMixin {
Future<bool> addGroup({required Group group}) async {
if (!await groupExists(groupId: group.id)) {
await db.transaction(() async {
await into(
groupTable,
).insert(GroupTableCompanion.insert(id: group.id, name: group.name));
await into(groupTable).insert(
GroupTableCompanion.insert(
id: group.id,
name: group.name,
createdAt: group.createdAt,
),
mode: InsertMode.insertOrReplace,
);
await Future.wait(
group.members.map((player) => db.playerDao.addPlayer(player: player)),
);
await db.batch(
(b) => b.insertAll(
db.playerGroupTable,
@@ -55,17 +73,57 @@ class GroupDao extends DatabaseAccessor<AppDatabase> with _$GroupDaoMixin {
),
)
.toList(),
mode: InsertMode.insertOrReplace,
),
);
await Future.wait(
group.members.map((player) => db.playerDao.addPlayer(player: player)),
);
});
return true;
}
return false;
}
/// Adds multiple groups to the database.
/// Also adds the group's members to the [PlayerGroupTable].
Future<void> addGroups({required List<Group> groups}) async {
if (groups.isEmpty) return;
await db.transaction(() async {
await db.batch(
(b) => b.insertAll(
groupTable,
groups
.map(
(group) => GroupTableCompanion.insert(
id: group.id,
name: group.name,
createdAt: group.createdAt,
),
)
.toList(),
mode: InsertMode.insertOrReplace,
),
);
for (final group in groups) {
await db.playerDao.addPlayers(players: group.members);
await db.batch(
(b) => b.insertAll(
db.playerGroupTable,
group.members
.map(
(member) => PlayerGroupTableCompanion.insert(
playerId: member.id,
groupId: group.id,
),
)
.toList(),
mode: InsertMode.insertOrReplace,
),
);
}
});
}
/// Deletes the group with the given [id] from the database.
/// Returns `true` if more than 0 rows were affected, otherwise `false`.
Future<bool> deleteGroup({required String groupId}) async {

View File

@@ -13,14 +13,22 @@ class PlayerDao extends DatabaseAccessor<AppDatabase> with _$PlayerDaoMixin {
Future<List<Player>> getAllPlayers() async {
final query = select(playerTable);
final result = await query.get();
return result.map((row) => Player(id: row.id, name: row.name)).toList();
return result
.map(
(row) => Player(id: row.id, name: row.name, createdAt: row.createdAt),
)
.toList();
}
/// Retrieves a [Player] by their [id].
Future<Player> getPlayerById({required String playerId}) async {
final query = select(playerTable)..where((p) => p.id.equals(playerId));
final result = await query.getSingle();
return Player(id: result.id, name: result.name);
return Player(
id: result.id,
name: result.name,
createdAt: result.createdAt,
);
}
/// Adds a new [player] to the database.
@@ -28,14 +36,42 @@ class PlayerDao extends DatabaseAccessor<AppDatabase> with _$PlayerDaoMixin {
/// the new one.
Future<bool> addPlayer({required Player player}) async {
if (!await playerExists(playerId: player.id)) {
await into(
playerTable,
).insert(PlayerTableCompanion.insert(id: player.id, name: player.name));
await into(playerTable).insert(
PlayerTableCompanion.insert(
id: player.id,
name: player.name,
createdAt: player.createdAt,
),
mode: InsertMode.insertOrReplace,
);
return true;
}
return false;
}
/// Adds multiple [players] to the database in a batch operation.
Future<bool> addPlayers({required List<Player> players}) async {
if (players.isEmpty) return false;
await db.batch(
(b) => b.insertAll(
playerTable,
players
.map(
(player) => PlayerTableCompanion.insert(
id: player.id,
name: player.name,
createdAt: player.createdAt,
),
)
.toList(),
mode: InsertMode.insertOrReplace,
),
);
return true;
}
/// Deletes the player with the given [id] from the database.
/// Returns `true` if the player was deleted, `false` if the player did not exist.
Future<bool> deletePlayer({required String playerId}) async {

View File

@@ -46,6 +46,7 @@ class PlayerGameDao extends DatabaseAccessor<AppDatabase>
}) async {
await into(playerGameTable).insert(
PlayerGameTableCompanion.insert(playerId: playerId, gameId: gameId),
mode: InsertMode.insertOrReplace,
);
}
}

View File

@@ -56,6 +56,7 @@ class PlayerGroupDao extends DatabaseAccessor<AppDatabase>
await into(playerGroupTable).insert(
PlayerGroupTableCompanion.insert(playerId: player.id, groupId: groupId),
mode: InsertMode.insertOrReplace,
);
return true;

View File

@@ -27,8 +27,19 @@ class $PlayerTableTable extends PlayerTable
type: DriftSqlType.string,
requiredDuringInsert: true,
);
static const VerificationMeta _createdAtMeta = const VerificationMeta(
'createdAt',
);
@override
List<GeneratedColumn> get $columns => [id, name];
late final GeneratedColumn<DateTime> createdAt = GeneratedColumn<DateTime>(
'created_at',
aliasedName,
false,
type: DriftSqlType.dateTime,
requiredDuringInsert: true,
);
@override
List<GeneratedColumn> get $columns => [id, name, createdAt];
@override
String get aliasedName => _alias ?? actualTableName;
@override
@@ -54,6 +65,14 @@ class $PlayerTableTable extends PlayerTable
} else if (isInserting) {
context.missing(_nameMeta);
}
if (data.containsKey('created_at')) {
context.handle(
_createdAtMeta,
createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta),
);
} else if (isInserting) {
context.missing(_createdAtMeta);
}
return context;
}
@@ -71,6 +90,10 @@ class $PlayerTableTable extends PlayerTable
DriftSqlType.string,
data['${effectivePrefix}name'],
)!,
createdAt: attachedDatabase.typeMapping.read(
DriftSqlType.dateTime,
data['${effectivePrefix}created_at'],
)!,
);
}
@@ -83,17 +106,27 @@ class $PlayerTableTable extends PlayerTable
class PlayerTableData extends DataClass implements Insertable<PlayerTableData> {
final String id;
final String name;
const PlayerTableData({required this.id, required this.name});
final DateTime createdAt;
const PlayerTableData({
required this.id,
required this.name,
required this.createdAt,
});
@override
Map<String, Expression> toColumns(bool nullToAbsent) {
final map = <String, Expression>{};
map['id'] = Variable<String>(id);
map['name'] = Variable<String>(name);
map['created_at'] = Variable<DateTime>(createdAt);
return map;
}
PlayerTableCompanion toCompanion(bool nullToAbsent) {
return PlayerTableCompanion(id: Value(id), name: Value(name));
return PlayerTableCompanion(
id: Value(id),
name: Value(name),
createdAt: Value(createdAt),
);
}
factory PlayerTableData.fromJson(
@@ -104,6 +137,7 @@ class PlayerTableData extends DataClass implements Insertable<PlayerTableData> {
return PlayerTableData(
id: serializer.fromJson<String>(json['id']),
name: serializer.fromJson<String>(json['name']),
createdAt: serializer.fromJson<DateTime>(json['createdAt']),
);
}
@override
@@ -112,15 +146,21 @@ class PlayerTableData extends DataClass implements Insertable<PlayerTableData> {
return <String, dynamic>{
'id': serializer.toJson<String>(id),
'name': serializer.toJson<String>(name),
'createdAt': serializer.toJson<DateTime>(createdAt),
};
}
PlayerTableData copyWith({String? id, String? name}) =>
PlayerTableData(id: id ?? this.id, name: name ?? this.name);
PlayerTableData copyWith({String? id, String? name, DateTime? createdAt}) =>
PlayerTableData(
id: id ?? this.id,
name: name ?? this.name,
createdAt: createdAt ?? this.createdAt,
);
PlayerTableData copyWithCompanion(PlayerTableCompanion data) {
return PlayerTableData(
id: data.id.present ? data.id.value : this.id,
name: data.name.present ? data.name.value : this.name,
createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt,
);
}
@@ -128,44 +168,52 @@ class PlayerTableData extends DataClass implements Insertable<PlayerTableData> {
String toString() {
return (StringBuffer('PlayerTableData(')
..write('id: $id, ')
..write('name: $name')
..write('name: $name, ')
..write('createdAt: $createdAt')
..write(')'))
.toString();
}
@override
int get hashCode => Object.hash(id, name);
int get hashCode => Object.hash(id, name, createdAt);
@override
bool operator ==(Object other) =>
identical(this, other) ||
(other is PlayerTableData &&
other.id == this.id &&
other.name == this.name);
other.name == this.name &&
other.createdAt == this.createdAt);
}
class PlayerTableCompanion extends UpdateCompanion<PlayerTableData> {
final Value<String> id;
final Value<String> name;
final Value<DateTime> createdAt;
final Value<int> rowid;
const PlayerTableCompanion({
this.id = const Value.absent(),
this.name = const Value.absent(),
this.createdAt = const Value.absent(),
this.rowid = const Value.absent(),
});
PlayerTableCompanion.insert({
required String id,
required String name,
required DateTime createdAt,
this.rowid = const Value.absent(),
}) : id = Value(id),
name = Value(name);
name = Value(name),
createdAt = Value(createdAt);
static Insertable<PlayerTableData> custom({
Expression<String>? id,
Expression<String>? name,
Expression<DateTime>? createdAt,
Expression<int>? rowid,
}) {
return RawValuesInsertable({
if (id != null) 'id': id,
if (name != null) 'name': name,
if (createdAt != null) 'created_at': createdAt,
if (rowid != null) 'rowid': rowid,
});
}
@@ -173,11 +221,13 @@ class PlayerTableCompanion extends UpdateCompanion<PlayerTableData> {
PlayerTableCompanion copyWith({
Value<String>? id,
Value<String>? name,
Value<DateTime>? createdAt,
Value<int>? rowid,
}) {
return PlayerTableCompanion(
id: id ?? this.id,
name: name ?? this.name,
createdAt: createdAt ?? this.createdAt,
rowid: rowid ?? this.rowid,
);
}
@@ -191,6 +241,9 @@ class PlayerTableCompanion extends UpdateCompanion<PlayerTableData> {
if (name.present) {
map['name'] = Variable<String>(name.value);
}
if (createdAt.present) {
map['created_at'] = Variable<DateTime>(createdAt.value);
}
if (rowid.present) {
map['rowid'] = Variable<int>(rowid.value);
}
@@ -202,6 +255,7 @@ class PlayerTableCompanion extends UpdateCompanion<PlayerTableData> {
return (StringBuffer('PlayerTableCompanion(')
..write('id: $id, ')
..write('name: $name, ')
..write('createdAt: $createdAt, ')
..write('rowid: $rowid')
..write(')'))
.toString();
@@ -232,8 +286,19 @@ class $GroupTableTable extends GroupTable
type: DriftSqlType.string,
requiredDuringInsert: true,
);
static const VerificationMeta _createdAtMeta = const VerificationMeta(
'createdAt',
);
@override
List<GeneratedColumn> get $columns => [id, name];
late final GeneratedColumn<DateTime> createdAt = GeneratedColumn<DateTime>(
'created_at',
aliasedName,
false,
type: DriftSqlType.dateTime,
requiredDuringInsert: true,
);
@override
List<GeneratedColumn> get $columns => [id, name, createdAt];
@override
String get aliasedName => _alias ?? actualTableName;
@override
@@ -259,6 +324,14 @@ class $GroupTableTable extends GroupTable
} else if (isInserting) {
context.missing(_nameMeta);
}
if (data.containsKey('created_at')) {
context.handle(
_createdAtMeta,
createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta),
);
} else if (isInserting) {
context.missing(_createdAtMeta);
}
return context;
}
@@ -276,6 +349,10 @@ class $GroupTableTable extends GroupTable
DriftSqlType.string,
data['${effectivePrefix}name'],
)!,
createdAt: attachedDatabase.typeMapping.read(
DriftSqlType.dateTime,
data['${effectivePrefix}created_at'],
)!,
);
}
@@ -288,17 +365,27 @@ class $GroupTableTable extends GroupTable
class GroupTableData extends DataClass implements Insertable<GroupTableData> {
final String id;
final String name;
const GroupTableData({required this.id, required this.name});
final DateTime createdAt;
const GroupTableData({
required this.id,
required this.name,
required this.createdAt,
});
@override
Map<String, Expression> toColumns(bool nullToAbsent) {
final map = <String, Expression>{};
map['id'] = Variable<String>(id);
map['name'] = Variable<String>(name);
map['created_at'] = Variable<DateTime>(createdAt);
return map;
}
GroupTableCompanion toCompanion(bool nullToAbsent) {
return GroupTableCompanion(id: Value(id), name: Value(name));
return GroupTableCompanion(
id: Value(id),
name: Value(name),
createdAt: Value(createdAt),
);
}
factory GroupTableData.fromJson(
@@ -309,6 +396,7 @@ class GroupTableData extends DataClass implements Insertable<GroupTableData> {
return GroupTableData(
id: serializer.fromJson<String>(json['id']),
name: serializer.fromJson<String>(json['name']),
createdAt: serializer.fromJson<DateTime>(json['createdAt']),
);
}
@override
@@ -317,15 +405,21 @@ class GroupTableData extends DataClass implements Insertable<GroupTableData> {
return <String, dynamic>{
'id': serializer.toJson<String>(id),
'name': serializer.toJson<String>(name),
'createdAt': serializer.toJson<DateTime>(createdAt),
};
}
GroupTableData copyWith({String? id, String? name}) =>
GroupTableData(id: id ?? this.id, name: name ?? this.name);
GroupTableData copyWith({String? id, String? name, DateTime? createdAt}) =>
GroupTableData(
id: id ?? this.id,
name: name ?? this.name,
createdAt: createdAt ?? this.createdAt,
);
GroupTableData copyWithCompanion(GroupTableCompanion data) {
return GroupTableData(
id: data.id.present ? data.id.value : this.id,
name: data.name.present ? data.name.value : this.name,
createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt,
);
}
@@ -333,44 +427,52 @@ class GroupTableData extends DataClass implements Insertable<GroupTableData> {
String toString() {
return (StringBuffer('GroupTableData(')
..write('id: $id, ')
..write('name: $name')
..write('name: $name, ')
..write('createdAt: $createdAt')
..write(')'))
.toString();
}
@override
int get hashCode => Object.hash(id, name);
int get hashCode => Object.hash(id, name, createdAt);
@override
bool operator ==(Object other) =>
identical(this, other) ||
(other is GroupTableData &&
other.id == this.id &&
other.name == this.name);
other.name == this.name &&
other.createdAt == this.createdAt);
}
class GroupTableCompanion extends UpdateCompanion<GroupTableData> {
final Value<String> id;
final Value<String> name;
final Value<DateTime> createdAt;
final Value<int> rowid;
const GroupTableCompanion({
this.id = const Value.absent(),
this.name = const Value.absent(),
this.createdAt = const Value.absent(),
this.rowid = const Value.absent(),
});
GroupTableCompanion.insert({
required String id,
required String name,
required DateTime createdAt,
this.rowid = const Value.absent(),
}) : id = Value(id),
name = Value(name);
name = Value(name),
createdAt = Value(createdAt);
static Insertable<GroupTableData> custom({
Expression<String>? id,
Expression<String>? name,
Expression<DateTime>? createdAt,
Expression<int>? rowid,
}) {
return RawValuesInsertable({
if (id != null) 'id': id,
if (name != null) 'name': name,
if (createdAt != null) 'created_at': createdAt,
if (rowid != null) 'rowid': rowid,
});
}
@@ -378,11 +480,13 @@ class GroupTableCompanion extends UpdateCompanion<GroupTableData> {
GroupTableCompanion copyWith({
Value<String>? id,
Value<String>? name,
Value<DateTime>? createdAt,
Value<int>? rowid,
}) {
return GroupTableCompanion(
id: id ?? this.id,
name: name ?? this.name,
createdAt: createdAt ?? this.createdAt,
rowid: rowid ?? this.rowid,
);
}
@@ -396,6 +500,9 @@ class GroupTableCompanion extends UpdateCompanion<GroupTableData> {
if (name.present) {
map['name'] = Variable<String>(name.value);
}
if (createdAt.present) {
map['created_at'] = Variable<DateTime>(createdAt.value);
}
if (rowid.present) {
map['rowid'] = Variable<int>(rowid.value);
}
@@ -407,6 +514,7 @@ class GroupTableCompanion extends UpdateCompanion<GroupTableData> {
return (StringBuffer('GroupTableCompanion(')
..write('id: $id, ')
..write('name: $name, ')
..write('createdAt: $createdAt, ')
..write('rowid: $rowid')
..write(')'))
.toString();
@@ -448,8 +556,19 @@ class $GameTableTable extends GameTable
type: DriftSqlType.string,
requiredDuringInsert: false,
);
static const VerificationMeta _createdAtMeta = const VerificationMeta(
'createdAt',
);
@override
List<GeneratedColumn> get $columns => [id, name, winnerId];
late final GeneratedColumn<DateTime> createdAt = GeneratedColumn<DateTime>(
'created_at',
aliasedName,
false,
type: DriftSqlType.dateTime,
requiredDuringInsert: true,
);
@override
List<GeneratedColumn> get $columns => [id, name, winnerId, createdAt];
@override
String get aliasedName => _alias ?? actualTableName;
@override
@@ -481,6 +600,14 @@ class $GameTableTable extends GameTable
winnerId.isAcceptableOrUnknown(data['winner_id']!, _winnerIdMeta),
);
}
if (data.containsKey('created_at')) {
context.handle(
_createdAtMeta,
createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta),
);
} else if (isInserting) {
context.missing(_createdAtMeta);
}
return context;
}
@@ -502,6 +629,10 @@ class $GameTableTable extends GameTable
DriftSqlType.string,
data['${effectivePrefix}winner_id'],
),
createdAt: attachedDatabase.typeMapping.read(
DriftSqlType.dateTime,
data['${effectivePrefix}created_at'],
)!,
);
}
@@ -515,7 +646,13 @@ class GameTableData extends DataClass implements Insertable<GameTableData> {
final String id;
final String name;
final String? winnerId;
const GameTableData({required this.id, required this.name, this.winnerId});
final DateTime createdAt;
const GameTableData({
required this.id,
required this.name,
this.winnerId,
required this.createdAt,
});
@override
Map<String, Expression> toColumns(bool nullToAbsent) {
final map = <String, Expression>{};
@@ -524,6 +661,7 @@ class GameTableData extends DataClass implements Insertable<GameTableData> {
if (!nullToAbsent || winnerId != null) {
map['winner_id'] = Variable<String>(winnerId);
}
map['created_at'] = Variable<DateTime>(createdAt);
return map;
}
@@ -534,6 +672,7 @@ class GameTableData extends DataClass implements Insertable<GameTableData> {
winnerId: winnerId == null && nullToAbsent
? const Value.absent()
: Value(winnerId),
createdAt: Value(createdAt),
);
}
@@ -546,6 +685,7 @@ class GameTableData extends DataClass implements Insertable<GameTableData> {
id: serializer.fromJson<String>(json['id']),
name: serializer.fromJson<String>(json['name']),
winnerId: serializer.fromJson<String?>(json['winnerId']),
createdAt: serializer.fromJson<DateTime>(json['createdAt']),
);
}
@override
@@ -555,6 +695,7 @@ class GameTableData extends DataClass implements Insertable<GameTableData> {
'id': serializer.toJson<String>(id),
'name': serializer.toJson<String>(name),
'winnerId': serializer.toJson<String?>(winnerId),
'createdAt': serializer.toJson<DateTime>(createdAt),
};
}
@@ -562,16 +703,19 @@ class GameTableData extends DataClass implements Insertable<GameTableData> {
String? id,
String? name,
Value<String?> winnerId = const Value.absent(),
DateTime? createdAt,
}) => GameTableData(
id: id ?? this.id,
name: name ?? this.name,
winnerId: winnerId.present ? winnerId.value : this.winnerId,
createdAt: createdAt ?? this.createdAt,
);
GameTableData copyWithCompanion(GameTableCompanion data) {
return GameTableData(
id: data.id.present ? data.id.value : this.id,
name: data.name.present ? data.name.value : this.name,
winnerId: data.winnerId.present ? data.winnerId.value : this.winnerId,
createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt,
);
}
@@ -580,50 +724,58 @@ class GameTableData extends DataClass implements Insertable<GameTableData> {
return (StringBuffer('GameTableData(')
..write('id: $id, ')
..write('name: $name, ')
..write('winnerId: $winnerId')
..write('winnerId: $winnerId, ')
..write('createdAt: $createdAt')
..write(')'))
.toString();
}
@override
int get hashCode => Object.hash(id, name, winnerId);
int get hashCode => Object.hash(id, name, winnerId, createdAt);
@override
bool operator ==(Object other) =>
identical(this, other) ||
(other is GameTableData &&
other.id == this.id &&
other.name == this.name &&
other.winnerId == this.winnerId);
other.winnerId == this.winnerId &&
other.createdAt == this.createdAt);
}
class GameTableCompanion extends UpdateCompanion<GameTableData> {
final Value<String> id;
final Value<String> name;
final Value<String?> winnerId;
final Value<DateTime> createdAt;
final Value<int> rowid;
const GameTableCompanion({
this.id = const Value.absent(),
this.name = const Value.absent(),
this.winnerId = const Value.absent(),
this.createdAt = const Value.absent(),
this.rowid = const Value.absent(),
});
GameTableCompanion.insert({
required String id,
required String name,
this.winnerId = const Value.absent(),
required DateTime createdAt,
this.rowid = const Value.absent(),
}) : id = Value(id),
name = Value(name);
name = Value(name),
createdAt = Value(createdAt);
static Insertable<GameTableData> custom({
Expression<String>? id,
Expression<String>? name,
Expression<String>? winnerId,
Expression<DateTime>? createdAt,
Expression<int>? rowid,
}) {
return RawValuesInsertable({
if (id != null) 'id': id,
if (name != null) 'name': name,
if (winnerId != null) 'winner_id': winnerId,
if (createdAt != null) 'created_at': createdAt,
if (rowid != null) 'rowid': rowid,
});
}
@@ -632,12 +784,14 @@ class GameTableCompanion extends UpdateCompanion<GameTableData> {
Value<String>? id,
Value<String>? name,
Value<String?>? winnerId,
Value<DateTime>? createdAt,
Value<int>? rowid,
}) {
return GameTableCompanion(
id: id ?? this.id,
name: name ?? this.name,
winnerId: winnerId ?? this.winnerId,
createdAt: createdAt ?? this.createdAt,
rowid: rowid ?? this.rowid,
);
}
@@ -654,6 +808,9 @@ class GameTableCompanion extends UpdateCompanion<GameTableData> {
if (winnerId.present) {
map['winner_id'] = Variable<String>(winnerId.value);
}
if (createdAt.present) {
map['created_at'] = Variable<DateTime>(createdAt.value);
}
if (rowid.present) {
map['rowid'] = Variable<int>(rowid.value);
}
@@ -666,6 +823,7 @@ class GameTableCompanion extends UpdateCompanion<GameTableData> {
..write('id: $id, ')
..write('name: $name, ')
..write('winnerId: $winnerId, ')
..write('createdAt: $createdAt, ')
..write('rowid: $rowid')
..write(')'))
.toString();
@@ -1427,12 +1585,14 @@ typedef $$PlayerTableTableCreateCompanionBuilder =
PlayerTableCompanion Function({
required String id,
required String name,
required DateTime createdAt,
Value<int> rowid,
});
typedef $$PlayerTableTableUpdateCompanionBuilder =
PlayerTableCompanion Function({
Value<String> id,
Value<String> name,
Value<DateTime> createdAt,
Value<int> rowid,
});
@@ -1506,6 +1666,11 @@ class $$PlayerTableTableFilterComposer
builder: (column) => ColumnFilters(column),
);
ColumnFilters<DateTime> get createdAt => $composableBuilder(
column: $table.createdAt,
builder: (column) => ColumnFilters(column),
);
Expression<bool> playerGroupTableRefs(
Expression<bool> Function($$PlayerGroupTableTableFilterComposer f) f,
) {
@@ -1575,6 +1740,11 @@ class $$PlayerTableTableOrderingComposer
column: $table.name,
builder: (column) => ColumnOrderings(column),
);
ColumnOrderings<DateTime> get createdAt => $composableBuilder(
column: $table.createdAt,
builder: (column) => ColumnOrderings(column),
);
}
class $$PlayerTableTableAnnotationComposer
@@ -1592,6 +1762,9 @@ class $$PlayerTableTableAnnotationComposer
GeneratedColumn<String> get name =>
$composableBuilder(column: $table.name, builder: (column) => column);
GeneratedColumn<DateTime> get createdAt =>
$composableBuilder(column: $table.createdAt, builder: (column) => column);
Expression<T> playerGroupTableRefs<T extends Object>(
Expression<T> Function($$PlayerGroupTableTableAnnotationComposer a) f,
) {
@@ -1676,15 +1849,26 @@ class $$PlayerTableTableTableManager
({
Value<String> id = const Value.absent(),
Value<String> name = const Value.absent(),
Value<DateTime> createdAt = const Value.absent(),
Value<int> rowid = const Value.absent(),
}) => PlayerTableCompanion(id: id, name: name, rowid: rowid),
}) => PlayerTableCompanion(
id: id,
name: name,
createdAt: createdAt,
rowid: rowid,
),
createCompanionCallback:
({
required String id,
required String name,
required DateTime createdAt,
Value<int> rowid = const Value.absent(),
}) =>
PlayerTableCompanion.insert(id: id, name: name, rowid: rowid),
}) => PlayerTableCompanion.insert(
id: id,
name: name,
createdAt: createdAt,
rowid: rowid,
),
withReferenceMapper: (p0) => p0
.map(
(e) => (
@@ -1775,12 +1959,14 @@ typedef $$GroupTableTableCreateCompanionBuilder =
GroupTableCompanion Function({
required String id,
required String name,
required DateTime createdAt,
Value<int> rowid,
});
typedef $$GroupTableTableUpdateCompanionBuilder =
GroupTableCompanion Function({
Value<String> id,
Value<String> name,
Value<DateTime> createdAt,
Value<int> rowid,
});
@@ -1852,6 +2038,11 @@ class $$GroupTableTableFilterComposer
builder: (column) => ColumnFilters(column),
);
ColumnFilters<DateTime> get createdAt => $composableBuilder(
column: $table.createdAt,
builder: (column) => ColumnFilters(column),
);
Expression<bool> playerGroupTableRefs(
Expression<bool> Function($$PlayerGroupTableTableFilterComposer f) f,
) {
@@ -1921,6 +2112,11 @@ class $$GroupTableTableOrderingComposer
column: $table.name,
builder: (column) => ColumnOrderings(column),
);
ColumnOrderings<DateTime> get createdAt => $composableBuilder(
column: $table.createdAt,
builder: (column) => ColumnOrderings(column),
);
}
class $$GroupTableTableAnnotationComposer
@@ -1938,6 +2134,9 @@ class $$GroupTableTableAnnotationComposer
GeneratedColumn<String> get name =>
$composableBuilder(column: $table.name, builder: (column) => column);
GeneratedColumn<DateTime> get createdAt =>
$composableBuilder(column: $table.createdAt, builder: (column) => column);
Expression<T> playerGroupTableRefs<T extends Object>(
Expression<T> Function($$PlayerGroupTableTableAnnotationComposer a) f,
) {
@@ -2022,15 +2221,26 @@ class $$GroupTableTableTableManager
({
Value<String> id = const Value.absent(),
Value<String> name = const Value.absent(),
Value<DateTime> createdAt = const Value.absent(),
Value<int> rowid = const Value.absent(),
}) => GroupTableCompanion(id: id, name: name, rowid: rowid),
}) => GroupTableCompanion(
id: id,
name: name,
createdAt: createdAt,
rowid: rowid,
),
createCompanionCallback:
({
required String id,
required String name,
required DateTime createdAt,
Value<int> rowid = const Value.absent(),
}) =>
GroupTableCompanion.insert(id: id, name: name, rowid: rowid),
}) => GroupTableCompanion.insert(
id: id,
name: name,
createdAt: createdAt,
rowid: rowid,
),
withReferenceMapper: (p0) => p0
.map(
(e) => (
@@ -2122,6 +2332,7 @@ typedef $$GameTableTableCreateCompanionBuilder =
required String id,
required String name,
Value<String?> winnerId,
required DateTime createdAt,
Value<int> rowid,
});
typedef $$GameTableTableUpdateCompanionBuilder =
@@ -2129,6 +2340,7 @@ typedef $$GameTableTableUpdateCompanionBuilder =
Value<String> id,
Value<String> name,
Value<String?> winnerId,
Value<DateTime> createdAt,
Value<int> rowid,
});
@@ -2199,6 +2411,11 @@ class $$GameTableTableFilterComposer
builder: (column) => ColumnFilters(column),
);
ColumnFilters<DateTime> get createdAt => $composableBuilder(
column: $table.createdAt,
builder: (column) => ColumnFilters(column),
);
Expression<bool> playerGameTableRefs(
Expression<bool> Function($$PlayerGameTableTableFilterComposer f) f,
) {
@@ -2273,6 +2490,11 @@ class $$GameTableTableOrderingComposer
column: $table.winnerId,
builder: (column) => ColumnOrderings(column),
);
ColumnOrderings<DateTime> get createdAt => $composableBuilder(
column: $table.createdAt,
builder: (column) => ColumnOrderings(column),
);
}
class $$GameTableTableAnnotationComposer
@@ -2293,6 +2515,9 @@ class $$GameTableTableAnnotationComposer
GeneratedColumn<String> get winnerId =>
$composableBuilder(column: $table.winnerId, builder: (column) => column);
GeneratedColumn<DateTime> get createdAt =>
$composableBuilder(column: $table.createdAt, builder: (column) => column);
Expression<T> playerGameTableRefs<T extends Object>(
Expression<T> Function($$PlayerGameTableTableAnnotationComposer a) f,
) {
@@ -2378,11 +2603,13 @@ class $$GameTableTableTableManager
Value<String> id = const Value.absent(),
Value<String> name = const Value.absent(),
Value<String?> winnerId = const Value.absent(),
Value<DateTime> createdAt = const Value.absent(),
Value<int> rowid = const Value.absent(),
}) => GameTableCompanion(
id: id,
name: name,
winnerId: winnerId,
createdAt: createdAt,
rowid: rowid,
),
createCompanionCallback:
@@ -2390,11 +2617,13 @@ class $$GameTableTableTableManager
required String id,
required String name,
Value<String?> winnerId = const Value.absent(),
required DateTime createdAt,
Value<int> rowid = const Value.absent(),
}) => GameTableCompanion.insert(
id: id,
name: name,
winnerId: winnerId,
createdAt: createdAt,
rowid: rowid,
),
withReferenceMapper: (p0) => p0

View File

@@ -4,6 +4,7 @@ class GameTable extends Table {
TextColumn get id => text()();
TextColumn get name => text()();
late final winnerId = text().nullable()();
DateTimeColumn get createdAt => dateTime()();
@override
Set<Column<Object>> get primaryKey => {id};

View File

@@ -3,6 +3,7 @@ import 'package:drift/drift.dart';
class GroupTable extends Table {
TextColumn get id => text()();
TextColumn get name => text()();
DateTimeColumn get createdAt => dateTime()();
@override
Set<Column<Object>> get primaryKey => {id};

View File

@@ -3,6 +3,7 @@ import 'package:drift/drift.dart';
class PlayerTable extends Table {
TextColumn get id => text()();
TextColumn get name => text()();
DateTimeColumn get createdAt => dateTime()();
@override
Set<Column<Object>> get primaryKey => {id};

View File

@@ -1,16 +1,25 @@
import 'package:clock/clock.dart';
import 'package:game_tracker/data/dto/group.dart';
import 'package:game_tracker/data/dto/player.dart';
import 'package:uuid/uuid.dart';
class Game {
final String id;
final DateTime createdAt;
final String name;
final List<Player>? players;
final Group? group;
final String? winner;
Game({String? id, required this.name, this.players, this.group, this.winner})
: id = id ?? const Uuid().v4();
Game({
String? id,
DateTime? createdAt,
required this.name,
this.players,
this.group,
this.winner = '',
}) : id = id ?? const Uuid().v4(),
createdAt = createdAt ?? clock.now();
@override
String toString() {
@@ -21,6 +30,7 @@ class Game {
Game.fromJson(Map<String, dynamic> json)
: id = json['id'],
name = json['name'],
createdAt = DateTime.parse(json['createdAt']),
players = json['players'] != null
? (json['players'] as List)
.map((playerJson) => Player.fromJson(playerJson))
@@ -32,6 +42,7 @@ class Game {
/// Converts the Game instance to a JSON object.
Map<String, dynamic> toJson() => {
'id': id,
'createdAt': createdAt.toIso8601String(),
'name': name,
'players': players?.map((player) => player.toJson()).toList(),
'group': group?.toJson(),

View File

@@ -1,13 +1,20 @@
import 'package:clock/clock.dart';
import 'package:game_tracker/data/dto/player.dart';
import 'package:uuid/uuid.dart';
class Group {
final String id;
final DateTime createdAt;
final String name;
final List<Player> members;
Group({String? id, required this.name, required this.members})
: id = id ?? const Uuid().v4();
Group({
String? id,
DateTime? createdAt,
required this.name,
required this.members,
}) : id = id ?? const Uuid().v4(),
createdAt = createdAt ?? clock.now();
@override
String toString() {
@@ -17,6 +24,7 @@ class Group {
/// Creates a Group instance from a JSON object.
Group.fromJson(Map<String, dynamic> json)
: id = json['id'],
createdAt = DateTime.parse(json['createdAt']),
name = json['name'],
members = (json['members'] as List)
.map((memberJson) => Player.fromJson(memberJson))
@@ -25,6 +33,7 @@ class Group {
/// Converts the Group instance to a JSON object.
Map<String, dynamic> toJson() => {
'id': id,
'createdAt': createdAt.toIso8601String(),
'name': name,
'members': members.map((member) => member.toJson()).toList(),
};

View File

@@ -1,10 +1,14 @@
import 'package:clock/clock.dart';
import 'package:uuid/uuid.dart';
class Player {
final String id;
final DateTime createdAt;
final String name;
Player({String? id, required this.name}) : id = id ?? const Uuid().v4();
Player({String? id, DateTime? createdAt, required this.name})
: id = id ?? const Uuid().v4(),
createdAt = createdAt ?? clock.now();
@override
String toString() {
@@ -14,8 +18,13 @@ class Player {
/// Creates a Player instance from a JSON object.
Player.fromJson(Map<String, dynamic> json)
: id = json['id'],
createdAt = DateTime.parse(json['createdAt']),
name = json['name'];
/// Converts the Player instance to a JSON object.
Map<String, dynamic> toJson() => {'id': id, 'name': name};
Map<String, dynamic> toJson() => {
'id': id,
'createdAt': createdAt.toIso8601String(),
'name': name,
};
}

View File

@@ -110,17 +110,9 @@ class DataTransferService {
.toList() ??
[];
for (Player player in importedPlayers) {
await db.playerDao.addPlayer(player: player);
}
for (Group group in importedGroups) {
await db.groupDao.addGroup(group: group);
}
for (Game game in importedGames) {
await db.gameDao.addGame(game: game);
}
await db.playerDao.addPlayers(players: importedPlayers);
await db.groupDao.addGroups(groups: importedGroups);
await db.gameDao.addGames(games: importedGames);
} else {
return ImportResult.invalidSchema;
}

View File

@@ -23,6 +23,7 @@ dependencies:
file_picker: ^10.3.6
json_schema: ^5.2.2
file_saver: ^0.3.1
clock: ^1.1.2
dev_dependencies:
flutter_test:

View File

@@ -1,3 +1,4 @@
import 'package:clock/clock.dart';
import 'package:drift/drift.dart';
import 'package:drift/native.dart';
import 'package:flutter_test/flutter_test.dart';
@@ -15,6 +16,8 @@ void main() {
late Player player5;
late Group testgroup;
late Game testgame;
final fixedDate = DateTime(2025, 19, 11, 00, 11, 23);
final fakeClock = Clock(() => fixedDate);
setUp(() {
database = AppDatabase(
@@ -25,17 +28,22 @@ void main() {
),
);
player1 = Player(name: 'Alice');
player2 = Player(name: 'Bob');
player3 = Player(name: 'Charlie');
player4 = Player(name: 'Diana');
player5 = Player(name: 'Eve');
testgroup = Group(name: 'Test Group', members: [player1, player2, player3]);
testgame = Game(
name: 'Test Game',
group: testgroup,
players: [player4, player5],
);
withClock(fakeClock, () {
player1 = Player(name: 'Alice');
player2 = Player(name: 'Bob');
player3 = Player(name: 'Charlie');
player4 = Player(name: 'Diana');
player5 = Player(name: 'Eve');
testgroup = Group(
name: 'Test Group',
members: [player1, player2, player3],
);
testgame = Game(
name: 'Test Game',
group: testgroup,
players: [player4, player5],
);
});
});
tearDown(() async {
await database.close();
@@ -50,6 +58,7 @@ void main() {
expect(result.id, testgame.id);
expect(result.name, testgame.name);
expect(result.winner, testgame.winner);
expect(result.createdAt, testgame.createdAt);
if (result.group != null) {
expect(result.group!.members.length, testgroup.members.length);
@@ -67,6 +76,7 @@ void main() {
for (int i = 0; i < testgame.players!.length; i++) {
expect(result.players![i].id, testgame.players![i].id);
expect(result.players![i].name, testgame.players![i].name);
expect(result.players![i].createdAt, testgame.players![i].createdAt);
}
} else {
fail('Players is null');

View File

@@ -1,3 +1,4 @@
import 'package:clock/clock.dart';
import 'package:drift/drift.dart';
import 'package:drift/native.dart';
import 'package:flutter_test/flutter_test.dart';
@@ -12,6 +13,9 @@ void main() {
late Player player3;
late Player player4;
late Group testgroup;
late Group testgroup2;
final fixedDate = DateTime(2025, 19, 11, 00, 11, 23);
final fakeClock = Clock(() => fixedDate);
setUp(() {
database = AppDatabase(
@@ -22,22 +26,27 @@ void main() {
),
);
player1 = Player(name: 'Alice');
player2 = Player(name: 'Bob');
player3 = Player(name: 'Charlie');
player4 = Player(name: 'Diana');
testgroup = Group(name: 'Test Group', members: [player1, player2, player3]);
withClock(fakeClock, () {
player1 = Player(name: 'Alice');
player2 = Player(name: 'Bob');
player3 = Player(name: 'Charlie');
player4 = Player(name: 'Diana');
testgroup = Group(
name: 'Test Group',
members: [player1, player2, player3],
);
testgroup2 = Group(
id: 'gr2',
name: 'Second Group',
members: [player2, player3, player4],
);
});
});
tearDown(() async {
await database.close();
});
group('group tests', () {
test('all groups get fetched correctly', () async {
final testgroup2 = Group(
id: 'gr2',
name: 'Second Group',
members: [player2, player3, player4],
);
await database.groupDao.addGroup(group: testgroup);
await database.groupDao.addGroup(group: testgroup2);
@@ -48,11 +57,13 @@ void main() {
expect(fetchedGroup1.name, testgroup.name);
expect(fetchedGroup1.members.length, testgroup.members.length);
expect(fetchedGroup1.members.elementAt(0).id, player1.id);
expect(fetchedGroup1.members.elementAt(0).createdAt, player1.createdAt);
final fetchedGroup2 = allGroups.firstWhere((g) => g.id == testgroup2.id);
expect(fetchedGroup2.name, testgroup2.name);
expect(fetchedGroup2.members.length, testgroup2.members.length);
expect(fetchedGroup2.members.elementAt(0).id, player2.id);
expect(fetchedGroup2.members.elementAt(0).createdAt, player2.createdAt);
});
test('group and group members gets added correctly', () async {
@@ -64,11 +75,13 @@ void main() {
expect(result.id, testgroup.id);
expect(result.name, testgroup.name);
expect(result.createdAt, testgroup.createdAt);
expect(result.members.length, testgroup.members.length);
for (int i = 0; i < testgroup.members.length; i++) {
expect(result.members[i].id, testgroup.members[i].id);
expect(result.members[i].name, testgroup.members[i].name);
expect(result.members[i].createdAt, testgroup.members[i].createdAt);
}
});
@@ -124,8 +137,6 @@ void main() {
expect(playerNotAdded, true);
expect(playerAdded, true);
final result = await database.groupDao.getGroupById(
groupId: testgroup.id,
);
@@ -133,6 +144,7 @@ void main() {
final addedPlayer = result.members.firstWhere((p) => p.id == player4.id);
expect(addedPlayer.name, player4.name);
expect(addedPlayer.createdAt, player4.createdAt);
});
test('Removing player from group works correctly', () async {

View File

@@ -1,3 +1,4 @@
import 'package:clock/clock.dart';
import 'package:drift/drift.dart';
import 'package:drift/native.dart';
import 'package:flutter_test/flutter_test.dart';
@@ -7,6 +8,9 @@ import 'package:game_tracker/data/dto/player.dart';
void main() {
late AppDatabase database;
late Player testPlayer;
late Player testPlayer2;
final fixedDate = DateTime(2025, 19, 11, 00, 11, 23);
final fakeClock = Clock(() => fixedDate);
setUp(() {
database = AppDatabase(
@@ -17,7 +21,10 @@ void main() {
),
);
testPlayer = Player(name: 'Test Player');
withClock(fakeClock, () {
testPlayer = Player(name: 'Test Player');
testPlayer2 = Player(name: 'Second Group');
});
});
tearDown(() async {
await database.close();
@@ -25,7 +32,6 @@ void main() {
group('player tests', () {
test('all players get fetched correctly', () async {
final testPlayer2 = Player(name: 'Second Group');
await database.playerDao.addPlayer(player: testPlayer);
await database.playerDao.addPlayer(player: testPlayer2);
@@ -36,11 +42,13 @@ void main() {
(g) => g.id == testPlayer.id,
);
expect(fetchedPlayer1.name, testPlayer.name);
expect(fetchedPlayer1.createdAt, testPlayer.createdAt);
final fetchedPlayer2 = allPlayers.firstWhere(
(g) => g.id == testPlayer2.id,
);
expect(fetchedPlayer2.name, testPlayer2.name);
expect(fetchedPlayer2.createdAt, testPlayer2.createdAt);
});
test('players get inserted correcly ', () async {
@@ -51,6 +59,7 @@ void main() {
expect(result.id, testPlayer.id);
expect(result.name, testPlayer.name);
expect(result.createdAt, testPlayer.createdAt);
});
test('players get deleted correcly ', () async {