UI test fixes (#335)

* Remove status bars when running UITests
* Remove simulator OS versions from screenshot names, be less lenient with image diffing
* Rename UITests splash screen to onboarding
* Switch tests to Xcode 14.1, remove version names for used simulators and switched from iPhone 13 Pro Max to iPhone 14
* Fix ServiceLocator and fallbackLaguage for UI tests
* Drop snapshot diffing precision to 0.99 as 0.999 triggers false negatives
* Fix server selection UI tests after exposing the sliding sync proxy configuration
* Update reference screenshots
This commit is contained in:
Stefan Ceriu
2022-11-24 10:35:00 +02:00
committed by GitHub
parent e22c038a0f
commit 1102580d6c
206 changed files with 368 additions and 467 deletions
@@ -18,19 +18,6 @@ import Combine
import MatrixRustSDK
import SwiftUI
struct ServiceLocator {
fileprivate static var serviceLocator: ServiceLocator?
static var shared: ServiceLocator {
guard let serviceLocator else {
fatalError("The service locator should be setup at this point")
}
return serviceLocator
}
let userNotificationController: UserNotificationControllerProtocol
}
class AppCoordinator: AppCoordinatorProtocol {
private let stateMachine: AppCoordinatorStateMachine
private let navigationController: NavigationController
@@ -63,7 +50,7 @@ class AppCoordinator: AppCoordinatorProtocol {
navigationController.setRootCoordinator(SplashScreenCoordinator())
ServiceLocator.serviceLocator = ServiceLocator(userNotificationController: UserNotificationController(rootCoordinator: navigationController))
ServiceLocator.shared.register(userNotificationController: UserNotificationController(rootCoordinator: navigationController))
backgroundTaskService = UIKitBackgroundTaskService(withApplication: UIApplication.shared)
@@ -39,7 +39,12 @@ struct Application: App {
.task {
applicationCoordinator.start()
}
.statusBarHidden(shouldHideStatusBar)
}
}
}
private var shouldHideStatusBar: Bool {
Tests.isRunningUITests
}
}
@@ -0,0 +1,29 @@
//
// Copyright 2022 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import Foundation
class ServiceLocator {
private(set) static var shared = ServiceLocator()
private init() { }
private(set) var userNotificationController: UserNotificationControllerProtocol!
func register(userNotificationController: UserNotificationControllerProtocol) {
self.userNotificationController = userNotificationController
}
}
@@ -29,7 +29,7 @@ enum UITestScreenIdentifier: String {
case settings
case bugReport
case bugReportWithScreenshot
case splash
case onboarding
case roomPlainNoAvatar
case roomEncryptedWithAvatar
case sessionVerification
@@ -18,11 +18,14 @@ import SwiftUI
import UIKit
class UITestsAppCoordinator: AppCoordinatorProtocol {
private var currentRootCoordinator: CoordinatorProtocol?
private let navigationController: NavigationController
let notificationManager: NotificationManagerProtocol? = nil
init() {
navigationController = NavigationController()
ServiceLocator.shared.register(userNotificationController: MockUserNotificationController())
}
func start() {
@@ -31,11 +34,17 @@ class UITestsAppCoordinator: AppCoordinatorProtocol {
guard let screen = screens.first(where: { $0.id == id }) else {
fatalError()
}
// Store the initial coordinator so that it stays alive if drops it
// For example when replacing the root in the authentication flows
self.currentRootCoordinator = screen.coordinator
self.navigationController.setRootCoordinator(screen.coordinator)
}
navigationController.setRootCoordinator(rootCoordinator)
Bundle.elementFallbackLanguage = "en"
}
func toPresentable() -> AnyView {
@@ -105,7 +114,7 @@ class MockScreen: Identifiable {
userNotificationController: MockUserNotificationController(),
screenshot: Asset.Images.appLogo.image,
isModallyPresented: false))
case .splash:
case .onboarding:
return OnboardingCoordinator()
case .roomPlainNoAvatar:
let parameters = RoomScreenCoordinatorParameters(navigationController: navigationController,