@react-native-firebase/analytics 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 (31) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/RNFBAnalytics.podspec +49 -2
  3. package/dist/module/index.js +2 -2
  4. package/dist/module/index.js.map +1 -1
  5. package/dist/module/version.js +1 -1
  6. package/dist/typescript/lib/index.d.ts.map +1 -1
  7. package/dist/typescript/lib/version.d.ts +1 -1
  8. package/ios/RNFBAnalytics/RNFBAnalyticsConsentSettingsMapper.swift +98 -0
  9. package/ios/RNFBAnalytics/RNFBAnalyticsHelper.h +111 -0
  10. package/ios/RNFBAnalytics/RNFBAnalyticsHelper.m +338 -0
  11. package/ios/RNFBAnalytics/RNFBAnalyticsJavascriptParamsCleaner.swift +167 -0
  12. package/ios/RNFBAnalytics/RNFBAnalyticsModule.mm +32 -282
  13. package/ios/RNFBAnalytics.xcodeproj/project.pbxproj +16 -2
  14. package/ios/RNFBAnalyticsUnitTests/HostStubs/Firebase/FIRAnalyticsHostStub.m +304 -0
  15. package/ios/RNFBAnalyticsUnitTests/HostStubs/Firebase/Firebase.h +71 -0
  16. package/ios/RNFBAnalyticsUnitTests/HostStubs/RNFBAnalytics/RNFBAnalyticsLogTransactionHostStub.h +20 -0
  17. package/ios/RNFBAnalyticsUnitTests/HostStubs/RNFBAnalytics/RNFBAnalyticsLogTransactionHostStub.m +43 -0
  18. package/ios/RNFBAnalyticsUnitTests/HostStubs/RNFBApp/RNFBSharedUtils.h +21 -0
  19. package/ios/RNFBAnalyticsUnitTests/HostStubs/RNFBApp/RNFBSharedUtilsHostStub.m +26 -0
  20. package/ios/RNFBAnalyticsUnitTests/HostStubs/React/RCTBridgeModule.h +10 -0
  21. package/ios/RNFBAnalyticsUnitTests/RNFBAnalyticsConsentSettingsMapperHostStubTests.m +62 -0
  22. package/ios/RNFBAnalyticsUnitTests/RNFBAnalyticsConsentSettingsMapperTests.swift +91 -0
  23. package/ios/RNFBAnalyticsUnitTests/RNFBAnalyticsHelperHostStubTests.m +542 -0
  24. package/ios/RNFBAnalyticsUnitTests/RNFBAnalyticsJavascriptParamsCleanerHostStubTests.m +59 -0
  25. package/ios/RNFBAnalyticsUnitTests/RNFBAnalyticsJavascriptParamsCleanerTests.swift +205 -0
  26. package/ios/RNFBAnalyticsUnitTests/RNFBAnalyticsNullSentinelDecodeTests.m +111 -0
  27. package/ios/RNFBAnalyticsUnitTests/RNFBAnalyticsUnitTests.xcodeproj/project.pbxproj +302 -0
  28. package/ios/RNFBAnalyticsUnitTests/RNFBAnalyticsUnitTests.xcodeproj/xcshareddata/xcschemes/RNFBAnalyticsUnitTests.xcscheme +69 -0
  29. package/lib/index.ts +1 -1
  30. package/lib/version.ts +1 -1
  31. package/package.json +4 -4
@@ -0,0 +1,542 @@
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 <Firebase/Firebase.h>
20
+ #import "RNFBAnalytics/RNFBAnalyticsLogTransactionHostStub.h"
21
+ #import "RNFBAnalyticsHelper.h"
22
+
23
+ @interface RNFBAnalyticsHelperHostStubTests : XCTestCase
24
+ @end
25
+
26
+ @implementation RNFBAnalyticsHelperHostStubTests
27
+
28
+ - (void)setUp {
29
+ [super setUp];
30
+ [FIRAnalytics resetTestState];
31
+ [RNFBAnalyticsLogTransaction resetTestState];
32
+ }
33
+
34
+ - (void)tearDown {
35
+ [FIRAnalytics resetTestState];
36
+ [RNFBAnalyticsLogTransaction resetTestState];
37
+ [super tearDown];
38
+ }
39
+
40
+ - (void)testLogEvent_cleansJavascriptParamsBeforeForwarding {
41
+ __block id resolved = @"unset";
42
+ [RNFBAnalyticsHelper logEvent:@"purchase"
43
+ params:@{@"quantity" : @"2", @"success" : @"true"}
44
+ resolve:^(id result) {
45
+ resolved = result;
46
+ }
47
+ reject:^(NSString *code, NSString *message, NSError *error) {
48
+ (void)code;
49
+ (void)message;
50
+ (void)error;
51
+ XCTFail(@"unexpected reject");
52
+ }];
53
+
54
+ XCTAssertEqualObjects(resolved, [NSNull null]);
55
+ XCTAssertEqualObjects(FIRAnalytics.lastLogEventName, @"purchase");
56
+ XCTAssertEqualObjects(FIRAnalytics.lastLogEventParameters[@"quantity"], @2);
57
+ XCTAssertEqualObjects(FIRAnalytics.lastLogEventParameters[@"success"], @1);
58
+ }
59
+
60
+ - (void)testSetUserId_convertsNSNullToNil {
61
+ [RNFBAnalyticsHelper setUserId:(NSString *)[NSNull null]
62
+ resolve:^(id result) {
63
+ (void)result;
64
+ }
65
+ reject:^(NSString *code, NSString *message, NSError *error) {
66
+ (void)code;
67
+ (void)message;
68
+ (void)error;
69
+ XCTFail(@"unexpected reject");
70
+ }];
71
+
72
+ XCTAssertNil(FIRAnalytics.userIDValue);
73
+ }
74
+
75
+ - (void)testSetUserProperties_appliesEachEntryWithNSNullCoercion {
76
+ [RNFBAnalyticsHelper setUserProperties:@{@"a" : @"1", @"b" : [NSNull null]}
77
+ resolve:^(id result) {
78
+ (void)result;
79
+ }
80
+ reject:^(NSString *code, NSString *message, NSError *error) {
81
+ (void)code;
82
+ (void)message;
83
+ (void)error;
84
+ XCTFail(@"unexpected reject");
85
+ }];
86
+
87
+ XCTAssertEqualObjects(FIRAnalytics.userProperties[@"a"], @"1");
88
+ XCTAssertNil(FIRAnalytics.userProperties[@"b"]);
89
+ }
90
+
91
+ - (void)testSetSessionTimeoutDuration_convertsMillisecondsToSeconds {
92
+ [RNFBAnalyticsHelper setSessionTimeoutDuration:1500
93
+ resolve:^(id result) {
94
+ (void)result;
95
+ }
96
+ reject:^(NSString *code, NSString *message, NSError *error) {
97
+ (void)code;
98
+ (void)message;
99
+ (void)error;
100
+ XCTFail(@"unexpected reject");
101
+ }];
102
+
103
+ XCTAssertEqualWithAccuracy(FIRAnalytics.sessionTimeoutIntervalValue, 1.5, 0.0001);
104
+ }
105
+
106
+ - (void)testGetAppInstanceId_forwardsStubValue {
107
+ FIRAnalytics.appInstanceIDValue = @"instance-42";
108
+ __block id resolved = @"unset";
109
+ [RNFBAnalyticsHelper
110
+ getAppInstanceId:^(id result) {
111
+ resolved = result;
112
+ }
113
+ reject:^(NSString *code, NSString *message, NSError *error) {
114
+ (void)code;
115
+ (void)message;
116
+ (void)error;
117
+ XCTFail(@"unexpected reject");
118
+ }];
119
+
120
+ XCTAssertEqualObjects(resolved, @"instance-42");
121
+ }
122
+
123
+ - (void)testGetSessionId_success_resolvesNumber {
124
+ FIRAnalytics.sessionIDCompletionValue = 99;
125
+ __block id resolved = @"unset";
126
+ XCTestExpectation *expectation = [self expectationWithDescription:@"session id"];
127
+
128
+ [RNFBAnalyticsHelper
129
+ getSessionId:^(id result) {
130
+ resolved = result;
131
+ [expectation fulfill];
132
+ }
133
+ reject:^(NSString *code, NSString *message, NSError *error) {
134
+ (void)code;
135
+ (void)message;
136
+ (void)error;
137
+ XCTFail(@"unexpected reject");
138
+ }];
139
+
140
+ [self waitForExpectationsWithTimeout:1.0 handler:nil];
141
+ XCTAssertEqualObjects(resolved, @99);
142
+ }
143
+
144
+ - (void)testGetSessionId_zeroWithoutError_resolvesNull {
145
+ FIRAnalytics.sessionIDCompletionValue = 0;
146
+ __block id resolved = @"unset";
147
+ XCTestExpectation *expectation = [self expectationWithDescription:@"session id zero"];
148
+
149
+ [RNFBAnalyticsHelper
150
+ getSessionId:^(id result) {
151
+ resolved = result;
152
+ [expectation fulfill];
153
+ }
154
+ reject:^(NSString *code, NSString *message, NSError *error) {
155
+ (void)code;
156
+ (void)message;
157
+ (void)error;
158
+ XCTFail(@"unexpected reject");
159
+ }];
160
+
161
+ [self waitForExpectationsWithTimeout:1.0 handler:nil];
162
+ XCTAssertEqualObjects(resolved, [NSNull null]);
163
+ }
164
+
165
+ - (void)testGetSessionId_error_resolvesNull {
166
+ FIRAnalytics.sessionIDCompletionError =
167
+ [NSError errorWithDomain:@"test" code:1 userInfo:@{NSLocalizedDescriptionKey : @"boom"}];
168
+ __block id resolved = @"unset";
169
+ XCTestExpectation *expectation = [self expectationWithDescription:@"session id error"];
170
+
171
+ [RNFBAnalyticsHelper
172
+ getSessionId:^(id result) {
173
+ resolved = result;
174
+ [expectation fulfill];
175
+ }
176
+ reject:^(NSString *code, NSString *message, NSError *error) {
177
+ (void)code;
178
+ (void)message;
179
+ (void)error;
180
+ XCTFail(@"unexpected reject");
181
+ }];
182
+
183
+ [self waitForExpectationsWithTimeout:1.0 handler:nil];
184
+ XCTAssertEqualObjects(resolved, [NSNull null]);
185
+ }
186
+
187
+ - (void)testHashedEmail_invalidHex_rejects {
188
+ __block NSString *rejectCode = nil;
189
+ __block NSString *rejectMessage = nil;
190
+ __block BOOL resolved = NO;
191
+
192
+ [RNFBAnalyticsHelper initiateOnDeviceConversionMeasurementWithHashedEmailAddress:@"deadbeef"
193
+ resolve:^(id result) {
194
+ (void)result;
195
+ resolved = YES;
196
+ }
197
+ reject:^(NSString *code, NSString *message, NSError *error) {
198
+ (void)error;
199
+ rejectCode = code;
200
+ rejectMessage = message;
201
+ }];
202
+
203
+ XCTAssertFalse(resolved);
204
+ XCTAssertEqualObjects(rejectCode, @"firebase_analytics");
205
+ XCTAssertEqualObjects(rejectMessage, @"Expected a 64-character SHA-256 hex string");
206
+ XCTAssertNil(FIRAnalytics.lastHashedEmail);
207
+ }
208
+
209
+ - (void)testHashedEmail_validHex_forwardsData {
210
+ NSString *hex = [@"" stringByPaddingToLength:64 withString:@"ab" startingAtIndex:0];
211
+ __block BOOL resolved = NO;
212
+
213
+ [RNFBAnalyticsHelper initiateOnDeviceConversionMeasurementWithHashedEmailAddress:hex
214
+ resolve:^(id result) {
215
+ (void)result;
216
+ resolved = YES;
217
+ }
218
+ reject:^(NSString *code, NSString *message, NSError *error) {
219
+ (void)code;
220
+ (void)message;
221
+ (void)error;
222
+ XCTFail(@"unexpected reject");
223
+ }];
224
+
225
+ XCTAssertTrue(resolved);
226
+ XCTAssertEqual(FIRAnalytics.lastHashedEmail.length, 32u);
227
+ }
228
+
229
+ - (void)testHashedPhone_invalidHex_rejects {
230
+ __block NSString *rejectCode = nil;
231
+ __block BOOL resolved = NO;
232
+
233
+ [RNFBAnalyticsHelper initiateOnDeviceConversionMeasurementWithHashedPhoneNumber:@"short"
234
+ resolve:^(id result) {
235
+ (void)result;
236
+ resolved = YES;
237
+ }
238
+ reject:^(NSString *code, NSString *message, NSError *error) {
239
+ (void)message;
240
+ (void)error;
241
+ rejectCode = code;
242
+ }];
243
+
244
+ XCTAssertFalse(resolved);
245
+ XCTAssertEqualObjects(rejectCode, @"firebase_analytics");
246
+ XCTAssertNil(FIRAnalytics.lastHashedPhone);
247
+ }
248
+
249
+ - (void)testSetConsent_mapsSettingsAndForwards {
250
+ [RNFBAnalyticsHelper setConsent:@{@"analytics_storage" : @YES, @"ad_storage" : @NO}
251
+ resolve:^(id result) {
252
+ (void)result;
253
+ }
254
+ reject:^(NSString *code, NSString *message, NSError *error) {
255
+ (void)code;
256
+ (void)message;
257
+ (void)error;
258
+ XCTFail(@"unexpected reject");
259
+ }];
260
+
261
+ XCTAssertEqualObjects(FIRAnalytics.lastConsent[@"analytics_storage"], @"granted");
262
+ XCTAssertEqualObjects(FIRAnalytics.lastConsent[@"ad_storage"], @"denied");
263
+ }
264
+
265
+ - (void)testLogTransaction_forwardsToSwiftFacade {
266
+ [RNFBAnalyticsHelper logTransaction:@"12345"
267
+ resolve:^(id result) {
268
+ (void)result;
269
+ }
270
+ reject:^(NSString *code, NSString *message, NSError *error) {
271
+ (void)code;
272
+ (void)message;
273
+ (void)error;
274
+ XCTFail(@"unexpected reject");
275
+ }];
276
+
277
+ XCTAssertEqual(RNFBAnalyticsLogTransaction.logCallCount, 1u);
278
+ XCTAssertEqualObjects(RNFBAnalyticsLogTransaction.lastTransactionId, @"12345");
279
+ }
280
+
281
+ - (void)testSetAnalyticsCollectionEnabled_andReset {
282
+ [RNFBAnalyticsHelper setAnalyticsCollectionEnabled:YES
283
+ resolve:^(id result) {
284
+ (void)result;
285
+ }
286
+ reject:^(NSString *code, NSString *message, NSError *error) {
287
+ (void)code;
288
+ (void)message;
289
+ (void)error;
290
+ XCTFail(@"unexpected reject");
291
+ }];
292
+ [RNFBAnalyticsHelper
293
+ resetAnalyticsData:^(id result) {
294
+ (void)result;
295
+ }
296
+ reject:^(NSString *code, NSString *message, NSError *error) {
297
+ (void)code;
298
+ (void)message;
299
+ (void)error;
300
+ XCTFail(@"unexpected reject");
301
+ }];
302
+
303
+ XCTAssertTrue(FIRAnalytics.analyticsCollectionEnabledValue);
304
+ XCTAssertEqual(FIRAnalytics.resetAnalyticsDataCallCount, 1u);
305
+ }
306
+
307
+ - (void)testSetUserProperty_forwardsValue {
308
+ [RNFBAnalyticsHelper setUserProperty:@"tier"
309
+ value:@"gold"
310
+ resolve:^(id result) {
311
+ (void)result;
312
+ }
313
+ reject:^(NSString *code, NSString *message, NSError *error) {
314
+ (void)code;
315
+ (void)message;
316
+ (void)error;
317
+ XCTFail(@"unexpected reject");
318
+ }];
319
+
320
+ XCTAssertEqualObjects(FIRAnalytics.userProperties[@"tier"], @"gold");
321
+ }
322
+
323
+ - (void)testSetDefaultEventParameters_cleansBeforeForwarding {
324
+ [RNFBAnalyticsHelper setDefaultEventParameters:@{@"quantity" : @"3"}
325
+ resolve:^(id result) {
326
+ (void)result;
327
+ }
328
+ reject:^(NSString *code, NSString *message, NSError *error) {
329
+ (void)code;
330
+ (void)message;
331
+ (void)error;
332
+ XCTFail(@"unexpected reject");
333
+ }];
334
+
335
+ XCTAssertEqualObjects(FIRAnalytics.lastDefaultEventParameters[@"quantity"], @3);
336
+ }
337
+
338
+ - (void)testConversionEmailAndPhone_forwardPlainValues {
339
+ [RNFBAnalyticsHelper initiateOnDeviceConversionMeasurementWithEmailAddress:@"a@b.c"
340
+ resolve:^(id result) {
341
+ (void)result;
342
+ }
343
+ reject:^(NSString *code, NSString *message, NSError *error) {
344
+ (void)code;
345
+ (void)message;
346
+ (void)error;
347
+ XCTFail(@"unexpected reject");
348
+ }];
349
+ [RNFBAnalyticsHelper initiateOnDeviceConversionMeasurementWithPhoneNumber:@"+15551212"
350
+ resolve:^(id result) {
351
+ (void)result;
352
+ }
353
+ reject:^(NSString *code, NSString *message, NSError *error) {
354
+ (void)code;
355
+ (void)message;
356
+ (void)error;
357
+ XCTFail(@"unexpected reject");
358
+ }];
359
+
360
+ XCTAssertEqualObjects(FIRAnalytics.lastConversionEmail, @"a@b.c");
361
+ XCTAssertEqualObjects(FIRAnalytics.lastConversionPhone, @"+15551212");
362
+ }
363
+
364
+ - (void)testHashedPhone_validHex_forwardsData {
365
+ NSString *hex = [@"" stringByPaddingToLength:64 withString:@"cd" startingAtIndex:0];
366
+ [RNFBAnalyticsHelper initiateOnDeviceConversionMeasurementWithHashedPhoneNumber:hex
367
+ resolve:^(id result) {
368
+ (void)result;
369
+ }
370
+ reject:^(NSString *code, NSString *message, NSError *error) {
371
+ (void)code;
372
+ (void)message;
373
+ (void)error;
374
+ XCTFail(@"unexpected reject");
375
+ }];
376
+
377
+ XCTAssertEqual(FIRAnalytics.lastHashedPhone.length, 32u);
378
+ }
379
+
380
+ - (void)testLogEvent_sdkException_rejects {
381
+ FIRAnalytics.shouldThrowOnNextCall = YES;
382
+ __block NSString *rejectCode = nil;
383
+ __block NSString *rejectMessage = nil;
384
+ __block BOOL resolved = NO;
385
+
386
+ [RNFBAnalyticsHelper logEvent:@"x"
387
+ params:@{}
388
+ resolve:^(id result) {
389
+ (void)result;
390
+ resolved = YES;
391
+ }
392
+ reject:^(NSString *code, NSString *message, NSError *error) {
393
+ (void)error;
394
+ rejectCode = code;
395
+ rejectMessage = message;
396
+ }];
397
+
398
+ XCTAssertFalse(resolved);
399
+ XCTAssertEqualObjects(rejectCode, @"unknown");
400
+ XCTAssertEqualObjects(rejectMessage, @"stub throw");
401
+ }
402
+
403
+ - (void)testSetConsent_sdkException_rejects {
404
+ FIRAnalytics.shouldThrowOnNextCall = YES;
405
+ __block NSString *rejectMessage = nil;
406
+
407
+ [RNFBAnalyticsHelper setConsent:@{@"analytics_storage" : @YES}
408
+ resolve:^(id result) {
409
+ (void)result;
410
+ XCTFail(@"unexpected resolve");
411
+ }
412
+ reject:^(NSString *code, NSString *message, NSError *error) {
413
+ (void)code;
414
+ (void)error;
415
+ rejectMessage = message;
416
+ }];
417
+
418
+ XCTAssertEqualObjects(rejectMessage, @"stub throw");
419
+ }
420
+
421
+ - (void)testRemainingSdkExceptionPaths_reject {
422
+ NSArray<void (^)(void)> *calls = @[
423
+ ^{
424
+ [RNFBAnalyticsHelper setUserId:@"u"
425
+ resolve:^(id r) {
426
+ (void)r;
427
+ XCTFail(@"resolve");
428
+ }
429
+ reject:^(NSString *c, NSString *m, NSError *e) {
430
+ (void)c;
431
+ (void)e;
432
+ XCTAssertEqualObjects(m, @"stub throw");
433
+ }];
434
+ },
435
+ ^{
436
+ [RNFBAnalyticsHelper setUserProperty:@"k"
437
+ value:@"v"
438
+ resolve:^(id r) {
439
+ (void)r;
440
+ XCTFail(@"resolve");
441
+ }
442
+ reject:^(NSString *c, NSString *m, NSError *e) {
443
+ (void)c;
444
+ (void)e;
445
+ XCTAssertEqualObjects(m, @"stub throw");
446
+ }];
447
+ },
448
+ ^{
449
+ [RNFBAnalyticsHelper setUserProperties:@{@"k" : @"v"}
450
+ resolve:^(id r) {
451
+ (void)r;
452
+ XCTFail(@"resolve");
453
+ }
454
+ reject:^(NSString *c, NSString *m, NSError *e) {
455
+ (void)c;
456
+ (void)e;
457
+ XCTAssertEqualObjects(m, @"stub throw");
458
+ }];
459
+ },
460
+ ^{
461
+ [RNFBAnalyticsHelper
462
+ resetAnalyticsData:^(id r) {
463
+ (void)r;
464
+ XCTFail(@"resolve");
465
+ }
466
+ reject:^(NSString *c, NSString *m, NSError *e) {
467
+ (void)c;
468
+ (void)e;
469
+ XCTAssertEqualObjects(m, @"stub throw");
470
+ }];
471
+ },
472
+ ^{
473
+ [RNFBAnalyticsHelper setDefaultEventParameters:@{}
474
+ resolve:^(id r) {
475
+ (void)r;
476
+ XCTFail(@"resolve");
477
+ }
478
+ reject:^(NSString *c, NSString *m, NSError *e) {
479
+ (void)c;
480
+ (void)e;
481
+ XCTAssertEqualObjects(m, @"stub throw");
482
+ }];
483
+ },
484
+ ^{
485
+ [RNFBAnalyticsHelper initiateOnDeviceConversionMeasurementWithEmailAddress:@"a@b.c"
486
+ resolve:^(id r) {
487
+ (void)r;
488
+ XCTFail(@"resolve");
489
+ }
490
+ reject:^(NSString *c, NSString *m, NSError *e) {
491
+ (void)c;
492
+ (void)e;
493
+ XCTAssertEqualObjects(m, @"stub throw");
494
+ }];
495
+ },
496
+ ^{
497
+ [RNFBAnalyticsHelper initiateOnDeviceConversionMeasurementWithPhoneNumber:@"+1"
498
+ resolve:^(id r) {
499
+ (void)r;
500
+ XCTFail(@"resolve");
501
+ }
502
+ reject:^(NSString *c, NSString *m, NSError *e) {
503
+ (void)c;
504
+ (void)e;
505
+ XCTAssertEqualObjects(m, @"stub throw");
506
+ }];
507
+ },
508
+ ^{
509
+ NSString *hex = [@"" stringByPaddingToLength:64 withString:@"ab" startingAtIndex:0];
510
+ [RNFBAnalyticsHelper initiateOnDeviceConversionMeasurementWithHashedEmailAddress:hex
511
+ resolve:^(id r) {
512
+ (void)r;
513
+ XCTFail(@"resolve");
514
+ }
515
+ reject:^(NSString *c, NSString *m, NSError *e) {
516
+ (void)c;
517
+ (void)e;
518
+ XCTAssertEqualObjects(m, @"stub throw");
519
+ }];
520
+ },
521
+ ^{
522
+ NSString *hex = [@"" stringByPaddingToLength:64 withString:@"ab" startingAtIndex:0];
523
+ [RNFBAnalyticsHelper initiateOnDeviceConversionMeasurementWithHashedPhoneNumber:hex
524
+ resolve:^(id r) {
525
+ (void)r;
526
+ XCTFail(@"resolve");
527
+ }
528
+ reject:^(NSString *c, NSString *m, NSError *e) {
529
+ (void)c;
530
+ (void)e;
531
+ XCTAssertEqualObjects(m, @"stub throw");
532
+ }];
533
+ },
534
+ ];
535
+
536
+ for (void (^call)(void) in calls) {
537
+ FIRAnalytics.shouldThrowOnNextCall = YES;
538
+ call();
539
+ }
540
+ }
541
+
542
+ @end
@@ -0,0 +1,59 @@
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 <Firebase/Firebase.h>
20
+
21
+ #if __has_include("RNFBAnalyticsJavascriptParamsCleaner-Swift.inc")
22
+ #import "RNFBAnalyticsJavascriptParamsCleaner-Swift.inc"
23
+ #elif __has_include("RNFBAnalyticsUnitTests-Swift.h")
24
+ #import "RNFBAnalyticsUnitTests-Swift.h"
25
+ #else
26
+ #error "RNFBAnalyticsJavascriptParamsCleaner Swift interface not found"
27
+ #endif
28
+
29
+ @interface RNFBAnalyticsJavascriptParamsCleanerHostStubTests : XCTestCase
30
+ @end
31
+
32
+ @implementation RNFBAnalyticsJavascriptParamsCleanerHostStubTests
33
+
34
+ - (void)testLongNumericKeys_matchHostStubFirebaseConstants {
35
+ NSArray<NSString *> *expected = @[
36
+ kFIRParameterQuantity,
37
+ kFIRParameterIndex,
38
+ kFIRParameterLevel,
39
+ kFIRParameterNumberOfNights,
40
+ kFIRParameterNumberOfPassengers,
41
+ kFIRParameterNumberOfRooms,
42
+ kFIRParameterScore,
43
+ ];
44
+ XCTAssertEqualObjects(RNFBAnalyticsJavascriptParamsCleaner.longNumericParameterKeys, expected);
45
+ }
46
+
47
+ - (void)testCleanJavascriptParams_usesHostStubItemsSuccessExtendSessionKeys {
48
+ NSDictionary *cleaned = [RNFBAnalyticsJavascriptParamsCleaner cleanJavascriptParams:@{
49
+ kFIRParameterItems : @[ @{kFIRParameterQuantity : @2.7} ],
50
+ kFIRParameterSuccess : @"yes",
51
+ kFIRParameterExtendSession : @1,
52
+ }];
53
+ XCTAssertEqualObjects(cleaned[kFIRParameterSuccess], @1);
54
+ XCTAssertEqualObjects(cleaned[kFIRParameterExtendSession], @YES);
55
+ NSArray *items = cleaned[kFIRParameterItems];
56
+ XCTAssertEqualObjects(items[0][kFIRParameterQuantity], @2);
57
+ }
58
+
59
+ @end