Files
todos/UnitTests/Tests/View Models/TaskGroupListViewModelTests.swift
T
javier bbd7ec264b Todo repository protocol (#8)
This PR contains the work done to decouple the direct use of the `ModelContext` from `SwiftData` from the view model that uses it. In addition, the project transitioned to use Swift 6 and strict concurrency which brought some issues with the unit tests, so they were amended as well.

Reviewed-on: rock-n-code/todos-app#8
Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
Co-committed-by: Javier Cicchelli <javier@rock-n-code.com>
2026-02-11 18:22:26 +00:00

94 lines
2.5 KiB
Swift

import Foundation
import Testing
@testable import Todos
@MainActor
@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
@Test(
"count returns zero when empty data",
arguments: [TodoGroup.today, .upcoming, .overdue, .completed]
)
func countWhenEmptyData(for group: TodoGroup) throws {
// GIVEN
let viewModel = TaskGroupListView.ViewModel()
// WHEN
let count = viewModel.count(emptyTasks, for: group)
// THEN
#expect(count == 0)
}
@Test(
"count returns correct count when filled data",
arguments: [TodoGroup.today, .upcoming, .overdue, .completed]
)
func countWhenFilledData(for group: TodoGroup) throws {
// GIVEN
let viewModel = TaskGroupListView.ViewModel()
// WHEN
let count = viewModel.count(sampleTasks, for: group)
// THEN
#expect(count == 2)
}
}
// MARK: - Helpers
private extension TaskGroupListViewModelTests {
// MARK: Computed
var emptyTasks: [Todo] { [] }
var sampleTasks: [Todo] {
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
return [
Todo(title: "Today task #1", due: today),
Todo(title: "Today task #2", due: today),
Todo(title: "Tomorrow task #1", due: tomorrow),
Todo(title: "Next week task #1", due: nextWeek),
Todo(title: "Yesterday task #1", due: yesterday),
Todo(title: "Last week task #1", due: lastWeek),
Todo(title: "Completed task #1", due: tomorrow, completed: today),
Todo(title: "Completed task #2", due: yesterday, completed: today),
]
}
}