aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/server/repositories/card.test.ts
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2025-12-31 13:25:42 +0900
committernsfisis <nsfisis@gmail.com>2025-12-31 13:25:42 +0900
commitce9011bf351d9666bb2e81c92ae06a0eb1716d12 (patch)
treebeea42ad8c4b755d1c36705c6c052d5b0588eaac /src/server/repositories/card.test.ts
parent5e42032146de07d4ab53598e9311efd145f9dfc3 (diff)
downloadkioku-ce9011bf351d9666bb2e81c92ae06a0eb1716d12.tar.gz
kioku-ce9011bf351d9666bb2e81c92ae06a0eb1716d12.tar.zst
kioku-ce9011bf351d9666bb2e81c92ae06a0eb1716d12.zip
feat(study): render note-based cards using template system
Update StudyPage to support both legacy cards (direct front/back) and note-based cards (template rendering with field values). Add new CardForStudy type that includes note type templates and field values as a name-value map for efficient client-side rendering. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Diffstat (limited to 'src/server/repositories/card.test.ts')
-rw-r--r--src/server/repositories/card.test.ts50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/server/repositories/card.test.ts b/src/server/repositories/card.test.ts
index 64c071e..9d7ffa6 100644
--- a/src/server/repositories/card.test.ts
+++ b/src/server/repositories/card.test.ts
@@ -1,6 +1,7 @@
import { describe, expect, it, vi } from "vitest";
import type {
Card,
+ CardForStudy,
CardRepository,
CardWithNoteData,
Note,
@@ -85,6 +86,21 @@ function createMockCardWithNoteData(
};
}
+function createMockCardForStudy(
+ overrides: Partial<CardForStudy> = {},
+): CardForStudy {
+ const card = createMockCard({
+ noteId: overrides.noteType ? "note-uuid-123" : null,
+ isReversed: overrides.noteType ? false : null,
+ ...overrides,
+ });
+ return {
+ ...card,
+ noteType: overrides.noteType ?? null,
+ fieldValuesMap: overrides.fieldValuesMap ?? {},
+ };
+}
+
function createMockCardRepo(): CardRepository {
return {
findByDeckId: vi.fn(),
@@ -97,6 +113,7 @@ function createMockCardRepo(): CardRepository {
softDeleteByNoteId: vi.fn(),
findDueCards: vi.fn(),
findDueCardsWithNoteData: vi.fn(),
+ findDueCardsForStudy: vi.fn(),
updateFSRSFields: vi.fn(),
};
}
@@ -354,6 +371,39 @@ describe("Card interface contracts", () => {
expect(cardWithNote).toHaveProperty("fieldValues");
expect(Array.isArray(cardWithNote.fieldValues)).toBe(true);
});
+
+ it("CardForStudy extends Card with noteType and fieldValuesMap", () => {
+ const cardForStudy = createMockCardForStudy({
+ noteType: {
+ frontTemplate: "{{Front}}",
+ backTemplate: "{{Back}}",
+ },
+ fieldValuesMap: {
+ Front: "Question",
+ Back: "Answer",
+ },
+ });
+
+ expect(cardForStudy).toHaveProperty("id");
+ expect(cardForStudy).toHaveProperty("deckId");
+ expect(cardForStudy).toHaveProperty("noteType");
+ expect(cardForStudy).toHaveProperty("fieldValuesMap");
+ expect(cardForStudy.noteType?.frontTemplate).toBe("{{Front}}");
+ expect(cardForStudy.fieldValuesMap.Front).toBe("Question");
+ });
+
+ it("CardForStudy can represent legacy card with null noteType", () => {
+ const legacyCard = createMockCardForStudy({
+ front: "Legacy Question",
+ back: "Legacy Answer",
+ });
+
+ expect(legacyCard.noteId).toBeNull();
+ expect(legacyCard.noteType).toBeNull();
+ expect(legacyCard.fieldValuesMap).toEqual({});
+ expect(legacyCard.front).toBe("Legacy Question");
+ expect(legacyCard.back).toBe("Legacy Answer");
+ });
});
describe("Card and Note relationship", () => {