Files
Schnappix/node_modules/expo-modules-core/ios/Tests/ExpoAppDelegateSubscriberManagerSpec.swift
T

345 lines
10 KiB
Swift

import Testing
import UIKit
@testable import ExpoModulesCore
// Mock subscriber for testing
class MockAppDelegateSubscriber: ExpoAppDelegateSubscriber {
var didCallDidBecomeActive = false
var didCallWillResignActive = false
var didCallDidEnterBackground = false
var didCallWillEnterForeground = false
var didCallWillTerminate = false
var didCallDidReceiveMemoryWarning = false
var didCallHandleBackgroundURLSession = false
var didCallDidRegisterForRemoteNotifications = false
var didCallDidFailToRegisterForRemoteNotifications = false
var didCallDidReceiveRemoteNotification = false
var didCallDidUpdateUserActivity = false
var didCallDidFailToContinueUserActivity = false
var didCallPerformActionForShortcut = false
var didCallPerformFetch = false
var didCallFinishLaunchingWithOptions = false
var didCallwillFinishLaunchingWithOptions = false
func application(
_ application: UIApplication,
willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
) -> Bool {
didCallwillFinishLaunchingWithOptions = true
return true
}
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
) -> Bool {
didCallFinishLaunchingWithOptions = true
return false // return value is ignored by ExpoAppDelegateSubscriberManager
}
func applicationDidBecomeActive(_ application: UIApplication) {
didCallDidBecomeActive = true
}
func applicationWillResignActive(_ application: UIApplication) {
didCallWillResignActive = true
}
func applicationDidEnterBackground(_ application: UIApplication) {
didCallDidEnterBackground = true
}
func applicationWillEnterForeground(_ application: UIApplication) {
didCallWillEnterForeground = true
}
func applicationWillTerminate(_ application: UIApplication) {
didCallWillTerminate = true
}
func applicationDidReceiveMemoryWarning(_ application: UIApplication) {
didCallDidReceiveMemoryWarning = true
}
func application(
_ application: UIApplication,
handleEventsForBackgroundURLSession identifier: String,
completionHandler: @escaping () -> Void
) {
didCallHandleBackgroundURLSession = true
completionHandler()
}
func application(
_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
) {
didCallDidRegisterForRemoteNotifications = true
}
func application(
_ application: UIApplication,
didFailToRegisterForRemoteNotificationsWithError error: Error
) {
didCallDidFailToRegisterForRemoteNotifications = true
}
func application(
_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable: Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void
) {
didCallDidReceiveRemoteNotification = true
completionHandler(.noData)
}
func application(
_ application: UIApplication,
willContinueUserActivityWithType userActivityType: String
) -> Bool {
return true
}
func application(
_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void
) -> Bool {
restorationHandler(nil)
return true
}
func application(_ application: UIApplication, didUpdate userActivity: NSUserActivity) {
didCallDidUpdateUserActivity = true
}
func application(
_ application: UIApplication,
didFailToContinueUserActivityWithType userActivityType: String,
error: Error
) {
didCallDidFailToContinueUserActivity = true
}
func application(
_ application: UIApplication,
performActionFor shortcutItem: UIApplicationShortcutItem,
completionHandler: @escaping (Bool) -> Void
) {
didCallPerformActionForShortcut = true
completionHandler(true)
}
func application(
_ application: UIApplication,
performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void
) {
didCallPerformFetch = true
completionHandler(.noData)
}
func application(
_ app: UIApplication,
open url: URL,
options: [UIApplication.OpenURLOptionsKey: Any] = [:]
) -> Bool {
return true
}
func application(
_ application: UIApplication,
supportedInterfaceOrientationsFor window: UIWindow?
) -> UIInterfaceOrientationMask {
return .portrait
}
}
@Suite
@MainActor
final class ExpoAppDelegateSubscriberManagerTests {
let subscriber = MockAppDelegateSubscriber()
init() {
ExpoAppDelegateSubscriberRepository.registerSubscriber(subscriber)
}
// MARK: - Non-void returning methods
@Test
func willFinishLaunchingWithOptions() {
let result = ExpoAppDelegateSubscriberManager.application(UIApplication.shared, willFinishLaunchingWithOptions: nil)
#expect(result == true) // NOTE: could also be true if no subscribers respond to selector
#expect(subscriber.didCallwillFinishLaunchingWithOptions == true)
}
@Test
func openURL() {
let url = URL(string: "https://example.com")!
let result = ExpoAppDelegateSubscriberManager.application(UIApplication.shared, open: url, options: [:])
#expect(result == true)
}
@Test
func supportedInterfaceOrientationsFor() {
let result = ExpoAppDelegateSubscriberManager.application(UIApplication.shared, supportedInterfaceOrientationsFor: nil)
#expect(result == .portrait)
}
@Test
func willContinueUserActivityWithType() {
let result = ExpoAppDelegateSubscriberManager.application(UIApplication.shared, willContinueUserActivityWithType: "test")
#expect(result == true)
}
@Test
func didFinishLaunchingWithOptions() {
let result = ExpoAppDelegateSubscriberManager.application(UIApplication.shared, didFinishLaunchingWithOptions: nil)
#expect(result == true) // always true
#expect(subscriber.didCallFinishLaunchingWithOptions == true)
}
// MARK: - Void-returning methods
@Test
func applicationDidBecomeActive() {
ExpoAppDelegateSubscriberManager.applicationDidBecomeActive(UIApplication.shared)
#expect(subscriber.didCallDidBecomeActive == true)
}
@Test
func applicationWillResignActive() {
ExpoAppDelegateSubscriberManager.applicationWillResignActive(UIApplication.shared)
#expect(subscriber.didCallWillResignActive == true)
}
@Test
func applicationDidEnterBackground() {
ExpoAppDelegateSubscriberManager.applicationDidEnterBackground(UIApplication.shared)
#expect(subscriber.didCallDidEnterBackground == true)
}
@Test
func applicationWillEnterForeground() {
ExpoAppDelegateSubscriberManager.applicationWillEnterForeground(UIApplication.shared)
#expect(subscriber.didCallWillEnterForeground == true)
}
@Test
func applicationWillTerminate() {
ExpoAppDelegateSubscriberManager.applicationWillTerminate(UIApplication.shared)
#expect(subscriber.didCallWillTerminate == true)
}
@Test
func applicationDidReceiveMemoryWarning() {
ExpoAppDelegateSubscriberManager.applicationDidReceiveMemoryWarning(UIApplication.shared)
#expect(subscriber.didCallDidReceiveMemoryWarning == true)
}
@Test
func didRegisterForRemoteNotificationsWithDeviceToken() {
let deviceToken = Data()
ExpoAppDelegateSubscriberManager.application(UIApplication.shared, didRegisterForRemoteNotificationsWithDeviceToken: deviceToken)
#expect(subscriber.didCallDidRegisterForRemoteNotifications == true)
}
@Test
func didFailToRegisterForRemoteNotificationsWithError() {
let error = NSError(domain: "test", code: 0)
ExpoAppDelegateSubscriberManager.application(UIApplication.shared, didFailToRegisterForRemoteNotificationsWithError: error)
#expect(subscriber.didCallDidFailToRegisterForRemoteNotifications == true)
}
@Test
func didUpdateUserActivity() {
let userActivity = NSUserActivity(activityType: "test")
ExpoAppDelegateSubscriberManager.application(UIApplication.shared, didUpdate: userActivity)
#expect(subscriber.didCallDidUpdateUserActivity == true)
}
@Test
func didFailToContinueUserActivityWithType() {
let error = NSError(domain: "test", code: 0)
ExpoAppDelegateSubscriberManager.application(
UIApplication.shared,
didFailToContinueUserActivityWithType: "test",
error: error
)
#expect(subscriber.didCallDidFailToContinueUserActivity == true)
}
// MARK: - Completion-handler-based methods
@Test
func handleEventsForBackgroundURLSession() async {
await withCheckedContinuation { continuation in
ExpoAppDelegateSubscriberManager.application(
UIApplication.shared,
handleEventsForBackgroundURLSession: "test-session",
completionHandler: {
#expect(self.subscriber.didCallHandleBackgroundURLSession == true)
continuation.resume()
}
)
}
}
@Test
func didReceiveRemoteNotification() async {
await withCheckedContinuation { continuation in
ExpoAppDelegateSubscriberManager.application(
UIApplication.shared,
didReceiveRemoteNotification: [:],
fetchCompletionHandler: { _ in
#expect(self.subscriber.didCallDidReceiveRemoteNotification == true)
continuation.resume()
}
)
}
}
@Test
func continueUserActivity() async {
await withCheckedContinuation { continuation in
let userActivity = NSUserActivity(activityType: NSUserActivityTypeBrowsingWeb)
let result = ExpoAppDelegateSubscriberManager.application(
UIApplication.shared,
continue: userActivity,
restorationHandler: { _ in
continuation.resume()
}
)
#expect(result == true)
}
}
@Test
func performActionForShortcut() async {
await withCheckedContinuation { continuation in
let shortcutItem = UIApplicationShortcutItem(type: "test", localizedTitle: "Test")
ExpoAppDelegateSubscriberManager.application(
UIApplication.shared,
performActionFor: shortcutItem,
completionHandler: { _ in
#expect(self.subscriber.didCallPerformActionForShortcut == true)
continuation.resume()
}
)
}
}
@Test
func performFetch() async {
await withCheckedContinuation { continuation in
ExpoAppDelegateSubscriberManager.application(
UIApplication.shared,
performFetchWithCompletionHandler: { _ in
#expect(self.subscriber.didCallPerformFetch == true)
continuation.resume()
}
)
}
}
}