FIRIAMFetchResponseParserTests.m 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. /*
  2. * Copyright 2017 Google
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the 'License');
  5. * you may not use this file 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. #import <OCMock/OCMock.h>
  17. #import <XCTest/XCTest.h>
  18. #import "FirebaseInAppMessaging/Sources/Private/Data/FIRIAMFetchResponseParser.h"
  19. #import "FirebaseInAppMessaging/Sources/Private/Data/FIRIAMMessageContentDataWithImageURL.h"
  20. #import "FirebaseInAppMessaging/Sources/Private/Data/FIRIAMMessageDefinition.h"
  21. #import "FirebaseInAppMessaging/Sources/Private/DisplayTrigger/FIRIAMDisplayTriggerDefinition.h"
  22. #import "FirebaseInAppMessaging/Sources/Private/Util/FIRIAMTimeFetcher.h"
  23. #import "FirebaseInAppMessaging/Sources/Util/UIColor+FIRIAMHexString.h"
  24. @interface FIRIAMFetchResponseParserTests : XCTestCase
  25. @property(nonatomic, copy) NSString *jsonResponse;
  26. @property(nonatomic) FIRIAMFetchResponseParser *parser;
  27. @property(nonatomic) id<FIRIAMTimeFetcher> mockTimeFetcher;
  28. @end
  29. @implementation FIRIAMFetchResponseParserTests
  30. - (void)setUp {
  31. [super setUp];
  32. self.mockTimeFetcher = OCMProtocolMock(@protocol(FIRIAMTimeFetcher));
  33. self.parser = [[FIRIAMFetchResponseParser alloc] initWithTimeFetcher:self.mockTimeFetcher];
  34. }
  35. - (void)tearDown {
  36. [super tearDown];
  37. }
  38. - (void)testRegularConversion {
  39. NSString *testJsonDataFilePath =
  40. [[NSBundle bundleForClass:[self class]] pathForResource:@"TestJsonDataFromFetch"
  41. ofType:@"txt"];
  42. NSTimeInterval currentMoment = 100000000;
  43. OCMStub([self.mockTimeFetcher currentTimestampInSeconds]).andReturn(currentMoment);
  44. self.jsonResponse = [[NSString alloc] initWithContentsOfFile:testJsonDataFilePath
  45. encoding:NSUTF8StringEncoding
  46. error:nil];
  47. NSData *data = [self.jsonResponse dataUsingEncoding:NSUTF8StringEncoding];
  48. NSError *errorJson = nil;
  49. NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData:data
  50. options:kNilOptions
  51. error:&errorJson];
  52. NSInteger discardCount;
  53. NSNumber *fetchWaitTime;
  54. NSArray<FIRIAMMessageDefinition *> *results =
  55. [self.parser parseAPIResponseDictionary:responseDict
  56. discardedMsgCount:&discardCount
  57. fetchWaitTimeInSeconds:&fetchWaitTime];
  58. double nextFetchEpochTimeInResponse =
  59. [responseDict[@"expirationEpochTimestampMillis"] doubleValue];
  60. // Fetch wait time should be (next fetch epoch time - current moment).
  61. XCTAssertEqualWithAccuracy([fetchWaitTime doubleValue],
  62. nextFetchEpochTimeInResponse / 1000 - currentMoment, 0.1);
  63. XCTAssertEqual(6, [results count]);
  64. XCTAssertEqual(0, discardCount);
  65. FIRIAMMessageDefinition *first = results[0];
  66. XCTAssertEqualObjects(@"13313766398414028800", first.renderData.messageID);
  67. XCTAssertEqualObjects(@"first campaign", first.renderData.name);
  68. XCTAssertEqualObjects(@"I heard you like In-App Messages",
  69. first.renderData.contentData.titleText);
  70. XCTAssertEqualObjects(@"This is message body", first.renderData.contentData.bodyText);
  71. XCTAssertEqual(FIRIAMRenderAsModalView, first.renderData.renderingEffectSettings.viewMode);
  72. XCTAssertEqualWithAccuracy(1523986039, first.startTime, 0.1);
  73. XCTAssertEqualWithAccuracy(1526986039, first.endTime, 0.1);
  74. XCTAssertNotNil(first.renderData.renderingEffectSettings.textColor);
  75. XCTAssertEqualObjects(first.renderData.renderingEffectSettings.displayBGColor,
  76. [UIColor firiam_colorWithHexString:@"#fffff8"]);
  77. XCTAssertEqualObjects(first.renderData.renderingEffectSettings.btnBGColor,
  78. [UIColor firiam_colorWithHexString:@"#000000"]);
  79. XCTAssertEqualObjects(first.renderData.contentData.actionURL.absoluteString,
  80. @"https://www.google.com");
  81. XCTAssertEqual(FIRIAMRenderTriggerOnAppForeground, first.renderTriggers[0].triggerType);
  82. XCTAssertEqual(first.appData.count, 2);
  83. XCTAssertEqualObjects(first.appData[@"a"], @"b");
  84. XCTAssertEqualObjects(first.appData[@"c"], @"d");
  85. FIRIAMMessageDefinition *second = results[1];
  86. XCTAssertEqualObjects(@"9350598726327992320", second.renderData.messageID);
  87. XCTAssertEqualObjects(@"Inception1", second.renderData.name);
  88. XCTAssertEqualObjects(@"Test 2", second.renderData.contentData.titleText);
  89. XCTAssertNil(second.renderData.contentData.bodyText);
  90. XCTAssertNil(second.appData);
  91. XCTAssertEqual(FIRIAMRenderAsModalView, second.renderData.renderingEffectSettings.viewMode);
  92. XCTAssertEqual(2, second.renderTriggers.count);
  93. XCTAssertEqualObjects(second.renderData.renderingEffectSettings.displayBGColor,
  94. [UIColor firiam_colorWithHexString:@"#ffffff"]);
  95. // Third message is a banner view message based on an analytics event trigger.
  96. FIRIAMMessageDefinition *third = results[2];
  97. XCTAssertEqualObjects(@"14819094573862617088", third.renderData.messageID);
  98. XCTAssertEqual(FIRIAMRenderAsBannerView, third.renderData.renderingEffectSettings.viewMode);
  99. XCTAssertEqual(1, third.renderTriggers.count);
  100. XCTAssertEqualObjects(@"jackpot", third.renderTriggers[0].firebaseEventName);
  101. // Fifth message is a card view message based on an analytics event trigger.
  102. FIRIAMMessageDefinition *fifth = results[4];
  103. XCTAssertEqualObjects(@"5432869654332221", fifth.renderData.messageID);
  104. XCTAssertEqual(FIRIAMRenderAsCardView, fifth.renderData.renderingEffectSettings.viewMode);
  105. XCTAssertEqual(1, fifth.renderTriggers.count);
  106. XCTAssertEqual(FIRIAMRenderTriggerOnAppForeground, fifth.renderTriggers[0].triggerType);
  107. XCTAssertEqualObjects(@"Super Bowl LIV", fifth.renderData.name);
  108. XCTAssertEqualObjects(@"Eagles are going to win", fifth.renderData.contentData.titleText);
  109. XCTAssertEqualObjects(@"Start of a dynasty.", fifth.renderData.contentData.bodyText);
  110. XCTAssertEqualObjects(@"https://image.com/birds.png",
  111. fifth.renderData.contentData.imageURL.absoluteString);
  112. XCTAssertEqualObjects(@"https://image.com/ls_birds.png",
  113. fifth.renderData.contentData.landscapeImageURL.absoluteString);
  114. XCTAssertEqualObjects(@"https://www.google.com",
  115. fifth.renderData.contentData.actionURL.absoluteString);
  116. XCTAssertEqualObjects(@"Win Super Bowl LIV", fifth.renderData.contentData.actionButtonText);
  117. XCTAssertEqualObjects(@"https://www.google.com",
  118. fifth.renderData.contentData.secondaryActionURL.absoluteString);
  119. XCTAssertEqualObjects(@"Win Super Bowl LV",
  120. fifth.renderData.contentData.secondaryActionButtonText);
  121. FIRIAMMessageDefinition *sixth = results[5];
  122. XCTAssertEqualObjects(@"687787988989", sixth.renderData.messageID);
  123. XCTAssertEqualObjects(@"Super Bowl LV", sixth.renderData.name);
  124. XCTAssertEqualObjects(@"Eagles are going to win", sixth.renderData.contentData.titleText);
  125. XCTAssertNil(sixth.renderData.contentData.bodyText);
  126. XCTAssertNil(sixth.appData);
  127. XCTAssertNotNil(sixth.experimentPayload);
  128. XCTAssertEqual(FIRIAMRenderAsModalView, sixth.renderData.renderingEffectSettings.viewMode);
  129. XCTAssertEqual(1, sixth.renderTriggers.count);
  130. }
  131. - (void)testParsingTestMessage {
  132. NSString *testJsonDataFilePath = [[NSBundle bundleForClass:[self class]]
  133. pathForResource:@"TestJsonDataWithTestMessageFromFetch"
  134. ofType:@"txt"];
  135. self.jsonResponse = [[NSString alloc] initWithContentsOfFile:testJsonDataFilePath
  136. encoding:NSUTF8StringEncoding
  137. error:nil];
  138. NSData *data = [self.jsonResponse dataUsingEncoding:NSUTF8StringEncoding];
  139. NSError *errorJson = nil;
  140. NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData:data
  141. options:kNilOptions
  142. error:&errorJson];
  143. NSInteger discardCount;
  144. NSNumber *fetchWaitTime;
  145. NSArray<FIRIAMMessageDefinition *> *results =
  146. [self.parser parseAPIResponseDictionary:responseDict
  147. discardedMsgCount:&discardCount
  148. fetchWaitTimeInSeconds:&fetchWaitTime];
  149. // In our fixture file used in this test, there is no fetch expiration time
  150. XCTAssertNil(fetchWaitTime);
  151. XCTAssertEqual(2, [results count]);
  152. XCTAssertEqual(0, discardCount);
  153. // First is a test message and the second one is not.
  154. XCTAssertTrue(results[0].isTestMessage);
  155. XCTAssertTrue(results[0].renderData.renderingEffectSettings.isTestMessage);
  156. XCTAssertFalse(results[1].isTestMessage);
  157. XCTAssertFalse(results[1].renderData.renderingEffectSettings.isTestMessage);
  158. }
  159. - (void)testParsingInvalidTestMessageNodes {
  160. NSString *testJsonDataFilePath = [[NSBundle bundleForClass:[self class]]
  161. pathForResource:@"JsonDataWithInvalidMessagesFromFetch"
  162. ofType:@"txt"];
  163. self.jsonResponse = [[NSString alloc] initWithContentsOfFile:testJsonDataFilePath
  164. encoding:NSUTF8StringEncoding
  165. error:nil];
  166. NSData *data = [self.jsonResponse dataUsingEncoding:NSUTF8StringEncoding];
  167. NSError *errorJson = nil;
  168. NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData:data
  169. options:kNilOptions
  170. error:&errorJson];
  171. NSInteger discardCount;
  172. NSNumber *fetchWaitTime;
  173. NSArray<FIRIAMMessageDefinition *> *results =
  174. [self.parser parseAPIResponseDictionary:responseDict
  175. discardedMsgCount:&discardCount
  176. fetchWaitTimeInSeconds:&fetchWaitTime];
  177. XCTAssertEqual(0, [results count]);
  178. // First node missing title, second one missig triggering conditions and the third one
  179. // contains invalid type node.
  180. XCTAssertEqual(3, discardCount);
  181. }
  182. @end