From 4b70a20ee458a7b00a1be7a23e5528f247fa9d09 Mon Sep 17 00:00:00 2001 From: Luis Delgado Date: Mon, 3 Jun 2024 14:49:57 -0400 Subject: [PATCH 1/3] Fix integration tests --- .../DaysUntilBirthdayUITests_iOS.swift | 94 +++++++++++++++---- 1 file changed, 77 insertions(+), 17 deletions(-) diff --git a/Samples/Swift/DaysUntilBirthday/DaysUntilBirthdayUITests(iOS)/DaysUntilBirthdayUITests_iOS.swift b/Samples/Swift/DaysUntilBirthday/DaysUntilBirthdayUITests(iOS)/DaysUntilBirthdayUITests_iOS.swift index 437e0f65..ad0b9b12 100644 --- a/Samples/Swift/DaysUntilBirthday/DaysUntilBirthdayUITests(iOS)/DaysUntilBirthdayUITests_iOS.swift +++ b/Samples/Swift/DaysUntilBirthday/DaysUntilBirthdayUITests(iOS)/DaysUntilBirthdayUITests_iOS.swift @@ -19,6 +19,13 @@ import XCTest class DaysUntilBirthdayUITests_iOS: XCTestCase { private let signInStaticText = "“DaysUntilBirthday (iOS)” Wants to Use “google.com” to Sign In" + private let passwordManagerPrompt = + "Would you like to save this password to use with apps and websites?" + private let signInDisclaimerHeaderText = + "Sign in to Days Until Birthday" + private let additionalAccessHeaderText = "Days Until Birthday wants additional access to your Google Account" + private let appTrustWarningText = "Make sure you trust Days Until Birthday" + private let chooseAnAccountHeaderText = "Choose an account" private let timeout: TimeInterval = 5 private let sampleApp = XCUIApplication() @@ -152,6 +159,22 @@ extension DaysUntilBirthdayUITests_iOS { .typeText(Credential.password.rawValue) sampleApp.keyboards.element.buttons["return"].tap() + if sampleApp + .staticTexts[passwordManagerPrompt] + .waitForExistence(timeout: timeout) { + guard sampleApp + .buttons["Not Now"] + .waitForExistence(timeout: timeout) else { + XCTFail("Failed to find 'Not Now' button") + return false + } + sampleApp.buttons["Not Now"].tap() + } + + // Proceed through sign-in disclaimer and/or access request view(s) if needed + handleSignInDisclaimerIfNeeded() + handleAccessRequestIfNeeded() + return true } @@ -160,15 +183,13 @@ extension DaysUntilBirthdayUITests_iOS { /// This will check that there is a `Credential.email` in a list to select and /// sign in with. func useExistingSignIn() -> Bool { - guard sampleApp.staticTexts[Credential.email.rawValue].exists else { - XCTFail("Email used for previous sign-in not in list") + guard findAndTapExistingSignedInEmail() else { + XCTFail("Failed to find signed-in account") return false } - guard sampleApp.staticTexts[Credential.email.rawValue].isHittable else { - XCTFail("Email used for previous sign-in not tappable") - return false - } - sampleApp.staticTexts[Credential.email.rawValue].tap() + + handleSignInDisclaimerIfNeeded() + handleAccessRequestIfNeeded() return true } @@ -196,17 +217,16 @@ extension DaysUntilBirthdayUITests_iOS { } springboardApp.buttons["Continue"].tap() - guard sampleApp - .staticTexts["Days Until Birthday wants to access your Google Account"] - .waitForExistence(timeout: timeout) else { - XCTFail("Failed to find permission screen") - return false - } - guard sampleApp.buttons["Allow"].waitForExistence(timeout: timeout) else { - XCTFail("Failed to find 'Allow' button") - return false + if sampleApp + .staticTexts[chooseAnAccountHeaderText] + .waitForExistence(timeout: timeout) { + guard findAndTapExistingSignedInEmail() else { + XCTFail("Failed to find signed-in account") + return false + } } - sampleApp.buttons["Allow"].tap() + + handleAccessRequestIfNeeded() } guard sampleApp.staticTexts["Days Until Birthday"] @@ -240,4 +260,44 @@ extension DaysUntilBirthdayUITests_iOS { return true } + + /// Proceeds through the view with header "Days Until Birthday wants additional access to your Google Account" if needed. + func handleAccessRequestIfNeeded() { + let currentlyShowingAdditionalAccessRequest = sampleApp.staticTexts[additionalAccessHeaderText] + .waitForExistence(timeout: timeout) && sampleApp.staticTexts[appTrustWarningText] + .waitForExistence(timeout: timeout) && + sampleApp.buttons["Continue"] + .waitForExistence(timeout: timeout) + + if currentlyShowingAdditionalAccessRequest { + sampleApp.buttons["Continue"].tap() + } + } + + /// Proceeds through the sign-in disclaimer view if needed. + func handleSignInDisclaimerIfNeeded() { + let currentlyShowingSignInDisclaimer = sampleApp.staticTexts[signInDisclaimerHeaderText] + .waitForExistence(timeout: timeout) && + sampleApp.buttons["Continue"] + .waitForExistence(timeout: timeout) + + if currentlyShowingSignInDisclaimer { + sampleApp.buttons["Continue"].tap() + } + } + + /// This method looks for an account in the current view that reflects an already-signed-in state, and taps it. + /// Returns true if the signed-in account was found and tapped, otherwise returns false. + func findAndTapExistingSignedInEmail() -> Bool { + guard sampleApp.staticTexts[Credential.email.rawValue].exists else { + XCTFail("Email used for previous sign-in not in list") + return false + } + guard sampleApp.staticTexts[Credential.email.rawValue].isHittable else { + XCTFail("Email used for previous sign-in not tappable") + return false + } + sampleApp.staticTexts[Credential.email.rawValue].tap() + return true + } } From 9bfc1a40ac0beaca1e9f062be8d94553f9d4cef9 Mon Sep 17 00:00:00 2001 From: Luis Delgado Date: Mon, 3 Jun 2024 17:57:53 -0400 Subject: [PATCH 2/3] Refactoring a few snippets --- .../DaysUntilBirthdayUITests_iOS.swift | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Samples/Swift/DaysUntilBirthday/DaysUntilBirthdayUITests(iOS)/DaysUntilBirthdayUITests_iOS.swift b/Samples/Swift/DaysUntilBirthday/DaysUntilBirthdayUITests(iOS)/DaysUntilBirthdayUITests_iOS.swift index ad0b9b12..b3a78720 100644 --- a/Samples/Swift/DaysUntilBirthday/DaysUntilBirthdayUITests(iOS)/DaysUntilBirthdayUITests_iOS.swift +++ b/Samples/Swift/DaysUntilBirthday/DaysUntilBirthdayUITests(iOS)/DaysUntilBirthdayUITests_iOS.swift @@ -26,6 +26,7 @@ class DaysUntilBirthdayUITests_iOS: XCTestCase { private let additionalAccessHeaderText = "Days Until Birthday wants additional access to your Google Account" private let appTrustWarningText = "Make sure you trust Days Until Birthday" private let chooseAnAccountHeaderText = "Choose an account" + private let nowNowText = "Not Now" private let timeout: TimeInterval = 5 private let sampleApp = XCUIApplication() @@ -163,12 +164,12 @@ extension DaysUntilBirthdayUITests_iOS { .staticTexts[passwordManagerPrompt] .waitForExistence(timeout: timeout) { guard sampleApp - .buttons["Not Now"] + .buttons[nowNowText] .waitForExistence(timeout: timeout) else { - XCTFail("Failed to find 'Not Now' button") + XCTFail(String(format: "Failed to find '%@' button", nowNowText)) return false } - sampleApp.buttons["Not Now"].tap() + sampleApp.buttons[nowNowText].tap() } // Proceed through sign-in disclaimer and/or access request view(s) if needed @@ -287,14 +288,14 @@ extension DaysUntilBirthdayUITests_iOS { } /// This method looks for an account in the current view that reflects an already-signed-in state, and taps it. - /// Returns true if the signed-in account was found and tapped, otherwise returns false. + /// - returns: true if the signed-in account was found and tapped, otherwise returns false. func findAndTapExistingSignedInEmail() -> Bool { guard sampleApp.staticTexts[Credential.email.rawValue].exists else { - XCTFail("Email used for previous sign-in not in list") + XCTFail(String(format: "Could not find %@ in list of previously-used accounts.", Credential.email.rawValue)) return false } guard sampleApp.staticTexts[Credential.email.rawValue].isHittable else { - XCTFail("Email used for previous sign-in not tappable") + XCTFail(String(format: "%@ used for previous sign-in not tappable", Credential.email.rawValue)) return false } sampleApp.staticTexts[Credential.email.rawValue].tap() From 898c5d4176cd6a17c31d7cad3df95ca25ed158ec Mon Sep 17 00:00:00 2001 From: Luis Delgado Date: Mon, 3 Jun 2024 19:25:13 -0400 Subject: [PATCH 3/3] Updated error messages and renamed static var --- .../DaysUntilBirthdayUITests_iOS.swift | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Samples/Swift/DaysUntilBirthday/DaysUntilBirthdayUITests(iOS)/DaysUntilBirthdayUITests_iOS.swift b/Samples/Swift/DaysUntilBirthday/DaysUntilBirthdayUITests(iOS)/DaysUntilBirthdayUITests_iOS.swift index b3a78720..7d05239f 100644 --- a/Samples/Swift/DaysUntilBirthday/DaysUntilBirthdayUITests(iOS)/DaysUntilBirthdayUITests_iOS.swift +++ b/Samples/Swift/DaysUntilBirthday/DaysUntilBirthdayUITests(iOS)/DaysUntilBirthdayUITests_iOS.swift @@ -26,7 +26,7 @@ class DaysUntilBirthdayUITests_iOS: XCTestCase { private let additionalAccessHeaderText = "Days Until Birthday wants additional access to your Google Account" private let appTrustWarningText = "Make sure you trust Days Until Birthday" private let chooseAnAccountHeaderText = "Choose an account" - private let nowNowText = "Not Now" + private let notNowText = "Not Now" private let timeout: TimeInterval = 5 private let sampleApp = XCUIApplication() @@ -164,12 +164,12 @@ extension DaysUntilBirthdayUITests_iOS { .staticTexts[passwordManagerPrompt] .waitForExistence(timeout: timeout) { guard sampleApp - .buttons[nowNowText] + .buttons[notNowText] .waitForExistence(timeout: timeout) else { - XCTFail(String(format: "Failed to find '%@' button", nowNowText)) + XCTFail("Failed to find \(notNowText) button") return false } - sampleApp.buttons[nowNowText].tap() + sampleApp.buttons[notNowText].tap() } // Proceed through sign-in disclaimer and/or access request view(s) if needed @@ -291,11 +291,11 @@ extension DaysUntilBirthdayUITests_iOS { /// - returns: true if the signed-in account was found and tapped, otherwise returns false. func findAndTapExistingSignedInEmail() -> Bool { guard sampleApp.staticTexts[Credential.email.rawValue].exists else { - XCTFail(String(format: "Could not find %@ in list of previously-used accounts.", Credential.email.rawValue)) + XCTFail("Email used for previous sign-in was not found.") return false } guard sampleApp.staticTexts[Credential.email.rawValue].isHittable else { - XCTFail(String(format: "%@ used for previous sign-in not tappable", Credential.email.rawValue)) + XCTFail("Email used for previous sign-in not tappable.") return false } sampleApp.staticTexts[Credential.email.rawValue].tap()