Merge branch 'development' into setup/17-actions-aufsetzen
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 1m59s
Pull Request Pipeline / lint (pull_request) Successful in 2m1s

This commit is contained in:
2025-11-19 20:26:39 +01:00
15 changed files with 398 additions and 82 deletions

View File

@@ -15,7 +15,11 @@ class GameDao extends DatabaseAccessor<AppDatabase> with _$GameDaoMixin {
Future<List<Game>> getAllGames() async { Future<List<Game>> getAllGames() async {
final query = select(gameTable); final query = select(gameTable);
final result = await query.get(); 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]. /// Retrieves a [Game] by its [gameId].
@@ -38,6 +42,7 @@ class GameDao extends DatabaseAccessor<AppDatabase> with _$GameDaoMixin {
players: players, players: players,
group: group, group: group,
winner: result.winnerId, winner: result.winnerId,
createdAt: result.createdAt,
); );
} }
@@ -58,6 +63,7 @@ class GameDao extends DatabaseAccessor<AppDatabase> with _$GameDaoMixin {
id: game.id, id: game.id,
name: game.name, name: game.name,
winnerId: game.winner, winnerId: game.winner,
createdAt: game.createdAt,
), ),
mode: InsertMode.insertOrReplace, mode: InsertMode.insertOrReplace,
); );

View File

@@ -19,7 +19,12 @@ class GroupDao extends DatabaseAccessor<AppDatabase> with _$GroupDaoMixin {
final members = await db.playerGroupDao.getPlayersOfGroupById( final members = await db.playerGroupDao.getPlayersOfGroupById(
groupId: groupData.id, 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, 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. /// Adds a new group with the given [id] and [name] to the database.
@@ -41,9 +51,13 @@ class GroupDao extends DatabaseAccessor<AppDatabase> with _$GroupDaoMixin {
Future<bool> addGroup({required Group group}) async { Future<bool> addGroup({required Group group}) async {
if (!await groupExists(groupId: group.id)) { if (!await groupExists(groupId: group.id)) {
await db.transaction(() async { await db.transaction(() async {
await into( await into(groupTable).insert(
groupTable, GroupTableCompanion.insert(
).insert(GroupTableCompanion.insert(id: group.id, name: group.name)); id: group.id,
name: group.name,
createdAt: group.createdAt,
),
);
await db.batch( await db.batch(
(b) => b.insertAll( (b) => b.insertAll(
db.playerGroupTable, db.playerGroupTable,

View File

@@ -13,14 +13,22 @@ class PlayerDao extends DatabaseAccessor<AppDatabase> with _$PlayerDaoMixin {
Future<List<Player>> getAllPlayers() async { Future<List<Player>> getAllPlayers() async {
final query = select(playerTable); final query = select(playerTable);
final result = await query.get(); 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]. /// Retrieves a [Player] by their [id].
Future<Player> getPlayerById({required String playerId}) async { Future<Player> getPlayerById({required String playerId}) async {
final query = select(playerTable)..where((p) => p.id.equals(playerId)); final query = select(playerTable)..where((p) => p.id.equals(playerId));
final result = await query.getSingle(); 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. /// Adds a new [player] to the database.
@@ -28,9 +36,13 @@ class PlayerDao extends DatabaseAccessor<AppDatabase> with _$PlayerDaoMixin {
/// the new one. /// the new one.
Future<bool> addPlayer({required Player player}) async { Future<bool> addPlayer({required Player player}) async {
if (!await playerExists(playerId: player.id)) { if (!await playerExists(playerId: player.id)) {
await into( await into(playerTable).insert(
playerTable, PlayerTableCompanion.insert(
).insert(PlayerTableCompanion.insert(id: player.id, name: player.name)); id: player.id,
name: player.name,
createdAt: player.createdAt,
),
);
return true; return true;
} }
return false; return false;

View File

@@ -27,8 +27,19 @@ class $PlayerTableTable extends PlayerTable
type: DriftSqlType.string, type: DriftSqlType.string,
requiredDuringInsert: true, requiredDuringInsert: true,
); );
static const VerificationMeta _createdAtMeta = const VerificationMeta(
'createdAt',
);
@override @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 @override
String get aliasedName => _alias ?? actualTableName; String get aliasedName => _alias ?? actualTableName;
@override @override
@@ -54,6 +65,14 @@ class $PlayerTableTable extends PlayerTable
} else if (isInserting) { } else if (isInserting) {
context.missing(_nameMeta); 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; return context;
} }
@@ -71,6 +90,10 @@ class $PlayerTableTable extends PlayerTable
DriftSqlType.string, DriftSqlType.string,
data['${effectivePrefix}name'], 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> { class PlayerTableData extends DataClass implements Insertable<PlayerTableData> {
final String id; final String id;
final String name; 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 @override
Map<String, Expression> toColumns(bool nullToAbsent) { Map<String, Expression> toColumns(bool nullToAbsent) {
final map = <String, Expression>{}; final map = <String, Expression>{};
map['id'] = Variable<String>(id); map['id'] = Variable<String>(id);
map['name'] = Variable<String>(name); map['name'] = Variable<String>(name);
map['created_at'] = Variable<DateTime>(createdAt);
return map; return map;
} }
PlayerTableCompanion toCompanion(bool nullToAbsent) { 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( factory PlayerTableData.fromJson(
@@ -104,6 +137,7 @@ class PlayerTableData extends DataClass implements Insertable<PlayerTableData> {
return PlayerTableData( return PlayerTableData(
id: serializer.fromJson<String>(json['id']), id: serializer.fromJson<String>(json['id']),
name: serializer.fromJson<String>(json['name']), name: serializer.fromJson<String>(json['name']),
createdAt: serializer.fromJson<DateTime>(json['createdAt']),
); );
} }
@override @override
@@ -112,15 +146,21 @@ class PlayerTableData extends DataClass implements Insertable<PlayerTableData> {
return <String, dynamic>{ return <String, dynamic>{
'id': serializer.toJson<String>(id), 'id': serializer.toJson<String>(id),
'name': serializer.toJson<String>(name), 'name': serializer.toJson<String>(name),
'createdAt': serializer.toJson<DateTime>(createdAt),
}; };
} }
PlayerTableData copyWith({String? id, String? name}) => PlayerTableData copyWith({String? id, String? name, DateTime? createdAt}) =>
PlayerTableData(id: id ?? this.id, name: name ?? this.name); PlayerTableData(
id: id ?? this.id,
name: name ?? this.name,
createdAt: createdAt ?? this.createdAt,
);
PlayerTableData copyWithCompanion(PlayerTableCompanion data) { PlayerTableData copyWithCompanion(PlayerTableCompanion data) {
return PlayerTableData( return PlayerTableData(
id: data.id.present ? data.id.value : this.id, id: data.id.present ? data.id.value : this.id,
name: data.name.present ? data.name.value : this.name, 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() { String toString() {
return (StringBuffer('PlayerTableData(') return (StringBuffer('PlayerTableData(')
..write('id: $id, ') ..write('id: $id, ')
..write('name: $name') ..write('name: $name, ')
..write('createdAt: $createdAt')
..write(')')) ..write(')'))
.toString(); .toString();
} }
@override @override
int get hashCode => Object.hash(id, name); int get hashCode => Object.hash(id, name, createdAt);
@override @override
bool operator ==(Object other) => bool operator ==(Object other) =>
identical(this, other) || identical(this, other) ||
(other is PlayerTableData && (other is PlayerTableData &&
other.id == this.id && other.id == this.id &&
other.name == this.name); other.name == this.name &&
other.createdAt == this.createdAt);
} }
class PlayerTableCompanion extends UpdateCompanion<PlayerTableData> { class PlayerTableCompanion extends UpdateCompanion<PlayerTableData> {
final Value<String> id; final Value<String> id;
final Value<String> name; final Value<String> name;
final Value<DateTime> createdAt;
final Value<int> rowid; final Value<int> rowid;
const PlayerTableCompanion({ const PlayerTableCompanion({
this.id = const Value.absent(), this.id = const Value.absent(),
this.name = const Value.absent(), this.name = const Value.absent(),
this.createdAt = const Value.absent(),
this.rowid = const Value.absent(), this.rowid = const Value.absent(),
}); });
PlayerTableCompanion.insert({ PlayerTableCompanion.insert({
required String id, required String id,
required String name, required String name,
required DateTime createdAt,
this.rowid = const Value.absent(), this.rowid = const Value.absent(),
}) : id = Value(id), }) : id = Value(id),
name = Value(name); name = Value(name),
createdAt = Value(createdAt);
static Insertable<PlayerTableData> custom({ static Insertable<PlayerTableData> custom({
Expression<String>? id, Expression<String>? id,
Expression<String>? name, Expression<String>? name,
Expression<DateTime>? createdAt,
Expression<int>? rowid, Expression<int>? rowid,
}) { }) {
return RawValuesInsertable({ return RawValuesInsertable({
if (id != null) 'id': id, if (id != null) 'id': id,
if (name != null) 'name': name, if (name != null) 'name': name,
if (createdAt != null) 'created_at': createdAt,
if (rowid != null) 'rowid': rowid, if (rowid != null) 'rowid': rowid,
}); });
} }
@@ -173,11 +221,13 @@ class PlayerTableCompanion extends UpdateCompanion<PlayerTableData> {
PlayerTableCompanion copyWith({ PlayerTableCompanion copyWith({
Value<String>? id, Value<String>? id,
Value<String>? name, Value<String>? name,
Value<DateTime>? createdAt,
Value<int>? rowid, Value<int>? rowid,
}) { }) {
return PlayerTableCompanion( return PlayerTableCompanion(
id: id ?? this.id, id: id ?? this.id,
name: name ?? this.name, name: name ?? this.name,
createdAt: createdAt ?? this.createdAt,
rowid: rowid ?? this.rowid, rowid: rowid ?? this.rowid,
); );
} }
@@ -191,6 +241,9 @@ class PlayerTableCompanion extends UpdateCompanion<PlayerTableData> {
if (name.present) { if (name.present) {
map['name'] = Variable<String>(name.value); map['name'] = Variable<String>(name.value);
} }
if (createdAt.present) {
map['created_at'] = Variable<DateTime>(createdAt.value);
}
if (rowid.present) { if (rowid.present) {
map['rowid'] = Variable<int>(rowid.value); map['rowid'] = Variable<int>(rowid.value);
} }
@@ -202,6 +255,7 @@ class PlayerTableCompanion extends UpdateCompanion<PlayerTableData> {
return (StringBuffer('PlayerTableCompanion(') return (StringBuffer('PlayerTableCompanion(')
..write('id: $id, ') ..write('id: $id, ')
..write('name: $name, ') ..write('name: $name, ')
..write('createdAt: $createdAt, ')
..write('rowid: $rowid') ..write('rowid: $rowid')
..write(')')) ..write(')'))
.toString(); .toString();
@@ -232,8 +286,19 @@ class $GroupTableTable extends GroupTable
type: DriftSqlType.string, type: DriftSqlType.string,
requiredDuringInsert: true, requiredDuringInsert: true,
); );
static const VerificationMeta _createdAtMeta = const VerificationMeta(
'createdAt',
);
@override @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 @override
String get aliasedName => _alias ?? actualTableName; String get aliasedName => _alias ?? actualTableName;
@override @override
@@ -259,6 +324,14 @@ class $GroupTableTable extends GroupTable
} else if (isInserting) { } else if (isInserting) {
context.missing(_nameMeta); 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; return context;
} }
@@ -276,6 +349,10 @@ class $GroupTableTable extends GroupTable
DriftSqlType.string, DriftSqlType.string,
data['${effectivePrefix}name'], 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> { class GroupTableData extends DataClass implements Insertable<GroupTableData> {
final String id; final String id;
final String name; 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 @override
Map<String, Expression> toColumns(bool nullToAbsent) { Map<String, Expression> toColumns(bool nullToAbsent) {
final map = <String, Expression>{}; final map = <String, Expression>{};
map['id'] = Variable<String>(id); map['id'] = Variable<String>(id);
map['name'] = Variable<String>(name); map['name'] = Variable<String>(name);
map['created_at'] = Variable<DateTime>(createdAt);
return map; return map;
} }
GroupTableCompanion toCompanion(bool nullToAbsent) { 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( factory GroupTableData.fromJson(
@@ -309,6 +396,7 @@ class GroupTableData extends DataClass implements Insertable<GroupTableData> {
return GroupTableData( return GroupTableData(
id: serializer.fromJson<String>(json['id']), id: serializer.fromJson<String>(json['id']),
name: serializer.fromJson<String>(json['name']), name: serializer.fromJson<String>(json['name']),
createdAt: serializer.fromJson<DateTime>(json['createdAt']),
); );
} }
@override @override
@@ -317,15 +405,21 @@ class GroupTableData extends DataClass implements Insertable<GroupTableData> {
return <String, dynamic>{ return <String, dynamic>{
'id': serializer.toJson<String>(id), 'id': serializer.toJson<String>(id),
'name': serializer.toJson<String>(name), 'name': serializer.toJson<String>(name),
'createdAt': serializer.toJson<DateTime>(createdAt),
}; };
} }
GroupTableData copyWith({String? id, String? name}) => GroupTableData copyWith({String? id, String? name, DateTime? createdAt}) =>
GroupTableData(id: id ?? this.id, name: name ?? this.name); GroupTableData(
id: id ?? this.id,
name: name ?? this.name,
createdAt: createdAt ?? this.createdAt,
);
GroupTableData copyWithCompanion(GroupTableCompanion data) { GroupTableData copyWithCompanion(GroupTableCompanion data) {
return GroupTableData( return GroupTableData(
id: data.id.present ? data.id.value : this.id, id: data.id.present ? data.id.value : this.id,
name: data.name.present ? data.name.value : this.name, 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() { String toString() {
return (StringBuffer('GroupTableData(') return (StringBuffer('GroupTableData(')
..write('id: $id, ') ..write('id: $id, ')
..write('name: $name') ..write('name: $name, ')
..write('createdAt: $createdAt')
..write(')')) ..write(')'))
.toString(); .toString();
} }
@override @override
int get hashCode => Object.hash(id, name); int get hashCode => Object.hash(id, name, createdAt);
@override @override
bool operator ==(Object other) => bool operator ==(Object other) =>
identical(this, other) || identical(this, other) ||
(other is GroupTableData && (other is GroupTableData &&
other.id == this.id && other.id == this.id &&
other.name == this.name); other.name == this.name &&
other.createdAt == this.createdAt);
} }
class GroupTableCompanion extends UpdateCompanion<GroupTableData> { class GroupTableCompanion extends UpdateCompanion<GroupTableData> {
final Value<String> id; final Value<String> id;
final Value<String> name; final Value<String> name;
final Value<DateTime> createdAt;
final Value<int> rowid; final Value<int> rowid;
const GroupTableCompanion({ const GroupTableCompanion({
this.id = const Value.absent(), this.id = const Value.absent(),
this.name = const Value.absent(), this.name = const Value.absent(),
this.createdAt = const Value.absent(),
this.rowid = const Value.absent(), this.rowid = const Value.absent(),
}); });
GroupTableCompanion.insert({ GroupTableCompanion.insert({
required String id, required String id,
required String name, required String name,
required DateTime createdAt,
this.rowid = const Value.absent(), this.rowid = const Value.absent(),
}) : id = Value(id), }) : id = Value(id),
name = Value(name); name = Value(name),
createdAt = Value(createdAt);
static Insertable<GroupTableData> custom({ static Insertable<GroupTableData> custom({
Expression<String>? id, Expression<String>? id,
Expression<String>? name, Expression<String>? name,
Expression<DateTime>? createdAt,
Expression<int>? rowid, Expression<int>? rowid,
}) { }) {
return RawValuesInsertable({ return RawValuesInsertable({
if (id != null) 'id': id, if (id != null) 'id': id,
if (name != null) 'name': name, if (name != null) 'name': name,
if (createdAt != null) 'created_at': createdAt,
if (rowid != null) 'rowid': rowid, if (rowid != null) 'rowid': rowid,
}); });
} }
@@ -378,11 +480,13 @@ class GroupTableCompanion extends UpdateCompanion<GroupTableData> {
GroupTableCompanion copyWith({ GroupTableCompanion copyWith({
Value<String>? id, Value<String>? id,
Value<String>? name, Value<String>? name,
Value<DateTime>? createdAt,
Value<int>? rowid, Value<int>? rowid,
}) { }) {
return GroupTableCompanion( return GroupTableCompanion(
id: id ?? this.id, id: id ?? this.id,
name: name ?? this.name, name: name ?? this.name,
createdAt: createdAt ?? this.createdAt,
rowid: rowid ?? this.rowid, rowid: rowid ?? this.rowid,
); );
} }
@@ -396,6 +500,9 @@ class GroupTableCompanion extends UpdateCompanion<GroupTableData> {
if (name.present) { if (name.present) {
map['name'] = Variable<String>(name.value); map['name'] = Variable<String>(name.value);
} }
if (createdAt.present) {
map['created_at'] = Variable<DateTime>(createdAt.value);
}
if (rowid.present) { if (rowid.present) {
map['rowid'] = Variable<int>(rowid.value); map['rowid'] = Variable<int>(rowid.value);
} }
@@ -407,6 +514,7 @@ class GroupTableCompanion extends UpdateCompanion<GroupTableData> {
return (StringBuffer('GroupTableCompanion(') return (StringBuffer('GroupTableCompanion(')
..write('id: $id, ') ..write('id: $id, ')
..write('name: $name, ') ..write('name: $name, ')
..write('createdAt: $createdAt, ')
..write('rowid: $rowid') ..write('rowid: $rowid')
..write(')')) ..write(')'))
.toString(); .toString();
@@ -451,8 +559,19 @@ class $GameTableTable extends GameTable
'REFERENCES player_table (id) ON DELETE CASCADE', 'REFERENCES player_table (id) ON DELETE CASCADE',
), ),
); );
static const VerificationMeta _createdAtMeta = const VerificationMeta(
'createdAt',
);
@override @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 @override
String get aliasedName => _alias ?? actualTableName; String get aliasedName => _alias ?? actualTableName;
@override @override
@@ -486,6 +605,14 @@ class $GameTableTable extends GameTable
} else if (isInserting) { } else if (isInserting) {
context.missing(_winnerIdMeta); context.missing(_winnerIdMeta);
} }
if (data.containsKey('created_at')) {
context.handle(
_createdAtMeta,
createdAt.isAcceptableOrUnknown(data['created_at']!, _createdAtMeta),
);
} else if (isInserting) {
context.missing(_createdAtMeta);
}
return context; return context;
} }
@@ -507,6 +634,10 @@ class $GameTableTable extends GameTable
DriftSqlType.string, DriftSqlType.string,
data['${effectivePrefix}winner_id'], data['${effectivePrefix}winner_id'],
)!, )!,
createdAt: attachedDatabase.typeMapping.read(
DriftSqlType.dateTime,
data['${effectivePrefix}created_at'],
)!,
); );
} }
@@ -520,10 +651,12 @@ class GameTableData extends DataClass implements Insertable<GameTableData> {
final String id; final String id;
final String name; final String name;
final String winnerId; final String winnerId;
final DateTime createdAt;
const GameTableData({ const GameTableData({
required this.id, required this.id,
required this.name, required this.name,
required this.winnerId, required this.winnerId,
required this.createdAt,
}); });
@override @override
Map<String, Expression> toColumns(bool nullToAbsent) { Map<String, Expression> toColumns(bool nullToAbsent) {
@@ -531,6 +664,7 @@ class GameTableData extends DataClass implements Insertable<GameTableData> {
map['id'] = Variable<String>(id); map['id'] = Variable<String>(id);
map['name'] = Variable<String>(name); map['name'] = Variable<String>(name);
map['winner_id'] = Variable<String>(winnerId); map['winner_id'] = Variable<String>(winnerId);
map['created_at'] = Variable<DateTime>(createdAt);
return map; return map;
} }
@@ -539,6 +673,7 @@ class GameTableData extends DataClass implements Insertable<GameTableData> {
id: Value(id), id: Value(id),
name: Value(name), name: Value(name),
winnerId: Value(winnerId), winnerId: Value(winnerId),
createdAt: Value(createdAt),
); );
} }
@@ -551,6 +686,7 @@ class GameTableData extends DataClass implements Insertable<GameTableData> {
id: serializer.fromJson<String>(json['id']), id: serializer.fromJson<String>(json['id']),
name: serializer.fromJson<String>(json['name']), name: serializer.fromJson<String>(json['name']),
winnerId: serializer.fromJson<String>(json['winnerId']), winnerId: serializer.fromJson<String>(json['winnerId']),
createdAt: serializer.fromJson<DateTime>(json['createdAt']),
); );
} }
@override @override
@@ -560,20 +696,27 @@ class GameTableData extends DataClass implements Insertable<GameTableData> {
'id': serializer.toJson<String>(id), 'id': serializer.toJson<String>(id),
'name': serializer.toJson<String>(name), 'name': serializer.toJson<String>(name),
'winnerId': serializer.toJson<String>(winnerId), 'winnerId': serializer.toJson<String>(winnerId),
'createdAt': serializer.toJson<DateTime>(createdAt),
}; };
} }
GameTableData copyWith({String? id, String? name, String? winnerId}) => GameTableData copyWith({
GameTableData( String? id,
id: id ?? this.id, String? name,
name: name ?? this.name, String? winnerId,
winnerId: winnerId ?? this.winnerId, DateTime? createdAt,
); }) => GameTableData(
id: id ?? this.id,
name: name ?? this.name,
winnerId: winnerId ?? this.winnerId,
createdAt: createdAt ?? this.createdAt,
);
GameTableData copyWithCompanion(GameTableCompanion data) { GameTableData copyWithCompanion(GameTableCompanion data) {
return GameTableData( return GameTableData(
id: data.id.present ? data.id.value : this.id, id: data.id.present ? data.id.value : this.id,
name: data.name.present ? data.name.value : this.name, name: data.name.present ? data.name.value : this.name,
winnerId: data.winnerId.present ? data.winnerId.value : this.winnerId, winnerId: data.winnerId.present ? data.winnerId.value : this.winnerId,
createdAt: data.createdAt.present ? data.createdAt.value : this.createdAt,
); );
} }
@@ -582,51 +725,59 @@ class GameTableData extends DataClass implements Insertable<GameTableData> {
return (StringBuffer('GameTableData(') return (StringBuffer('GameTableData(')
..write('id: $id, ') ..write('id: $id, ')
..write('name: $name, ') ..write('name: $name, ')
..write('winnerId: $winnerId') ..write('winnerId: $winnerId, ')
..write('createdAt: $createdAt')
..write(')')) ..write(')'))
.toString(); .toString();
} }
@override @override
int get hashCode => Object.hash(id, name, winnerId); int get hashCode => Object.hash(id, name, winnerId, createdAt);
@override @override
bool operator ==(Object other) => bool operator ==(Object other) =>
identical(this, other) || identical(this, other) ||
(other is GameTableData && (other is GameTableData &&
other.id == this.id && other.id == this.id &&
other.name == this.name && other.name == this.name &&
other.winnerId == this.winnerId); other.winnerId == this.winnerId &&
other.createdAt == this.createdAt);
} }
class GameTableCompanion extends UpdateCompanion<GameTableData> { class GameTableCompanion extends UpdateCompanion<GameTableData> {
final Value<String> id; final Value<String> id;
final Value<String> name; final Value<String> name;
final Value<String> winnerId; final Value<String> winnerId;
final Value<DateTime> createdAt;
final Value<int> rowid; final Value<int> rowid;
const GameTableCompanion({ const GameTableCompanion({
this.id = const Value.absent(), this.id = const Value.absent(),
this.name = const Value.absent(), this.name = const Value.absent(),
this.winnerId = const Value.absent(), this.winnerId = const Value.absent(),
this.createdAt = const Value.absent(),
this.rowid = const Value.absent(), this.rowid = const Value.absent(),
}); });
GameTableCompanion.insert({ GameTableCompanion.insert({
required String id, required String id,
required String name, required String name,
required String winnerId, required String winnerId,
required DateTime createdAt,
this.rowid = const Value.absent(), this.rowid = const Value.absent(),
}) : id = Value(id), }) : id = Value(id),
name = Value(name), name = Value(name),
winnerId = Value(winnerId); winnerId = Value(winnerId),
createdAt = Value(createdAt);
static Insertable<GameTableData> custom({ static Insertable<GameTableData> custom({
Expression<String>? id, Expression<String>? id,
Expression<String>? name, Expression<String>? name,
Expression<String>? winnerId, Expression<String>? winnerId,
Expression<DateTime>? createdAt,
Expression<int>? rowid, Expression<int>? rowid,
}) { }) {
return RawValuesInsertable({ return RawValuesInsertable({
if (id != null) 'id': id, if (id != null) 'id': id,
if (name != null) 'name': name, if (name != null) 'name': name,
if (winnerId != null) 'winner_id': winnerId, if (winnerId != null) 'winner_id': winnerId,
if (createdAt != null) 'created_at': createdAt,
if (rowid != null) 'rowid': rowid, if (rowid != null) 'rowid': rowid,
}); });
} }
@@ -635,12 +786,14 @@ class GameTableCompanion extends UpdateCompanion<GameTableData> {
Value<String>? id, Value<String>? id,
Value<String>? name, Value<String>? name,
Value<String>? winnerId, Value<String>? winnerId,
Value<DateTime>? createdAt,
Value<int>? rowid, Value<int>? rowid,
}) { }) {
return GameTableCompanion( return GameTableCompanion(
id: id ?? this.id, id: id ?? this.id,
name: name ?? this.name, name: name ?? this.name,
winnerId: winnerId ?? this.winnerId, winnerId: winnerId ?? this.winnerId,
createdAt: createdAt ?? this.createdAt,
rowid: rowid ?? this.rowid, rowid: rowid ?? this.rowid,
); );
} }
@@ -657,6 +810,9 @@ class GameTableCompanion extends UpdateCompanion<GameTableData> {
if (winnerId.present) { if (winnerId.present) {
map['winner_id'] = Variable<String>(winnerId.value); map['winner_id'] = Variable<String>(winnerId.value);
} }
if (createdAt.present) {
map['created_at'] = Variable<DateTime>(createdAt.value);
}
if (rowid.present) { if (rowid.present) {
map['rowid'] = Variable<int>(rowid.value); map['rowid'] = Variable<int>(rowid.value);
} }
@@ -669,6 +825,7 @@ class GameTableCompanion extends UpdateCompanion<GameTableData> {
..write('id: $id, ') ..write('id: $id, ')
..write('name: $name, ') ..write('name: $name, ')
..write('winnerId: $winnerId, ') ..write('winnerId: $winnerId, ')
..write('createdAt: $createdAt, ')
..write('rowid: $rowid') ..write('rowid: $rowid')
..write(')')) ..write(')'))
.toString(); .toString();
@@ -1437,12 +1594,14 @@ typedef $$PlayerTableTableCreateCompanionBuilder =
PlayerTableCompanion Function({ PlayerTableCompanion Function({
required String id, required String id,
required String name, required String name,
required DateTime createdAt,
Value<int> rowid, Value<int> rowid,
}); });
typedef $$PlayerTableTableUpdateCompanionBuilder = typedef $$PlayerTableTableUpdateCompanionBuilder =
PlayerTableCompanion Function({ PlayerTableCompanion Function({
Value<String> id, Value<String> id,
Value<String> name, Value<String> name,
Value<DateTime> createdAt,
Value<int> rowid, Value<int> rowid,
}); });
@@ -1534,6 +1693,11 @@ class $$PlayerTableTableFilterComposer
builder: (column) => ColumnFilters(column), builder: (column) => ColumnFilters(column),
); );
ColumnFilters<DateTime> get createdAt => $composableBuilder(
column: $table.createdAt,
builder: (column) => ColumnFilters(column),
);
Expression<bool> gameTableRefs( Expression<bool> gameTableRefs(
Expression<bool> Function($$GameTableTableFilterComposer f) f, Expression<bool> Function($$GameTableTableFilterComposer f) f,
) { ) {
@@ -1628,6 +1792,11 @@ class $$PlayerTableTableOrderingComposer
column: $table.name, column: $table.name,
builder: (column) => ColumnOrderings(column), builder: (column) => ColumnOrderings(column),
); );
ColumnOrderings<DateTime> get createdAt => $composableBuilder(
column: $table.createdAt,
builder: (column) => ColumnOrderings(column),
);
} }
class $$PlayerTableTableAnnotationComposer class $$PlayerTableTableAnnotationComposer
@@ -1645,6 +1814,9 @@ class $$PlayerTableTableAnnotationComposer
GeneratedColumn<String> get name => GeneratedColumn<String> get name =>
$composableBuilder(column: $table.name, builder: (column) => column); $composableBuilder(column: $table.name, builder: (column) => column);
GeneratedColumn<DateTime> get createdAt =>
$composableBuilder(column: $table.createdAt, builder: (column) => column);
Expression<T> gameTableRefs<T extends Object>( Expression<T> gameTableRefs<T extends Object>(
Expression<T> Function($$GameTableTableAnnotationComposer a) f, Expression<T> Function($$GameTableTableAnnotationComposer a) f,
) { ) {
@@ -1755,15 +1927,26 @@ class $$PlayerTableTableTableManager
({ ({
Value<String> id = const Value.absent(), Value<String> id = const Value.absent(),
Value<String> name = const Value.absent(), Value<String> name = const Value.absent(),
Value<DateTime> createdAt = const Value.absent(),
Value<int> rowid = 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: createCompanionCallback:
({ ({
required String id, required String id,
required String name, required String name,
required DateTime createdAt,
Value<int> rowid = const Value.absent(), Value<int> rowid = const Value.absent(),
}) => }) => PlayerTableCompanion.insert(
PlayerTableCompanion.insert(id: id, name: name, rowid: rowid), id: id,
name: name,
createdAt: createdAt,
rowid: rowid,
),
withReferenceMapper: (p0) => p0 withReferenceMapper: (p0) => p0
.map( .map(
(e) => ( (e) => (
@@ -1881,12 +2064,14 @@ typedef $$GroupTableTableCreateCompanionBuilder =
GroupTableCompanion Function({ GroupTableCompanion Function({
required String id, required String id,
required String name, required String name,
required DateTime createdAt,
Value<int> rowid, Value<int> rowid,
}); });
typedef $$GroupTableTableUpdateCompanionBuilder = typedef $$GroupTableTableUpdateCompanionBuilder =
GroupTableCompanion Function({ GroupTableCompanion Function({
Value<String> id, Value<String> id,
Value<String> name, Value<String> name,
Value<DateTime> createdAt,
Value<int> rowid, Value<int> rowid,
}); });
@@ -1958,6 +2143,11 @@ class $$GroupTableTableFilterComposer
builder: (column) => ColumnFilters(column), builder: (column) => ColumnFilters(column),
); );
ColumnFilters<DateTime> get createdAt => $composableBuilder(
column: $table.createdAt,
builder: (column) => ColumnFilters(column),
);
Expression<bool> playerGroupTableRefs( Expression<bool> playerGroupTableRefs(
Expression<bool> Function($$PlayerGroupTableTableFilterComposer f) f, Expression<bool> Function($$PlayerGroupTableTableFilterComposer f) f,
) { ) {
@@ -2027,6 +2217,11 @@ class $$GroupTableTableOrderingComposer
column: $table.name, column: $table.name,
builder: (column) => ColumnOrderings(column), builder: (column) => ColumnOrderings(column),
); );
ColumnOrderings<DateTime> get createdAt => $composableBuilder(
column: $table.createdAt,
builder: (column) => ColumnOrderings(column),
);
} }
class $$GroupTableTableAnnotationComposer class $$GroupTableTableAnnotationComposer
@@ -2044,6 +2239,9 @@ class $$GroupTableTableAnnotationComposer
GeneratedColumn<String> get name => GeneratedColumn<String> get name =>
$composableBuilder(column: $table.name, builder: (column) => column); $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> playerGroupTableRefs<T extends Object>(
Expression<T> Function($$PlayerGroupTableTableAnnotationComposer a) f, Expression<T> Function($$PlayerGroupTableTableAnnotationComposer a) f,
) { ) {
@@ -2128,15 +2326,26 @@ class $$GroupTableTableTableManager
({ ({
Value<String> id = const Value.absent(), Value<String> id = const Value.absent(),
Value<String> name = const Value.absent(), Value<String> name = const Value.absent(),
Value<DateTime> createdAt = const Value.absent(),
Value<int> rowid = 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: createCompanionCallback:
({ ({
required String id, required String id,
required String name, required String name,
required DateTime createdAt,
Value<int> rowid = const Value.absent(), Value<int> rowid = const Value.absent(),
}) => }) => GroupTableCompanion.insert(
GroupTableCompanion.insert(id: id, name: name, rowid: rowid), id: id,
name: name,
createdAt: createdAt,
rowid: rowid,
),
withReferenceMapper: (p0) => p0 withReferenceMapper: (p0) => p0
.map( .map(
(e) => ( (e) => (
@@ -2228,6 +2437,7 @@ typedef $$GameTableTableCreateCompanionBuilder =
required String id, required String id,
required String name, required String name,
required String winnerId, required String winnerId,
required DateTime createdAt,
Value<int> rowid, Value<int> rowid,
}); });
typedef $$GameTableTableUpdateCompanionBuilder = typedef $$GameTableTableUpdateCompanionBuilder =
@@ -2235,6 +2445,7 @@ typedef $$GameTableTableUpdateCompanionBuilder =
Value<String> id, Value<String> id,
Value<String> name, Value<String> name,
Value<String> winnerId, Value<String> winnerId,
Value<DateTime> createdAt,
Value<int> rowid, Value<int> rowid,
}); });
@@ -2319,6 +2530,11 @@ class $$GameTableTableFilterComposer
builder: (column) => ColumnFilters(column), builder: (column) => ColumnFilters(column),
); );
ColumnFilters<DateTime> get createdAt => $composableBuilder(
column: $table.createdAt,
builder: (column) => ColumnFilters(column),
);
$$PlayerTableTableFilterComposer get winnerId { $$PlayerTableTableFilterComposer get winnerId {
final $$PlayerTableTableFilterComposer composer = $composerBuilder( final $$PlayerTableTableFilterComposer composer = $composerBuilder(
composer: this, composer: this,
@@ -2412,6 +2628,11 @@ class $$GameTableTableOrderingComposer
builder: (column) => ColumnOrderings(column), builder: (column) => ColumnOrderings(column),
); );
ColumnOrderings<DateTime> get createdAt => $composableBuilder(
column: $table.createdAt,
builder: (column) => ColumnOrderings(column),
);
$$PlayerTableTableOrderingComposer get winnerId { $$PlayerTableTableOrderingComposer get winnerId {
final $$PlayerTableTableOrderingComposer composer = $composerBuilder( final $$PlayerTableTableOrderingComposer composer = $composerBuilder(
composer: this, composer: this,
@@ -2451,6 +2672,9 @@ class $$GameTableTableAnnotationComposer
GeneratedColumn<String> get name => GeneratedColumn<String> get name =>
$composableBuilder(column: $table.name, builder: (column) => column); $composableBuilder(column: $table.name, builder: (column) => column);
GeneratedColumn<DateTime> get createdAt =>
$composableBuilder(column: $table.createdAt, builder: (column) => column);
$$PlayerTableTableAnnotationComposer get winnerId { $$PlayerTableTableAnnotationComposer get winnerId {
final $$PlayerTableTableAnnotationComposer composer = $composerBuilder( final $$PlayerTableTableAnnotationComposer composer = $composerBuilder(
composer: this, composer: this,
@@ -2560,11 +2784,13 @@ class $$GameTableTableTableManager
Value<String> id = const Value.absent(), Value<String> id = const Value.absent(),
Value<String> name = const Value.absent(), Value<String> name = const Value.absent(),
Value<String> winnerId = const Value.absent(), Value<String> winnerId = const Value.absent(),
Value<DateTime> createdAt = const Value.absent(),
Value<int> rowid = const Value.absent(), Value<int> rowid = const Value.absent(),
}) => GameTableCompanion( }) => GameTableCompanion(
id: id, id: id,
name: name, name: name,
winnerId: winnerId, winnerId: winnerId,
createdAt: createdAt,
rowid: rowid, rowid: rowid,
), ),
createCompanionCallback: createCompanionCallback:
@@ -2572,11 +2798,13 @@ class $$GameTableTableTableManager
required String id, required String id,
required String name, required String name,
required String winnerId, required String winnerId,
required DateTime createdAt,
Value<int> rowid = const Value.absent(), Value<int> rowid = const Value.absent(),
}) => GameTableCompanion.insert( }) => GameTableCompanion.insert(
id: id, id: id,
name: name, name: name,
winnerId: winnerId, winnerId: winnerId,
createdAt: createdAt,
rowid: rowid, rowid: rowid,
), ),
withReferenceMapper: (p0) => p0 withReferenceMapper: (p0) => p0

View File

@@ -6,6 +6,7 @@ class GameTable extends Table {
TextColumn get name => text()(); TextColumn get name => text()();
TextColumn get winnerId => TextColumn get winnerId =>
text().references(PlayerTable, #id, onDelete: KeyAction.cascade)(); text().references(PlayerTable, #id, onDelete: KeyAction.cascade)();
DateTimeColumn get createdAt => dateTime()();
@override @override
Set<Column<Object>> get primaryKey => {id}; Set<Column<Object>> get primaryKey => {id};

View File

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

View File

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

View File

@@ -1,3 +1,4 @@
import 'package:clock/clock.dart';
import 'package:game_tracker/data/dto/group.dart'; import 'package:game_tracker/data/dto/group.dart';
import 'package:game_tracker/data/dto/player.dart'; import 'package:game_tracker/data/dto/player.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
@@ -8,14 +9,17 @@ class Game {
final List<Player>? players; final List<Player>? players;
final Group? group; final Group? group;
final String winner; final String winner;
final DateTime createdAt;
Game({ Game({
String? id, String? id,
DateTime? createdAt,
required this.name, required this.name,
this.players, this.players,
this.group, this.group,
this.winner = '', this.winner = '',
}) : id = id ?? const Uuid().v4(); }) : id = id ?? const Uuid().v4(),
createdAt = createdAt ?? clock.now();
@override @override
String toString() { String toString() {

View File

@@ -1,3 +1,4 @@
import 'package:clock/clock.dart';
import 'package:game_tracker/data/dto/player.dart'; import 'package:game_tracker/data/dto/player.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
@@ -5,9 +6,15 @@ class Group {
final String id; final String id;
final String name; final String name;
final List<Player> members; final List<Player> members;
final DateTime createdAt;
Group({String? id, required this.name, required this.members}) Group({
: id = id ?? const Uuid().v4(); String? id,
DateTime? createdAt,
required this.name,
required this.members,
}) : id = id ?? const Uuid().v4(),
createdAt = createdAt ?? clock.now();
@override @override
String toString() { String toString() {

View File

@@ -1,10 +1,14 @@
import 'package:clock/clock.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
class Player { class Player {
final String id; final String id;
final String name; final String name;
final DateTime createdAt;
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 @override
String toString() { String toString() {

View File

@@ -26,11 +26,13 @@ class CustomWidthButton extends StatelessWidget {
if (buttonType == ButtonType.primary) { if (buttonType == ButtonType.primary) {
textcolor = Colors.white; textcolor = Colors.white;
disabledTextColor = Colors.white.withValues(alpha: 0.24); disabledTextColor = Color.lerp(textcolor, Colors.black, 0.5)!;
buttonBackgroundColor = CustomTheme.primaryColor; buttonBackgroundColor = CustomTheme.primaryColor;
disabledBackgroundColor = CustomTheme.primaryColor.withValues( disabledBackgroundColor = Color.lerp(
alpha: 0.24, buttonBackgroundColor,
); Colors.black,
0.5,
)!;
return ElevatedButton( return ElevatedButton(
onPressed: onPressed, onPressed: onPressed,
@@ -55,12 +57,12 @@ class CustomWidthButton extends StatelessWidget {
); );
} else if (buttonType == ButtonType.secondary) { } else if (buttonType == ButtonType.secondary) {
textcolor = CustomTheme.primaryColor; textcolor = CustomTheme.primaryColor;
disabledTextColor = CustomTheme.primaryColor.withValues(alpha: 0.5); disabledTextColor = Color.lerp(textcolor, Colors.black, 0.5)!;
buttonBackgroundColor = Colors.transparent; buttonBackgroundColor = Colors.transparent;
disabledBackgroundColor = Colors.transparent; disabledBackgroundColor = Colors.transparent;
borderSideColor = onPressed != null borderSideColor = onPressed != null
? CustomTheme.primaryColor ? CustomTheme.primaryColor
: CustomTheme.primaryColor.withValues(alpha: 0.5); : Color.lerp(CustomTheme.primaryColor, Colors.black, 0.5)!;
return OutlinedButton( return OutlinedButton(
onPressed: onPressed, onPressed: onPressed,
@@ -86,7 +88,11 @@ class CustomWidthButton extends StatelessWidget {
); );
} else { } else {
textcolor = CustomTheme.primaryColor; textcolor = CustomTheme.primaryColor;
disabledTextColor = CustomTheme.primaryColor.withValues(alpha: 0.3); disabledTextColor = Color.lerp(
CustomTheme.primaryColor,
Colors.black,
0.5,
)!;
buttonBackgroundColor = Colors.transparent; buttonBackgroundColor = Colors.transparent;
disabledBackgroundColor = Colors.transparent; disabledBackgroundColor = Colors.transparent;

View File

@@ -20,6 +20,7 @@ dependencies:
provider: ^6.1.5 provider: ^6.1.5
skeletonizer: ^2.1.0+1 skeletonizer: ^2.1.0+1
uuid: ^4.5.2 uuid: ^4.5.2
clock: ^1.1.2
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:

View File

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

View File

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