// // MoodReplacementTests.swift // Tests iOS // // Mood replacement and duplicate prevention tests. // import XCTest final class MoodReplacementTests: BaseUITestCase { override var seedFixture: String? { "single_mood" } /// TC-003: Replace a mood via header or detail -- entry still exists afterward. func testReplaceMood_NoDuplicates() { let dayScreen = DayScreen(app: app) if dayScreen.moodHeader.waitForExistence(timeout: defaultTimeout) { dayScreen.logMood(.good) } else { let firstEntry = app.firstEntryRow firstEntry.waitForExistenceOrFail(timeout: navigationTimeout, message: "No entry rows found") firstEntry.tap() let detailScreen = EntryDetailScreen(app: app) detailScreen.assertVisible() detailScreen.selectMood(.good) detailScreen.dismiss() detailScreen.assertDismissed() } dayScreen.assertAnyEntryExists() } /// TC-158: Change mood via detail sheet -- entry still exists afterward. func testNoDuplicateEntries_SameDate() { let dayScreen = DayScreen(app: app) // If header shows, log a mood first if dayScreen.moodHeader.waitForExistence(timeout: defaultTimeout) { dayScreen.logMood(.great) } // Open entry and change mood via detail let firstEntry = app.firstEntryRow firstEntry.waitForExistenceOrFail(timeout: navigationTimeout, message: "No entry found after logging") firstEntry.tap() let detailScreen = EntryDetailScreen(app: app) detailScreen.assertVisible() detailScreen.selectMood(.bad) detailScreen.dismiss() detailScreen.assertDismissed() // Verify entry still exists (no accidental deletion) dayScreen.assertAnyEntryExists() } }