import XCTest /// UI Tests for Portfolio Journal app /// These tests verify the app's user interface and navigation flows final class PortfolioJournalUITests: XCTestCase { var app: XCUIApplication! override func setUpWithError() throws { continueAfterFailure = false app = XCUIApplication() app.launchArguments = ["--uitesting"] app.launch() } override func tearDownWithError() throws { app = nil } // MARK: - App Launch Tests func testAppLaunches() throws { // Verify the app launches successfully XCTAssertTrue(app.exists) } func testTabBarExists() throws { // Wait for the tab bar to appear let tabBar = app.tabBars.firstMatch let exists = tabBar.waitForExistence(timeout: 5) XCTAssertTrue(exists, "Tab bar should exist after launch") } // MARK: - Navigation Tests func testDashboardTabIsSelected() throws { // Dashboard should be the default selected tab let tabBar = app.tabBars.firstMatch _ = tabBar.waitForExistence(timeout: 5) // Look for Dashboard tab button let dashboardTab = tabBar.buttons["Dashboard"] if dashboardTab.exists { XCTAssertTrue(dashboardTab.isSelected || dashboardTab.isHittable) } } func testNavigateToSourcesTab() throws { let tabBar = app.tabBars.firstMatch _ = tabBar.waitForExistence(timeout: 5) let sourcesTab = tabBar.buttons["Sources"] if sourcesTab.exists { sourcesTab.tap() // Verify we're on the Sources screen XCTAssertTrue(sourcesTab.isSelected || sourcesTab.isHittable) } } func testNavigateToGoalsTab() throws { let tabBar = app.tabBars.firstMatch _ = tabBar.waitForExistence(timeout: 5) let goalsTab = tabBar.buttons["Goals"] if goalsTab.exists { goalsTab.tap() XCTAssertTrue(goalsTab.isSelected || goalsTab.isHittable) } } func testNavigateToJournalTab() throws { let tabBar = app.tabBars.firstMatch _ = tabBar.waitForExistence(timeout: 5) let journalTab = tabBar.buttons["Journal"] if journalTab.exists { journalTab.tap() XCTAssertTrue(journalTab.isSelected || journalTab.isHittable) } } func testNavigateToSettingsTab() throws { let tabBar = app.tabBars.firstMatch _ = tabBar.waitForExistence(timeout: 5) let settingsTab = tabBar.buttons["Settings"] if settingsTab.exists { settingsTab.tap() XCTAssertTrue(settingsTab.isSelected || settingsTab.isHittable) } } // MARK: - All Tabs Navigation Test func testNavigateThroughAllTabs() throws { let tabBar = app.tabBars.firstMatch guard tabBar.waitForExistence(timeout: 5) else { XCTFail("Tab bar not found") return } let tabs = ["Dashboard", "Sources", "Goals", "Journal", "Settings"] for tabName in tabs { let tab = tabBar.buttons[tabName] if tab.exists && tab.isHittable { tab.tap() // Give time for navigation Thread.sleep(forTimeInterval: 0.3) } } // Return to Dashboard let dashboardTab = tabBar.buttons["Dashboard"] if dashboardTab.exists { dashboardTab.tap() } } }