aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/server/routes/decks.test.ts
diff options
context:
space:
mode:
authorClaude <noreply@anthropic.com>2026-01-12 08:57:51 +0000
committerClaude <noreply@anthropic.com>2026-01-12 08:57:51 +0000
commit887630365ff0531a0556cb71a6b1be0956c41d06 (patch)
treef0cebd927c2292a40f123a694c6aa561768ad7a3 /src/server/routes/decks.test.ts
parentf8e4be9b36a16969ac53bd9ce12ce8064be10196 (diff)
downloadkioku-887630365ff0531a0556cb71a6b1be0956c41d06.tar.gz
kioku-887630365ff0531a0556cb71a6b1be0956c41d06.tar.zst
kioku-887630365ff0531a0556cb71a6b1be0956c41d06.zip
feat(deck): show due card count on deck list page
Display a badge with the number of cards due for study today next to each deck name on the home page. The count is fetched along with deck data from the API to minimize additional network requests.
Diffstat (limited to 'src/server/routes/decks.test.ts')
-rw-r--r--src/server/routes/decks.test.ts59
1 files changed, 53 insertions, 6 deletions
diff --git a/src/server/routes/decks.test.ts b/src/server/routes/decks.test.ts
index 8f5be9d..55aca2d 100644
--- a/src/server/routes/decks.test.ts
+++ b/src/server/routes/decks.test.ts
@@ -2,7 +2,11 @@ import { Hono } from "hono";
import { sign } from "hono/jwt";
import { beforeEach, describe, expect, it, vi } from "vitest";
import { errorHandler } from "../middleware/index.js";
-import type { Deck, DeckRepository } from "../repositories/index.js";
+import type {
+ CardRepository,
+ Deck,
+ DeckRepository,
+} from "../repositories/index.js";
import { createDecksRouter } from "./decks.js";
function createMockDeckRepo(): DeckRepository {
@@ -15,6 +19,24 @@ function createMockDeckRepo(): DeckRepository {
};
}
+function createMockCardRepo(): CardRepository {
+ return {
+ findByDeckId: vi.fn(),
+ findById: vi.fn(),
+ findByIdWithNoteData: vi.fn(),
+ findByNoteId: vi.fn(),
+ create: vi.fn(),
+ update: vi.fn(),
+ softDelete: vi.fn(),
+ softDeleteByNoteId: vi.fn(),
+ findDueCards: vi.fn(),
+ countDueCards: vi.fn().mockResolvedValue(0),
+ findDueCardsWithNoteData: vi.fn(),
+ findDueCardsForStudy: vi.fn(),
+ updateFSRSFields: vi.fn(),
+ };
+}
+
const JWT_SECRET = process.env.JWT_SECRET || "test-secret";
async function createTestToken(userId: string): Promise<string> {
@@ -57,12 +79,17 @@ interface DeckResponse {
describe("GET /api/decks", () => {
let app: Hono;
let mockDeckRepo: ReturnType<typeof createMockDeckRepo>;
+ let mockCardRepo: ReturnType<typeof createMockCardRepo>;
let authToken: string;
beforeEach(async () => {
vi.clearAllMocks();
mockDeckRepo = createMockDeckRepo();
- const decksRouter = createDecksRouter({ deckRepo: mockDeckRepo });
+ mockCardRepo = createMockCardRepo();
+ const decksRouter = createDecksRouter({
+ deckRepo: mockDeckRepo,
+ cardRepo: mockCardRepo,
+ });
app = new Hono();
app.onError(errorHandler);
app.route("/api/decks", decksRouter);
@@ -112,12 +139,17 @@ describe("GET /api/decks", () => {
describe("POST /api/decks", () => {
let app: Hono;
let mockDeckRepo: ReturnType<typeof createMockDeckRepo>;
+ let mockCardRepo: ReturnType<typeof createMockCardRepo>;
let authToken: string;
beforeEach(async () => {
vi.clearAllMocks();
mockDeckRepo = createMockDeckRepo();
- const decksRouter = createDecksRouter({ deckRepo: mockDeckRepo });
+ mockCardRepo = createMockCardRepo();
+ const decksRouter = createDecksRouter({
+ deckRepo: mockDeckRepo,
+ cardRepo: mockCardRepo,
+ });
app = new Hono();
app.onError(errorHandler);
app.route("/api/decks", decksRouter);
@@ -220,12 +252,17 @@ describe("POST /api/decks", () => {
describe("GET /api/decks/:id", () => {
let app: Hono;
let mockDeckRepo: ReturnType<typeof createMockDeckRepo>;
+ let mockCardRepo: ReturnType<typeof createMockCardRepo>;
let authToken: string;
beforeEach(async () => {
vi.clearAllMocks();
mockDeckRepo = createMockDeckRepo();
- const decksRouter = createDecksRouter({ deckRepo: mockDeckRepo });
+ mockCardRepo = createMockCardRepo();
+ const decksRouter = createDecksRouter({
+ deckRepo: mockDeckRepo,
+ cardRepo: mockCardRepo,
+ });
app = new Hono();
app.onError(errorHandler);
app.route("/api/decks", decksRouter);
@@ -285,12 +322,17 @@ describe("GET /api/decks/:id", () => {
describe("PUT /api/decks/:id", () => {
let app: Hono;
let mockDeckRepo: ReturnType<typeof createMockDeckRepo>;
+ let mockCardRepo: ReturnType<typeof createMockCardRepo>;
let authToken: string;
beforeEach(async () => {
vi.clearAllMocks();
mockDeckRepo = createMockDeckRepo();
- const decksRouter = createDecksRouter({ deckRepo: mockDeckRepo });
+ mockCardRepo = createMockCardRepo();
+ const decksRouter = createDecksRouter({
+ deckRepo: mockDeckRepo,
+ cardRepo: mockCardRepo,
+ });
app = new Hono();
app.onError(errorHandler);
app.route("/api/decks", decksRouter);
@@ -410,12 +452,17 @@ describe("PUT /api/decks/:id", () => {
describe("DELETE /api/decks/:id", () => {
let app: Hono;
let mockDeckRepo: ReturnType<typeof createMockDeckRepo>;
+ let mockCardRepo: ReturnType<typeof createMockCardRepo>;
let authToken: string;
beforeEach(async () => {
vi.clearAllMocks();
mockDeckRepo = createMockDeckRepo();
- const decksRouter = createDecksRouter({ deckRepo: mockDeckRepo });
+ mockCardRepo = createMockCardRepo();
+ const decksRouter = createDecksRouter({
+ deckRepo: mockDeckRepo,
+ cardRepo: mockCardRepo,
+ });
app = new Hono();
app.onError(errorHandler);
app.route("/api/decks", decksRouter);