60 lines
1.8 KiB
Swift
60 lines
1.8 KiB
Swift
|
|
import XCTest
|
||
|
|
@testable import AIStudyApp
|
||
|
|
|
||
|
|
final class ReviewPlanViewModelTests: XCTestCase {
|
||
|
|
|
||
|
|
var vm: ReviewPlanViewModel!
|
||
|
|
|
||
|
|
override func setUp() {
|
||
|
|
super.setUp()
|
||
|
|
vm = ReviewPlanViewModel()
|
||
|
|
}
|
||
|
|
|
||
|
|
override func tearDown() {
|
||
|
|
vm = nil
|
||
|
|
super.tearDown()
|
||
|
|
}
|
||
|
|
|
||
|
|
func testInitialState_hasTasks() {
|
||
|
|
XCTAssertFalse(vm.todayTasks.isEmpty)
|
||
|
|
XCTAssertFalse(vm.tomorrowTasks.isEmpty)
|
||
|
|
XCTAssertFalse(vm.weekTasks.isEmpty)
|
||
|
|
}
|
||
|
|
|
||
|
|
func testTotalCount_sumsAllTasks() {
|
||
|
|
let expected = vm.todayTasks.count + vm.tomorrowTasks.count + vm.weekTasks.count
|
||
|
|
XCTAssertEqual(vm.totalCount, expected)
|
||
|
|
}
|
||
|
|
|
||
|
|
func testToggleTask_changesStatusToCompleted() {
|
||
|
|
guard let task = vm.todayTasks.first(where: { $0.status == .pending }) else {
|
||
|
|
XCTFail("Expected at least one pending task")
|
||
|
|
return
|
||
|
|
}
|
||
|
|
vm.toggleTask(task)
|
||
|
|
let toggled = vm.todayTasks.first(where: { $0.id == task.id })
|
||
|
|
XCTAssertEqual(toggled?.status, .completed)
|
||
|
|
}
|
||
|
|
|
||
|
|
func testToggleTask_togglingBackChangesToPending() {
|
||
|
|
guard let task = vm.todayTasks.first(where: { $0.status == .completed }) else {
|
||
|
|
XCTFail("Expected at least one completed task")
|
||
|
|
return
|
||
|
|
}
|
||
|
|
vm.toggleTask(task)
|
||
|
|
let toggled = vm.todayTasks.first(where: { $0.id == task.id })
|
||
|
|
XCTAssertEqual(toggled?.status, .pending)
|
||
|
|
}
|
||
|
|
|
||
|
|
func testToggleTask_doesNothingForUnknownTask() {
|
||
|
|
let before = vm.totalCount
|
||
|
|
let fake = ReviewTask(
|
||
|
|
id: "non-existent", userId: "", lessonId: "",
|
||
|
|
sourceSessionId: "", reviewType: .recall,
|
||
|
|
scheduledAt: "", completedAt: nil, status: .pending
|
||
|
|
)
|
||
|
|
vm.toggleTask(fake)
|
||
|
|
XCTAssertEqual(vm.totalCount, before)
|
||
|
|
}
|
||
|
|
}
|