diff options
| author | nsfisis <nsfisis@gmail.com> | 2025-12-31 02:15:17 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2025-12-31 02:15:17 +0900 |
| commit | ed93dd099f43dd6746276a72953485de91b49c8c (patch) | |
| tree | db737032e32508b7de24d94696a13e4bfebe8978 /src/client/sync/manager.test.ts | |
| parent | 78609e0b390e9a485c8935c17db6e0093660ebef (diff) | |
| download | kioku-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.ts | 56 |
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, ), |
