UserDefaultsManagerTests.swift 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. // Copyright 2025 Google LLC
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. @testable import FirebaseRemoteConfig
  15. import XCTest
  16. class UserDefaultsManagerTests: XCTestCase {
  17. let appName = "testApp"
  18. let bundleID = "com.example.testApp"
  19. let namespace = "namespace:app"
  20. let fullyQualifiedNamespace = "namespace:testApp"
  21. override func setUp() {
  22. super.setUp()
  23. // Clear for clean test state
  24. let persistentDomain = UserDefaultsManager.userDefaultsSuiteName(for: bundleID)
  25. UserDefaults.standard.removePersistentDomain(forName: persistentDomain)
  26. }
  27. func testSharedUserDefaultsForBundleIdentifier() {
  28. let defaults1 = UserDefaultsManager.sharedUserDefaultsForBundleIdentifier(bundleID)
  29. let defaults2 = UserDefaultsManager.sharedUserDefaultsForBundleIdentifier(bundleID)
  30. XCTAssertTrue(defaults1 === defaults2) // Should return the same instance each time
  31. }
  32. func testUserDefaultsSuiteName() {
  33. let suiteName = UserDefaultsManager.userDefaultsSuiteName(for: bundleID)
  34. XCTAssertEqual(suiteName, "group.\(bundleID).firebase")
  35. }
  36. func testLastETag() {
  37. let manager = UserDefaultsManager(
  38. appName: appName,
  39. bundleID: bundleID,
  40. namespace: namespace
  41. )
  42. manager.lastETag = "eTag1"
  43. XCTAssertEqual(manager.lastETag, "eTag1")
  44. }
  45. func testSettingNilLastETagIsNoOp() {
  46. let manager = UserDefaultsManager(
  47. appName: appName,
  48. bundleID: bundleID,
  49. namespace: namespace
  50. )
  51. manager.lastETag = "eTag1"
  52. XCTAssertEqual(manager.lastETag, "eTag1")
  53. manager.lastETag = nil
  54. XCTAssertEqual(manager.lastETag, "eTag1")
  55. }
  56. func testLastFetchedTemplateVersion() {
  57. let manager = UserDefaultsManager(
  58. appName: appName,
  59. bundleID: bundleID,
  60. namespace: namespace
  61. )
  62. // Test default value
  63. // Default should be "0"
  64. XCTAssertEqual(manager.lastFetchedTemplateVersion, "0")
  65. manager.lastFetchedTemplateVersion = "123"
  66. XCTAssertEqual(manager.lastFetchedTemplateVersion, "123")
  67. }
  68. func testUserDefaultsSharedWithinBundleID() {
  69. let manager1 = UserDefaultsManager(appName: appName, bundleID: bundleID, namespace: namespace)
  70. let manager2 = UserDefaultsManager(appName: appName, bundleID: bundleID, namespace: namespace)
  71. let manager3 = UserDefaultsManager(
  72. appName: appName,
  73. bundleID: bundleID,
  74. namespace: namespace + "1"
  75. )
  76. let manager4 = UserDefaultsManager(
  77. appName: appName,
  78. bundleID: bundleID + "1",
  79. namespace: namespace
  80. )
  81. manager1.lastETag = "etag1"
  82. XCTAssertEqual(manager2.lastETag, "etag1")
  83. XCTAssertEqual(manager3.lastETag, "etag1")
  84. XCTAssertNil(manager4.lastETag)
  85. }
  86. func testLastActiveTemplateVersion() {
  87. let manager = UserDefaultsManager(
  88. appName: appName,
  89. bundleID: bundleID,
  90. namespace: namespace
  91. )
  92. // Test default value
  93. // Default should be "0"
  94. XCTAssertEqual(manager.lastActiveTemplateVersion, "0")
  95. manager.lastActiveTemplateVersion = "456"
  96. XCTAssertEqual(manager.lastActiveTemplateVersion, "456")
  97. }
  98. func testLastETagUpdateTime() {
  99. let manager = UserDefaultsManager(
  100. appName: appName,
  101. bundleID: bundleID,
  102. namespace: namespace
  103. )
  104. let time: TimeInterval = 1_678_886_400 // Example timestamp
  105. manager.lastETagUpdateTime = time
  106. XCTAssertEqual(manager.lastETagUpdateTime, time)
  107. }
  108. func testLastFetchTime() {
  109. let manager = UserDefaultsManager(
  110. appName: appName,
  111. bundleID: bundleID,
  112. namespace: namespace
  113. )
  114. let time: TimeInterval = 1_678_886_400 // Example timestamp
  115. manager.lastFetchTime = time
  116. XCTAssertEqual(manager.lastFetchTime, time)
  117. }
  118. func testLastFetchStatus() {
  119. let manager = UserDefaultsManager(
  120. appName: appName,
  121. bundleID: bundleID,
  122. namespace: namespace
  123. )
  124. manager.lastFetchStatus = "Success"
  125. XCTAssertEqual(manager.lastFetchStatus, "Success")
  126. }
  127. func testLastFetchStatusIsNoOp() {
  128. let manager = UserDefaultsManager(
  129. appName: appName,
  130. bundleID: bundleID,
  131. namespace: namespace
  132. )
  133. manager.lastETag = "eTag1"
  134. XCTAssertEqual(manager.lastETag, "eTag1")
  135. manager.lastETag = nil
  136. XCTAssertEqual(manager.lastETag, "eTag1")
  137. }
  138. func testIsClientThrottledWithExponentialBackoff() {
  139. let manager = UserDefaultsManager(
  140. appName: appName,
  141. bundleID: bundleID,
  142. namespace: namespace
  143. )
  144. manager.isClientThrottledWithExponentialBackoff = true
  145. XCTAssertTrue(manager.isClientThrottledWithExponentialBackoff)
  146. manager.isClientThrottledWithExponentialBackoff = false
  147. XCTAssertFalse(manager.isClientThrottledWithExponentialBackoff)
  148. }
  149. func testThrottleEndTime() {
  150. let manager = UserDefaultsManager(
  151. appName: appName,
  152. bundleID: bundleID,
  153. namespace: namespace
  154. )
  155. let time: TimeInterval = 1_678_886_400 // Example timestamp
  156. manager.throttleEndTime = time
  157. XCTAssertEqual(manager.throttleEndTime, time)
  158. }
  159. func testCurrentThrottlingRetryIntervalSeconds() {
  160. let manager = UserDefaultsManager(
  161. appName: appName,
  162. bundleID: bundleID,
  163. namespace: namespace
  164. )
  165. let interval: TimeInterval = 300 // Example interval
  166. manager.currentThrottlingRetryIntervalSeconds = interval
  167. XCTAssertEqual(manager.currentThrottlingRetryIntervalSeconds, interval)
  168. }
  169. func testRealtimeRetryCount() {
  170. let manager = UserDefaultsManager(
  171. appName: appName,
  172. bundleID: bundleID,
  173. namespace: namespace
  174. )
  175. manager.realtimeRetryCount = 5
  176. XCTAssertEqual(manager.realtimeRetryCount, 5)
  177. }
  178. func testRealtimeThrottleEndTime() {
  179. let manager = UserDefaultsManager(
  180. appName: appName,
  181. bundleID: bundleID,
  182. namespace: namespace
  183. )
  184. let time: TimeInterval = 1_678_886_400 // Example timestamp
  185. manager.realtimeThrottleEndTime = time
  186. XCTAssertEqual(manager.realtimeThrottleEndTime, time)
  187. }
  188. func testCurrentRealtimeThrottlingRetryIntervalSeconds() {
  189. let manager = UserDefaultsManager(
  190. appName: appName,
  191. bundleID: bundleID,
  192. namespace: namespace
  193. )
  194. let interval: TimeInterval = 300 // Example interval
  195. manager.currentRealtimeThrottlingRetryIntervalSeconds = interval
  196. XCTAssertEqual(manager.currentRealtimeThrottlingRetryIntervalSeconds, interval)
  197. }
  198. func testResetUserDefaults() {
  199. let manager = UserDefaultsManager(
  200. appName: appName,
  201. bundleID: bundleID,
  202. namespace: namespace
  203. )
  204. manager.lastETag = "testValue"
  205. manager.resetUserDefaults()
  206. XCTAssertNil(manager.lastETag) // Check if value was removed
  207. }
  208. }