diff options
| author | nsfisis <54318333+nsfisis@users.noreply.github.com> | 2026-02-13 20:23:31 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-02-13 20:23:31 +0900 |
| commit | ce6bbcea37d014b9575299d2d079fda7ccb5628d (patch) | |
| tree | 1fe3a43f1c7ab469bb0154a1495028cc42b414a0 /src/server/routes/study.test.ts | |
| parent | 9a52e7ad3b2d46c523caf079794fdb7757375b91 (diff) | |
| parent | 1afb825860cd293b8065d51746f4b23e4e8dab5d (diff) | |
| download | kioku-ce6bbcea37d014b9575299d2d079fda7ccb5628d.tar.gz kioku-ce6bbcea37d014b9575299d2d079fda7ccb5628d.tar.zst kioku-ce6bbcea37d014b9575299d2d079fda7ccb5628d.zip | |
Merge pull request #15 from nsfisis/claude/remove-card-limit-10fVw
Remove newCardsPerDay limit and simplify card study logic
Diffstat (limited to 'src/server/routes/study.test.ts')
| -rw-r--r-- | src/server/routes/study.test.ts | 109 |
1 files changed, 6 insertions, 103 deletions
diff --git a/src/server/routes/study.test.ts b/src/server/routes/study.test.ts index 514d966..119b25d 100644 --- a/src/server/routes/study.test.ts +++ b/src/server/routes/study.test.ts @@ -26,12 +26,8 @@ function createMockCardRepo(): CardRepository { softDeleteByNoteId: vi.fn(), findDueCards: vi.fn(), countDueCards: vi.fn(), - countDueNewCards: vi.fn(), - countDueReviewCards: vi.fn(), findDueCardsWithNoteData: vi.fn(), findDueCardsForStudy: vi.fn(), - findDueNewCardsForStudy: vi.fn(), - findDueReviewCardsForStudy: vi.fn(), updateFSRSFields: vi.fn(), }; } @@ -49,7 +45,6 @@ function createMockDeckRepo(): DeckRepository { function createMockReviewLogRepo(): ReviewLogRepository { return { create: vi.fn(), - countTodayNewCardReviews: vi.fn().mockResolvedValue(0), }; } @@ -73,7 +68,6 @@ function createMockDeck(overrides: Partial<Deck> = {}): Deck { userId: "user-uuid-123", name: "Test Deck", description: "Test description", - newCardsPerDay: 20, createdAt: new Date("2024-01-01"), updatedAt: new Date("2024-01-01"), deletedAt: null, @@ -152,14 +146,13 @@ describe("GET /api/decks/:deckId/study", () => { let app: Hono; let mockCardRepo: ReturnType<typeof createMockCardRepo>; let mockDeckRepo: ReturnType<typeof createMockDeckRepo>; - let mockReviewLogRepo: ReturnType<typeof createMockReviewLogRepo>; let authToken: string; beforeEach(async () => { vi.clearAllMocks(); mockCardRepo = createMockCardRepo(); mockDeckRepo = createMockDeckRepo(); - mockReviewLogRepo = createMockReviewLogRepo(); + const mockReviewLogRepo = createMockReviewLogRepo(); const studyRouter = createStudyRouter({ cardRepo: mockCardRepo, deckRepo: mockDeckRepo, @@ -175,8 +168,7 @@ describe("GET /api/decks/:deckId/study", () => { vi.mocked(mockDeckRepo.findById).mockResolvedValue( createMockDeck({ id: DECK_ID }), ); - vi.mocked(mockCardRepo.findDueNewCardsForStudy).mockResolvedValue([]); - vi.mocked(mockCardRepo.findDueReviewCardsForStudy).mockResolvedValue([]); + vi.mocked(mockCardRepo.findDueCardsForStudy).mockResolvedValue([]); const res = await app.request(`/api/decks/${DECK_ID}/study`, { method: "GET", @@ -190,20 +182,14 @@ describe("GET /api/decks/:deckId/study", () => { DECK_ID, "user-uuid-123", ); - expect(mockCardRepo.findDueNewCardsForStudy).toHaveBeenCalledWith( - DECK_ID, - expect.any(Date), - 20, - ); - expect(mockCardRepo.findDueReviewCardsForStudy).toHaveBeenCalledWith( + expect(mockCardRepo.findDueCardsForStudy).toHaveBeenCalledWith( DECK_ID, expect.any(Date), - 80, ); }); it("returns due cards", async () => { - const newCards = [ + const mockCards = [ createMockCardForStudy({ id: "card-1", front: "Q1", @@ -211,8 +197,6 @@ describe("GET /api/decks/:deckId/study", () => { state: CardState.New, fieldValuesMap: {}, }), - ]; - const reviewCards = [ createMockCardForStudy({ id: "card-2", front: "Q2", @@ -224,10 +208,7 @@ describe("GET /api/decks/:deckId/study", () => { vi.mocked(mockDeckRepo.findById).mockResolvedValue( createMockDeck({ id: DECK_ID }), ); - vi.mocked(mockCardRepo.findDueNewCardsForStudy).mockResolvedValue(newCards); - vi.mocked(mockCardRepo.findDueReviewCardsForStudy).mockResolvedValue( - reviewCards, - ); + vi.mocked(mockCardRepo.findDueCardsForStudy).mockResolvedValue(mockCards); const res = await app.request(`/api/decks/${DECK_ID}/study`, { method: "GET", @@ -259,10 +240,7 @@ describe("GET /api/decks/:deckId/study", () => { vi.mocked(mockDeckRepo.findById).mockResolvedValue( createMockDeck({ id: DECK_ID }), ); - vi.mocked(mockCardRepo.findDueNewCardsForStudy).mockResolvedValue( - mockCards, - ); - vi.mocked(mockCardRepo.findDueReviewCardsForStudy).mockResolvedValue([]); + vi.mocked(mockCardRepo.findDueCardsForStudy).mockResolvedValue(mockCards); const res = await app.request(`/api/decks/${DECK_ID}/study`, { method: "GET", @@ -276,81 +254,6 @@ describe("GET /api/decks/:deckId/study", () => { expect(body.cards?.[0]?.fieldValuesMap?.Front).toBe("Question"); }); - it("limits new cards based on newCardsPerDay", async () => { - vi.mocked(mockDeckRepo.findById).mockResolvedValue( - createMockDeck({ id: DECK_ID, newCardsPerDay: 5 }), - ); - vi.mocked(mockReviewLogRepo.countTodayNewCardReviews).mockResolvedValue(3); - vi.mocked(mockCardRepo.findDueNewCardsForStudy).mockResolvedValue([]); - vi.mocked(mockCardRepo.findDueReviewCardsForStudy).mockResolvedValue([]); - - await app.request(`/api/decks/${DECK_ID}/study`, { - method: "GET", - headers: { Authorization: `Bearer ${authToken}` }, - }); - - expect(mockCardRepo.findDueNewCardsForStudy).toHaveBeenCalledWith( - DECK_ID, - expect.any(Date), - 2, - ); - }); - - it("returns 0 new cards when daily limit is reached", async () => { - vi.mocked(mockDeckRepo.findById).mockResolvedValue( - createMockDeck({ id: DECK_ID, newCardsPerDay: 5 }), - ); - vi.mocked(mockReviewLogRepo.countTodayNewCardReviews).mockResolvedValue(5); - vi.mocked(mockCardRepo.findDueNewCardsForStudy).mockResolvedValue([]); - vi.mocked(mockCardRepo.findDueReviewCardsForStudy).mockResolvedValue([]); - - await app.request(`/api/decks/${DECK_ID}/study`, { - method: "GET", - headers: { Authorization: `Bearer ${authToken}` }, - }); - - expect(mockCardRepo.findDueNewCardsForStudy).toHaveBeenCalledWith( - DECK_ID, - expect.any(Date), - 0, - ); - }); - - it("places new cards before review cards in response", async () => { - const newCards = [ - createMockCardForStudy({ - id: "new-1", - state: CardState.New, - fieldValuesMap: {}, - }), - ]; - const reviewCards = [ - createMockCardForStudy({ - id: "review-1", - state: CardState.Review, - fieldValuesMap: {}, - }), - ]; - vi.mocked(mockDeckRepo.findById).mockResolvedValue( - createMockDeck({ id: DECK_ID }), - ); - vi.mocked(mockCardRepo.findDueNewCardsForStudy).mockResolvedValue(newCards); - vi.mocked(mockCardRepo.findDueReviewCardsForStudy).mockResolvedValue( - reviewCards, - ); - - const res = await app.request(`/api/decks/${DECK_ID}/study`, { - method: "GET", - headers: { Authorization: `Bearer ${authToken}` }, - }); - - expect(res.status).toBe(200); - const body = (await res.json()) as StudyResponse; - expect(body.cards).toHaveLength(2); - expect(body.cards?.[0]?.id).toBe("new-1"); - expect(body.cards?.[1]?.id).toBe("review-1"); - }); - it("returns 404 for non-existent deck", async () => { vi.mocked(mockDeckRepo.findById).mockResolvedValue(undefined); |
