import XCTest enum TestFlows { @discardableResult static func navigateToLoginFromOnboarding(app: XCUIApplication) -> LoginScreen { let welcome = OnboardingWelcomeScreen(app: app) welcome.waitForLoad() welcome.tapAlreadyHaveAccount() let login = LoginScreen(app: app) login.waitForLoad() return login } @discardableResult static func navigateStartFreshToCreateAccount( app: XCUIApplication, residenceName: String = "UI Test Residence" ) -> OnboardingCreateAccountScreen { let welcome = OnboardingWelcomeScreen(app: app) welcome.waitForLoad() welcome.tapStartFresh() let valueProps = OnboardingValuePropsScreen(app: app) valueProps.waitForLoad() valueProps.tapContinue() let nameResidence = OnboardingNameResidenceScreen(app: app) nameResidence.waitForLoad() nameResidence.enterResidenceName(residenceName) nameResidence.tapContinue() let createAccount = OnboardingCreateAccountScreen(app: app) createAccount.waitForLoad() return createAccount } /// Type credentials into the login screen and tap login. /// Assumes the app is already showing the login screen. static func loginWithCredentials(app: XCUIApplication, username: String, password: String) { let login = LoginScreen(app: app) login.waitForLoad() login.enterUsername(username) login.enterPassword(password) let loginButton = app.buttons[UITestID.Auth.loginButton] loginButton.waitUntilHittable(timeout: 10).tap() } /// Drive the full forgot password → verify code → reset password flow using the debug code. static func completeForgotPasswordFlow( app: XCUIApplication, email: String, newPassword: String, confirmPassword: String? = nil ) { let confirm = confirmPassword ?? newPassword // Step 1: Enter email on forgot password screen let forgotScreen = ForgotPasswordScreen(app: app) forgotScreen.waitForLoad() forgotScreen.enterEmail(email) forgotScreen.tapSendCode() // Step 2: Enter debug verification code let verifyScreen = VerifyResetCodeScreen(app: app) verifyScreen.waitForLoad() verifyScreen.enterCode(TestAccountAPIClient.debugVerificationCode) verifyScreen.tapVerify() // Step 3: Enter new password let resetScreen = ResetPasswordScreen(app: app) resetScreen.waitForLoad() resetScreen.enterNewPassword(newPassword) resetScreen.enterConfirmPassword(confirm) resetScreen.tapReset() } @discardableResult static func openRegisterFromLogin(app: XCUIApplication) -> RegisterScreen { let login: LoginScreen let loginRoot = app.otherElements[UITestID.Root.login] if loginRoot.exists || app.textFields[UITestID.Auth.usernameField].exists { login = LoginScreen(app: app) login.waitForLoad() } else { login = navigateToLoginFromOnboarding(app: app) } login.tapSignUp() let register = RegisterScreen(app: app) register.waitForLoad() return register } }