@react-native-firebase/app 26.3.3 → 27.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +75 -0
- package/README.md +10 -27
- package/RNFBApp.podspec +13 -5
- package/android/build.gradle +3 -0
- package/android/src/main/java/io/invertase/firebase/common/RNFBHandleCollisionException.kt +29 -0
- package/android/src/main/java/io/invertase/firebase/common/RNFBHandleMap.kt +146 -0
- package/android/src/main/java/io/invertase/firebase/common/TaskExecutorService.kt +156 -0
- package/android/src/main/java/io/invertase/firebase/common/UniversalFirebaseModule.kt +44 -0
- package/android/src/main/java/io/invertase/firebase/common/UniversalFirebasePreferences.kt +100 -0
- package/android/src/reactnative/java/io/invertase/firebase/app/NativeRNFBTurboApp.kt +250 -0
- package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseApp.kt +64 -0
- package/android/src/reactnative/java/io/invertase/firebase/app/{ReactNativeFirebaseAppInitProvider.java → ReactNativeFirebaseAppInitProvider.kt} +3 -4
- package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseAppPackage.kt +47 -0
- package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseAppRegistrar.kt +33 -0
- package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseVersion.java +1 -1
- package/android/src/reactnative/java/io/invertase/firebase/common/RCTConvertFirebase.kt +185 -0
- package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseEvent.kt +35 -0
- package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseEventEmitter.kt +662 -0
- package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseJSON.kt +103 -0
- package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseMeta.kt +96 -0
- package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseModule.kt +140 -0
- package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebasePreferences.kt +109 -0
- package/android/src/reactnative/java/io/invertase/firebase/common/SharedUtils.kt +451 -0
- package/android/src/reactnative/java/io/invertase/firebase/interfaces/{ContextProvider.java → ContextProvider.kt} +8 -8
- package/android/src/reactnative/java/io/invertase/firebase/interfaces/{NativeError.java → NativeError.kt} +8 -8
- package/android/src/reactnative/java/io/invertase/firebase/interfaces/{NativeEvent.java → NativeEvent.kt} +6 -6
- package/android/src/reactnative/java/io/invertase/firebase/utils/NativeRNFBTurboUtils.kt +219 -0
- package/android/src/test/java/expo/core/ModuleRegistry.java +9 -0
- package/android/src/test/java/io/invertase/firebase/app/NativeRNFBTurboAppTest.java +208 -60
- package/android/src/test/java/io/invertase/firebase/app/ReactNativeFirebaseAppComponentsJavaCompatibilityTest.java +70 -0
- package/android/src/test/java/io/invertase/firebase/app/ReactNativeFirebaseAppJavaCompatibilityTest.java +60 -0
- package/android/src/test/java/io/invertase/firebase/app/ReactNativeFirebaseAppPackageTest.java +165 -0
- package/android/src/test/java/io/invertase/firebase/app/ReactNativeFirebaseAppTest.kt +167 -0
- package/android/src/test/java/io/invertase/firebase/common/RCTConvertFirebaseJavaCompatibilityTest.java +112 -0
- package/android/src/test/java/io/invertase/firebase/common/RCTConvertFirebaseTest.kt +317 -0
- package/android/src/test/java/io/invertase/firebase/common/RNFBHandleMapTest.kt +309 -0
- package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseEventEmitterJavaCompatibilityTest.java +176 -0
- package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseEventEmitterTest.java +144 -13
- package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseEventTest.kt +61 -0
- package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseJSONJavaCompatibilityTest.java +85 -0
- package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseJSONTest.kt +296 -0
- package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseMetaJavaCompatibilityTest.java +67 -0
- package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseMetaTest.kt +246 -0
- package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseModuleTest.kt +254 -0
- package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebasePreferencesJavaCompatibilityTest.java +87 -0
- package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebasePreferencesTest.kt +260 -0
- package/android/src/test/java/io/invertase/firebase/common/SharedUtilsJavaCompatibilityTest.java +255 -0
- package/android/src/test/java/io/invertase/firebase/common/SharedUtilsTest.kt +674 -0
- package/android/src/test/java/io/invertase/firebase/common/TaskExecutorServiceTest.kt +290 -0
- package/android/src/test/java/io/invertase/firebase/common/UniversalFirebaseModuleJavaCompatibilityTest.java +178 -0
- package/android/src/test/java/io/invertase/firebase/common/UniversalFirebasePreferencesJavaCompatibilityTest.java +99 -0
- package/android/src/test/java/io/invertase/firebase/common/UniversalFirebasePreferencesTest.kt +217 -0
- package/android/src/test/java/io/invertase/firebase/commoncompat/ReactNativeFirebaseModuleJavaCompatibilityTest.java +176 -0
- package/android/src/test/java/io/invertase/firebase/commoncompat/ReactNativeFirebaseModuleKotlinCompatibilityTest.kt +52 -0
- package/android/src/test/java/io/invertase/firebase/interfaces/InterfacesJavaCompatibilityTest.java +144 -0
- package/android/src/test/java/io/invertase/firebase/interfaces/NativeEventTest.kt +56 -0
- package/android/src/test/java/io/invertase/firebase/utils/NativeRNFBTurboUtilsTest.java +517 -23
- package/dist/module/FirebaseApp.js +10 -0
- package/dist/module/FirebaseApp.js.map +1 -1
- package/dist/module/common/Base64.js +13 -21
- package/dist/module/common/Base64.js.map +1 -1
- package/dist/module/common/deeps.js +3 -0
- package/dist/module/common/deeps.js.map +1 -1
- package/dist/module/common/index.js +17 -9
- package/dist/module/common/index.js.map +1 -1
- package/dist/module/internal/FirebaseModule.js.map +1 -1
- package/dist/module/internal/RNFBNativeEventEmitter.js +12 -1
- package/dist/module/internal/RNFBNativeEventEmitter.js.map +1 -1
- package/dist/module/internal/SharedEventEmitter.js +3 -1
- package/dist/module/internal/SharedEventEmitter.js.map +1 -1
- package/dist/module/internal/asyncStorage.js +7 -11
- package/dist/module/internal/asyncStorage.js.map +1 -1
- package/dist/module/internal/index.js +1 -0
- package/dist/module/internal/index.js.map +1 -1
- package/dist/module/internal/logger.js +44 -40
- package/dist/module/internal/logger.js.map +1 -1
- package/dist/module/internal/nativeModuleAndroidIos.js +2 -29
- package/dist/module/internal/nativeModuleAndroidIos.js.map +1 -1
- package/dist/module/internal/nativeModuleDebug.js +74 -0
- package/dist/module/internal/nativeModuleDebug.js.map +1 -0
- package/dist/module/internal/nativeModuleWeb.js +9 -29
- package/dist/module/internal/nativeModuleWeb.js.map +1 -1
- package/dist/module/internal/registry/app.js +8 -2
- package/dist/module/internal/registry/app.js.map +1 -1
- package/dist/module/internal/registry/modular.js +2 -2
- package/dist/module/internal/registry/modular.js.map +1 -1
- package/dist/module/internal/registry/nativeModule.js +3 -3
- package/dist/module/internal/registry/nativeModule.js.map +1 -1
- package/dist/module/internal/web/RNFBAppModule.js +16 -15
- package/dist/module/internal/web/RNFBAppModule.js.map +1 -1
- package/dist/module/internal/web/memidb/lib/FakeEventTarget.js +3 -1
- package/dist/module/internal/web/memidb/lib/FakeEventTarget.js.map +1 -1
- package/dist/module/types/app.js.map +1 -1
- package/dist/module/types/internal.js +2 -0
- package/dist/module/version.js +1 -1
- package/dist/typescript/lib/FirebaseApp.d.ts +7 -0
- package/dist/typescript/lib/FirebaseApp.d.ts.map +1 -1
- package/dist/typescript/lib/common/Base64.d.ts.map +1 -1
- package/dist/typescript/lib/common/deeps.d.ts.map +1 -1
- package/dist/typescript/lib/common/index.d.ts.map +1 -1
- package/dist/typescript/lib/internal/FirebaseModule.d.ts +2 -3
- package/dist/typescript/lib/internal/FirebaseModule.d.ts.map +1 -1
- package/dist/typescript/lib/internal/NativeModules.d.ts +4 -1
- package/dist/typescript/lib/internal/NativeModules.d.ts.map +1 -1
- package/dist/typescript/lib/internal/RNFBNativeEventEmitter.d.ts +2 -2
- package/dist/typescript/lib/internal/RNFBNativeEventEmitter.d.ts.map +1 -1
- package/dist/typescript/lib/internal/SharedEventEmitter.d.ts +3 -3
- package/dist/typescript/lib/internal/SharedEventEmitter.d.ts.map +1 -1
- package/dist/typescript/lib/internal/asyncStorage.d.ts.map +1 -1
- package/dist/typescript/lib/internal/index.d.ts +1 -0
- package/dist/typescript/lib/internal/index.d.ts.map +1 -1
- package/dist/typescript/lib/internal/logger.d.ts.map +1 -1
- package/dist/typescript/lib/internal/nativeModuleAndroidIos.d.ts.map +1 -1
- package/dist/typescript/lib/internal/nativeModuleDebug.d.ts +2 -0
- package/dist/typescript/lib/internal/nativeModuleDebug.d.ts.map +1 -0
- package/dist/typescript/lib/internal/nativeModuleWeb.d.ts.map +1 -1
- package/dist/typescript/lib/internal/registry/app.d.ts.map +1 -1
- package/dist/typescript/lib/internal/web/RNFBAppModule.d.ts +7 -7
- package/dist/typescript/lib/internal/web/RNFBAppModule.d.ts.map +1 -1
- package/dist/typescript/lib/types/app.d.ts +10 -3
- package/dist/typescript/lib/types/app.d.ts.map +1 -1
- package/dist/typescript/lib/types/internal.d.ts +12 -0
- package/dist/typescript/lib/types/internal.d.ts.map +1 -1
- package/dist/typescript/lib/version.d.ts +1 -1
- package/firebase-schema.json +5 -1
- package/firebase_spm.rb +552 -96
- package/ios/RNFBApp/RCTConvert+FIRApp.h +2 -5
- package/ios/RNFBApp/RCTConvert+FIRApp.m +11 -6
- package/ios/RNFBApp/RCTConvert+FIROptions.h +2 -5
- package/ios/RNFBApp/RCTConvert+FIROptions.m +11 -10
- package/ios/RNFBApp/RCTConvertFIRApp.swift +86 -0
- package/ios/RNFBApp/RCTConvertFIROptions.swift +259 -0
- package/ios/RNFBApp/RNFBAppCustomAuthDomains.swift +63 -0
- package/ios/RNFBApp/RNFBAppInitializeOptionsMapper.swift +113 -0
- package/ios/RNFBApp/RNFBAppLogLevelMapper.swift +53 -0
- package/ios/RNFBApp/RNFBAppModule+CustomAuthDomain.m +35 -0
- package/ios/RNFBApp/RNFBAppModule.h +6 -2
- package/ios/RNFBApp/RNFBAppModule.mm +67 -204
- package/ios/RNFBApp/RNFBAppModuleFirebase.swift +439 -0
- package/ios/RNFBApp/RNFBAppModuleImplementation.h +68 -0
- package/ios/RNFBApp/RNFBAppModuleImplementation.m +195 -0
- package/ios/RNFBApp/RNFBHandleMap.h +73 -0
- package/ios/RNFBApp/RNFBHandleMap.m +87 -0
- package/ios/RNFBApp/RNFBHandleMapStorage.swift +90 -0
- package/ios/RNFBApp/RNFBInitializeAppArguments.swift +82 -0
- package/ios/RNFBApp/RNFBJSON.m +22 -38
- package/ios/RNFBApp/RNFBJSONImplementation.swift +71 -0
- package/ios/RNFBApp/RNFBMeta.m +24 -26
- package/ios/RNFBApp/RNFBMetaStorage.swift +76 -0
- package/ios/RNFBApp/RNFBNullSentinelDecoding.swift +135 -0
- package/ios/RNFBApp/RNFBNullSentinelInterceptor.h +30 -3
- package/ios/RNFBApp/RNFBNullSentinelInterceptor.m +28 -5
- package/ios/RNFBApp/RNFBPreferences.m +22 -20
- package/ios/RNFBApp/RNFBPreferencesStorage.swift +101 -0
- package/ios/RNFBApp/RNFBRCTEventEmitter.m +36 -93
- package/ios/RNFBApp/RNFBRCTEventEmitterCore.swift +161 -0
- package/ios/RNFBApp/RNFBSharedUtils.h +2 -5
- package/ios/RNFBApp/RNFBSharedUtils.m +109 -197
- package/ios/RNFBApp/RNFBSharedUtilsConfig.swift +72 -0
- package/ios/RNFBApp/RNFBSharedUtilsFIRApp.swift +271 -0
- package/ios/RNFBApp/RNFBSharedUtilsFormatting.swift +59 -0
- package/ios/RNFBApp/RNFBSharedUtilsPromiseRejection.swift +88 -0
- package/ios/RNFBApp/RNFBUtilsHelpers.swift +116 -0
- package/ios/RNFBApp/RNFBUtilsModule+Foundation.m +44 -0
- package/ios/RNFBApp/RNFBUtilsModule+PhotoAssets.m +47 -0
- package/ios/RNFBApp/RNFBUtilsModule.h +11 -1
- package/ios/RNFBApp/RNFBUtilsModule.mm +10 -85
- package/ios/RNFBApp/RNFBUtilsModuleImplementation.h +32 -0
- package/ios/RNFBApp/RNFBUtilsModuleImplementation.m +56 -0
- package/ios/RNFBApp/RNFBVersion.m +1 -1
- package/ios/RNFBApp.xcodeproj/project.pbxproj +106 -0
- package/ios/RNFBAppUnitTests/HostStubs/FirebaseCore/FIRApp.m +171 -0
- package/ios/RNFBAppUnitTests/HostStubs/FirebaseCore/FirebaseCore.h +78 -0
- package/ios/RNFBAppUnitTests/HostStubs/FirebaseInstallations/FIRInstallations.m +7 -0
- package/ios/RNFBAppUnitTests/HostStubs/FirebaseInstallations/FirebaseInstallations.h +8 -0
- package/ios/RNFBAppUnitTests/HostStubs/RNFBAppModuleHostStub.m +55 -0
- package/ios/RNFBAppUnitTests/HostStubs/RNFBAppTurboModules.h +89 -0
- package/ios/RNFBAppUnitTests/HostStubs/RNFBAppTurboModules.mm +30 -0
- package/ios/RNFBAppUnitTests/HostStubs/React/RCTBridge.h +19 -0
- package/ios/RNFBAppUnitTests/HostStubs/React/RCTBridge.m +32 -0
- package/ios/RNFBAppUnitTests/HostStubs/React/RCTBridgeModule.h +19 -0
- package/ios/RNFBAppUnitTests/HostStubs/React/RCTConvert.h +28 -0
- package/ios/RNFBAppUnitTests/HostStubs/React/RCTConvert.m +23 -0
- package/ios/RNFBAppUnitTests/HostStubs/React/RCTEventEmitter.h +9 -0
- package/ios/RNFBAppUnitTests/HostStubs/React/RCTInvalidating.h +24 -0
- package/ios/RNFBAppUnitTests/HostStubs/React/RCTUtils.h +9 -0
- package/ios/RNFBAppUnitTests/HostStubs/module.modulemap +13 -0
- package/ios/RNFBAppUnitTests/RCTConvertFIRAppFacadeTests.m +61 -0
- package/ios/RNFBAppUnitTests/RCTConvertFIRAppTests.swift +73 -0
- package/ios/RNFBAppUnitTests/RCTConvertFIROptionsFacadeTests.m +57 -0
- package/ios/RNFBAppUnitTests/RCTConvertFIROptionsTests.swift +243 -0
- package/ios/RNFBAppUnitTests/RNFBAppCustomAuthDomainsFacadeTests.m +73 -0
- package/ios/RNFBAppUnitTests/RNFBAppCustomAuthDomainsTests.swift +70 -0
- package/ios/RNFBAppUnitTests/RNFBAppInitializeOptionsMapperTests.swift +190 -0
- package/ios/RNFBAppUnitTests/RNFBAppLogLevelFacadeTests.m +76 -0
- package/ios/RNFBAppUnitTests/RNFBAppLogLevelMapperTests.swift +59 -0
- package/ios/RNFBAppUnitTests/RNFBAppModuleFirebaseFacadeTests.m +215 -0
- package/ios/RNFBAppUnitTests/RNFBAppModuleFirebaseTests.swift +430 -0
- package/ios/RNFBAppUnitTests/RNFBAppModuleLifecycleTests.m +206 -0
- package/ios/RNFBAppUnitTests/RNFBAppModuleShellTests.mm +367 -0
- package/ios/RNFBAppUnitTests/RNFBAppUnitTests.xcodeproj/project.pbxproj +590 -0
- package/ios/RNFBAppUnitTests/RNFBAppUnitTests.xcodeproj/xcshareddata/xcschemes/RNFBAppUnitTests.xcscheme +69 -0
- package/ios/RNFBAppUnitTests/RNFBFirebaseAppClientTests.swift +165 -0
- package/ios/RNFBAppUnitTests/RNFBHandleMapStorageTests.swift +121 -0
- package/ios/RNFBAppUnitTests/RNFBHandleMapTests.m +238 -0
- package/ios/RNFBAppUnitTests/RNFBInitializeAppArgumentsTests.swift +256 -0
- package/ios/RNFBAppUnitTests/RNFBJSONImplementationTests.swift +126 -0
- package/ios/RNFBAppUnitTests/RNFBJSONTests.m +172 -0
- package/ios/RNFBAppUnitTests/RNFBMetaStorageTests.swift +106 -0
- package/ios/RNFBAppUnitTests/RNFBMetaTests.m +65 -0
- package/ios/RNFBAppUnitTests/RNFBNullSentinelDecodingTests.swift +286 -0
- package/ios/RNFBAppUnitTests/RNFBNullSentinelInterceptorTests.m +312 -0
- package/ios/RNFBAppUnitTests/RNFBPreferencesStorageTests.swift +105 -0
- package/ios/RNFBAppUnitTests/RNFBPreferencesTests.m +110 -0
- package/ios/RNFBAppUnitTests/RNFBRCTEventEmitterCoreTests.swift +163 -0
- package/ios/RNFBAppUnitTests/RNFBRCTEventEmitterFacadeTests.m +141 -0
- package/ios/RNFBAppUnitTests/RNFBSharedUtilsConfigFacadeTests.m +100 -0
- package/ios/RNFBAppUnitTests/RNFBSharedUtilsConfigTests.swift +234 -0
- package/ios/RNFBAppUnitTests/RNFBSharedUtilsFIRAppFacadeTests.m +145 -0
- package/ios/RNFBAppUnitTests/RNFBSharedUtilsFIRAppTests.swift +173 -0
- package/ios/RNFBAppUnitTests/RNFBSharedUtilsFormattingFacadeTests.m +38 -0
- package/ios/RNFBAppUnitTests/RNFBSharedUtilsFormattingTests.swift +82 -0
- package/ios/RNFBAppUnitTests/RNFBSharedUtilsNullSentinelTests.m +35 -0
- package/ios/RNFBAppUnitTests/RNFBSharedUtilsPromiseRejectionFacadeTests.m +107 -0
- package/ios/RNFBAppUnitTests/RNFBSharedUtilsPromiseRejectionTests.swift +133 -0
- package/ios/RNFBAppUnitTests/RNFBUtilsHelpersTests.swift +144 -0
- package/ios/RNFBAppUnitTests/RNFBUtilsModuleFacadeTests.m +72 -0
- package/ios/RNFBAppUnitTests/RNFBUtilsModuleShellTests.mm +282 -0
- package/ios/RNFBFirebase/Package.swift +53 -0
- package/ios/RNFBFirebase/Sources/RNFBFirebase/RNFBFirebase.swift +285 -0
- package/ios/RNFBFirebase/Sources/RNFBFirebaseBridge/Public/.gitkeep +0 -0
- package/ios/RNFBFirebase/Sources/RNFBFirebaseBridge/RNFBFirebaseBridge.m +169 -0
- package/ios/RNFBFirebase/Sources/RNFBFirebaseBridge/include/RNFBFirebaseBridge.h +52 -0
- package/ios/RNFBFirebaseUnitTests/RNFBAppDynamicFacadeTests.swift +240 -0
- package/{android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseAppRegistrar.java → ios/RNFBFirebaseUnitTests/RNFBFirebaseClientImport.swift} +22 -17
- package/ios/RNFBFirebaseUnitTests/RNFBFirebaseUnitTests.xcodeproj/project.pbxproj +588 -0
- package/ios/RNFBFirebaseUnitTests/RNFBFirebaseUnitTests.xcodeproj/xcshareddata/xcschemes/RNFBFirebaseUnitTests.xcscheme +83 -0
- package/ios_config.sh +50 -22
- package/lib/FirebaseApp.ts +10 -0
- package/lib/common/Base64.ts +10 -16
- package/lib/common/deeps.ts +3 -0
- package/lib/common/index.ts +20 -9
- package/lib/internal/FirebaseModule.ts +6 -3
- package/lib/internal/NativeModules.ts +4 -1
- package/lib/internal/RNFBNativeEventEmitter.ts +14 -5
- package/lib/internal/SharedEventEmitter.ts +5 -1
- package/lib/internal/asyncStorage.ts +7 -11
- package/lib/internal/index.ts +1 -0
- package/lib/internal/logger.ts +53 -43
- package/lib/internal/nativeModuleAndroidIos.ts +2 -40
- package/lib/internal/nativeModuleDebug.ts +97 -0
- package/lib/internal/nativeModuleWeb.ts +10 -40
- package/lib/internal/react-native-vendor-emitter.d.ts +11 -0
- package/lib/internal/registry/app.ts +8 -2
- package/lib/internal/registry/modular.ts +2 -2
- package/lib/internal/registry/nativeModule.ts +3 -3
- package/lib/internal/web/RNFBAppModule.ts +16 -15
- package/lib/internal/web/memidb/lib/FakeEventTarget.js +3 -1
- package/lib/types/app.ts +10 -3
- package/lib/types/internal.ts +19 -0
- package/lib/version.ts +1 -1
- package/package.json +9 -8
- package/plugin/build/ios/appDelegate.js +19 -9
- package/plugin/build/ios/podfile.js +16 -16
- package/plugin/build/pluginConfig.d.ts +4 -2
- package/plugin/src/ios/appDelegate.ts +45 -15
- package/plugin/src/ios/podfile.ts +20 -23
- package/plugin/src/pluginConfig.ts +4 -2
- package/android/src/main/java/io/invertase/firebase/common/TaskExecutorService.java +0 -124
- package/android/src/main/java/io/invertase/firebase/common/UniversalFirebaseModule.java +0 -62
- package/android/src/main/java/io/invertase/firebase/common/UniversalFirebasePreferences.java +0 -91
- package/android/src/reactnative/java/io/invertase/firebase/app/NativeRNFBTurboApp.java +0 -222
- package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseApp.java +0 -46
- package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseAppPackage.java +0 -49
- package/android/src/reactnative/java/io/invertase/firebase/common/RCTConvertFirebase.java +0 -191
- package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseEvent.java +0 -53
- package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseEventEmitter.java +0 -606
- package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseJSON.java +0 -107
- package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseMeta.java +0 -101
- package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseModule.java +0 -146
- package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebasePreferences.java +0 -96
- package/android/src/reactnative/java/io/invertase/firebase/common/SharedUtils.java +0 -441
- package/android/src/reactnative/java/io/invertase/firebase/utils/NativeRNFBTurboUtils.java +0 -223
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2016-present Invertase Limited & Contributors
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this library except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import Foundation
|
|
18
|
+
import XCTest
|
|
19
|
+
|
|
20
|
+
final class RNFBPreferencesStorageTests: XCTestCase {
|
|
21
|
+
private var domainIdentifier: String!
|
|
22
|
+
private var userDefaults: UserDefaults!
|
|
23
|
+
private var storage: RNFBPreferencesStorage!
|
|
24
|
+
|
|
25
|
+
override func setUp() {
|
|
26
|
+
super.setUp()
|
|
27
|
+
domainIdentifier = "io.invertase.firebase.tests.\(UUID().uuidString)"
|
|
28
|
+
userDefaults = UserDefaults(suiteName: domainIdentifier)
|
|
29
|
+
userDefaults.removePersistentDomain(forName: domainIdentifier)
|
|
30
|
+
storage = RNFBPreferencesStorage(
|
|
31
|
+
userDefaults: userDefaults,
|
|
32
|
+
domainIdentifier: domainIdentifier
|
|
33
|
+
)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
override func tearDown() {
|
|
37
|
+
userDefaults.removePersistentDomain(forName: domainIdentifier)
|
|
38
|
+
storage = nil
|
|
39
|
+
userDefaults = nil
|
|
40
|
+
domainIdentifier = nil
|
|
41
|
+
super.tearDown()
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
func testMissingKeysUseDefaultsAndAreNotContained() {
|
|
45
|
+
XCTAssertFalse(storage.contains("missing"))
|
|
46
|
+
XCTAssertTrue(storage.getBooleanValue("missing", defaultValue: true))
|
|
47
|
+
XCTAssertEqual(storage.getIntegerValue("missing", defaultValue: Int.max), Int.max)
|
|
48
|
+
XCTAssertEqual(storage.getStringValue("missing", defaultValue: "fallback"), "fallback")
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
func testSettersAndGettersPreserveValuesAndDictionaryRepresentation() {
|
|
52
|
+
storage.setBooleanValue("bool", boolValue: true)
|
|
53
|
+
storage.setIntegerValue("integer", integerValue: Int.max)
|
|
54
|
+
storage.setStringValue("string", stringValue: "value")
|
|
55
|
+
|
|
56
|
+
XCTAssertTrue(storage.contains("bool"))
|
|
57
|
+
XCTAssertTrue(storage.getBooleanValue("bool", defaultValue: false))
|
|
58
|
+
XCTAssertEqual(storage.getIntegerValue("integer", defaultValue: 0), Int.max)
|
|
59
|
+
XCTAssertEqual(storage.getStringValue("string", defaultValue: "fallback"), "value")
|
|
60
|
+
|
|
61
|
+
let all = storage.getAll()
|
|
62
|
+
XCTAssertEqual(all["bool"] as? Bool, true)
|
|
63
|
+
XCTAssertEqual(all["integer"] as? Int, Int.max)
|
|
64
|
+
XCTAssertEqual(all["string"] as? String, "value")
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
func testStringForPresentNonStringValueMatchesNSUserDefaults() {
|
|
68
|
+
userDefaults.set(["value"], forKey: "notString")
|
|
69
|
+
|
|
70
|
+
XCTAssertTrue(storage.contains("notString"))
|
|
71
|
+
XCTAssertNil(storage.getStringValue("notString", defaultValue: "fallback"))
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
func testRemoveAndClearAllUseTheConfiguredPersistentDomain() {
|
|
75
|
+
storage.setStringValue("first", stringValue: "one")
|
|
76
|
+
storage.setStringValue("second", stringValue: "two")
|
|
77
|
+
|
|
78
|
+
storage.remove("first")
|
|
79
|
+
XCTAssertFalse(storage.contains("first"))
|
|
80
|
+
XCTAssertTrue(storage.contains("second"))
|
|
81
|
+
|
|
82
|
+
storage.clearAll()
|
|
83
|
+
XCTAssertFalse(storage.contains("second"))
|
|
84
|
+
let clearedDomain = userDefaults.persistentDomain(forName: domainIdentifier)
|
|
85
|
+
XCTAssertTrue(
|
|
86
|
+
clearedDomain == nil || clearedDomain?.isEmpty == true,
|
|
87
|
+
"clearAll must leave the persistent domain nil or empty; got \(String(describing: clearedDomain))"
|
|
88
|
+
)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
func testDefaultInitializerUsesRNFBPreferencesSuite() {
|
|
92
|
+
let suiteName = "io.invertase.firebase"
|
|
93
|
+
let productionDefaults = UserDefaults(suiteName: suiteName)!
|
|
94
|
+
let key = "RNFBPreferencesStorageTests.\(UUID().uuidString)"
|
|
95
|
+
productionDefaults.removeObject(forKey: key)
|
|
96
|
+
defer {
|
|
97
|
+
productionDefaults.removeObject(forKey: key)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
let productionStorage = RNFBPreferencesStorage()
|
|
101
|
+
productionStorage.setStringValue(key, stringValue: "suite-value")
|
|
102
|
+
|
|
103
|
+
XCTAssertEqual(productionDefaults.string(forKey: key), "suite-value")
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2016-present Invertase Limited & Contributors
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this library except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
#import <XCTest/XCTest.h>
|
|
18
|
+
|
|
19
|
+
#import "RNFBHandleMapStorage-Swift.inc"
|
|
20
|
+
#import "RNFBPreferences.h"
|
|
21
|
+
|
|
22
|
+
@interface RNFBPreferencesTests : XCTestCase
|
|
23
|
+
@property(nonatomic, strong) NSString *domainIdentifier;
|
|
24
|
+
@property(nonatomic, strong) NSUserDefaults *userDefaults;
|
|
25
|
+
@property(nonatomic, strong) RNFBPreferences *preferences;
|
|
26
|
+
@end
|
|
27
|
+
|
|
28
|
+
@implementation RNFBPreferencesTests
|
|
29
|
+
|
|
30
|
+
- (void)setUp {
|
|
31
|
+
[super setUp];
|
|
32
|
+
self.domainIdentifier =
|
|
33
|
+
[@"io.invertase.firebase.tests." stringByAppendingString:NSUUID.UUID.UUIDString];
|
|
34
|
+
self.userDefaults = [[NSUserDefaults alloc] initWithSuiteName:self.domainIdentifier];
|
|
35
|
+
[self.userDefaults removePersistentDomainForName:self.domainIdentifier];
|
|
36
|
+
RNFBPreferencesStorage *storage =
|
|
37
|
+
[[RNFBPreferencesStorage alloc] initWithUserDefaults:self.userDefaults
|
|
38
|
+
domainIdentifier:self.domainIdentifier];
|
|
39
|
+
self.preferences = [[RNFBPreferences alloc] init];
|
|
40
|
+
[self.preferences setValue:storage forKey:@"storage"];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
- (void)tearDown {
|
|
44
|
+
[self.userDefaults removePersistentDomainForName:self.domainIdentifier];
|
|
45
|
+
self.preferences = nil;
|
|
46
|
+
self.userDefaults = nil;
|
|
47
|
+
self.domainIdentifier = nil;
|
|
48
|
+
[super tearDown];
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
- (void)testSharedIsAvailableAndStable {
|
|
52
|
+
XCTAssertNotNil(RNFBPreferences.shared);
|
|
53
|
+
XCTAssertIdentical(RNFBPreferences.shared, RNFBPreferences.shared);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
- (void)testPublicSelectorsAndIntegerWidthsAreUnchanged {
|
|
57
|
+
NSArray<NSString *> *selectorNames = @[
|
|
58
|
+
@"contains:",
|
|
59
|
+
@"getBooleanValue:defaultValue:",
|
|
60
|
+
@"setBooleanValue:boolValue:",
|
|
61
|
+
@"setIntegerValue:integerValue:",
|
|
62
|
+
@"setStringValue:stringValue:",
|
|
63
|
+
@"getStringValue:defaultValue:",
|
|
64
|
+
@"getIntegerValue:defaultValue:",
|
|
65
|
+
@"getAll",
|
|
66
|
+
@"clearAll",
|
|
67
|
+
@"remove:",
|
|
68
|
+
];
|
|
69
|
+
for (NSString *selectorName in selectorNames) {
|
|
70
|
+
XCTAssertTrue([self.preferences respondsToSelector:NSSelectorFromString(selectorName)]);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
NSMethodSignature *setter =
|
|
74
|
+
[RNFBPreferences instanceMethodSignatureForSelector:@selector(setIntegerValue:integerValue:)];
|
|
75
|
+
XCTAssertEqual(strcmp([setter getArgumentTypeAtIndex:3], @encode(NSInteger)), 0);
|
|
76
|
+
|
|
77
|
+
NSMethodSignature *getter =
|
|
78
|
+
[RNFBPreferences instanceMethodSignatureForSelector:@selector(getIntegerValue:defaultValue:)];
|
|
79
|
+
XCTAssertEqual(strcmp(getter.methodReturnType, @encode(NSInteger)), 0);
|
|
80
|
+
XCTAssertEqual(strcmp([getter getArgumentTypeAtIndex:3], @encode(NSInteger)), 0);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
- (void)testFacadeForwardsEveryPreferenceOperation {
|
|
84
|
+
XCTAssertFalse([self.preferences contains:@"missing"]);
|
|
85
|
+
XCTAssertTrue([self.preferences getBooleanValue:@"missing" defaultValue:YES]);
|
|
86
|
+
XCTAssertEqual([self.preferences getIntegerValue:@"missing" defaultValue:NSIntegerMax],
|
|
87
|
+
NSIntegerMax);
|
|
88
|
+
XCTAssertEqualObjects([self.preferences getStringValue:@"missing" defaultValue:@"fallback"],
|
|
89
|
+
@"fallback");
|
|
90
|
+
|
|
91
|
+
[self.preferences setBooleanValue:@"bool" boolValue:YES];
|
|
92
|
+
[self.preferences setIntegerValue:@"integer" integerValue:NSIntegerMax];
|
|
93
|
+
[self.preferences setStringValue:@"string" stringValue:@"value"];
|
|
94
|
+
|
|
95
|
+
XCTAssertTrue([self.preferences contains:@"bool"]);
|
|
96
|
+
XCTAssertTrue([self.preferences getBooleanValue:@"bool" defaultValue:NO]);
|
|
97
|
+
XCTAssertEqual([self.preferences getIntegerValue:@"integer" defaultValue:0], NSIntegerMax);
|
|
98
|
+
XCTAssertEqualObjects([self.preferences getStringValue:@"string" defaultValue:@"fallback"],
|
|
99
|
+
@"value");
|
|
100
|
+
XCTAssertEqualObjects([self.preferences getAll][@"string"], @"value");
|
|
101
|
+
|
|
102
|
+
[self.preferences remove:@"bool"];
|
|
103
|
+
XCTAssertFalse([self.preferences contains:@"bool"]);
|
|
104
|
+
|
|
105
|
+
[self.preferences clearAll];
|
|
106
|
+
XCTAssertFalse([self.preferences contains:@"integer"]);
|
|
107
|
+
XCTAssertFalse([self.preferences contains:@"string"]);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
@end
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2016-present Invertase Limited & Contributors
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this library except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import Foundation
|
|
18
|
+
import XCTest
|
|
19
|
+
|
|
20
|
+
final class RNFBRCTEventEmitterCoreTests: XCTestCase {
|
|
21
|
+
private var bridgePresent = false
|
|
22
|
+
private var emitted: [(String, Any?)] = []
|
|
23
|
+
private var core: RNFBRCTEventEmitterCore!
|
|
24
|
+
|
|
25
|
+
override func setUp() {
|
|
26
|
+
super.setUp()
|
|
27
|
+
bridgePresent = false
|
|
28
|
+
emitted = []
|
|
29
|
+
core = RNFBRCTEventEmitterCore(
|
|
30
|
+
isBridgePresent: { [unowned self] in self.bridgePresent },
|
|
31
|
+
emitHandler: { [unowned self] name, body in
|
|
32
|
+
self.emitted.append((name, body))
|
|
33
|
+
}
|
|
34
|
+
)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
override func tearDown() {
|
|
38
|
+
core = nil
|
|
39
|
+
super.tearDown()
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
func testInvalidateResetsState() {
|
|
43
|
+
core.sendEvent(name: "a", body: ["x": 1])
|
|
44
|
+
core.addListener("a")
|
|
45
|
+
core.notifyJsReady(true)
|
|
46
|
+
|
|
47
|
+
core.invalidate()
|
|
48
|
+
|
|
49
|
+
let dict = core.getListenersDictionary()
|
|
50
|
+
XCTAssertEqual(dict["listeners"] as? Int, 0)
|
|
51
|
+
XCTAssertEqual(dict["queued"] as? Int, 0)
|
|
52
|
+
XCTAssertEqual((dict["events"] as? NSDictionary)?.count, 0)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
func testSendEventQueuesWhenNotReadyToEmit() {
|
|
56
|
+
core.sendEvent(name: "evt", body: ["k": "v"])
|
|
57
|
+
|
|
58
|
+
let dict = core.getListenersDictionary()
|
|
59
|
+
XCTAssertEqual(dict["queued"] as? Int, 1)
|
|
60
|
+
XCTAssertTrue(emitted.isEmpty)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
func testSendEventEmitsWhenBridgeObservingAndRegistered() {
|
|
64
|
+
bridgePresent = true
|
|
65
|
+
core.notifyJsReady(true)
|
|
66
|
+
core.addListener("evt")
|
|
67
|
+
emitted = []
|
|
68
|
+
|
|
69
|
+
core.sendEvent(name: "evt", body: ["k": "v"])
|
|
70
|
+
|
|
71
|
+
XCTAssertEqual(emitted.count, 1)
|
|
72
|
+
XCTAssertEqual(emitted[0].0, "evt")
|
|
73
|
+
XCTAssertEqual((emitted[0].1 as? NSDictionary)?["k"] as? String, "v")
|
|
74
|
+
XCTAssertEqual(core.getListenersDictionary()["queued"] as? Int, 0)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
func testNotifyJsReadyFlushesQueue() {
|
|
78
|
+
bridgePresent = true
|
|
79
|
+
core.addListener("evt")
|
|
80
|
+
core.sendEvent(name: "evt", body: ["k": 1])
|
|
81
|
+
emitted = []
|
|
82
|
+
|
|
83
|
+
core.notifyJsReady(true)
|
|
84
|
+
|
|
85
|
+
XCTAssertEqual(emitted.count, 1)
|
|
86
|
+
XCTAssertEqual(emitted[0].0, "evt")
|
|
87
|
+
XCTAssertEqual(core.getListenersDictionary()["queued"] as? Int, 0)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
func testAddListenerFlushesMatchingQueuedEvents() {
|
|
91
|
+
bridgePresent = true
|
|
92
|
+
core.notifyJsReady(true)
|
|
93
|
+
core.sendEvent(name: "evt", body: ["k": 1])
|
|
94
|
+
core.sendEvent(name: "other", body: ["k": 2])
|
|
95
|
+
emitted = []
|
|
96
|
+
|
|
97
|
+
core.addListener("evt")
|
|
98
|
+
|
|
99
|
+
XCTAssertEqual(emitted.count, 1)
|
|
100
|
+
XCTAssertEqual(emitted[0].0, "evt")
|
|
101
|
+
XCTAssertEqual(core.getListenersDictionary()["queued"] as? Int, 1)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
func testAddListenerIncrementsCounts() {
|
|
105
|
+
core.addListener("evt")
|
|
106
|
+
core.addListener("evt")
|
|
107
|
+
|
|
108
|
+
let dict = core.getListenersDictionary()
|
|
109
|
+
XCTAssertEqual(dict["listeners"] as? Int, 2)
|
|
110
|
+
XCTAssertEqual((dict["events"] as? NSDictionary)?["evt"] as? Int, 2)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
func testRemoveListenersDecrementsAndRemoves() {
|
|
114
|
+
core.addListener("evt")
|
|
115
|
+
core.addListener("evt")
|
|
116
|
+
|
|
117
|
+
core.removeListeners("evt", all: false)
|
|
118
|
+
XCTAssertEqual((core.getListenersDictionary()["events"] as? NSDictionary)?["evt"] as? Int, 1)
|
|
119
|
+
XCTAssertEqual(core.getListenersDictionary()["listeners"] as? Int, 1)
|
|
120
|
+
|
|
121
|
+
core.removeListeners("evt", all: false)
|
|
122
|
+
XCTAssertNil((core.getListenersDictionary()["events"] as? NSDictionary)?["evt"])
|
|
123
|
+
XCTAssertEqual(core.getListenersDictionary()["listeners"] as? Int, 0)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
func testRemoveListenersAllRemovesEntireCount() {
|
|
127
|
+
core.addListener("evt")
|
|
128
|
+
core.addListener("evt")
|
|
129
|
+
core.addListener("evt")
|
|
130
|
+
|
|
131
|
+
core.removeListeners("evt", all: true)
|
|
132
|
+
|
|
133
|
+
XCTAssertNil((core.getListenersDictionary()["events"] as? NSDictionary)?["evt"])
|
|
134
|
+
XCTAssertEqual(core.getListenersDictionary()["listeners"] as? Int, 0)
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
func testRemoveListenersNoOpWhenMissing() {
|
|
138
|
+
core.removeListeners("missing", all: true)
|
|
139
|
+
XCTAssertEqual(core.getListenersDictionary()["listeners"] as? Int, 0)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
func testSendEventWithNilBodyWhenEmitting() {
|
|
143
|
+
bridgePresent = true
|
|
144
|
+
core.notifyJsReady(true)
|
|
145
|
+
core.addListener("evt")
|
|
146
|
+
emitted = []
|
|
147
|
+
|
|
148
|
+
core.sendEvent(name: "evt", body: nil)
|
|
149
|
+
|
|
150
|
+
XCTAssertEqual(emitted.count, 1)
|
|
151
|
+
XCTAssertEqual(emitted[0].0, "evt")
|
|
152
|
+
XCTAssertNil(emitted[0].1)
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
func testIsObservingRequiresJsReady() {
|
|
156
|
+
bridgePresent = true
|
|
157
|
+
core.addListener("evt")
|
|
158
|
+
core.sendEvent(name: "evt", body: ["k": 1])
|
|
159
|
+
|
|
160
|
+
XCTAssertTrue(emitted.isEmpty)
|
|
161
|
+
XCTAssertEqual(core.getListenersDictionary()["queued"] as? Int, 1)
|
|
162
|
+
}
|
|
163
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2016-present Invertase Limited & Contributors
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this library except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
#import <XCTest/XCTest.h>
|
|
18
|
+
|
|
19
|
+
#import <React/RCTBridge.h>
|
|
20
|
+
#import "RNFBHandleMapStorage-Swift.inc"
|
|
21
|
+
#import "RNFBRCTEventEmitter.h"
|
|
22
|
+
|
|
23
|
+
@interface RNFBRCTEventEmitterFacadeTests : XCTestCase
|
|
24
|
+
@property(nonatomic, strong) RNFBRCTEventEmitter *emitter;
|
|
25
|
+
@property(nonatomic, strong) RCTBridge *bridge;
|
|
26
|
+
@end
|
|
27
|
+
|
|
28
|
+
@implementation RNFBRCTEventEmitterFacadeTests
|
|
29
|
+
|
|
30
|
+
- (void)setUp {
|
|
31
|
+
[super setUp];
|
|
32
|
+
self.emitter = [[RNFBRCTEventEmitter alloc] init];
|
|
33
|
+
self.bridge = [[RCTBridge alloc] init];
|
|
34
|
+
[self.emitter invalidate];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
- (void)tearDown {
|
|
38
|
+
[self.emitter invalidate];
|
|
39
|
+
self.emitter.bridge = nil;
|
|
40
|
+
self.emitter = nil;
|
|
41
|
+
self.bridge = nil;
|
|
42
|
+
[super tearDown];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
- (void)testSharedIsSingleton {
|
|
46
|
+
XCTAssertIdentical([RNFBRCTEventEmitter shared], [RNFBRCTEventEmitter shared]);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
- (void)testPublicSelectorsUnchanged {
|
|
50
|
+
NSArray<NSString *> *selectorNames = @[
|
|
51
|
+
@"invalidate",
|
|
52
|
+
@"addListener:",
|
|
53
|
+
@"removeListeners:all:",
|
|
54
|
+
@"sendEventWithName:body:",
|
|
55
|
+
@"notifyJsReady:",
|
|
56
|
+
@"getListenersDictionary",
|
|
57
|
+
];
|
|
58
|
+
for (NSString *selectorName in selectorNames) {
|
|
59
|
+
XCTAssertTrue([self.emitter respondsToSelector:NSSelectorFromString(selectorName)]);
|
|
60
|
+
}
|
|
61
|
+
XCTAssertTrue([RNFBRCTEventEmitter respondsToSelector:@selector(shared)]);
|
|
62
|
+
XCTAssertTrue([self.emitter respondsToSelector:@selector(bridge)]);
|
|
63
|
+
XCTAssertTrue([self.emitter respondsToSelector:@selector(setBridge:)]);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
- (void)testInvalidateResetsListenersAndQueue {
|
|
67
|
+
[self.emitter sendEventWithName:@"evt" body:@{@"a" : @1}];
|
|
68
|
+
[self.emitter addListener:@"evt"];
|
|
69
|
+
[self.emitter notifyJsReady:YES];
|
|
70
|
+
|
|
71
|
+
[self.emitter invalidate];
|
|
72
|
+
|
|
73
|
+
NSDictionary *dict = [self.emitter getListenersDictionary];
|
|
74
|
+
XCTAssertEqualObjects(dict[@"listeners"], @0);
|
|
75
|
+
XCTAssertEqualObjects(dict[@"queued"], @0);
|
|
76
|
+
XCTAssertEqual([dict[@"events"] count], 0u);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
- (void)testSendEventQueuesWithoutBridge {
|
|
80
|
+
[self.emitter notifyJsReady:YES];
|
|
81
|
+
[self.emitter addListener:@"evt"];
|
|
82
|
+
[self.emitter sendEventWithName:@"evt" body:@{@"a" : @1}];
|
|
83
|
+
|
|
84
|
+
NSDictionary *dict = [self.emitter getListenersDictionary];
|
|
85
|
+
XCTAssertEqualObjects(dict[@"queued"], @1);
|
|
86
|
+
XCTAssertNil(self.bridge.lastModule);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
- (void)testSendEventEmitsViaBridgeWhenReady {
|
|
90
|
+
self.emitter.bridge = self.bridge;
|
|
91
|
+
[self.emitter notifyJsReady:YES];
|
|
92
|
+
[self.emitter addListener:@"evt"];
|
|
93
|
+
[self.bridge resetLastJSCallForTesting];
|
|
94
|
+
|
|
95
|
+
[self.emitter sendEventWithName:@"evt" body:@{@"a" : @1}];
|
|
96
|
+
|
|
97
|
+
XCTAssertEqualObjects(self.bridge.lastModule, @"RCTDeviceEventEmitter");
|
|
98
|
+
XCTAssertEqualObjects(self.bridge.lastMethod, @"emit");
|
|
99
|
+
XCTAssertEqualObjects(self.bridge.lastArgs[0], @"rnfb_evt");
|
|
100
|
+
XCTAssertEqualObjects(self.bridge.lastArgs[1][@"a"], @1);
|
|
101
|
+
XCTAssertEqualObjects([self.emitter getListenersDictionary][@"queued"], @0);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
- (void)testSendEventEmitsNilBodyAsSingleArg {
|
|
105
|
+
self.emitter.bridge = self.bridge;
|
|
106
|
+
[self.emitter notifyJsReady:YES];
|
|
107
|
+
[self.emitter addListener:@"evt"];
|
|
108
|
+
[self.bridge resetLastJSCallForTesting];
|
|
109
|
+
|
|
110
|
+
[self.emitter sendEventWithName:@"evt" body:nil];
|
|
111
|
+
|
|
112
|
+
XCTAssertEqualObjects(self.bridge.lastArgs, (@[ @"rnfb_evt" ]));
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
- (void)testNotifyJsReadyFlushesQueuedEvents {
|
|
116
|
+
self.emitter.bridge = self.bridge;
|
|
117
|
+
[self.emitter addListener:@"evt"];
|
|
118
|
+
[self.emitter sendEventWithName:@"evt" body:@{@"a" : @1}];
|
|
119
|
+
[self.bridge resetLastJSCallForTesting];
|
|
120
|
+
|
|
121
|
+
[self.emitter notifyJsReady:YES];
|
|
122
|
+
|
|
123
|
+
XCTAssertEqualObjects(self.bridge.lastArgs[0], @"rnfb_evt");
|
|
124
|
+
XCTAssertEqualObjects([self.emitter getListenersDictionary][@"queued"], @0);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
- (void)testAddAndRemoveListeners {
|
|
128
|
+
[self.emitter addListener:@"evt"];
|
|
129
|
+
[self.emitter addListener:@"evt"];
|
|
130
|
+
XCTAssertEqualObjects([self.emitter getListenersDictionary][@"listeners"], @2);
|
|
131
|
+
XCTAssertEqualObjects([self.emitter getListenersDictionary][@"events"][@"evt"], @2);
|
|
132
|
+
|
|
133
|
+
[self.emitter removeListeners:@"evt" all:NO];
|
|
134
|
+
XCTAssertEqualObjects([self.emitter getListenersDictionary][@"events"][@"evt"], @1);
|
|
135
|
+
|
|
136
|
+
[self.emitter removeListeners:@"evt" all:YES];
|
|
137
|
+
XCTAssertNil([self.emitter getListenersDictionary][@"events"][@"evt"]);
|
|
138
|
+
XCTAssertEqualObjects([self.emitter getListenersDictionary][@"listeners"], @0);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
@end
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2016-present Invertase Limited & Contributors
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this library except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
#import <XCTest/XCTest.h>
|
|
18
|
+
|
|
19
|
+
#import "RNFBHandleMapStorage-Swift.inc"
|
|
20
|
+
#import "RNFBJSON.h"
|
|
21
|
+
#import "RNFBPreferences.h"
|
|
22
|
+
#import "RNFBSharedUtils.h"
|
|
23
|
+
|
|
24
|
+
@interface RNFBSharedUtilsConfigFacadeTests : XCTestCase
|
|
25
|
+
@end
|
|
26
|
+
|
|
27
|
+
@implementation RNFBSharedUtilsConfigFacadeTests
|
|
28
|
+
|
|
29
|
+
- (void)tearDown {
|
|
30
|
+
[[RNFBPreferences shared] remove:@"__rnfb_config_facade_prefs__"];
|
|
31
|
+
[[RNFBPreferences shared] remove:@"__rnfb_config_facade_bool__"];
|
|
32
|
+
[[RNFBPreferences shared] remove:@"__rnfb_config_facade_json_lose__"];
|
|
33
|
+
[super tearDown];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
- (void)testFacadeConfigContainsViaPreferences {
|
|
37
|
+
NSString *key = @"__rnfb_config_facade_prefs__";
|
|
38
|
+
XCTAssertFalse([RNFBSharedUtils configContains:key]);
|
|
39
|
+
|
|
40
|
+
[[RNFBPreferences shared] setBooleanValue:key boolValue:YES];
|
|
41
|
+
XCTAssertTrue([RNFBSharedUtils configContains:key]);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
- (void)testFacadeGetConfigBooleanValuePreferencesWins {
|
|
45
|
+
NSString *key = @"__rnfb_config_facade_bool__";
|
|
46
|
+
[[RNFBPreferences shared] setBooleanValue:key boolValue:YES];
|
|
47
|
+
|
|
48
|
+
XCTAssertTrue([RNFBSharedUtils getConfigBooleanValue:@"ConfigFacadeTests"
|
|
49
|
+
key:key
|
|
50
|
+
defaultValue:NO]);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
- (void)testFacadeGetConfigBooleanValueMetaPathUsesDefault {
|
|
54
|
+
NSString *key = @"__rnfb_config_facade_missing_everywhere__";
|
|
55
|
+
// Absent from Preferences / JSON / Meta → Meta path with passed-in defaultValue.
|
|
56
|
+
XCTAssertFalse([RNFBSharedUtils getConfigBooleanValue:@"ConfigFacadeTests"
|
|
57
|
+
key:key
|
|
58
|
+
defaultValue:NO]);
|
|
59
|
+
XCTAssertTrue([RNFBSharedUtils getConfigBooleanValue:@"ConfigFacadeTests"
|
|
60
|
+
key:key
|
|
61
|
+
defaultValue:YES]);
|
|
62
|
+
XCTAssertFalse([RNFBSharedUtils configContains:key]);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
- (void)testFacadeGetConfigBooleanValueJsonOverMeta {
|
|
66
|
+
NSString *key = @"__rnfb_config_facade_json_win__";
|
|
67
|
+
RNFBJSONImplementation *implementation =
|
|
68
|
+
[[RNFBJSONImplementation alloc] initWithJSONObject:@{key : @YES}];
|
|
69
|
+
|
|
70
|
+
// Temporarily swap the shared JSON implementation so the façade resolves JSON before Meta.
|
|
71
|
+
RNFBJSON *shared = [RNFBJSON shared];
|
|
72
|
+
id previous = [shared valueForKey:@"implementation"];
|
|
73
|
+
[shared setValue:implementation forKey:@"implementation"];
|
|
74
|
+
|
|
75
|
+
@try {
|
|
76
|
+
XCTAssertFalse([[RNFBPreferences shared] contains:key]);
|
|
77
|
+
XCTAssertTrue([RNFBSharedUtils configContains:key]);
|
|
78
|
+
XCTAssertTrue([RNFBSharedUtils getConfigBooleanValue:@"ConfigFacadeTests"
|
|
79
|
+
key:key
|
|
80
|
+
defaultValue:NO]);
|
|
81
|
+
} @finally {
|
|
82
|
+
[shared setValue:previous forKey:@"implementation"];
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
- (void)testFacadePublicSelectorsUnchanged {
|
|
87
|
+
XCTAssertTrue([RNFBSharedUtils respondsToSelector:@selector(configContains:)]);
|
|
88
|
+
XCTAssertTrue(
|
|
89
|
+
[RNFBSharedUtils respondsToSelector:@selector(getConfigBooleanValue:key:defaultValue:)]);
|
|
90
|
+
|
|
91
|
+
NSMethodSignature *contains =
|
|
92
|
+
[RNFBSharedUtils methodSignatureForSelector:@selector(configContains:)];
|
|
93
|
+
XCTAssertEqual(strcmp(contains.methodReturnType, @encode(BOOL)), 0);
|
|
94
|
+
|
|
95
|
+
NSMethodSignature *boolean = [RNFBSharedUtils
|
|
96
|
+
methodSignatureForSelector:@selector(getConfigBooleanValue:key:defaultValue:)];
|
|
97
|
+
XCTAssertEqual(strcmp(boolean.methodReturnType, @encode(BOOL)), 0);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
@end
|