aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/client/sync/manager.test.ts
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2025-12-31 02:15:17 +0900
committernsfisis <nsfisis@gmail.com>2025-12-31 02:15:17 +0900
commited93dd099f43dd6746276a72953485de91b49c8c (patch)
treedb737032e32508b7de24d94696a13e4bfebe8978 /src/client/sync/manager.test.ts
parent78609e0b390e9a485c8935c17db6e0093660ebef (diff)
downloadkioku-ed93dd099f43dd6746276a72953485de91b49c8c.tar.gz
kioku-ed93dd099f43dd6746276a72953485de91b49c8c.tar.zst
kioku-ed93dd099f43dd6746276a72953485de91b49c8c.zip
feat(sync): add sync support for note-related entities
Extend the sync system to handle NoteType, NoteFieldType, Note, and NoteFieldValue entities. This includes: - Server sync repository and routes for push/pull of new entities - Client sync queue, push, pull, and conflict resolution for notes - Update Card sync to include noteId and isReversed fields - Add comprehensive tests for all sync functionality 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Diffstat (limited to 'src/client/sync/manager.test.ts')
-rw-r--r--src/client/sync/manager.test.ts56
1 files changed, 48 insertions, 8 deletions
diff --git a/src/client/sync/manager.test.ts b/src/client/sync/manager.test.ts
index 96fb97d..a3799c0 100644
--- a/src/client/sync/manager.test.ts
+++ b/src/client/sync/manager.test.ts
@@ -19,6 +19,41 @@ import { PullService, type SyncPullResult } from "./pull";
import { PushService, type SyncPushResult } from "./push";
import { SyncQueue } from "./queue";
+function createEmptyConflicts() {
+ return {
+ decks: [] as string[],
+ cards: [] as string[],
+ noteTypes: [] as string[],
+ noteFieldTypes: [] as string[],
+ notes: [] as string[],
+ noteFieldValues: [] as string[],
+ };
+}
+
+function createEmptyPullResult(
+ currentSyncVersion = 0,
+): Omit<SyncPullResult, "decks" | "cards" | "reviewLogs"> {
+ return {
+ noteTypes: [],
+ noteFieldTypes: [],
+ notes: [],
+ noteFieldValues: [],
+ currentSyncVersion,
+ };
+}
+
+function createEmptyPushResult(): Omit<
+ SyncPushResult,
+ "decks" | "cards" | "reviewLogs" | "conflicts"
+> {
+ return {
+ noteTypes: [],
+ noteFieldTypes: [],
+ notes: [],
+ noteFieldValues: [],
+ };
+}
+
describe("SyncManager", () => {
let syncQueue: SyncQueue;
let conflictResolver: ConflictResolver;
@@ -63,14 +98,15 @@ describe("SyncManager", () => {
decks: [],
cards: [],
reviewLogs: [],
- conflicts: { decks: [], cards: [] },
+ ...createEmptyPushResult(),
+ conflicts: createEmptyConflicts(),
} satisfies SyncPushResult);
pullFromServer = vi.fn().mockResolvedValue({
decks: [],
cards: [],
reviewLogs: [],
- currentSyncVersion: 0,
+ ...createEmptyPullResult(0),
} satisfies SyncPullResult);
conflictResolver = new ConflictResolver({ strategy: "server_wins" });
@@ -249,7 +285,8 @@ describe("SyncManager", () => {
decks: [{ id: "deck-1", syncVersion: 1 }],
cards: [],
reviewLogs: [],
- conflicts: { decks: [], cards: [] },
+ ...createEmptyPushResult(),
+ conflicts: createEmptyConflicts(),
};
pushToServer.mockResolvedValue(expectedPushResult);
@@ -257,7 +294,7 @@ describe("SyncManager", () => {
decks: [],
cards: [],
reviewLogs: [],
- currentSyncVersion: 5,
+ ...createEmptyPullResult(5),
};
pullFromServer.mockResolvedValue(expectedPullResult);
@@ -323,7 +360,8 @@ describe("SyncManager", () => {
decks: [],
cards: [],
reviewLogs: [],
- conflicts: { decks: [], cards: [] },
+ ...createEmptyPushResult(),
+ conflicts: createEmptyConflicts(),
}),
100,
),
@@ -357,7 +395,8 @@ describe("SyncManager", () => {
decks: [{ id: deck.id, syncVersion: 1 }],
cards: [],
reviewLogs: [],
- conflicts: { decks: [deck.id], cards: [] },
+ ...createEmptyPushResult(),
+ conflicts: { ...createEmptyConflicts(), decks: [deck.id] },
};
pushToServer.mockResolvedValue(pushResult);
@@ -377,7 +416,7 @@ describe("SyncManager", () => {
],
cards: [],
reviewLogs: [],
- currentSyncVersion: 5,
+ ...createEmptyPullResult(5),
};
pullFromServer.mockResolvedValue(pullResult);
@@ -573,7 +612,8 @@ describe("SyncManager", () => {
decks: [],
cards: [],
reviewLogs: [],
- conflicts: { decks: [], cards: [] },
+ ...createEmptyPushResult(),
+ conflicts: createEmptyConflicts(),
}),
100,
),