diff --git a/.semaphore/semaphore.yml b/.semaphore/semaphore.yml index 0b6a12a72..313fdf31f 100644 --- a/.semaphore/semaphore.yml +++ b/.semaphore/semaphore.yml @@ -36,6 +36,7 @@ blocks: jobs: - name: Appium UI tests commands: + - xcversion select 13.4 - bundle exec fastlane build && ls -la appium - 'wget https://flowcrypt.s3.eu-central-1.amazonaws.com/release/flowcrypt-ios-old-version-for-ci-storage-compatibility-2022-05-09.zip -P ~/git/flowcrypt-ios/appium' - cd appium && npm run-script lint diff --git a/FlowCrypt.xcworkspace/xcshareddata/swiftpm/Package.resolved b/FlowCrypt.xcworkspace/xcshareddata/swiftpm/Package.resolved index cc43f543b..24fc3eea5 100644 --- a/FlowCrypt.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/FlowCrypt.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -41,8 +41,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/google/gtm-session-fetcher.git", "state" : { - "revision" : "eca9404a18f53727e4698211aaf2615eb93b962a", - "version" : "1.7.1" + "revision" : "4e9bbf2808b8fee444e84a48f5f3c12641987d3e", + "version" : "1.7.2" } }, { @@ -86,8 +86,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/realm/realm-cocoa", "state" : { - "revision" : "98024648651fff3d111a340e38fff3b703d1c3f0", - "version" : "10.25.1" + "revision" : "41fe221e2209ad31bee35593513d957dc3e6e458", + "version" : "10.25.2" } }, { @@ -95,8 +95,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/realm/realm-core", "state" : { - "revision" : "33dd84212b64cd0788590a93be0dde64d2869abb", - "version" : "11.14.0" + "revision" : "472d325a2e844fcb48c400db74e6b9646f92ca93", + "version" : "11.15.0" } }, { diff --git a/FlowCrypt/Controllers/Inbox/Container/InboxViewContainerController.swift b/FlowCrypt/Controllers/Inbox/Container/InboxViewContainerController.swift index c3f36a9f1..ea8a02b06 100644 --- a/FlowCrypt/Controllers/Inbox/Container/InboxViewContainerController.swift +++ b/FlowCrypt/Controllers/Inbox/Container/InboxViewContainerController.swift @@ -29,9 +29,10 @@ final class InboxViewContainerController: TableNodeViewController { case loadedFolders([FolderViewModel]) } - let appContext: AppContextWithUser - let foldersService: FoldersServiceType - let decorator: InboxViewControllerContainerDecorator + private let appContext: AppContextWithUser + private let foldersService: FoldersServiceType + private let decorator: InboxViewControllerContainerDecorator + private let ekmVcHelper: EKMVcHelper? private var state: State = .loading { didSet { handleNewState() } @@ -45,6 +46,8 @@ final class InboxViewContainerController: TableNodeViewController { self.appContext = appContext self.foldersService = foldersService ?? appContext.getFoldersService() self.decorator = decorator + self.ekmVcHelper = EKMVcHelper(appContext: appContext) + super.init(node: TableNode()) node.delegate = self node.dataSource = self @@ -106,6 +109,7 @@ final class InboxViewContainerController: TableNodeViewController { viewModel: input ) navigationController?.setViewControllers([inboxViewController], animated: false) + ekmVcHelper?.refreshKeysFromEKMIfNeeded(in: inboxViewController) } } diff --git a/FlowCrypt/Controllers/Inbox/InboxViewController.swift b/FlowCrypt/Controllers/Inbox/InboxViewController.swift index 99ec36836..2ff9d1e37 100644 --- a/FlowCrypt/Controllers/Inbox/InboxViewController.swift +++ b/FlowCrypt/Controllers/Inbox/InboxViewController.swift @@ -33,8 +33,8 @@ class InboxViewController: ViewController { var path: String { viewModel.path } // Search related varaibles - internal var isSearch: Bool = false - internal var searchedExpression: String = "" + internal var isSearch = false + internal var searchedExpression = "" var shouldBeginFetch = true init( diff --git a/FlowCrypt/Controllers/SideMenu/Main/SideMenuNavigationController.swift b/FlowCrypt/Controllers/SideMenu/Main/SideMenuNavigationController.swift index 9a6fc18a6..bdf987a31 100644 --- a/FlowCrypt/Controllers/SideMenu/Main/SideMenuNavigationController.swift +++ b/FlowCrypt/Controllers/SideMenu/Main/SideMenuNavigationController.swift @@ -46,19 +46,17 @@ final class SideMenuNavigationController: ENSideMenuNavigationController { self?.hideMenu() } - private var menuViewContoller: SideMenuViewController? + private var menuViewController: SideMenuViewController? convenience init(appContext: AppContextWithUser, contentViewController: UIViewController) { let menu = MyMenuViewController(appContext: appContext) self.init(menuViewController: menu, contentViewController: contentViewController) - menuViewContoller = menu + menuViewController = menu sideMenu = ENSideMenu(sourceView: view, menuViewController: menu, menuPosition: .left).then { $0.bouncingEnabled = false $0.delegate = self $0.animationDuration = Constants.animationDuration } - let ekmVcHelper = EKMVcHelper(appContext: appContext) - ekmVcHelper.refreshKeysFromEKMIfNeeded(in: self) } override func viewDidLoad() { @@ -124,7 +122,7 @@ extension SideMenuNavigationController: ENSideMenuDelegate { isStatusBarHidden = true setNeedsStatusBarAppearanceUpdate() gestureView.frame = view.frame - menuViewContoller?.didOpen() + menuViewController?.didOpen() } } diff --git a/FlowCrypt/Functionality/Services/EKMVcHelper.swift b/FlowCrypt/Functionality/Services/EKMVcHelper.swift index 970aa3830..b7575d442 100644 --- a/FlowCrypt/Functionality/Services/EKMVcHelper.swift +++ b/FlowCrypt/Functionality/Services/EKMVcHelper.swift @@ -28,11 +28,6 @@ final class EKMVcHelper: EKMVcHelperType { func refreshKeysFromEKMIfNeeded(in viewController: UIViewController) { Task { do { - // Sleep for 3 seconds when mock testing - // (This is to prevent refresh key UI test failure in semaphoreCI) - if Bundle.isMockDebugBundle { - try await Task.sleep(nanoseconds: 3 * 1000 * 1_000_000) - } let configuration = try await appContext.clientConfigurationService.configuration guard configuration.checkUsesEKM() == .usesEKM else { return @@ -87,7 +82,9 @@ final class EKMVcHelper: EKMVcHelperType { private func findKeysToUpdate(from keyDetails: [KeyDetails], localKeys: [Keypair]) throws -> [KeyDetails] { var keysToUpdate: [KeyDetails] = [] for keyDetail in keyDetails { - guard keyDetail.isFullyDecrypted ?? false else { throw EmailKeyManagerApiError.keysAreUnexpectedlyEncrypted } + guard keyDetail.isFullyDecrypted ?? false else { + throw EmailKeyManagerApiError.keysAreUnexpectedlyEncrypted + } guard let keyLastModified = keyDetail.lastModified else { throw EmailKeyManagerApiError.keysAreInvalid } diff --git a/appium/config/wdio.live.conf.js b/appium/config/wdio.live.conf.js index bf6378a54..a0c648df5 100644 --- a/appium/config/wdio.live.conf.js +++ b/appium/config/wdio.live.conf.js @@ -29,7 +29,7 @@ config.capabilities = [ platformName: 'iOS', iosInstallPause: 5000, deviceName: 'iPhone 13', - platformVersion: '15.4', + platformVersion: '15.5', automationName: 'XCUITest', app: join(process.cwd(), './FlowCrypt.app'), simpleIsVisibleCheck: true, diff --git a/appium/config/wdio.mock.conf.js b/appium/config/wdio.mock.conf.js index 1730b0a60..83c856d16 100644 --- a/appium/config/wdio.mock.conf.js +++ b/appium/config/wdio.mock.conf.js @@ -14,7 +14,7 @@ config.capabilities = [ platformName: 'iOS', iosInstallPause: 5000, deviceName: 'iPhone 13', - platformVersion: '15.4', + platformVersion: '15.5', automationName: 'XCUITest', app: join(process.cwd(), './FlowCrypt.app'), processArguments: { 'args': ['--mock-fes-api', '--mock-attester-api'] }, diff --git a/appium/tests/helpers/AppiumHelper.ts b/appium/tests/helpers/AppiumHelper.ts index 770dc9ffd..fd2623e03 100644 --- a/appium/tests/helpers/AppiumHelper.ts +++ b/appium/tests/helpers/AppiumHelper.ts @@ -7,6 +7,7 @@ class AppiumHelper { static async restartApp(processArgs: string[] = []) { const bundleId = CommonData.bundleId.id; await driver.terminateApp(bundleId); + await driver.pause(1500); const args = { bundleId, arguments: processArgs