@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,234 @@
|
|
|
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
|
+
private final class RecordingConfigSource: NSObject, RNFBConfigBooleanProviding {
|
|
21
|
+
var containsCalls: [String] = []
|
|
22
|
+
var getBooleanCalls: [(key: String, defaultValue: Bool)] = []
|
|
23
|
+
var containsResult = false
|
|
24
|
+
var booleanResult = false
|
|
25
|
+
/// When true, `getBooleanValue` returns the passed-in `defaultValue` (Meta missing-key path).
|
|
26
|
+
var echoDefaultValue = false
|
|
27
|
+
|
|
28
|
+
func contains(_ key: String) -> Bool {
|
|
29
|
+
containsCalls.append(key)
|
|
30
|
+
return containsResult
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
func getBooleanValue(_ key: String, defaultValue: Bool) -> Bool {
|
|
34
|
+
getBooleanCalls.append((key, defaultValue))
|
|
35
|
+
if echoDefaultValue {
|
|
36
|
+
return defaultValue
|
|
37
|
+
}
|
|
38
|
+
return booleanResult
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
final class RNFBSharedUtilsConfigTests: XCTestCase {
|
|
43
|
+
private let key = "rnfb.config.waterfall.test"
|
|
44
|
+
|
|
45
|
+
func testConfigContainsIsOrOfPreferencesJsonMeta() {
|
|
46
|
+
let preferences = RecordingConfigSource()
|
|
47
|
+
let json = RecordingConfigSource()
|
|
48
|
+
let meta = RecordingConfigSource()
|
|
49
|
+
|
|
50
|
+
preferences.containsResult = false
|
|
51
|
+
json.containsResult = false
|
|
52
|
+
meta.containsResult = false
|
|
53
|
+
XCTAssertFalse(
|
|
54
|
+
RNFBSharedUtilsConfig.configContains(
|
|
55
|
+
key,
|
|
56
|
+
preferences: preferences,
|
|
57
|
+
json: json,
|
|
58
|
+
meta: meta
|
|
59
|
+
)
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
meta.containsResult = true
|
|
63
|
+
XCTAssertTrue(
|
|
64
|
+
RNFBSharedUtilsConfig.configContains(
|
|
65
|
+
key,
|
|
66
|
+
preferences: preferences,
|
|
67
|
+
json: json,
|
|
68
|
+
meta: meta
|
|
69
|
+
)
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
json.containsResult = true
|
|
73
|
+
meta.containsResult = false
|
|
74
|
+
XCTAssertTrue(
|
|
75
|
+
RNFBSharedUtilsConfig.configContains(
|
|
76
|
+
key,
|
|
77
|
+
preferences: preferences,
|
|
78
|
+
json: json,
|
|
79
|
+
meta: meta
|
|
80
|
+
)
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
preferences.containsResult = true
|
|
84
|
+
json.containsResult = false
|
|
85
|
+
XCTAssertTrue(
|
|
86
|
+
RNFBSharedUtilsConfig.configContains(
|
|
87
|
+
key,
|
|
88
|
+
preferences: preferences,
|
|
89
|
+
json: json,
|
|
90
|
+
meta: meta
|
|
91
|
+
)
|
|
92
|
+
)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
func testConfigContainsShortCircuitsLeftToRight() {
|
|
96
|
+
let preferences = RecordingConfigSource()
|
|
97
|
+
let json = RecordingConfigSource()
|
|
98
|
+
let meta = RecordingConfigSource()
|
|
99
|
+
preferences.containsResult = true
|
|
100
|
+
|
|
101
|
+
XCTAssertTrue(
|
|
102
|
+
RNFBSharedUtilsConfig.configContains(
|
|
103
|
+
key,
|
|
104
|
+
preferences: preferences,
|
|
105
|
+
json: json,
|
|
106
|
+
meta: meta
|
|
107
|
+
)
|
|
108
|
+
)
|
|
109
|
+
XCTAssertEqual(preferences.containsCalls, [key])
|
|
110
|
+
XCTAssertTrue(json.containsCalls.isEmpty)
|
|
111
|
+
XCTAssertTrue(meta.containsCalls.isEmpty)
|
|
112
|
+
|
|
113
|
+
preferences.containsResult = false
|
|
114
|
+
json.containsResult = true
|
|
115
|
+
preferences.containsCalls.removeAll()
|
|
116
|
+
json.containsCalls.removeAll()
|
|
117
|
+
meta.containsCalls.removeAll()
|
|
118
|
+
|
|
119
|
+
XCTAssertTrue(
|
|
120
|
+
RNFBSharedUtilsConfig.configContains(
|
|
121
|
+
key,
|
|
122
|
+
preferences: preferences,
|
|
123
|
+
json: json,
|
|
124
|
+
meta: meta
|
|
125
|
+
)
|
|
126
|
+
)
|
|
127
|
+
XCTAssertEqual(preferences.containsCalls, [key])
|
|
128
|
+
XCTAssertEqual(json.containsCalls, [key])
|
|
129
|
+
XCTAssertTrue(meta.containsCalls.isEmpty)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
func testGetConfigBooleanValuePreferencesWinsOverJsonAndMeta() {
|
|
133
|
+
let preferences = RecordingConfigSource()
|
|
134
|
+
let json = RecordingConfigSource()
|
|
135
|
+
let meta = RecordingConfigSource()
|
|
136
|
+
preferences.containsResult = true
|
|
137
|
+
preferences.booleanResult = true
|
|
138
|
+
json.containsResult = true
|
|
139
|
+
json.booleanResult = false
|
|
140
|
+
meta.containsResult = true
|
|
141
|
+
meta.booleanResult = false
|
|
142
|
+
|
|
143
|
+
XCTAssertTrue(
|
|
144
|
+
RNFBSharedUtilsConfig.getConfigBooleanValue(
|
|
145
|
+
forKey: key,
|
|
146
|
+
defaultValue: false,
|
|
147
|
+
preferences: preferences,
|
|
148
|
+
json: json,
|
|
149
|
+
meta: meta
|
|
150
|
+
)
|
|
151
|
+
)
|
|
152
|
+
XCTAssertEqual(preferences.getBooleanCalls.count, 1)
|
|
153
|
+
XCTAssertTrue(json.getBooleanCalls.isEmpty)
|
|
154
|
+
XCTAssertTrue(meta.getBooleanCalls.isEmpty)
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
func testGetConfigBooleanValueJsonWinsOverMeta() {
|
|
158
|
+
let preferences = RecordingConfigSource()
|
|
159
|
+
let json = RecordingConfigSource()
|
|
160
|
+
let meta = RecordingConfigSource()
|
|
161
|
+
preferences.containsResult = false
|
|
162
|
+
json.containsResult = true
|
|
163
|
+
json.booleanResult = true
|
|
164
|
+
meta.containsResult = true
|
|
165
|
+
meta.booleanResult = false
|
|
166
|
+
|
|
167
|
+
XCTAssertTrue(
|
|
168
|
+
RNFBSharedUtilsConfig.getConfigBooleanValue(
|
|
169
|
+
forKey: key,
|
|
170
|
+
defaultValue: false,
|
|
171
|
+
preferences: preferences,
|
|
172
|
+
json: json,
|
|
173
|
+
meta: meta
|
|
174
|
+
)
|
|
175
|
+
)
|
|
176
|
+
XCTAssertTrue(preferences.getBooleanCalls.isEmpty)
|
|
177
|
+
XCTAssertEqual(json.getBooleanCalls.count, 1)
|
|
178
|
+
XCTAssertTrue(meta.getBooleanCalls.isEmpty)
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
func testGetConfigBooleanValueMetaPathUsesPassedInDefault() {
|
|
182
|
+
let preferences = RecordingConfigSource()
|
|
183
|
+
let json = RecordingConfigSource()
|
|
184
|
+
let meta = RecordingConfigSource()
|
|
185
|
+
preferences.containsResult = false
|
|
186
|
+
json.containsResult = false
|
|
187
|
+
// Meta missing-key path forwards the caller defaultValue.
|
|
188
|
+
meta.echoDefaultValue = true
|
|
189
|
+
|
|
190
|
+
XCTAssertTrue(
|
|
191
|
+
RNFBSharedUtilsConfig.getConfigBooleanValue(
|
|
192
|
+
forKey: key,
|
|
193
|
+
defaultValue: true,
|
|
194
|
+
preferences: preferences,
|
|
195
|
+
json: json,
|
|
196
|
+
meta: meta
|
|
197
|
+
)
|
|
198
|
+
)
|
|
199
|
+
XCTAssertFalse(
|
|
200
|
+
RNFBSharedUtilsConfig.getConfigBooleanValue(
|
|
201
|
+
forKey: key,
|
|
202
|
+
defaultValue: false,
|
|
203
|
+
preferences: preferences,
|
|
204
|
+
json: json,
|
|
205
|
+
meta: meta
|
|
206
|
+
)
|
|
207
|
+
)
|
|
208
|
+
XCTAssertEqual(meta.getBooleanCalls.count, 2)
|
|
209
|
+
XCTAssertEqual(meta.getBooleanCalls[0].defaultValue, true)
|
|
210
|
+
XCTAssertEqual(meta.getBooleanCalls[1].defaultValue, false)
|
|
211
|
+
XCTAssertTrue(preferences.getBooleanCalls.isEmpty)
|
|
212
|
+
XCTAssertTrue(json.getBooleanCalls.isEmpty)
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
func testGetConfigBooleanValueMetaPathReturnsSourceValue() {
|
|
216
|
+
let preferences = RecordingConfigSource()
|
|
217
|
+
let json = RecordingConfigSource()
|
|
218
|
+
let meta = RecordingConfigSource()
|
|
219
|
+
preferences.containsResult = false
|
|
220
|
+
json.containsResult = false
|
|
221
|
+
meta.booleanResult = true
|
|
222
|
+
|
|
223
|
+
XCTAssertTrue(
|
|
224
|
+
RNFBSharedUtilsConfig.getConfigBooleanValue(
|
|
225
|
+
forKey: key,
|
|
226
|
+
defaultValue: false,
|
|
227
|
+
preferences: preferences,
|
|
228
|
+
json: json,
|
|
229
|
+
meta: meta
|
|
230
|
+
)
|
|
231
|
+
)
|
|
232
|
+
XCTAssertEqual(meta.getBooleanCalls[0].defaultValue, false)
|
|
233
|
+
}
|
|
234
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
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
|
+
|
|
21
|
+
#import "FirebaseCore/FirebaseCore.h"
|
|
22
|
+
#import "RNFBAppModule.h"
|
|
23
|
+
#import "RNFBHandleMapStorage-Swift.inc"
|
|
24
|
+
#import "RNFBRCTEventEmitter.h"
|
|
25
|
+
#import "RNFBSharedUtils.h"
|
|
26
|
+
|
|
27
|
+
@interface RNFBAppModule (Testing)
|
|
28
|
+
+ (void)setCustomDomainForTesting:(NSString *)domain forAppName:(NSString *)appName;
|
|
29
|
+
+ (void)resetCustomDomainsForTesting;
|
|
30
|
+
@end
|
|
31
|
+
|
|
32
|
+
@interface RNFBSharedUtilsFIRAppFacadeTests : XCTestCase
|
|
33
|
+
@end
|
|
34
|
+
|
|
35
|
+
@implementation RNFBSharedUtilsFIRAppFacadeTests
|
|
36
|
+
|
|
37
|
+
- (FIROptions *)fullyPopulatedOptions {
|
|
38
|
+
FIROptions *options = [[FIROptions alloc] init];
|
|
39
|
+
options.APIKey = @"api-key";
|
|
40
|
+
options.googleAppID = @"app-id";
|
|
41
|
+
options.projectID = @"project-id";
|
|
42
|
+
options.databaseURL = @"https://example.firebaseio.com";
|
|
43
|
+
options.storageBucket = @"example.appspot.com";
|
|
44
|
+
options.GCMSenderID = @"sender-id";
|
|
45
|
+
options.clientID = @"client-id";
|
|
46
|
+
return options;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
- (void)tearDown {
|
|
50
|
+
[RNFBAppModule resetCustomDomainsForTesting];
|
|
51
|
+
RNFBRCTEventEmitter *emitter = [RNFBRCTEventEmitter shared];
|
|
52
|
+
// Rebuild a core whose bridge/emit closures capture *shared*, not a disposable
|
|
53
|
+
// template (stealing template.core leaves dangling weakSelf → permanent queue-only).
|
|
54
|
+
__weak RNFBRCTEventEmitter *weakEmitter = emitter;
|
|
55
|
+
RNFBRCTEventEmitterCore *restoredCore = [[RNFBRCTEventEmitterCore alloc]
|
|
56
|
+
initWithIsBridgePresent:^BOOL {
|
|
57
|
+
return weakEmitter.bridge != nil;
|
|
58
|
+
}
|
|
59
|
+
emitHandler:^(NSString *eventName, id body) {
|
|
60
|
+
__strong RNFBRCTEventEmitter *strongEmitter = weakEmitter;
|
|
61
|
+
NSString *prefixedEventName = [@"rnfb_" stringByAppendingString:eventName];
|
|
62
|
+
[strongEmitter.bridge
|
|
63
|
+
enqueueJSCall:@"RCTDeviceEventEmitter"
|
|
64
|
+
method:@"emit"
|
|
65
|
+
args:body ? @[ prefixedEventName, body ] : @[ prefixedEventName ]
|
|
66
|
+
completion:NULL];
|
|
67
|
+
}];
|
|
68
|
+
[emitter setValue:restoredCore forKey:@"core"];
|
|
69
|
+
[emitter invalidate];
|
|
70
|
+
emitter.bridge = nil;
|
|
71
|
+
[super tearDown];
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
- (void)testFacadeDefaultNameMappingAndOptions {
|
|
75
|
+
FIRApp *app = [[FIRApp alloc] initWithName:DEFAULT_APP_NAME options:[self fullyPopulatedOptions]];
|
|
76
|
+
[app setDataCollectionDefaultEnabled:YES];
|
|
77
|
+
|
|
78
|
+
NSDictionary *result = [RNFBSharedUtils firAppToDictionary:app];
|
|
79
|
+
NSDictionary *appConfig = result[@"appConfig"];
|
|
80
|
+
NSDictionary *options = result[@"options"];
|
|
81
|
+
|
|
82
|
+
XCTAssertEqualObjects(appConfig[@"name"], DEFAULT_APP_DISPLAY_NAME);
|
|
83
|
+
XCTAssertEqualObjects(appConfig[@"automaticDataCollectionEnabled"], @YES);
|
|
84
|
+
XCTAssertEqualObjects(options[@"apiKey"], @"api-key");
|
|
85
|
+
XCTAssertEqualObjects(options[@"appId"], @"app-id");
|
|
86
|
+
XCTAssertEqualObjects(options[@"projectId"], @"project-id");
|
|
87
|
+
XCTAssertEqualObjects(options[@"databaseURL"], @"https://example.firebaseio.com");
|
|
88
|
+
XCTAssertEqualObjects(options[@"storageBucket"], @"example.appspot.com");
|
|
89
|
+
XCTAssertEqualObjects(options[@"messagingSenderId"], @"sender-id");
|
|
90
|
+
XCTAssertEqualObjects(options[@"clientId"], @"client-id");
|
|
91
|
+
XCTAssertNil(options[@"authDomain"]);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
- (void)testFacadeAuthDomainPresentAndAbsent {
|
|
95
|
+
FIRApp *app = [[FIRApp alloc] initWithName:@"secondary" options:[self fullyPopulatedOptions]];
|
|
96
|
+
|
|
97
|
+
NSDictionary *withoutDomain = [RNFBSharedUtils firAppToDictionary:app];
|
|
98
|
+
XCTAssertNil(withoutDomain[@"options"][@"authDomain"]);
|
|
99
|
+
|
|
100
|
+
[RNFBAppModule setCustomDomainForTesting:@"custom.example.com" forAppName:@"secondary"];
|
|
101
|
+
NSDictionary *withDomain = [RNFBSharedUtils firAppToDictionary:app];
|
|
102
|
+
XCTAssertEqualObjects(withDomain[@"options"][@"authDomain"], @"custom.example.com");
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
- (void)testFacadeAuthDomainUsesMappedDefaultName {
|
|
106
|
+
FIRApp *app = [[FIRApp alloc] initWithName:DEFAULT_APP_NAME options:[self fullyPopulatedOptions]];
|
|
107
|
+
[RNFBAppModule setCustomDomainForTesting:@"default-domain.example.com"
|
|
108
|
+
forAppName:DEFAULT_APP_DISPLAY_NAME];
|
|
109
|
+
|
|
110
|
+
NSDictionary *result = [RNFBSharedUtils firAppToDictionary:app];
|
|
111
|
+
XCTAssertEqualObjects(result[@"options"][@"authDomain"], @"default-domain.example.com");
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
- (void)testFacadeSendJSEventInjectsAppNameAndForwards {
|
|
115
|
+
FIRApp *app = [[FIRApp alloc] initWithName:DEFAULT_APP_NAME options:[self fullyPopulatedOptions]];
|
|
116
|
+
RNFBRCTEventEmitter *emitter = [RNFBRCTEventEmitter shared];
|
|
117
|
+
[emitter invalidate];
|
|
118
|
+
|
|
119
|
+
__block NSString *capturedName = nil;
|
|
120
|
+
__block NSDictionary *capturedBody = nil;
|
|
121
|
+
RNFBRCTEventEmitterCore *recordingCore = [[RNFBRCTEventEmitterCore alloc]
|
|
122
|
+
initWithIsBridgePresent:^BOOL {
|
|
123
|
+
return YES;
|
|
124
|
+
}
|
|
125
|
+
emitHandler:^(NSString *eventName, id body) {
|
|
126
|
+
capturedName = [eventName copy];
|
|
127
|
+
capturedBody = body;
|
|
128
|
+
}];
|
|
129
|
+
[emitter setValue:recordingCore forKey:@"core"];
|
|
130
|
+
[emitter notifyJsReady:YES];
|
|
131
|
+
[emitter addListener:@"facade_event"];
|
|
132
|
+
|
|
133
|
+
[RNFBSharedUtils sendJSEventForApp:app name:@"facade_event" body:@{@"foo" : @"bar"}];
|
|
134
|
+
|
|
135
|
+
XCTAssertEqualObjects(capturedName, @"facade_event");
|
|
136
|
+
XCTAssertEqualObjects(capturedBody[@"foo"], @"bar");
|
|
137
|
+
XCTAssertEqualObjects(capturedBody[@"appName"], DEFAULT_APP_DISPLAY_NAME);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
- (void)testFacadePublicSelectorsUnchanged {
|
|
141
|
+
XCTAssertTrue([RNFBSharedUtils respondsToSelector:@selector(firAppToDictionary:)]);
|
|
142
|
+
XCTAssertTrue([RNFBSharedUtils respondsToSelector:@selector(sendJSEventForApp:name:body:)]);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
@end
|
|
@@ -0,0 +1,173 @@
|
|
|
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
|
+
private final class StubFIROptions: NSObject, RNFBFIROptionsProviding {
|
|
21
|
+
var apiKey: String?
|
|
22
|
+
var googleAppID: String?
|
|
23
|
+
var projectID: String?
|
|
24
|
+
var databaseURL: String?
|
|
25
|
+
var storageBucket: String?
|
|
26
|
+
var gcmSenderID: String?
|
|
27
|
+
var clientID: String?
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
private final class StubFIRApp: NSObject, RNFBFIRAppProviding {
|
|
31
|
+
var name: String
|
|
32
|
+
var options: RNFBFIROptionsProviding
|
|
33
|
+
var dataCollectionEnabled = false
|
|
34
|
+
|
|
35
|
+
init(name: String, options: RNFBFIROptionsProviding) {
|
|
36
|
+
self.name = name
|
|
37
|
+
self.options = options
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
func isDataCollectionDefaultEnabled() -> Bool {
|
|
41
|
+
dataCollectionEnabled
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
private final class StubCustomDomainProvider: NSObject, RNFBCustomDomainProviding {
|
|
46
|
+
var domains: [String: String] = [:]
|
|
47
|
+
var lastRequestedName: String?
|
|
48
|
+
|
|
49
|
+
func getCustomDomain(_ appName: String) -> String? {
|
|
50
|
+
lastRequestedName = appName
|
|
51
|
+
return domains[appName]
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
private final class RecordingEventSender: NSObject, RNFBJSEventSending {
|
|
56
|
+
var lastName: String?
|
|
57
|
+
var lastBody: Any?
|
|
58
|
+
|
|
59
|
+
func sendEvent(name: String, body: Any?) {
|
|
60
|
+
lastName = name
|
|
61
|
+
lastBody = body
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
final class RNFBSharedUtilsFIRAppTests: XCTestCase {
|
|
66
|
+
private func fullyPopulatedOptions() -> StubFIROptions {
|
|
67
|
+
let options = StubFIROptions()
|
|
68
|
+
options.apiKey = "api-key"
|
|
69
|
+
options.googleAppID = "app-id"
|
|
70
|
+
options.projectID = "project-id"
|
|
71
|
+
options.databaseURL = "https://example.firebaseio.com"
|
|
72
|
+
options.storageBucket = "example.appspot.com"
|
|
73
|
+
options.gcmSenderID = "sender-id"
|
|
74
|
+
options.clientID = "client-id"
|
|
75
|
+
return options
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
func testDefaultAppNameMapsToDisplayName() {
|
|
79
|
+
let app = StubFIRApp(name: "__FIRAPP_DEFAULT", options: fullyPopulatedOptions())
|
|
80
|
+
app.dataCollectionEnabled = true
|
|
81
|
+
let domains = StubCustomDomainProvider()
|
|
82
|
+
|
|
83
|
+
let result = RNFBSharedUtilsFIRApp.firAppToDictionary(app, customDomainProvider: domains)
|
|
84
|
+
let appConfig = result["appConfig"] as? NSDictionary
|
|
85
|
+
|
|
86
|
+
XCTAssertEqual(appConfig?["name"] as? String, "[DEFAULT]")
|
|
87
|
+
XCTAssertEqual(appConfig?["automaticDataCollectionEnabled"] as? Bool, true)
|
|
88
|
+
XCTAssertEqual(domains.lastRequestedName, "[DEFAULT]")
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
func testNamedAppPreservesName() {
|
|
92
|
+
let app = StubFIRApp(name: "secondary", options: fullyPopulatedOptions())
|
|
93
|
+
let domains = StubCustomDomainProvider()
|
|
94
|
+
|
|
95
|
+
let result = RNFBSharedUtilsFIRApp.firAppToDictionary(app, customDomainProvider: domains)
|
|
96
|
+
let appConfig = result["appConfig"] as? NSDictionary
|
|
97
|
+
|
|
98
|
+
XCTAssertEqual(appConfig?["name"] as? String, "secondary")
|
|
99
|
+
XCTAssertEqual(domains.lastRequestedName, "secondary")
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
func testOptionsFieldMapping() {
|
|
103
|
+
let app = StubFIRApp(name: "secondary", options: fullyPopulatedOptions())
|
|
104
|
+
let domains = StubCustomDomainProvider()
|
|
105
|
+
|
|
106
|
+
let result = RNFBSharedUtilsFIRApp.firAppToDictionary(app, customDomainProvider: domains)
|
|
107
|
+
let options = result["options"] as? NSDictionary
|
|
108
|
+
|
|
109
|
+
XCTAssertEqual(options?["apiKey"] as? String, "api-key")
|
|
110
|
+
XCTAssertEqual(options?["appId"] as? String, "app-id")
|
|
111
|
+
XCTAssertEqual(options?["projectId"] as? String, "project-id")
|
|
112
|
+
XCTAssertEqual(options?["databaseURL"] as? String, "https://example.firebaseio.com")
|
|
113
|
+
XCTAssertEqual(options?["storageBucket"] as? String, "example.appspot.com")
|
|
114
|
+
XCTAssertEqual(options?["messagingSenderId"] as? String, "sender-id")
|
|
115
|
+
XCTAssertEqual(options?["clientId"] as? String, "client-id")
|
|
116
|
+
XCTAssertNil(options?["authDomain"])
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
func testAuthDomainPresentWhenProviderReturnsValue() {
|
|
120
|
+
let app = StubFIRApp(name: "secondary", options: fullyPopulatedOptions())
|
|
121
|
+
let domains = StubCustomDomainProvider()
|
|
122
|
+
domains.domains["secondary"] = "custom.example.com"
|
|
123
|
+
|
|
124
|
+
let result = RNFBSharedUtilsFIRApp.firAppToDictionary(app, customDomainProvider: domains)
|
|
125
|
+
let options = result["options"] as? NSDictionary
|
|
126
|
+
|
|
127
|
+
XCTAssertEqual(options?["authDomain"] as? String, "custom.example.com")
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
func testAuthDomainAbsentWhenProviderReturnsNil() {
|
|
131
|
+
let app = StubFIRApp(name: "__FIRAPP_DEFAULT", options: fullyPopulatedOptions())
|
|
132
|
+
let domains = StubCustomDomainProvider()
|
|
133
|
+
|
|
134
|
+
let result = RNFBSharedUtilsFIRApp.firAppToDictionary(app, customDomainProvider: domains)
|
|
135
|
+
let options = result["options"] as? NSDictionary
|
|
136
|
+
|
|
137
|
+
XCTAssertNil(options?["authDomain"])
|
|
138
|
+
XCTAssertEqual(domains.lastRequestedName, "[DEFAULT]")
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
func testSendJSEventInjectsAppNameAndForwards() {
|
|
142
|
+
let app = StubFIRApp(name: "__FIRAPP_DEFAULT", options: fullyPopulatedOptions())
|
|
143
|
+
let sender = RecordingEventSender()
|
|
144
|
+
let body: NSDictionary = ["foo": "bar"]
|
|
145
|
+
|
|
146
|
+
RNFBSharedUtilsFIRApp.sendJSEvent(
|
|
147
|
+
forApp: app,
|
|
148
|
+
name: "app_event",
|
|
149
|
+
body: body,
|
|
150
|
+
eventSender: sender
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
XCTAssertEqual(sender.lastName, "app_event")
|
|
154
|
+
let forwarded = sender.lastBody as? NSDictionary
|
|
155
|
+
XCTAssertEqual(forwarded?["foo"] as? String, "bar")
|
|
156
|
+
XCTAssertEqual(forwarded?["appName"] as? String, "[DEFAULT]")
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
func testSendJSEventPreservesNamedAppName() {
|
|
160
|
+
let app = StubFIRApp(name: "secondary", options: fullyPopulatedOptions())
|
|
161
|
+
let sender = RecordingEventSender()
|
|
162
|
+
|
|
163
|
+
RNFBSharedUtilsFIRApp.sendJSEvent(
|
|
164
|
+
forApp: app,
|
|
165
|
+
name: "named_event",
|
|
166
|
+
body: [:],
|
|
167
|
+
eventSender: sender
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
let forwarded = sender.lastBody as? NSDictionary
|
|
171
|
+
XCTAssertEqual(forwarded?["appName"] as? String, "secondary")
|
|
172
|
+
}
|
|
173
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
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 "RNFBSharedUtils.h"
|
|
21
|
+
|
|
22
|
+
@interface RNFBSharedUtilsFormattingFacadeTests : XCTestCase
|
|
23
|
+
@end
|
|
24
|
+
|
|
25
|
+
@implementation RNFBSharedUtilsFormattingFacadeTests
|
|
26
|
+
|
|
27
|
+
- (void)testFacadeMapsDefaultAppName {
|
|
28
|
+
XCTAssertEqualObjects([RNFBSharedUtils getAppJavaScriptName:DEFAULT_APP_NAME],
|
|
29
|
+
DEFAULT_APP_DISPLAY_NAME);
|
|
30
|
+
XCTAssertEqualObjects([RNFBSharedUtils getAppJavaScriptName:@"secondary"], @"secondary");
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
- (void)testFacadeFormatsISO8601WithTrailingZ {
|
|
34
|
+
NSDate *date = [NSDate dateWithTimeIntervalSince1970:1577934245];
|
|
35
|
+
XCTAssertEqualObjects([RNFBSharedUtils getISO8601String:date], @"2020-01-02T03:04:05Z");
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
@end
|
|
@@ -0,0 +1,82 @@
|
|
|
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 RNFBSharedUtilsFormattingTests: XCTestCase {
|
|
21
|
+
func testDefaultAppNameMapsToDisplayName() {
|
|
22
|
+
XCTAssertEqual(
|
|
23
|
+
RNFBSharedUtilsFormatting.getAppJavaScriptName("__FIRAPP_DEFAULT"),
|
|
24
|
+
"[DEFAULT]"
|
|
25
|
+
)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
func testNonDefaultAppNameIsReturnedUnchanged() {
|
|
29
|
+
XCTAssertEqual(
|
|
30
|
+
RNFBSharedUtilsFormatting.getAppJavaScriptName("secondary"),
|
|
31
|
+
"secondary"
|
|
32
|
+
)
|
|
33
|
+
XCTAssertEqual(
|
|
34
|
+
RNFBSharedUtilsFormatting.getAppJavaScriptName("[DEFAULT]"),
|
|
35
|
+
"[DEFAULT]"
|
|
36
|
+
)
|
|
37
|
+
XCTAssertEqual(RNFBSharedUtilsFormatting.getAppJavaScriptName(""), "")
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
func testNilAppNameReturnsNil() {
|
|
41
|
+
XCTAssertNil(RNFBSharedUtilsFormatting.getAppJavaScriptName(nil))
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
func testISO8601UsesPOSIXUTCAndTrailingZ() {
|
|
45
|
+
var components = DateComponents()
|
|
46
|
+
components.calendar = Calendar(identifier: .gregorian)
|
|
47
|
+
components.timeZone = TimeZone(abbreviation: "UTC")
|
|
48
|
+
components.year = 2020
|
|
49
|
+
components.month = 1
|
|
50
|
+
components.day = 2
|
|
51
|
+
components.hour = 3
|
|
52
|
+
components.minute = 4
|
|
53
|
+
components.second = 5
|
|
54
|
+
|
|
55
|
+
let date = components.date!
|
|
56
|
+
XCTAssertEqual(
|
|
57
|
+
RNFBSharedUtilsFormatting.getISO8601String(date),
|
|
58
|
+
"2020-01-02T03:04:05Z"
|
|
59
|
+
)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
func testISO8601FormatsInUTCRegardlessOfLocalOffset() {
|
|
63
|
+
// 2020-01-02 03:04:05 UTC as absolute instant; format must stay UTC/`Z`.
|
|
64
|
+
let date = Date(timeIntervalSince1970: 1_577_934_245)
|
|
65
|
+
XCTAssertEqual(
|
|
66
|
+
RNFBSharedUtilsFormatting.getISO8601String(date),
|
|
67
|
+
"2020-01-02T03:04:05Z"
|
|
68
|
+
)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
func testISO8601OmitsFractionalSeconds() {
|
|
72
|
+
let date = Date(timeIntervalSince1970: 1_577_934_245.789)
|
|
73
|
+
XCTAssertEqual(
|
|
74
|
+
RNFBSharedUtilsFormatting.getISO8601String(date),
|
|
75
|
+
"2020-01-02T03:04:05Z"
|
|
76
|
+
)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
func testNilDateReturnsNil() {
|
|
80
|
+
XCTAssertNil(RNFBSharedUtilsFormatting.getISO8601String(nil))
|
|
81
|
+
}
|
|
82
|
+
}
|