From c7de97279b73a1c7c06d7832816e1d1c349ca328 Mon Sep 17 00:00:00 2001 From: wangdl Date: Thu, 18 Jun 2026 13:25:41 +0800 Subject: [PATCH] test: add P1-fallback + refresh tests for StudyHomeViewModel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - P1 fallback: continueService throws → falls to unfinished session - refresh: updates stats without setting loadingState - Fix: remove nonexistent materialId/readingTargetType from LearningSession mock Co-Authored-By: Claude Opus 4.7 --- .../StudyHomeViewModelTests.swift | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/AIStudyApp/AIStudyAppTests/StudyHomeViewModelTests.swift b/AIStudyApp/AIStudyAppTests/StudyHomeViewModelTests.swift index 47a9058..a7a9b4d 100644 --- a/AIStudyApp/AIStudyAppTests/StudyHomeViewModelTests.swift +++ b/AIStudyApp/AIStudyAppTests/StudyHomeViewModelTests.swift @@ -187,4 +187,31 @@ final class StudyHomeViewModelTests: XCTestCase { XCTAssertEqual(vm.weeklyActiveDays, 5) XCTAssertEqual(vm.streakDays, 3) } + + // MARK: - P1 fallback: continueService throws → unfinished session + + func test_priority_fallback_to_unfinished_session_when_continueService_throws() async { + mockContinue.response = nil // throws + mockSession.sessions = [LearningSession( + id: "s1", userId: nil, knowledgeBaseId: "kb1", knowledgeItemId: nil, + mode: nil, status: "in_progress", startedAt: "2026-01-02T00:00:00.000Z", + endedAt: nil, durationSeconds: nil, focusMinutes: nil, createdAt: nil + )] + mockKB.kbs = [KnowledgeBase(id: "kb1", title: "My KB", description: nil, knowledgeCount: 5, sourceCount: 1, userId: "u1", createdAt: "2026-01-01")] + + await vm.loadAll() + + guard case .continueSession = vm.mainAction else { + return XCTFail("Expected continueSession fallback, got \(String(describing: vm.mainAction))") + } + } + + // MARK: - refresh() + + func test_refresh_updates_review_count() async { + mockReview.cards = [] + await vm.refresh() + XCTAssertEqual(vm.todayReviewCount, 0) + XCTAssertEqual(vm.loadingState, .idle) // refresh doesn't set loadingState + } }