// // EntryDetailScreen.swift // Tests iOS // // Screen object for the Entry Detail sheet (edit mood, notes, delete). // import XCTest struct EntryDetailScreen { let app: XCUIApplication // MARK: - Elements var navigationTitle: XCUIElement { app.navigationBars["Entry Details"] } var doneButton: XCUIElement { app.buttons["entry_detail_done"] } var deleteButton: XCUIElement { app.buttons["entry_detail_delete"] } var moodGrid: XCUIElement { app.otherElements["entry_detail_mood_grid"] } /// Mood buttons inside the detail sheet's mood grid. /// These use accessibilityLabel (the mood name text), not identifiers. func moodButton(label: String) -> XCUIElement { app.buttons.matching(NSPredicate(format: "label CONTAINS[cd] %@", label)).firstMatch } // MARK: - Actions func dismiss() { doneButton.tapWhenReady() } func selectMood(_ mood: MoodChoice) { let button = moodButton(label: mood.rawValue.capitalized) button.tapWhenReady() } func deleteEntry() { deleteButton.tapWhenReady() // Confirm the delete alert let deleteAlert = app.alerts["Delete Entry"] let confirmButton = deleteAlert.buttons["Delete"] confirmButton.tapWhenReady() } // MARK: - Assertions func assertVisible(file: StaticString = #file, line: UInt = #line) { XCTAssertTrue( navigationTitle.waitForExistence(timeout: 5), "Entry Detail sheet should be visible", file: file, line: line ) } func assertDismissed(file: StaticString = #file, line: UInt = #line) { XCTAssertTrue( navigationTitle.waitForDisappearance(timeout: 5), "Entry Detail sheet should be dismissed", file: file, line: line ) } }