@react-native-firebase/app 26.4.0 → 27.1.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.
Files changed (242) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/README.md +10 -27
  3. package/RNFBApp.podspec +13 -5
  4. package/android/build.gradle +3 -0
  5. package/android/src/main/java/io/invertase/firebase/common/RNFBHandleCollisionException.kt +29 -0
  6. package/android/src/main/java/io/invertase/firebase/common/RNFBHandleMap.kt +146 -0
  7. package/android/src/main/java/io/invertase/firebase/common/TaskExecutorService.kt +156 -0
  8. package/android/src/main/java/io/invertase/firebase/common/UniversalFirebaseModule.kt +44 -0
  9. package/android/src/main/java/io/invertase/firebase/common/UniversalFirebasePreferences.kt +100 -0
  10. package/android/src/reactnative/java/io/invertase/firebase/app/NativeRNFBTurboApp.kt +250 -0
  11. package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseApp.kt +64 -0
  12. package/android/src/reactnative/java/io/invertase/firebase/app/{ReactNativeFirebaseAppInitProvider.java → ReactNativeFirebaseAppInitProvider.kt} +3 -4
  13. package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseAppPackage.kt +47 -0
  14. package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseAppRegistrar.kt +33 -0
  15. package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseVersion.java +1 -1
  16. package/android/src/reactnative/java/io/invertase/firebase/common/RCTConvertFirebase.kt +185 -0
  17. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseEvent.kt +35 -0
  18. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseEventEmitter.kt +662 -0
  19. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseJSON.kt +103 -0
  20. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseMeta.kt +96 -0
  21. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseModule.kt +140 -0
  22. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebasePreferences.kt +109 -0
  23. package/android/src/reactnative/java/io/invertase/firebase/common/SharedUtils.kt +451 -0
  24. package/android/src/reactnative/java/io/invertase/firebase/interfaces/{ContextProvider.java → ContextProvider.kt} +8 -8
  25. package/android/src/reactnative/java/io/invertase/firebase/interfaces/{NativeError.java → NativeError.kt} +8 -8
  26. package/android/src/reactnative/java/io/invertase/firebase/interfaces/{NativeEvent.java → NativeEvent.kt} +6 -6
  27. package/android/src/reactnative/java/io/invertase/firebase/utils/NativeRNFBTurboUtils.kt +219 -0
  28. package/android/src/test/java/expo/core/ModuleRegistry.java +9 -0
  29. package/android/src/test/java/io/invertase/firebase/app/NativeRNFBTurboAppTest.java +182 -59
  30. package/android/src/test/java/io/invertase/firebase/app/ReactNativeFirebaseAppComponentsJavaCompatibilityTest.java +70 -0
  31. package/android/src/test/java/io/invertase/firebase/app/ReactNativeFirebaseAppJavaCompatibilityTest.java +60 -0
  32. package/android/src/test/java/io/invertase/firebase/app/ReactNativeFirebaseAppPackageTest.java +165 -0
  33. package/android/src/test/java/io/invertase/firebase/app/ReactNativeFirebaseAppTest.kt +167 -0
  34. package/android/src/test/java/io/invertase/firebase/common/RCTConvertFirebaseJavaCompatibilityTest.java +112 -0
  35. package/android/src/test/java/io/invertase/firebase/common/RCTConvertFirebaseTest.kt +317 -0
  36. package/android/src/test/java/io/invertase/firebase/common/RNFBHandleMapTest.kt +309 -0
  37. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseEventEmitterJavaCompatibilityTest.java +176 -0
  38. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseEventEmitterTest.java +143 -12
  39. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseEventTest.kt +61 -0
  40. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseJSONJavaCompatibilityTest.java +85 -0
  41. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseJSONTest.kt +296 -0
  42. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseMetaJavaCompatibilityTest.java +67 -0
  43. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseMetaTest.kt +246 -0
  44. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseModuleTest.kt +254 -0
  45. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebasePreferencesJavaCompatibilityTest.java +87 -0
  46. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebasePreferencesTest.kt +260 -0
  47. package/android/src/test/java/io/invertase/firebase/common/SharedUtilsJavaCompatibilityTest.java +255 -0
  48. package/android/src/test/java/io/invertase/firebase/common/SharedUtilsTest.kt +674 -0
  49. package/android/src/test/java/io/invertase/firebase/common/TaskExecutorServiceTest.kt +290 -0
  50. package/android/src/test/java/io/invertase/firebase/common/UniversalFirebaseModuleJavaCompatibilityTest.java +178 -0
  51. package/android/src/test/java/io/invertase/firebase/common/UniversalFirebasePreferencesJavaCompatibilityTest.java +99 -0
  52. package/android/src/test/java/io/invertase/firebase/common/UniversalFirebasePreferencesTest.kt +217 -0
  53. package/android/src/test/java/io/invertase/firebase/commoncompat/ReactNativeFirebaseModuleJavaCompatibilityTest.java +176 -0
  54. package/android/src/test/java/io/invertase/firebase/commoncompat/ReactNativeFirebaseModuleKotlinCompatibilityTest.kt +52 -0
  55. package/android/src/test/java/io/invertase/firebase/interfaces/InterfacesJavaCompatibilityTest.java +144 -0
  56. package/android/src/test/java/io/invertase/firebase/interfaces/NativeEventTest.kt +56 -0
  57. package/android/src/test/java/io/invertase/firebase/utils/NativeRNFBTurboUtilsTest.java +517 -21
  58. package/dist/module/FirebaseApp.js +10 -0
  59. package/dist/module/FirebaseApp.js.map +1 -1
  60. package/dist/module/common/deeps.js +3 -0
  61. package/dist/module/common/deeps.js.map +1 -1
  62. package/dist/module/internal/FirebaseModule.js.map +1 -1
  63. package/dist/module/internal/RNFBNativeEventEmitter.js +12 -1
  64. package/dist/module/internal/RNFBNativeEventEmitter.js.map +1 -1
  65. package/dist/module/internal/SharedEventEmitter.js +3 -1
  66. package/dist/module/internal/SharedEventEmitter.js.map +1 -1
  67. package/dist/module/internal/index.js +1 -0
  68. package/dist/module/internal/index.js.map +1 -1
  69. package/dist/module/internal/registry/app.js +7 -1
  70. package/dist/module/internal/registry/app.js.map +1 -1
  71. package/dist/module/types/app.js.map +1 -1
  72. package/dist/module/types/internal.js +2 -0
  73. package/dist/module/version.js +1 -1
  74. package/dist/typescript/lib/FirebaseApp.d.ts +7 -0
  75. package/dist/typescript/lib/FirebaseApp.d.ts.map +1 -1
  76. package/dist/typescript/lib/common/deeps.d.ts.map +1 -1
  77. package/dist/typescript/lib/internal/FirebaseModule.d.ts +2 -3
  78. package/dist/typescript/lib/internal/FirebaseModule.d.ts.map +1 -1
  79. package/dist/typescript/lib/internal/NativeModules.d.ts +4 -1
  80. package/dist/typescript/lib/internal/NativeModules.d.ts.map +1 -1
  81. package/dist/typescript/lib/internal/RNFBNativeEventEmitter.d.ts +2 -2
  82. package/dist/typescript/lib/internal/RNFBNativeEventEmitter.d.ts.map +1 -1
  83. package/dist/typescript/lib/internal/SharedEventEmitter.d.ts +3 -3
  84. package/dist/typescript/lib/internal/SharedEventEmitter.d.ts.map +1 -1
  85. package/dist/typescript/lib/internal/index.d.ts +1 -0
  86. package/dist/typescript/lib/internal/index.d.ts.map +1 -1
  87. package/dist/typescript/lib/internal/registry/app.d.ts.map +1 -1
  88. package/dist/typescript/lib/types/app.d.ts +10 -3
  89. package/dist/typescript/lib/types/app.d.ts.map +1 -1
  90. package/dist/typescript/lib/types/internal.d.ts +12 -0
  91. package/dist/typescript/lib/types/internal.d.ts.map +1 -1
  92. package/dist/typescript/lib/version.d.ts +1 -1
  93. package/firebase-schema.json +4 -0
  94. package/firebase_spm.rb +552 -96
  95. package/ios/RNFBApp/RCTConvert+FIRApp.h +2 -5
  96. package/ios/RNFBApp/RCTConvert+FIRApp.m +11 -6
  97. package/ios/RNFBApp/RCTConvert+FIROptions.h +2 -5
  98. package/ios/RNFBApp/RCTConvert+FIROptions.m +11 -10
  99. package/ios/RNFBApp/RCTConvertFIRApp.swift +86 -0
  100. package/ios/RNFBApp/RCTConvertFIROptions.swift +259 -0
  101. package/ios/RNFBApp/RNFBAppCustomAuthDomains.swift +63 -0
  102. package/ios/RNFBApp/RNFBAppInitializeOptionsMapper.swift +113 -0
  103. package/ios/RNFBApp/RNFBAppLogLevelMapper.swift +53 -0
  104. package/ios/RNFBApp/RNFBAppModule+CustomAuthDomain.m +35 -0
  105. package/ios/RNFBApp/RNFBAppModule.h +6 -2
  106. package/ios/RNFBApp/RNFBAppModule.mm +65 -228
  107. package/ios/RNFBApp/RNFBAppModuleFirebase.swift +439 -0
  108. package/ios/RNFBApp/RNFBAppModuleImplementation.h +68 -0
  109. package/ios/RNFBApp/RNFBAppModuleImplementation.m +195 -0
  110. package/ios/RNFBApp/RNFBHandleMap.m +27 -56
  111. package/ios/RNFBApp/RNFBHandleMapStorage.swift +90 -0
  112. package/ios/RNFBApp/RNFBInitializeAppArguments.swift +82 -0
  113. package/ios/RNFBApp/RNFBJSON.m +22 -38
  114. package/ios/RNFBApp/RNFBJSONImplementation.swift +71 -0
  115. package/ios/RNFBApp/RNFBMeta.m +24 -26
  116. package/ios/RNFBApp/RNFBMetaStorage.swift +76 -0
  117. package/ios/RNFBApp/RNFBNullSentinelDecoding.swift +135 -0
  118. package/ios/RNFBApp/RNFBNullSentinelInterceptor.h +30 -3
  119. package/ios/RNFBApp/RNFBNullSentinelInterceptor.m +28 -5
  120. package/ios/RNFBApp/RNFBPreferences.m +22 -20
  121. package/ios/RNFBApp/RNFBPreferencesStorage.swift +101 -0
  122. package/ios/RNFBApp/RNFBRCTEventEmitter.m +36 -93
  123. package/ios/RNFBApp/RNFBRCTEventEmitterCore.swift +161 -0
  124. package/ios/RNFBApp/RNFBSharedUtils.h +2 -5
  125. package/ios/RNFBApp/RNFBSharedUtils.m +109 -198
  126. package/ios/RNFBApp/RNFBSharedUtilsConfig.swift +72 -0
  127. package/ios/RNFBApp/RNFBSharedUtilsFIRApp.swift +271 -0
  128. package/ios/RNFBApp/RNFBSharedUtilsFormatting.swift +59 -0
  129. package/ios/RNFBApp/RNFBSharedUtilsPromiseRejection.swift +88 -0
  130. package/ios/RNFBApp/RNFBUtilsHelpers.swift +116 -0
  131. package/ios/RNFBApp/RNFBUtilsModule+Foundation.m +44 -0
  132. package/ios/RNFBApp/RNFBUtilsModule+PhotoAssets.m +47 -0
  133. package/ios/RNFBApp/RNFBUtilsModule.h +11 -1
  134. package/ios/RNFBApp/RNFBUtilsModule.mm +10 -85
  135. package/ios/RNFBApp/RNFBUtilsModuleImplementation.h +32 -0
  136. package/ios/RNFBApp/RNFBUtilsModuleImplementation.m +56 -0
  137. package/ios/RNFBApp/RNFBVersion.m +1 -1
  138. package/ios/RNFBApp.xcodeproj/project.pbxproj +100 -0
  139. package/ios/RNFBAppUnitTests/HostStubs/FirebaseCore/FIRApp.m +171 -0
  140. package/ios/RNFBAppUnitTests/HostStubs/FirebaseCore/FirebaseCore.h +78 -0
  141. package/ios/RNFBAppUnitTests/HostStubs/FirebaseInstallations/FIRInstallations.m +7 -0
  142. package/ios/RNFBAppUnitTests/HostStubs/FirebaseInstallations/FirebaseInstallations.h +8 -0
  143. package/ios/RNFBAppUnitTests/HostStubs/RNFBAppModuleHostStub.m +55 -0
  144. package/ios/RNFBAppUnitTests/HostStubs/RNFBAppTurboModules.h +89 -0
  145. package/ios/RNFBAppUnitTests/HostStubs/RNFBAppTurboModules.mm +30 -0
  146. package/ios/RNFBAppUnitTests/HostStubs/React/RCTBridge.h +19 -0
  147. package/ios/RNFBAppUnitTests/HostStubs/React/RCTBridge.m +32 -0
  148. package/ios/RNFBAppUnitTests/HostStubs/React/RCTBridgeModule.h +19 -0
  149. package/ios/RNFBAppUnitTests/HostStubs/React/RCTConvert.h +28 -0
  150. package/ios/RNFBAppUnitTests/HostStubs/React/RCTConvert.m +23 -0
  151. package/ios/RNFBAppUnitTests/HostStubs/React/RCTEventEmitter.h +9 -0
  152. package/ios/RNFBAppUnitTests/HostStubs/React/RCTInvalidating.h +24 -0
  153. package/ios/RNFBAppUnitTests/HostStubs/React/RCTUtils.h +9 -0
  154. package/ios/RNFBAppUnitTests/HostStubs/module.modulemap +13 -0
  155. package/ios/RNFBAppUnitTests/RCTConvertFIRAppFacadeTests.m +61 -0
  156. package/ios/RNFBAppUnitTests/RCTConvertFIRAppTests.swift +73 -0
  157. package/ios/RNFBAppUnitTests/RCTConvertFIROptionsFacadeTests.m +57 -0
  158. package/ios/RNFBAppUnitTests/RCTConvertFIROptionsTests.swift +243 -0
  159. package/ios/RNFBAppUnitTests/RNFBAppCustomAuthDomainsFacadeTests.m +73 -0
  160. package/ios/RNFBAppUnitTests/RNFBAppCustomAuthDomainsTests.swift +70 -0
  161. package/ios/RNFBAppUnitTests/RNFBAppInitializeOptionsMapperTests.swift +190 -0
  162. package/ios/RNFBAppUnitTests/RNFBAppLogLevelFacadeTests.m +76 -0
  163. package/ios/RNFBAppUnitTests/RNFBAppLogLevelMapperTests.swift +59 -0
  164. package/ios/RNFBAppUnitTests/RNFBAppModuleFirebaseFacadeTests.m +215 -0
  165. package/ios/RNFBAppUnitTests/RNFBAppModuleFirebaseTests.swift +430 -0
  166. package/ios/RNFBAppUnitTests/RNFBAppModuleLifecycleTests.m +206 -0
  167. package/ios/RNFBAppUnitTests/RNFBAppModuleShellTests.mm +367 -0
  168. package/ios/RNFBAppUnitTests/RNFBAppUnitTests.xcodeproj/project.pbxproj +355 -2
  169. package/ios/RNFBAppUnitTests/RNFBFirebaseAppClientTests.swift +165 -0
  170. package/ios/RNFBAppUnitTests/RNFBHandleMapStorageTests.swift +121 -0
  171. package/ios/RNFBAppUnitTests/RNFBInitializeAppArgumentsTests.swift +256 -0
  172. package/ios/RNFBAppUnitTests/RNFBJSONImplementationTests.swift +126 -0
  173. package/ios/RNFBAppUnitTests/RNFBJSONTests.m +172 -0
  174. package/ios/RNFBAppUnitTests/RNFBMetaStorageTests.swift +106 -0
  175. package/ios/RNFBAppUnitTests/RNFBMetaTests.m +65 -0
  176. package/ios/RNFBAppUnitTests/RNFBNullSentinelDecodingTests.swift +286 -0
  177. package/ios/RNFBAppUnitTests/RNFBNullSentinelInterceptorTests.m +312 -0
  178. package/ios/RNFBAppUnitTests/RNFBPreferencesStorageTests.swift +105 -0
  179. package/ios/RNFBAppUnitTests/RNFBPreferencesTests.m +110 -0
  180. package/ios/RNFBAppUnitTests/RNFBRCTEventEmitterCoreTests.swift +163 -0
  181. package/ios/RNFBAppUnitTests/RNFBRCTEventEmitterFacadeTests.m +141 -0
  182. package/ios/RNFBAppUnitTests/RNFBSharedUtilsConfigFacadeTests.m +100 -0
  183. package/ios/RNFBAppUnitTests/RNFBSharedUtilsConfigTests.swift +234 -0
  184. package/ios/RNFBAppUnitTests/RNFBSharedUtilsFIRAppFacadeTests.m +145 -0
  185. package/ios/RNFBAppUnitTests/RNFBSharedUtilsFIRAppTests.swift +173 -0
  186. package/ios/RNFBAppUnitTests/RNFBSharedUtilsFormattingFacadeTests.m +38 -0
  187. package/ios/RNFBAppUnitTests/RNFBSharedUtilsFormattingTests.swift +82 -0
  188. package/ios/RNFBAppUnitTests/RNFBSharedUtilsNullSentinelTests.m +35 -0
  189. package/ios/RNFBAppUnitTests/RNFBSharedUtilsPromiseRejectionFacadeTests.m +107 -0
  190. package/ios/RNFBAppUnitTests/RNFBSharedUtilsPromiseRejectionTests.swift +133 -0
  191. package/ios/RNFBAppUnitTests/RNFBUtilsHelpersTests.swift +144 -0
  192. package/ios/RNFBAppUnitTests/RNFBUtilsModuleFacadeTests.m +72 -0
  193. package/ios/RNFBAppUnitTests/RNFBUtilsModuleShellTests.mm +282 -0
  194. package/ios/RNFBFirebase/Package.swift +53 -0
  195. package/ios/RNFBFirebase/Sources/RNFBFirebase/RNFBFirebase.swift +285 -0
  196. package/ios/RNFBFirebase/Sources/RNFBFirebaseBridge/Public/.gitkeep +0 -0
  197. package/ios/RNFBFirebase/Sources/RNFBFirebaseBridge/RNFBFirebaseBridge.m +169 -0
  198. package/ios/RNFBFirebase/Sources/RNFBFirebaseBridge/include/RNFBFirebaseBridge.h +52 -0
  199. package/ios/RNFBFirebaseUnitTests/RNFBAppDynamicFacadeTests.swift +240 -0
  200. package/{android/src/main/java/io/invertase/firebase/common/RNFBHandleCollisionException.java → ios/RNFBFirebaseUnitTests/RNFBFirebaseClientImport.swift} +23 -14
  201. package/ios/RNFBFirebaseUnitTests/RNFBFirebaseUnitTests.xcodeproj/project.pbxproj +588 -0
  202. package/ios/RNFBFirebaseUnitTests/RNFBFirebaseUnitTests.xcodeproj/xcshareddata/xcschemes/RNFBFirebaseUnitTests.xcscheme +83 -0
  203. package/ios_config.sh +50 -22
  204. package/lib/FirebaseApp.ts +10 -0
  205. package/lib/common/deeps.ts +3 -0
  206. package/lib/internal/FirebaseModule.ts +6 -3
  207. package/lib/internal/NativeModules.ts +4 -1
  208. package/lib/internal/RNFBNativeEventEmitter.ts +14 -5
  209. package/lib/internal/SharedEventEmitter.ts +5 -1
  210. package/lib/internal/index.ts +1 -0
  211. package/lib/internal/react-native-vendor-emitter.d.ts +11 -0
  212. package/lib/internal/registry/app.ts +7 -1
  213. package/lib/types/app.ts +10 -3
  214. package/lib/types/internal.ts +19 -0
  215. package/lib/version.ts +1 -1
  216. package/package.json +8 -8
  217. package/plugin/build/ios/appDelegate.js +2 -2
  218. package/plugin/build/ios/podfile.js +16 -16
  219. package/plugin/build/pluginConfig.d.ts +4 -2
  220. package/plugin/src/ios/appDelegate.ts +2 -2
  221. package/plugin/src/ios/podfile.ts +20 -23
  222. package/plugin/src/pluginConfig.ts +4 -2
  223. package/android/src/main/java/io/invertase/firebase/common/RNFBHandleMap.java +0 -150
  224. package/android/src/main/java/io/invertase/firebase/common/TaskExecutorService.java +0 -148
  225. package/android/src/main/java/io/invertase/firebase/common/UniversalFirebaseModule.java +0 -62
  226. package/android/src/main/java/io/invertase/firebase/common/UniversalFirebasePreferences.java +0 -91
  227. package/android/src/reactnative/java/io/invertase/firebase/app/NativeRNFBTurboApp.java +0 -224
  228. package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseApp.java +0 -46
  229. package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseAppPackage.java +0 -49
  230. package/android/src/reactnative/java/io/invertase/firebase/app/ReactNativeFirebaseAppRegistrar.java +0 -35
  231. package/android/src/reactnative/java/io/invertase/firebase/common/RCTConvertFirebase.java +0 -192
  232. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseEvent.java +0 -53
  233. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseEventEmitter.java +0 -606
  234. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseJSON.java +0 -109
  235. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseMeta.java +0 -101
  236. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebaseModule.java +0 -146
  237. package/android/src/reactnative/java/io/invertase/firebase/common/ReactNativeFirebasePreferences.java +0 -96
  238. package/android/src/reactnative/java/io/invertase/firebase/common/SharedUtils.java +0 -441
  239. package/android/src/reactnative/java/io/invertase/firebase/utils/NativeRNFBTurboUtils.java +0 -223
  240. package/android/src/test/java/io/invertase/firebase/common/RNFBHandleMapTest.java +0 -275
  241. package/android/src/test/java/io/invertase/firebase/common/ReactNativeFirebaseJSONTest.java +0 -108
  242. package/android/src/test/java/io/invertase/firebase/common/TaskExecutorServiceTest.java +0 -97
@@ -0,0 +1,296 @@
1
+ package io.invertase.firebase.common
2
+
3
+ /*
4
+ * Copyright (c) 2016-present Invertase Limited & Contributors
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this library except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ */
18
+
19
+ import android.util.Log
20
+ import com.facebook.react.bridge.Arguments
21
+ import com.facebook.react.bridge.WritableArray
22
+ import com.facebook.react.bridge.WritableMap
23
+ import io.invertase.firebase.BuildConfig
24
+ import org.json.JSONArray
25
+ import org.json.JSONException
26
+ import org.json.JSONObject
27
+ import org.junit.After
28
+ import org.junit.Assert.assertEquals
29
+ import org.junit.Assert.assertFalse
30
+ import org.junit.Assert.assertSame
31
+ import org.junit.Assert.assertTrue
32
+ import org.junit.Before
33
+ import org.junit.Test
34
+ import org.mockito.Mockito.inOrder
35
+ import org.mockito.Mockito.mock
36
+ import org.mockito.Mockito.mockStatic
37
+ import org.mockito.Mockito.verify
38
+ import org.mockito.Mockito.verifyNoInteractions
39
+ import org.mockito.Mockito.`when`
40
+ import java.lang.reflect.Modifier
41
+ import java.util.ArrayList
42
+
43
+ /**
44
+ * Plain JUnit4 + Mockito (AndroidTest-AD-1). JSONObject and JSONArray are mocked where Android's
45
+ * host-side stubs would otherwise be involved.
46
+ */
47
+ class ReactNativeFirebaseJSONTest {
48
+ private lateinit var json: ReactNativeFirebaseJSON
49
+ private lateinit var jsonObjectField: java.lang.reflect.Field
50
+ private var originalJsonObject: Any? = null
51
+
52
+ @Before
53
+ fun setUp() {
54
+ json = ReactNativeFirebaseJSON.getSharedInstance()
55
+ jsonObjectField = ReactNativeFirebaseJSON::class.java.getDeclaredField("jsonObject")
56
+ jsonObjectField.isAccessible = true
57
+ originalJsonObject = jsonObjectField.get(json)
58
+ }
59
+
60
+ @After
61
+ fun tearDown() {
62
+ jsonObjectField.set(json, originalJsonObject)
63
+ }
64
+
65
+ @Test
66
+ fun javaVisibleApi_preservesSingletonAndExactMethodTypes() {
67
+ val jsonClass = ReactNativeFirebaseJSON::class.java
68
+ val sharedInstanceMethod = jsonClass.getMethod("getSharedInstance")
69
+
70
+ assertTrue(Modifier.isStatic(sharedInstanceMethod.modifiers))
71
+ assertEquals(jsonClass, sharedInstanceMethod.returnType)
72
+ assertSame(json, ReactNativeFirebaseJSON.getSharedInstance())
73
+ assertEquals(Boolean::class.javaPrimitiveType, jsonClass.getMethod("contains", String::class.java).returnType)
74
+ assertEquals(
75
+ Boolean::class.javaPrimitiveType,
76
+ jsonClass
77
+ .getMethod("getBooleanValue", String::class.java, Boolean::class.javaPrimitiveType)
78
+ .returnType,
79
+ )
80
+ assertEquals(
81
+ Int::class.javaPrimitiveType,
82
+ jsonClass.getMethod("getIntValue", String::class.java, Int::class.javaPrimitiveType).returnType,
83
+ )
84
+ assertEquals(
85
+ Long::class.javaPrimitiveType,
86
+ jsonClass
87
+ .getMethod("getLongValue", String::class.java, Long::class.javaPrimitiveType)
88
+ .returnType,
89
+ )
90
+ assertEquals(
91
+ String::class.java,
92
+ jsonClass.getMethod("getStringValue", String::class.java, String::class.java).returnType,
93
+ )
94
+ assertEquals(ArrayList::class.java, jsonClass.getMethod("getArrayValue", String::class.java).returnType)
95
+ assertEquals(String::class.java, jsonClass.getMethod("getRawJSON").returnType)
96
+ assertEquals(WritableMap::class.java, jsonClass.getMethod("getAll").returnType)
97
+ }
98
+
99
+ @Test
100
+ fun scalarAccessors_returnDefaultsWhenJsonObjectIsNull() {
101
+ jsonObjectField.set(json, null)
102
+
103
+ assertFalse(json.contains("missing"))
104
+ assertTrue(json.getBooleanValue("missing", true))
105
+ assertEquals(17, json.getIntValue("missing", 17))
106
+ assertEquals(23L, json.getLongValue("missing", 23L))
107
+ assertEquals("fallback", json.getStringValue("missing", "fallback"))
108
+ }
109
+
110
+ @Test
111
+ fun scalarAccessors_delegateToJsonObject() {
112
+ val jsonObject = mock(JSONObject::class.java)
113
+ `when`(jsonObject.has("present")).thenReturn(true)
114
+ `when`(jsonObject.optBoolean("boolean", false)).thenReturn(true)
115
+ `when`(jsonObject.optInt("integer", 0)).thenReturn(42)
116
+ `when`(jsonObject.optLong("long", 0L)).thenReturn(4_294_967_296L)
117
+ `when`(jsonObject.optString("string", "fallback")).thenReturn("value")
118
+ jsonObjectField.set(json, jsonObject)
119
+
120
+ assertTrue(json.contains("present"))
121
+ assertTrue(json.getBooleanValue("boolean", false))
122
+ assertEquals(42, json.getIntValue("integer", 0))
123
+ assertEquals(4_294_967_296L, json.getLongValue("long", 0L))
124
+ assertEquals("value", json.getStringValue("string", "fallback"))
125
+ }
126
+
127
+ @Test
128
+ fun getArrayValue_returnsMutableEmptyArrayListWhenJsonObjectIsNull() {
129
+ jsonObjectField.set(json, null)
130
+
131
+ val result = json.getArrayValue("missing")
132
+ result.add("later")
133
+
134
+ assertEquals(arrayListOf("later"), result)
135
+ }
136
+
137
+ @Test
138
+ fun getArrayValue_returnsMutableEmptyArrayListWhenValueIsNotAnArray() {
139
+ val jsonObject = mock(JSONObject::class.java)
140
+ `when`(jsonObject.optJSONArray("missing")).thenReturn(null)
141
+ jsonObjectField.set(json, jsonObject)
142
+
143
+ val result = json.getArrayValue("missing")
144
+ result.add("later")
145
+
146
+ assertEquals(arrayListOf("later"), result)
147
+ }
148
+
149
+ @Test
150
+ fun getArrayValue_preservesElementOrder() {
151
+ val jsonObject = mock(JSONObject::class.java)
152
+ val jsonArray = mock(JSONArray::class.java)
153
+ `when`(jsonObject.optJSONArray("items")).thenReturn(jsonArray)
154
+ `when`(jsonArray.length()).thenReturn(3)
155
+ `when`(jsonArray.getString(0)).thenReturn("first")
156
+ `when`(jsonArray.getString(1)).thenReturn("second")
157
+ `when`(jsonArray.getString(2)).thenReturn("third")
158
+ jsonObjectField.set(json, jsonObject)
159
+
160
+ assertEquals(arrayListOf("first", "second", "third"), json.getArrayValue("items"))
161
+ }
162
+
163
+ @Test
164
+ fun getArrayValue_returnsValuesCollectedBeforeJsonException() {
165
+ val jsonObject = mock(JSONObject::class.java)
166
+ val jsonArray = mock(JSONArray::class.java)
167
+ `when`(jsonObject.optJSONArray("items")).thenReturn(jsonArray)
168
+ `when`(jsonArray.length()).thenReturn(3)
169
+ `when`(jsonArray.getString(0)).thenReturn("first")
170
+ `when`(jsonArray.getString(1)).thenThrow(JSONException("malformed"))
171
+ jsonObjectField.set(json, jsonObject)
172
+
173
+ assertEquals(arrayListOf("first"), json.getArrayValue("items"))
174
+ }
175
+
176
+ @Test
177
+ fun getRawJson_returnsGeneratedBuildConfigValue() {
178
+ assertEquals(BuildConfig.FIREBASE_JSON_RAW, json.getRawJSON())
179
+ }
180
+
181
+ @Test
182
+ fun getAllReturnsEmptyMapWhenJsonObjectIsNull() {
183
+ val emptyMap = mock(WritableMap::class.java)
184
+ jsonObjectField.set(json, null)
185
+
186
+ mockStatic(Arguments::class.java).use { arguments ->
187
+ arguments.`when`<WritableMap>(Arguments::createMap).thenReturn(emptyMap)
188
+
189
+ assertSame(emptyMap, json.getAll())
190
+ verifyNoInteractions(emptyMap)
191
+ }
192
+ }
193
+
194
+ @Test
195
+ fun getAllReturnsEmptyMapForEmptyJsonObject() {
196
+ val emptyMap = mock(WritableMap::class.java)
197
+ val jsonObject = mock(JSONObject::class.java)
198
+ `when`(jsonObject.keys()).thenReturn(emptyList<String>().iterator())
199
+ jsonObjectField.set(json, jsonObject)
200
+
201
+ mockStatic(Arguments::class.java).use { arguments ->
202
+ arguments.`when`<WritableMap>(Arguments::createMap).thenReturn(emptyMap)
203
+
204
+ assertSame(emptyMap, json.getAll())
205
+ verifyNoInteractions(emptyMap)
206
+ }
207
+ }
208
+
209
+ @Test
210
+ fun getAllConvertsSupportedPreferenceValueShapesAndNestedCollections() {
211
+ val writableMap = mock(WritableMap::class.java)
212
+ val nestedWritableArray = mock(WritableArray::class.java)
213
+ val nestedWritableMap = mock(WritableMap::class.java)
214
+ val jsonObject = mock(JSONObject::class.java)
215
+ val nestedObject = mock(JSONObject::class.java)
216
+ val nestedJsonArray = mock(JSONArray::class.java)
217
+ val values =
218
+ linkedMapOf<String, Any>(
219
+ "boolean" to true,
220
+ "integer" to 42,
221
+ "long" to 4_294_967_296L,
222
+ "float" to 1.5F,
223
+ "double" to 2.5,
224
+ "string" to "value",
225
+ "jsonNull" to JSONObject.NULL,
226
+ "jsonObject" to nestedObject,
227
+ "jsonArray" to nestedJsonArray,
228
+ "list" to listOf("nested"),
229
+ "map" to linkedMapOf("nested" to true),
230
+ )
231
+ `when`(jsonObject.keys()).thenReturn(values.keys.iterator())
232
+ values.forEach { (key, value) -> `when`(jsonObject.get(key)).thenReturn(value) }
233
+ jsonObjectField.set(json, jsonObject)
234
+
235
+ mockStatic(Log::class.java).use {
236
+ mockStatic(Arguments::class.java).use { arguments ->
237
+ arguments.`when`<WritableMap>(Arguments::createMap).thenReturn(writableMap, nestedWritableMap)
238
+ arguments.`when`<WritableArray>(Arguments::createArray).thenReturn(nestedWritableArray)
239
+
240
+ assertSame(writableMap, json.getAll())
241
+
242
+ verify(writableMap).putBoolean("boolean", true)
243
+ verify(writableMap).putInt("integer", 42)
244
+ verify(writableMap).putDouble("long", 4_294_967_296.0)
245
+ verify(writableMap).putDouble("float", 1.5)
246
+ verify(writableMap).putDouble("double", 2.5)
247
+ verify(writableMap).putString("string", "value")
248
+ verify(writableMap).putNull("jsonNull")
249
+ verify(writableMap).putNull("jsonObject")
250
+ verify(writableMap).putNull("jsonArray")
251
+ verify(writableMap).putArray("list", nestedWritableArray)
252
+ verify(writableMap).putMap("map", nestedWritableMap)
253
+ verify(nestedWritableArray).pushString("nested")
254
+ verify(nestedWritableMap).putBoolean("nested", true)
255
+ }
256
+ }
257
+ }
258
+
259
+ @Test
260
+ fun getAllPreservesKeyOrder() {
261
+ val writableMap = mock(WritableMap::class.java)
262
+ val jsonObject = mock(JSONObject::class.java)
263
+ `when`(jsonObject.keys()).thenReturn(listOf("first", "second").iterator())
264
+ `when`(jsonObject.get("first")).thenReturn(1)
265
+ `when`(jsonObject.get("second")).thenReturn(2)
266
+ jsonObjectField.set(json, jsonObject)
267
+
268
+ mockStatic(Arguments::class.java).use { arguments ->
269
+ arguments.`when`<WritableMap>(Arguments::createMap).thenReturn(writableMap)
270
+
271
+ json.getAll()
272
+
273
+ val order = inOrder(jsonObject)
274
+ order.verify(jsonObject).get("first")
275
+ order.verify(jsonObject).get("second")
276
+ }
277
+ }
278
+
279
+ @Test
280
+ fun getAllSkipsJsonExceptionAndContinuesWithRemainingEntries() {
281
+ val writableMap = mock(WritableMap::class.java)
282
+ val jsonObject = mock(JSONObject::class.java)
283
+ `when`(jsonObject.keys()).thenReturn(listOf("bad", "good").iterator())
284
+ `when`(jsonObject.get("bad")).thenThrow(JSONException("malformed"))
285
+ `when`(jsonObject.get("good")).thenReturn(false)
286
+ jsonObjectField.set(json, jsonObject)
287
+
288
+ mockStatic(Arguments::class.java).use { arguments ->
289
+ arguments.`when`<WritableMap>(Arguments::createMap).thenReturn(writableMap)
290
+
291
+ assertSame(writableMap, json.getAll())
292
+
293
+ verify(writableMap).putBoolean("good", false)
294
+ }
295
+ }
296
+ }
@@ -0,0 +1,67 @@
1
+ package io.invertase.firebase.common;
2
+
3
+ /*
4
+ * Copyright (c) 2016-present Invertase Limited & Contributors
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this library except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ */
18
+
19
+ import static org.junit.Assert.assertEquals;
20
+ import static org.junit.Assert.assertFalse;
21
+ import static org.junit.Assert.assertNull;
22
+ import static org.mockito.Mockito.mock;
23
+ import static org.mockito.Mockito.mockStatic;
24
+ import static org.mockito.Mockito.when;
25
+
26
+ import android.content.Context;
27
+ import android.util.Log;
28
+ import com.facebook.react.bridge.Arguments;
29
+ import com.facebook.react.bridge.WritableMap;
30
+ import io.invertase.firebase.app.ReactNativeFirebaseApp;
31
+ import org.junit.Test;
32
+ import org.mockito.MockedStatic;
33
+
34
+ /** Compiles and exercises the Kotlin implementation through its Java ABI, including null calls. */
35
+ public class ReactNativeFirebaseMetaJavaCompatibilityTest {
36
+ @Test
37
+ public void javaCallersCanConstructOverrideAndPassNull() {
38
+ Context context = mock(Context.class);
39
+ WritableMap writableMap = mock(WritableMap.class);
40
+ when(context.getPackageManager()).thenReturn(null);
41
+ Context previous = ReactNativeFirebaseApp.getApplicationContext();
42
+
43
+ try (MockedStatic<Log> ignored = mockStatic(Log.class);
44
+ MockedStatic<Arguments> arguments = mockStatic(Arguments.class)) {
45
+ ReactNativeFirebaseApp.setApplicationContext(context);
46
+ arguments.when(Arguments::createMap).thenReturn(writableMap);
47
+
48
+ ReactNativeFirebaseMeta meta =
49
+ new ReactNativeFirebaseMeta() {
50
+ @Override
51
+ public boolean contains(String key) {
52
+ return super.contains(key);
53
+ }
54
+ };
55
+
56
+ assertFalse(meta.contains(null));
57
+ assertFalse(meta.getBooleanValue(null, false));
58
+ assertEquals(7, meta.getIntValue(null, 7));
59
+ assertNull(meta.getStringValue(null, null));
60
+ assertEquals(writableMap, meta.getAll());
61
+ } finally {
62
+ try (MockedStatic<Log> ignored = mockStatic(Log.class)) {
63
+ ReactNativeFirebaseApp.setApplicationContext(previous);
64
+ }
65
+ }
66
+ }
67
+ }
@@ -0,0 +1,246 @@
1
+ package io.invertase.firebase.common
2
+
3
+ /*
4
+ * Copyright (c) 2016-present Invertase Limited & Contributors
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this library except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ */
18
+
19
+ import android.content.Context
20
+ import android.content.pm.ApplicationInfo
21
+ import android.content.pm.PackageManager
22
+ import android.os.Bundle
23
+ import android.util.Log
24
+ import com.facebook.react.bridge.Arguments
25
+ import com.facebook.react.bridge.WritableMap
26
+ import io.invertase.firebase.app.ReactNativeFirebaseApp
27
+ import org.junit.Assert.assertEquals
28
+ import org.junit.Assert.assertFalse
29
+ import org.junit.Assert.assertSame
30
+ import org.junit.Assert.assertTrue
31
+ import org.junit.Test
32
+ import org.mockito.Mockito.mock
33
+ import org.mockito.Mockito.mockStatic
34
+ import org.mockito.Mockito.never
35
+ import org.mockito.Mockito.verify
36
+ import org.mockito.Mockito.verifyNoInteractions
37
+ import org.mockito.Mockito.verifyNoMoreInteractions
38
+ import org.mockito.Mockito.`when`
39
+ import java.lang.reflect.Modifier
40
+
41
+ /** Plain JUnit4 + Mockito coverage for manifest metadata lookup (AndroidTest-AD-1). */
42
+ class ReactNativeFirebaseMetaTest {
43
+ @Test
44
+ fun javaVisibleApiPreservesConstructorSingletonAndExactMethodTypes() {
45
+ val metaClass = ReactNativeFirebaseMeta::class.java
46
+ val constructor = metaClass.getConstructor()
47
+ val sharedInstanceMethod = metaClass.getMethod("getSharedInstance")
48
+
49
+ assertTrue(Modifier.isPublic(constructor.modifiers))
50
+ assertFalse(Modifier.isFinal(metaClass.modifiers))
51
+ assertTrue(Modifier.isStatic(sharedInstanceMethod.modifiers))
52
+ assertEquals(metaClass, sharedInstanceMethod.returnType)
53
+ assertSame(
54
+ ReactNativeFirebaseMeta.getSharedInstance(),
55
+ ReactNativeFirebaseMeta.getSharedInstance(),
56
+ )
57
+ assertEquals(
58
+ Boolean::class.javaPrimitiveType,
59
+ metaClass.getMethod("contains", String::class.java).returnType,
60
+ )
61
+ assertEquals(
62
+ Boolean::class.javaPrimitiveType,
63
+ metaClass
64
+ .getMethod("getBooleanValue", String::class.java, Boolean::class.javaPrimitiveType)
65
+ .returnType,
66
+ )
67
+ assertEquals(
68
+ String::class.java,
69
+ metaClass.getMethod("getStringValue", String::class.java, String::class.java).returnType,
70
+ )
71
+ assertEquals(
72
+ Int::class.javaPrimitiveType,
73
+ metaClass
74
+ .getMethod("getIntValue", String::class.java, Int::class.javaPrimitiveType)
75
+ .returnType,
76
+ )
77
+ assertEquals(WritableMap::class.java, metaClass.getMethod("getAll").returnType)
78
+ metaClass.declaredMethods
79
+ .filterNot { Modifier.isStatic(it.modifiers) || Modifier.isPrivate(it.modifiers) }
80
+ .forEach { method ->
81
+ assertFalse("${method.name} must remain overridable", Modifier.isFinal(method.modifiers))
82
+ }
83
+ }
84
+
85
+ @Test
86
+ fun scalarAccessorsReturnDefaultsWhenPackageManagerIsNull() {
87
+ val context = mock(Context::class.java)
88
+ `when`(context.packageManager).thenReturn(null)
89
+
90
+ withApplicationContext(context) {
91
+ val subject = ReactNativeFirebaseMeta()
92
+
93
+ assertFalse(subject.contains("missing"))
94
+ assertTrue(subject.getBooleanValue("missing", true))
95
+ assertEquals("fallback", subject.getStringValue("missing", "fallback"))
96
+ assertEquals(17, subject.getIntValue("missing", 17))
97
+ }
98
+ }
99
+
100
+ @Test
101
+ fun scalarAccessorsUsePrefixedKeysIncludingNullAndDelegateDefaults() {
102
+ val metaData = mock(Bundle::class.java)
103
+ val context = contextWithMetaData(metaData)
104
+ `when`(metaData.containsKey("rnfirebase_present")).thenReturn(true)
105
+ `when`(metaData.getBoolean("rnfirebase_boolean", false)).thenReturn(true)
106
+ `when`(metaData.getString("rnfirebase_string", null)).thenReturn("value")
107
+ `when`(metaData.getInt("rnfirebase_integer", 0)).thenReturn(42)
108
+ `when`(metaData.containsKey("rnfirebase_null")).thenReturn(true)
109
+
110
+ withApplicationContext(context) {
111
+ val subject = ReactNativeFirebaseMeta()
112
+
113
+ assertTrue(subject.contains("present"))
114
+ assertTrue(subject.getBooleanValue("boolean", false))
115
+ assertEquals("value", subject.getStringValue("string", null))
116
+ assertEquals(42, subject.getIntValue("integer", 0))
117
+ assertTrue(subject.contains(null))
118
+ }
119
+ }
120
+
121
+ @Test
122
+ fun metadataLookupUsesPackageNameAndGetMetaDataFlag() {
123
+ val context = mock(Context::class.java)
124
+ val packageManager = mock(PackageManager::class.java)
125
+ val applicationInfo = mock(ApplicationInfo::class.java)
126
+ val metaData = mock(Bundle::class.java)
127
+ applicationInfo.metaData = metaData
128
+ `when`(context.packageManager).thenReturn(packageManager)
129
+ `when`(context.packageName).thenReturn("com.example.test")
130
+ `when`(
131
+ packageManager.getApplicationInfo("com.example.test", PackageManager.GET_META_DATA),
132
+ ).thenReturn(applicationInfo)
133
+ `when`(metaData.containsKey("rnfirebase_present")).thenReturn(true)
134
+
135
+ withApplicationContext(context) {
136
+ assertTrue(ReactNativeFirebaseMeta().contains("present"))
137
+ }
138
+
139
+ verify(packageManager)
140
+ .getApplicationInfo("com.example.test", PackageManager.GET_META_DATA)
141
+ }
142
+
143
+ @Test
144
+ fun metadataLookupFallsBackForNullApplicationInfoNullMetadataAndMissingPackage() {
145
+ val context = mock(Context::class.java)
146
+ val packageManager = mock(PackageManager::class.java)
147
+ val applicationInfo = mock(ApplicationInfo::class.java)
148
+ `when`(context.packageManager).thenReturn(packageManager)
149
+ `when`(context.packageName).thenReturn("com.example.test")
150
+ `when`(
151
+ packageManager.getApplicationInfo("com.example.test", PackageManager.GET_META_DATA),
152
+ ).thenReturn(null, applicationInfo)
153
+ .thenThrow(PackageManager.NameNotFoundException("missing"))
154
+
155
+ withApplicationContext(context) {
156
+ val subject = ReactNativeFirebaseMeta()
157
+
158
+ assertFalse(subject.contains("first"))
159
+ assertFalse(subject.contains("second"))
160
+ assertFalse(subject.contains("third"))
161
+ }
162
+ }
163
+
164
+ @Test
165
+ fun getAllCreatesAndReturnsEmptyMapWhenMetadataIsUnavailable() {
166
+ val context = mock(Context::class.java)
167
+ val emptyMap = mock(WritableMap::class.java)
168
+ `when`(context.packageManager).thenReturn(null)
169
+
170
+ withApplicationContext(context) {
171
+ mockStatic(Arguments::class.java).use { arguments ->
172
+ arguments.`when`<WritableMap>(Arguments::createMap).thenReturn(emptyMap)
173
+
174
+ assertSame(emptyMap, ReactNativeFirebaseMeta().getAll())
175
+ verifyNoInteractions(emptyMap)
176
+ }
177
+ }
178
+ }
179
+
180
+ @Test
181
+ fun getAllKeepsPrefixedSupportedValuesAndIgnoresEverythingElse() {
182
+ val metaData = mock(Bundle::class.java)
183
+ val writableMap = mock(WritableMap::class.java)
184
+ val context = contextWithMetaData(metaData)
185
+ val keys =
186
+ linkedSetOf(
187
+ "unrelated",
188
+ "rnfirebase_null",
189
+ "rnfirebase_string",
190
+ "rnfirebase_boolean",
191
+ "rnfirebase_integer",
192
+ "rnfirebase_unsupported",
193
+ )
194
+ `when`(metaData.keySet()).thenReturn(keys)
195
+ `when`(metaData.get("rnfirebase_null")).thenReturn(null)
196
+ `when`(metaData.get("rnfirebase_string")).thenReturn("value")
197
+ `when`(metaData.get("rnfirebase_boolean")).thenReturn(true)
198
+ `when`(metaData.get("rnfirebase_integer")).thenReturn(42)
199
+ `when`(metaData.get("rnfirebase_unsupported")).thenReturn(42L)
200
+
201
+ withApplicationContext(context) {
202
+ mockStatic(Arguments::class.java).use { arguments ->
203
+ arguments.`when`<WritableMap>(Arguments::createMap).thenReturn(writableMap)
204
+
205
+ assertSame(writableMap, ReactNativeFirebaseMeta().getAll())
206
+ }
207
+ }
208
+
209
+ verify(metaData, never()).get("unrelated")
210
+ verify(writableMap).putNull("rnfirebase_null")
211
+ verify(writableMap).putString("rnfirebase_string", "value")
212
+ verify(writableMap).putBoolean("rnfirebase_boolean", true)
213
+ verify(writableMap).putInt("rnfirebase_integer", 42)
214
+ verifyNoMoreInteractions(writableMap)
215
+ }
216
+
217
+ private fun contextWithMetaData(metaData: Bundle): Context {
218
+ val context = mock(Context::class.java)
219
+ val packageManager = mock(PackageManager::class.java)
220
+ val applicationInfo = mock(ApplicationInfo::class.java)
221
+ applicationInfo.metaData = metaData
222
+ `when`(context.packageManager).thenReturn(packageManager)
223
+ `when`(context.packageName).thenReturn("com.example.test")
224
+ `when`(
225
+ packageManager.getApplicationInfo("com.example.test", PackageManager.GET_META_DATA),
226
+ ).thenReturn(applicationInfo)
227
+ return context
228
+ }
229
+
230
+ private fun withApplicationContext(
231
+ context: Context,
232
+ block: () -> Unit,
233
+ ) {
234
+ val previous: Context? = ReactNativeFirebaseApp.getApplicationContext()
235
+ mockStatic(Log::class.java).use {
236
+ ReactNativeFirebaseApp.setApplicationContext(context)
237
+ }
238
+ try {
239
+ block()
240
+ } finally {
241
+ mockStatic(Log::class.java).use {
242
+ ReactNativeFirebaseApp.setApplicationContext(previous)
243
+ }
244
+ }
245
+ }
246
+ }