Show completed task feature (#5)
This PR contains the work done to add support for showing or hiding completed todo tasks to the *Task list* view. Reviewed-on: rock-n-code/todos-app#5 Co-authored-by: Javier Cicchelli <javier@rock-n-code.com> Co-committed-by: Javier Cicchelli <javier@rock-n-code.com>
This commit was merged in pull request #5.
This commit is contained in:
@@ -9,6 +9,25 @@ struct TodoGroupTests {
|
||||
|
||||
// MARK: Computed tests
|
||||
|
||||
@Test(
|
||||
"canShowCompleted returns correct values",
|
||||
arguments: zip(
|
||||
TodoGroup.allCases,
|
||||
[true, true, true, false]
|
||||
)
|
||||
)
|
||||
func canShowCompleted(
|
||||
for group: TodoGroup,
|
||||
expects expectation: Bool
|
||||
) {
|
||||
// GIVEN
|
||||
// WHEN
|
||||
let canShowCompleted = group.canShowCompleted
|
||||
|
||||
// THEN
|
||||
#expect(canShowCompleted == expectation)
|
||||
}
|
||||
|
||||
@Test(
|
||||
"group color match expected values",
|
||||
arguments: zip(
|
||||
|
||||
@@ -20,7 +20,10 @@ struct TodoFetchDescriptorTests {
|
||||
let context = container.mainContext
|
||||
|
||||
// WHEN
|
||||
let descriptor = FetchDescriptor<Todo>(group: .today)
|
||||
let descriptor = FetchDescriptor<Todo>(
|
||||
group: .today,
|
||||
showCompleted: .random()
|
||||
)
|
||||
let results = try context.fetch(descriptor)
|
||||
|
||||
// THEN
|
||||
@@ -28,7 +31,7 @@ struct TodoFetchDescriptorTests {
|
||||
}
|
||||
|
||||
@Test(
|
||||
"initializes with group when filled tasks",
|
||||
"initializes with group and show completed disabled when filled tasks",
|
||||
arguments: TodoGroup.allCases
|
||||
)
|
||||
@MainActor
|
||||
@@ -40,7 +43,10 @@ struct TodoFetchDescriptorTests {
|
||||
insert(into: context)
|
||||
|
||||
// WHEN
|
||||
let descriptor = FetchDescriptor<Todo>(group: group)
|
||||
let descriptor = FetchDescriptor<Todo>(
|
||||
group: group,
|
||||
showCompleted: false
|
||||
)
|
||||
let results = try context.fetch(descriptor)
|
||||
|
||||
// THEN
|
||||
@@ -61,6 +67,50 @@ struct TodoFetchDescriptorTests {
|
||||
#expect(results[1].title == "Upcoming task #2")
|
||||
}
|
||||
}
|
||||
|
||||
@Test(
|
||||
"initializes with group and show completed enabled when filled tasks",
|
||||
arguments: TodoGroup.allCases
|
||||
)
|
||||
@MainActor
|
||||
func initializationWithShowCompleted(for group: TodoGroup) throws {
|
||||
// GIVEN
|
||||
let container = try modelContainer
|
||||
let context = container.mainContext
|
||||
|
||||
insert(into: context)
|
||||
|
||||
// WHEN
|
||||
let descriptor = FetchDescriptor<Todo>(
|
||||
group: group,
|
||||
showCompleted: true
|
||||
)
|
||||
let results = try context.fetch(descriptor)
|
||||
|
||||
// THEN
|
||||
if group == .overdue || group == .upcoming {
|
||||
#expect(results.count == 3)
|
||||
} else {
|
||||
#expect(results.count == 2)
|
||||
}
|
||||
|
||||
switch group {
|
||||
case .completed:
|
||||
#expect(results[0].title == "Completed task #2")
|
||||
#expect(results[1].title == "Completed task #1")
|
||||
case .overdue:
|
||||
#expect(results[0].title == "Completed task #1")
|
||||
#expect(results[1].title == "Overdue task #2")
|
||||
#expect(results[2].title == "Overdue task #1")
|
||||
case .today:
|
||||
#expect(results[0].title == "Today task #1")
|
||||
#expect(results[1].title == "Today task #2")
|
||||
case .upcoming:
|
||||
#expect(results[0].title == "Upcoming task #1")
|
||||
#expect(results[1].title == "Upcoming task #2")
|
||||
#expect(results[2].title == "Completed task #2")
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import Foundation
|
||||
import SwiftData
|
||||
import SwiftUI
|
||||
import Testing
|
||||
|
||||
@testable import Todos
|
||||
@@ -7,10 +8,73 @@ import Testing
|
||||
@Suite("TaskList view model tests")
|
||||
struct TaskListViewModelTests {
|
||||
|
||||
// MARK: Computed tests
|
||||
// MARK: Initializers tests
|
||||
|
||||
@Test(
|
||||
"navigationTitle returns correct title for each and every group",
|
||||
"properties are set correctly during initialization",
|
||||
arguments: TodoGroup.allCases
|
||||
)
|
||||
func initialization(for group: TodoGroup) {
|
||||
// GIVEN
|
||||
// WHEN
|
||||
let viewModel = TaskListView.ViewModel(group: group)
|
||||
|
||||
// THEN
|
||||
#expect(viewModel.group == group)
|
||||
#expect(viewModel.showCompleted == false)
|
||||
}
|
||||
|
||||
// MARK: Computed property tests
|
||||
|
||||
@Test(
|
||||
"buttonCompleted returns correct values when showCompleted is true",
|
||||
arguments: TodoGroup.allCases, [true, false]
|
||||
)
|
||||
func buttonCompleted(
|
||||
for group: TodoGroup,
|
||||
showCompleted: Bool
|
||||
) {
|
||||
// GIVEN
|
||||
let viewModel = TaskListView.ViewModel(group: group)
|
||||
|
||||
viewModel.showCompleted = showCompleted
|
||||
|
||||
// WHEN
|
||||
let (title, icon) = viewModel.buttonCompleted
|
||||
|
||||
// THEN
|
||||
if showCompleted {
|
||||
#expect(title == "view.task-list.label.hide-completed")
|
||||
#expect(icon == "eye.slash")
|
||||
} else {
|
||||
#expect(title == "view.task-list.label.show-completed")
|
||||
#expect(icon == "eye")
|
||||
}
|
||||
}
|
||||
|
||||
@Test(
|
||||
"canShowCompleted returns correct value for each group",
|
||||
arguments: zip(
|
||||
TodoGroup.allCases,
|
||||
[true, true, true, false]
|
||||
)
|
||||
)
|
||||
func canShowCompleted(
|
||||
for group: TodoGroup,
|
||||
expects expectation: Bool
|
||||
) {
|
||||
// GIVEN
|
||||
let viewModel = TaskListView.ViewModel(group: group)
|
||||
|
||||
// WHEN
|
||||
let canShowCompleted = viewModel.canShowCompleted
|
||||
|
||||
// THEN
|
||||
#expect(canShowCompleted == expectation)
|
||||
}
|
||||
|
||||
@Test(
|
||||
"navigationTitle returns correct view title for each group",
|
||||
arguments: TodoGroup.allCases
|
||||
)
|
||||
func navigationTitle(for group: TodoGroup) {
|
||||
@@ -24,4 +88,25 @@ struct TaskListViewModelTests {
|
||||
#expect(title == group.title)
|
||||
}
|
||||
|
||||
// MARK: Method tests
|
||||
|
||||
@Test("toggleCompletedVisbility toggles the showCompleted property")
|
||||
func toggleCompletedVisibility() {
|
||||
// GIVEN
|
||||
let viewModel = TaskListView.ViewModel(group: .today)
|
||||
let initialValue = viewModel.showCompleted
|
||||
|
||||
// WHEN
|
||||
viewModel.toggleCompletedVisibility()
|
||||
let afterFirstToggle = viewModel.showCompleted
|
||||
|
||||
viewModel.toggleCompletedVisibility()
|
||||
let afterSecondToggle = viewModel.showCompleted
|
||||
|
||||
// THEN
|
||||
#expect(initialValue == false)
|
||||
#expect(afterFirstToggle == true)
|
||||
#expect(afterSecondToggle == false)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user