import Foundation import SwiftData import Testing @testable import Todos @Suite("TaskGroupListView view model tests") struct TaskGroupListViewModelTests { // MARK: Properties private let calendar: Calendar = .current // MARK: Computed tests @Test("groups returns cases in predetermined order") func groups() { // GIVEN let viewModel = TaskGroupListView.ViewModel() // WHEN let groups = viewModel.groups // THEN #expect(groups.count == 4) #expect(groups[0] == .today) #expect(groups[1] == .upcoming) #expect(groups[2] == .overdue) #expect(groups[3] == .completed) } // MARK: Functions tests @MainActor @Test( "count returns zero when empty data", arguments: TodoGroup.allCases ) func countWhenEmptyData(for group: TodoGroup) throws { // GIVEN let container = try ModelContainer( for: Todo.self, configurations: .init(isStoredInMemoryOnly: true) ) let viewModel = TaskGroupListView.ViewModel() // WHEN let count = viewModel.count(for: group, in: container.mainContext) // THEN #expect(count == 0) } @MainActor @Test( "count returns correct count when filled data", arguments: TodoGroup.allCases ) func countWhenFilledData(for group: TodoGroup) throws { // GIVEN let container = try ModelContainer( for: Todo.self, configurations: .init(isStoredInMemoryOnly: true) ) let context = container.mainContext let today: Date = .now let tomorrow = calendar.date(byAdding: .day, value: 1, to: today) ?? today let yesterday = calendar.date(byAdding: .day, value: -1, to: today) ?? today let nextWeek = calendar.date(byAdding: .day, value: 7, to: today) ?? today let lastWeek = calendar.date(byAdding: .day, value: -7, to: today) ?? today context.insert(Todo(title: "Today task #1", due: today)) context.insert(Todo(title: "Today task #2", due: today)) context.insert(Todo(title: "Tomorrow task #1", due: tomorrow)) context.insert(Todo(title: "Next week task #1", due: nextWeek)) context.insert(Todo(title: "Yesterday task #1", due: yesterday)) context.insert(Todo(title: "Last week task #1", due: lastWeek)) context.insert(Todo(title: "Completed task #1", due: tomorrow, completed: today)) context.insert(Todo(title: "Completed task #2", due: yesterday, completed: today)) let viewModel = TaskGroupListView.ViewModel() // WHEN let count = viewModel.count(for: group, in: context) // THEN #expect(count == 2) } }