Version bump to v0.4.0

This commit is contained in:
Michael Freno
2026-01-13 10:28:04 -05:00
parent 338e79c6c6
commit 2d0db8af2a
5 changed files with 268 additions and 80 deletions

View File

@@ -0,0 +1,175 @@
//
// EnhancedOnboardingUITests.swift
// GazeUITests
//
// Created by Gaze Team on 1/13/26.
//
import XCTest
@MainActor
final class EnhancedOnboardingUITests: XCTestCase {
var app: XCUIApplication!
override func setUpWithError() throws {
continueAfterFailure = false
app = XCUIApplication()
app.launchArguments.append("--reset-onboarding")
app.launch()
}
override func tearDownWithError() throws {
app = nil
}
func testOnboardingCompleteFlowWithUserTimers() throws {
// Navigate through the complete onboarding flow
let continueButtons = app.buttons.matching(identifier: "Continue")
let nextButtons = app.buttons.matching(identifier: "Next")
var currentStep = 0
let maxSteps = 15
while currentStep < maxSteps {
if continueButtons.firstMatch.exists && continueButtons.firstMatch.isHittable {
continueButtons.firstMatch.tap()
currentStep += 1
sleep(1)
} else if nextButtons.firstMatch.exists && nextButtons.firstMatch.isHittable {
nextButtons.firstMatch.tap()
currentStep += 1
sleep(1)
} else if app.buttons["Get Started"].exists {
app.buttons["Get Started"].tap()
break
} else if app.buttons["Done"].exists {
app.buttons["Done"].tap()
break
} else {
break
}
}
// Verify onboarding completed successfully
XCTAssertLessThan(currentStep, maxSteps, "Onboarding flow should complete")
// Verify main application UI is visible (menubar should be active)
XCTAssertTrue(app.menuBarItems.firstMatch.exists, "Menubar should be available after onboarding")
}
func testUserTimerCreationInOnboarding() throws {
// Reset to fresh onboarding state
app.terminate()
app = XCUIApplication()
app.launchArguments.append("--reset-onboarding")
app.launch()
// Navigate to user timer setup section (assumes it's at the end)
let continueButtons = app.buttons.matching(identifier: "Continue")
let nextButtons = app.buttons.matching(identifier: "Next")
// Skip through initial screens
var currentStep = 0
while currentStep < 8 && (continueButtons.firstMatch.exists || nextButtons.firstMatch.exists) {
if continueButtons.firstMatch.exists && continueButtons.firstMatch.isHittable {
continueButtons.firstMatch.tap()
currentStep += 1
sleep(1)
} else if nextButtons.firstMatch.exists && nextButtons.firstMatch.isHittable {
nextButtons.firstMatch.tap()
currentStep += 1
sleep(1)
}
}
// Look for timer creation UI or related elements
let timerSetupElement = app.staticTexts.containing(NSPredicate(format: "label CONTAINS 'Timer' OR label CONTAINS 'Custom'")).firstMatch
XCTAssertTrue(timerSetupElement.exists, "User timer setup section should be available during onboarding")
// If we can create a timer in onboarding, test that flow
if app.buttons["Add Timer"].exists {
app.buttons["Add Timer"].tap()
// Fill out timer details - this would be specific to the actual UI structure
let titleField = app.textFields["Timer Title"]
if titleField.exists {
titleField.typeText("Test Timer")
}
let intervalField = app.textFields["Interval (minutes)"]
if intervalField.exists {
intervalField.typeText("10")
}
// Submit the timer
app.buttons["Save"].tap()
}
}
func testSettingsPersistenceAfterOnboarding() throws {
// Reset to fresh onboarding state
app.terminate()
app = XCUIApplication()
app.launchArguments.append("--reset-onboarding")
app.launch()
// Complete onboarding flow
let continueButtons = app.buttons.matching(identifier: "Continue")
let nextButtons = app.buttons.matching(identifier: "Next")
while continueButtons.firstMatch.exists || nextButtons.firstMatch.exists {
if continueButtons.firstMatch.exists && continueButtons.firstMatch.isHittable {
continueButtons.firstMatch.tap()
sleep(1)
} else if nextButtons.firstMatch.exists && nextButtons.firstMatch.isHittable {
nextButtons.firstMatch.tap()
sleep(1)
}
}
// Get to the end and complete onboarding
app.buttons["Get Started"].tap()
// Verify that settings are properly initialized
let menuBar = app.menuBarItems.firstMatch
XCTAssertTrue(menuBar.exists, "Menubar should exist after onboarding")
// Re-launch the app to verify settings persistence
app.terminate()
let newApp = XCUIApplication()
newApp.launchArguments.append("--skip-onboarding")
newApp.launch()
XCTAssertTrue(newApp.menuBarItems.firstMatch.exists, "Application should maintain state after restart")
newApp.terminate()
}
func testOnboardingNavigationEdgeCases() throws {
// Test that navigation buttons work properly at each step
let continueButton = app.buttons["Continue"]
if continueButton.waitForExistence(timeout: 2) {
continueButton.tap()
// Verify we moved to the next screen
let nextScreen = app.staticTexts.containing(NSPredicate(format: "label CONTAINS 'Setup' OR label CONTAINS 'Configure'")).firstMatch
XCTAssertTrue(nextScreen.exists, "Should navigate to next screen on Continue")
}
// Test back navigation
let backButton = app.buttons["Back"]
if backButton.waitForExistence(timeout: 1) {
backButton.tap()
// Should return to previous screen
XCTAssertTrue(app.staticTexts.containing(NSPredicate(format: "label CONTAINS 'Welcome'")).firstMatch.exists)
}
// Test that we can go forward again
let continueButton2 = app.buttons["Continue"]
if continueButton2.waitForExistence(timeout: 1) {
continueButton2.tap()
XCTAssertTrue(app.staticTexts.containing(NSPredicate(format: "label CONTAINS 'Setup'")).firstMatch.exists)
}
}
}