refactor: type server identifiers
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import 'dart:io';
|
||||
import 'package:plezy/media/ids.dart';
|
||||
|
||||
import 'package:drift/drift.dart' hide isNull, isNotNull;
|
||||
import 'package:drift/native.dart';
|
||||
@@ -436,7 +437,7 @@ class _AppDatabaseTestSuite {
|
||||
group('OfflineWatchProgress', () {
|
||||
test('upsertProgressAction inserts a new progress row', () async {
|
||||
await db.upsertProgressAction(
|
||||
serverId: 'srv',
|
||||
serverId: ServerId('srv'),
|
||||
ratingKey: '42',
|
||||
viewOffset: 5000,
|
||||
duration: 10000,
|
||||
@@ -456,14 +457,14 @@ class _AppDatabaseTestSuite {
|
||||
|
||||
test('upsertProgressAction merges into the existing progress row', () async {
|
||||
await db.upsertProgressAction(
|
||||
serverId: 'srv',
|
||||
serverId: ServerId('srv'),
|
||||
ratingKey: '42',
|
||||
viewOffset: 1000,
|
||||
duration: 10000,
|
||||
shouldMarkWatched: false,
|
||||
);
|
||||
await db.upsertProgressAction(
|
||||
serverId: 'srv',
|
||||
serverId: ServerId('srv'),
|
||||
ratingKey: '42',
|
||||
viewOffset: 9500,
|
||||
duration: 10000,
|
||||
@@ -478,7 +479,7 @@ class _AppDatabaseTestSuite {
|
||||
|
||||
test('upsertProgressAction keeps scoped Jellyfin users separate', () async {
|
||||
await db.upsertProgressAction(
|
||||
serverId: 'srv',
|
||||
serverId: ServerId('srv'),
|
||||
clientScopeId: 'srv/user-a',
|
||||
ratingKey: '42',
|
||||
viewOffset: 1000,
|
||||
@@ -486,7 +487,7 @@ class _AppDatabaseTestSuite {
|
||||
shouldMarkWatched: false,
|
||||
);
|
||||
await db.upsertProgressAction(
|
||||
serverId: 'srv',
|
||||
serverId: ServerId('srv'),
|
||||
clientScopeId: 'srv/user-b',
|
||||
ratingKey: '42',
|
||||
viewOffset: 9000,
|
||||
@@ -505,14 +506,18 @@ class _AppDatabaseTestSuite {
|
||||
test('insertWatchAction (watched) clears prior progress + insert single row', () async {
|
||||
// Existing progress row for the same item
|
||||
await db.upsertProgressAction(
|
||||
serverId: 'srv',
|
||||
serverId: ServerId('srv'),
|
||||
ratingKey: '42',
|
||||
viewOffset: 5000,
|
||||
duration: 10000,
|
||||
shouldMarkWatched: false,
|
||||
);
|
||||
|
||||
await db.insertWatchAction(serverId: 'srv', ratingKey: '42', actionType: OfflineActionType.watched.id);
|
||||
await db.insertWatchAction(
|
||||
serverId: ServerId('srv'),
|
||||
ratingKey: '42',
|
||||
actionType: OfflineActionType.watched.id,
|
||||
);
|
||||
|
||||
final rows = await db.select(db.offlineWatchProgress).get();
|
||||
expect(rows, hasLength(1));
|
||||
@@ -522,7 +527,7 @@ class _AppDatabaseTestSuite {
|
||||
|
||||
test('insertWatchAction clears only matching clientScopeId conflicts', () async {
|
||||
await db.upsertProgressAction(
|
||||
serverId: 'srv',
|
||||
serverId: ServerId('srv'),
|
||||
clientScopeId: 'srv/user-a',
|
||||
ratingKey: '42',
|
||||
viewOffset: 1000,
|
||||
@@ -530,7 +535,7 @@ class _AppDatabaseTestSuite {
|
||||
shouldMarkWatched: false,
|
||||
);
|
||||
await db.upsertProgressAction(
|
||||
serverId: 'srv',
|
||||
serverId: ServerId('srv'),
|
||||
clientScopeId: 'srv/user-b',
|
||||
ratingKey: '42',
|
||||
viewOffset: 2000,
|
||||
@@ -539,7 +544,7 @@ class _AppDatabaseTestSuite {
|
||||
);
|
||||
|
||||
await db.insertWatchAction(
|
||||
serverId: 'srv',
|
||||
serverId: ServerId('srv'),
|
||||
clientScopeId: 'srv/user-a',
|
||||
ratingKey: '42',
|
||||
actionType: OfflineActionType.watched.id,
|
||||
@@ -588,10 +593,10 @@ class _AppDatabaseTestSuite {
|
||||
});
|
||||
|
||||
test('adoptLegacyOfflineWatchActionsForProfile claims null-profile rows', () async {
|
||||
await db.insertWatchAction(serverId: 's', ratingKey: '1', actionType: OfflineActionType.watched.id);
|
||||
await db.insertWatchAction(serverId: ServerId('s'), ratingKey: '1', actionType: OfflineActionType.watched.id);
|
||||
await db.insertWatchAction(
|
||||
profileId: 'profile-existing',
|
||||
serverId: 's',
|
||||
serverId: ServerId('s'),
|
||||
ratingKey: '2',
|
||||
actionType: OfflineActionType.watched.id,
|
||||
);
|
||||
@@ -603,14 +608,14 @@ class _AppDatabaseTestSuite {
|
||||
});
|
||||
|
||||
test('getPendingWatchActionsForServer filters by serverId', () async {
|
||||
await db.insertWatchAction(serverId: 'a', ratingKey: '1', actionType: OfflineActionType.watched.id);
|
||||
await db.insertWatchAction(serverId: 'b', ratingKey: '2', actionType: OfflineActionType.watched.id);
|
||||
await db.insertWatchAction(serverId: 'a', ratingKey: '3', actionType: OfflineActionType.unwatched.id);
|
||||
await db.insertWatchAction(serverId: ServerId('a'), ratingKey: '1', actionType: OfflineActionType.watched.id);
|
||||
await db.insertWatchAction(serverId: ServerId('b'), ratingKey: '2', actionType: OfflineActionType.watched.id);
|
||||
await db.insertWatchAction(serverId: ServerId('a'), ratingKey: '3', actionType: OfflineActionType.unwatched.id);
|
||||
|
||||
final aRows = await db.getPendingWatchActionsForServer('a');
|
||||
final aRows = await db.getPendingWatchActionsForServer(ServerId('a'));
|
||||
expect(aRows.map((r) => r.ratingKey).toSet(), {'1', '3'});
|
||||
|
||||
final bRows = await db.getPendingWatchActionsForServer('b');
|
||||
final bRows = await db.getPendingWatchActionsForServer(ServerId('b'));
|
||||
expect(bRows.map((r) => r.ratingKey).toSet(), {'2'});
|
||||
});
|
||||
|
||||
@@ -774,7 +779,7 @@ class _AppDatabaseTestSuite {
|
||||
});
|
||||
|
||||
test('updateSyncAttempt increments syncAttempts and stores lastError', () async {
|
||||
await db.insertWatchAction(serverId: 's', ratingKey: '1', actionType: OfflineActionType.watched.id);
|
||||
await db.insertWatchAction(serverId: ServerId('s'), ratingKey: '1', actionType: OfflineActionType.watched.id);
|
||||
final inserted = (await db.select(db.offlineWatchProgress).get()).single;
|
||||
|
||||
await db.updateSyncAttempt(inserted.id, 'boom');
|
||||
@@ -794,8 +799,8 @@ class _AppDatabaseTestSuite {
|
||||
});
|
||||
|
||||
test('deleteWatchAction removes only the matching row', () async {
|
||||
await db.insertWatchAction(serverId: 's', ratingKey: '1', actionType: OfflineActionType.watched.id);
|
||||
await db.insertWatchAction(serverId: 's', ratingKey: '2', actionType: OfflineActionType.watched.id);
|
||||
await db.insertWatchAction(serverId: ServerId('s'), ratingKey: '1', actionType: OfflineActionType.watched.id);
|
||||
await db.insertWatchAction(serverId: ServerId('s'), ratingKey: '2', actionType: OfflineActionType.watched.id);
|
||||
final rows = await db.select(db.offlineWatchProgress).get();
|
||||
expect(rows, hasLength(2));
|
||||
|
||||
@@ -806,14 +811,14 @@ class _AppDatabaseTestSuite {
|
||||
test('getPendingSyncCount counts every row', () async {
|
||||
expect(await db.getPendingSyncCount(), 0);
|
||||
|
||||
await db.insertWatchAction(serverId: 's', ratingKey: '1', actionType: OfflineActionType.watched.id);
|
||||
await db.insertWatchAction(serverId: 's', ratingKey: '2', actionType: OfflineActionType.unwatched.id);
|
||||
await db.insertWatchAction(serverId: ServerId('s'), ratingKey: '1', actionType: OfflineActionType.watched.id);
|
||||
await db.insertWatchAction(serverId: ServerId('s'), ratingKey: '2', actionType: OfflineActionType.unwatched.id);
|
||||
expect(await db.getPendingSyncCount(), 2);
|
||||
});
|
||||
|
||||
test('clearAllWatchActions empties the table', () async {
|
||||
await db.insertWatchAction(serverId: 's', ratingKey: '1', actionType: OfflineActionType.watched.id);
|
||||
await db.insertWatchAction(serverId: 's', ratingKey: '2', actionType: OfflineActionType.unwatched.id);
|
||||
await db.insertWatchAction(serverId: ServerId('s'), ratingKey: '1', actionType: OfflineActionType.watched.id);
|
||||
await db.insertWatchAction(serverId: ServerId('s'), ratingKey: '2', actionType: OfflineActionType.unwatched.id);
|
||||
|
||||
await db.clearAllWatchActions();
|
||||
expect(await db.select(db.offlineWatchProgress).get(), isEmpty);
|
||||
@@ -829,7 +834,7 @@ class _AppDatabaseTestSuite {
|
||||
group('SyncRules', () {
|
||||
test('insertSyncRule + getSyncRules round-trip with defaults', () async {
|
||||
await db.insertSyncRule(
|
||||
serverId: 'srv',
|
||||
serverId: ServerId('srv'),
|
||||
ratingKey: '10',
|
||||
globalKey: 'srv:10',
|
||||
targetType: 'show',
|
||||
@@ -854,14 +859,14 @@ class _AppDatabaseTestSuite {
|
||||
// [globalKey] so re-creating a rule for the same target updates the
|
||||
// existing row rather than throwing.
|
||||
await db.insertSyncRule(
|
||||
serverId: 'srv',
|
||||
serverId: ServerId('srv'),
|
||||
ratingKey: '10',
|
||||
globalKey: 'srv:10',
|
||||
targetType: 'show',
|
||||
episodeCount: 5,
|
||||
);
|
||||
await db.insertSyncRule(
|
||||
serverId: 'srv',
|
||||
serverId: ServerId('srv'),
|
||||
ratingKey: '10',
|
||||
globalKey: 'srv:10',
|
||||
targetType: 'season',
|
||||
@@ -879,7 +884,7 @@ class _AppDatabaseTestSuite {
|
||||
test('insertSyncRule allows the same server item for different profiles', () async {
|
||||
await db.insertSyncRule(
|
||||
profileId: 'profile-a',
|
||||
serverId: 'srv',
|
||||
serverId: ServerId('srv'),
|
||||
ratingKey: '10',
|
||||
globalKey: 'profile-a|srv:10',
|
||||
targetType: 'show',
|
||||
@@ -887,7 +892,7 @@ class _AppDatabaseTestSuite {
|
||||
);
|
||||
await db.insertSyncRule(
|
||||
profileId: 'profile-b',
|
||||
serverId: 'srv',
|
||||
serverId: ServerId('srv'),
|
||||
ratingKey: '10',
|
||||
globalKey: 'profile-b|srv:10',
|
||||
targetType: 'show',
|
||||
@@ -902,7 +907,7 @@ class _AppDatabaseTestSuite {
|
||||
|
||||
test('insertSyncRule preserves enabled + lastExecutedAt across upserts', () async {
|
||||
await db.insertSyncRule(
|
||||
serverId: 'srv',
|
||||
serverId: ServerId('srv'),
|
||||
ratingKey: '10',
|
||||
globalKey: 'srv:10',
|
||||
targetType: 'show',
|
||||
@@ -913,7 +918,7 @@ class _AppDatabaseTestSuite {
|
||||
final firstRun = (await db.getSyncRule('srv:10'))!;
|
||||
|
||||
await db.insertSyncRule(
|
||||
serverId: 'srv',
|
||||
serverId: ServerId('srv'),
|
||||
ratingKey: '10',
|
||||
globalKey: 'srv:10',
|
||||
targetType: 'show',
|
||||
@@ -927,7 +932,7 @@ class _AppDatabaseTestSuite {
|
||||
|
||||
test('getSyncRule returns the matching rule or null', () async {
|
||||
await db.insertSyncRule(
|
||||
serverId: 'srv',
|
||||
serverId: ServerId('srv'),
|
||||
ratingKey: '10',
|
||||
globalKey: 'srv:10',
|
||||
targetType: 'show',
|
||||
@@ -939,7 +944,7 @@ class _AppDatabaseTestSuite {
|
||||
|
||||
test('updateSyncRuleCount mutates only the count', () async {
|
||||
await db.insertSyncRule(
|
||||
serverId: 'srv',
|
||||
serverId: ServerId('srv'),
|
||||
ratingKey: '10',
|
||||
globalKey: 'srv:10',
|
||||
targetType: 'show',
|
||||
@@ -954,7 +959,7 @@ class _AppDatabaseTestSuite {
|
||||
|
||||
test('updateSyncRuleFilter mutates the filter', () async {
|
||||
await db.insertSyncRule(
|
||||
serverId: 'srv',
|
||||
serverId: ServerId('srv'),
|
||||
ratingKey: '10',
|
||||
globalKey: 'srv:10',
|
||||
targetType: 'show',
|
||||
@@ -968,7 +973,7 @@ class _AppDatabaseTestSuite {
|
||||
|
||||
test('updateSyncRuleEnabled toggles enabled', () async {
|
||||
await db.insertSyncRule(
|
||||
serverId: 'srv',
|
||||
serverId: ServerId('srv'),
|
||||
ratingKey: '10',
|
||||
globalKey: 'srv:10',
|
||||
targetType: 'show',
|
||||
@@ -983,7 +988,7 @@ class _AppDatabaseTestSuite {
|
||||
|
||||
test('updateSyncRuleLastExecuted writes a timestamp', () async {
|
||||
await db.insertSyncRule(
|
||||
serverId: 'srv',
|
||||
serverId: ServerId('srv'),
|
||||
ratingKey: '10',
|
||||
globalKey: 'srv:10',
|
||||
targetType: 'show',
|
||||
@@ -1001,14 +1006,14 @@ class _AppDatabaseTestSuite {
|
||||
|
||||
test('deleteSyncRule removes the matching row', () async {
|
||||
await db.insertSyncRule(
|
||||
serverId: 'srv',
|
||||
serverId: ServerId('srv'),
|
||||
ratingKey: '10',
|
||||
globalKey: 'srv:10',
|
||||
targetType: 'show',
|
||||
episodeCount: 5,
|
||||
);
|
||||
await db.insertSyncRule(
|
||||
serverId: 'srv',
|
||||
serverId: ServerId('srv'),
|
||||
ratingKey: '11',
|
||||
globalKey: 'srv:11',
|
||||
targetType: 'show',
|
||||
|
||||
Reference in New Issue
Block a user