Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,29 +1,21 @@
import XCTest
import Foundation
import Testing
@testable import DiaryApp
@testable import Chiui

final class DiaryEntryDateSelectionViewModelTests: XCTestCase {
var sut: DiaryEntryDateSelectionViewModel!
var context: DiaryContext!

override func setUp() async throws {
try await super.setUp()
await MainActor.run {
context = DiaryContext(initialState: DiaryStoreState())
sut = DiaryEntryDateSelectionViewModel(context)
}
}

override func tearDown() async throws {
await MainActor.run {
sut = nil
context = nil
}
try await super.tearDown()
@Suite("DiaryEntryDateSelectionViewModel tests")
struct DiaryEntryDateSelectionViewModelTests {
@MainActor
private func makeSUT() -> (sut: DiaryEntryDateSelectionViewModel, context: DiaryContext) {
let context = DiaryContext(initialState: DiaryStoreState())
let sut = DiaryEntryDateSelectionViewModel(context)
return (sut, context)
}

@Test("Store update maps draft date")
@MainActor
func testDidStoreUpdateUsesDraftDate() async {
func didStoreUpdateUsesDraftDate() async {
let (sut, context) = makeSUT()
let draftDate = Date(timeIntervalSince1970: 1_750_000_000)

await context.store.update { state in
Expand All @@ -34,23 +26,27 @@ final class DiaryEntryDateSelectionViewModelTests: XCTestCase {

try? await Task.sleep(for: .seconds(0.1))

XCTAssertEqual(sut.state.selectedDate, draftDate)
#expect(sut.state.selectedDate == draftDate)
}

@Test("selectedDateChanged persists draft date")
@MainActor
func testUpdateSelectedDateUpdatesStoreDraft() async {
func updateSelectedDateUpdatesStoreDraft() async {
let (sut, context) = makeSUT()
let selectedDate = Date(timeIntervalSince1970: 1_760_000_000)

await sut.sendAwaitingEffects(.selectedDateChanged(selectedDate))
try? await Task.sleep(for: .seconds(0.1))

XCTAssertEqual(sut.state.selectedDate, selectedDate)
#expect(sut.state.selectedDate == selectedDate)
let storeState = await context.store.state
XCTAssertEqual(storeState.entryDraftDate, selectedDate)
#expect(storeState.entryDraftDate == selectedDate)
}

@Test("confirmSelection dismisses date selection")
@MainActor
func testConfirmSelectionDismissesDateSelection() async {
func confirmSelectionDismissesDateSelection() async {
let (sut, context) = makeSUT()
await context.store.update { state in
state.isSelectingEntryDate = true
}
Expand All @@ -59,11 +55,13 @@ final class DiaryEntryDateSelectionViewModelTests: XCTestCase {
try? await Task.sleep(for: .seconds(0.1))

let storeState = await context.store.state
XCTAssertFalse(storeState.isSelectingEntryDate)
#expect(storeState.isSelectingEntryDate == false)
}

@Test("cancelSelection dismisses date selection")
@MainActor
func testCancelSelectionDismissesDateSelection() async {
func cancelSelectionDismissesDateSelection() async {
let (sut, context) = makeSUT()
await context.store.update { state in
state.isSelectingEntryDate = true
}
Expand All @@ -72,15 +70,16 @@ final class DiaryEntryDateSelectionViewModelTests: XCTestCase {
try? await Task.sleep(for: .seconds(0.1))

let storeState = await context.store.state
XCTAssertFalse(storeState.isSelectingEntryDate)
#expect(storeState.isSelectingEntryDate == false)
}

@Test("Reducer emits persistDraftDate effect")
@MainActor
func testReducerProducesPersistEffect() {
func reducerProducesPersistEffect() {
var state = DiaryEntryDateSelectionViewModel.State()
let date = Date(timeIntervalSince1970: 1_760_000_000)
let effect = DiaryEntryDateSelectionViewModel.respond(to: .selectedDateChanged(date), state: &state)
XCTAssertEqual(state.selectedDate, date)
XCTAssertEqual(effect, .persistDraftDate(date))
#expect(state.selectedDate == date)
#expect(effect == .persistDraftDate(date))
}
}
Original file line number Diff line number Diff line change
@@ -1,29 +1,21 @@
import XCTest
import Foundation
import Testing
@testable import DiaryApp
@testable import Chiui

final class DiaryEntryLocationSelectionViewModelTests: XCTestCase {
var sut: DiaryEntryLocationSelectionViewModel!
var context: DiaryContext!

override func setUp() async throws {
try await super.setUp()
await MainActor.run {
context = DiaryContext(initialState: DiaryStoreState())
sut = DiaryEntryLocationSelectionViewModel(context)
}
}

override func tearDown() async throws {
await MainActor.run {
sut = nil
context = nil
}
try await super.tearDown()
@Suite("DiaryEntryLocationSelectionViewModel tests")
struct DiaryEntryLocationSelectionViewModelTests {
@MainActor
private func makeSUT() -> (sut: DiaryEntryLocationSelectionViewModel, context: DiaryContext) {
let context = DiaryContext(initialState: DiaryStoreState())
let sut = DiaryEntryLocationSelectionViewModel(context)
return (sut, context)
}

@Test("Store update maps draft location")
@MainActor
func testDidStoreUpdateUsesDraftLocation() async {
func didStoreUpdateUsesDraftLocation() async {
let (sut, context) = makeSUT()
await context.store.update { state in
state.entrySelectionMode = .addingNew
state.entryDraftLocation = "Kyoto"
Expand All @@ -32,11 +24,13 @@ final class DiaryEntryLocationSelectionViewModelTests: XCTestCase {

try? await Task.sleep(for: .seconds(0.1))

XCTAssertEqual(sut.state.location, "Kyoto")
#expect(sut.state.location == "Kyoto")
}

@Test("Store update maps selected entry location when draft is missing")
@MainActor
func testDidStoreUpdateUsesSelectedEntryLocationWhenNoDraft() async {
func didStoreUpdateUsesSelectedEntryLocationWhenNoDraft() async {
let (sut, context) = makeSUT()
let entry = DiaryEntry(
id: UUID(),
title: "Title",
Expand All @@ -53,21 +47,25 @@ final class DiaryEntryLocationSelectionViewModelTests: XCTestCase {

try? await Task.sleep(for: .seconds(0.1))

XCTAssertEqual(sut.state.location, "Berlin")
#expect(sut.state.location == "Berlin")
}

@Test("locationChanged persists draft location")
@MainActor
func testLocationChangedUpdatesStoreDraft() async {
func locationChangedUpdatesStoreDraft() async {
let (sut, context) = makeSUT()
await sut.sendAwaitingEffects(.locationChanged("Toronto"))
try? await Task.sleep(for: .seconds(0.1))

XCTAssertEqual(sut.state.location, "Toronto")
#expect(sut.state.location == "Toronto")
let storeState = await context.store.state
XCTAssertEqual(storeState.entryDraftLocation, "Toronto")
#expect(storeState.entryDraftLocation == "Toronto")
}

@Test("confirmSelection dismisses location selection")
@MainActor
func testConfirmSelectionDismissesLocationSelection() async {
func confirmSelectionDismissesLocationSelection() async {
let (sut, context) = makeSUT()
await context.store.update { state in
state.isSelectingEntryLocation = true
}
Expand All @@ -76,11 +74,13 @@ final class DiaryEntryLocationSelectionViewModelTests: XCTestCase {
try? await Task.sleep(for: .seconds(0.1))

let storeState = await context.store.state
XCTAssertFalse(storeState.isSelectingEntryLocation)
#expect(storeState.isSelectingEntryLocation == false)
}

@Test("cancelSelection dismisses location selection")
@MainActor
func testCancelSelectionDismissesLocationSelection() async {
func cancelSelectionDismissesLocationSelection() async {
let (sut, context) = makeSUT()
await context.store.update { state in
state.isSelectingEntryLocation = true
}
Expand All @@ -89,14 +89,15 @@ final class DiaryEntryLocationSelectionViewModelTests: XCTestCase {
try? await Task.sleep(for: .seconds(0.1))

let storeState = await context.store.state
XCTAssertFalse(storeState.isSelectingEntryLocation)
#expect(storeState.isSelectingEntryLocation == false)
}

@Test("Reducer emits persistDraftLocation effect")
@MainActor
func testReducerProducesPersistEffect() {
func reducerProducesPersistEffect() {
var state = DiaryEntryLocationSelectionViewModel.State()
let effect = DiaryEntryLocationSelectionViewModel.respond(to: .locationChanged("Oslo"), state: &state)
XCTAssertEqual(state.location, "Oslo")
XCTAssertEqual(effect, .persistDraftLocation("Oslo"))
#expect(state.location == "Oslo")
#expect(effect == .persistDraftLocation("Oslo"))
}
}
Original file line number Diff line number Diff line change
@@ -1,29 +1,21 @@
import XCTest
import Foundation
import Testing
@testable import DiaryApp
@testable import Chiui

final class DiaryEntryMoodSelectionViewModelTests: XCTestCase {
var sut: DiaryEntryMoodSelectionViewModel!
var context: DiaryContext!

override func setUp() async throws {
try await super.setUp()
await MainActor.run {
context = DiaryContext(initialState: DiaryStoreState())
sut = DiaryEntryMoodSelectionViewModel(context)
}
}

override func tearDown() async throws {
await MainActor.run {
sut = nil
context = nil
}
try await super.tearDown()
@Suite("DiaryEntryMoodSelectionViewModel tests")
struct DiaryEntryMoodSelectionViewModelTests {
@MainActor
private func makeSUT() -> (sut: DiaryEntryMoodSelectionViewModel, context: DiaryContext) {
let context = DiaryContext(initialState: DiaryStoreState())
let sut = DiaryEntryMoodSelectionViewModel(context)
return (sut, context)
}

@Test("Store update maps draft mood")
@MainActor
func testDidStoreUpdateUsesDraftMood() async {
func didStoreUpdateUsesDraftMood() async {
let (sut, context) = makeSUT()
await context.store.update { state in
state.entrySelectionMode = .addingNew
state.entryDraftMood = .great
Expand All @@ -32,11 +24,13 @@ final class DiaryEntryMoodSelectionViewModelTests: XCTestCase {

try? await Task.sleep(for: .seconds(0.1))

XCTAssertEqual(sut.state.selectedMood, .great)
#expect(sut.state.selectedMood == .great)
}

@Test("Store update maps selected entry mood when draft is missing")
@MainActor
func testDidStoreUpdateUsesSelectedEntryMoodWhenNoDraft() async {
func didStoreUpdateUsesSelectedEntryMoodWhenNoDraft() async {
let (sut, context) = makeSUT()
let entry = DiaryEntry(
id: UUID(),
title: "Title",
Expand All @@ -52,21 +46,25 @@ final class DiaryEntryMoodSelectionViewModelTests: XCTestCase {

try? await Task.sleep(for: .seconds(0.1))

XCTAssertEqual(sut.state.selectedMood, .bad)
#expect(sut.state.selectedMood == .bad)
}

@Test("selectedMoodChanged persists draft mood")
@MainActor
func testUpdateSelectedMoodUpdatesStoreDraft() async {
func updateSelectedMoodUpdatesStoreDraft() async {
let (sut, context) = makeSUT()
await sut.sendAwaitingEffects(.selectedMoodChanged(.amazing))
try? await Task.sleep(for: .seconds(0.1))

XCTAssertEqual(sut.state.selectedMood, .amazing)
#expect(sut.state.selectedMood == .amazing)
let storeState = await context.store.state
XCTAssertEqual(storeState.entryDraftMood, .amazing)
#expect(storeState.entryDraftMood == .amazing)
}

@Test("confirmSelection dismisses mood selection")
@MainActor
func testConfirmSelectionDismissesMoodSelection() async {
func confirmSelectionDismissesMoodSelection() async {
let (sut, context) = makeSUT()
await context.store.update { state in
state.isSelectingEntryMood = true
}
Expand All @@ -75,11 +73,13 @@ final class DiaryEntryMoodSelectionViewModelTests: XCTestCase {
try? await Task.sleep(for: .seconds(0.1))

let storeState = await context.store.state
XCTAssertFalse(storeState.isSelectingEntryMood)
#expect(storeState.isSelectingEntryMood == false)
}

@Test("cancelSelection dismisses mood selection")
@MainActor
func testCancelSelectionDismissesMoodSelection() async {
func cancelSelectionDismissesMoodSelection() async {
let (sut, context) = makeSUT()
await context.store.update { state in
state.isSelectingEntryMood = true
}
Expand All @@ -88,14 +88,15 @@ final class DiaryEntryMoodSelectionViewModelTests: XCTestCase {
try? await Task.sleep(for: .seconds(0.1))

let storeState = await context.store.state
XCTAssertFalse(storeState.isSelectingEntryMood)
#expect(storeState.isSelectingEntryMood == false)
}

@Test("Reducer emits persistDraftMood effect")
@MainActor
func testReducerProducesPersistEffect() {
func reducerProducesPersistEffect() {
var state = DiaryEntryMoodSelectionViewModel.State()
let effect = DiaryEntryMoodSelectionViewModel.respond(to: .selectedMoodChanged(.great), state: &state)
XCTAssertEqual(state.selectedMood, .great)
XCTAssertEqual(effect, .persistDraftMood(.great))
#expect(state.selectedMood == .great)
#expect(effect == .persistDraftMood(.great))
}
}
Loading
Loading