FIRIAMFetchResponseParserTests.m 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  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(7, [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. XCTAssertEqualObjects(sixth.renderData.renderingEffectSettings.btnTextColor,
  126. [UIColor firiam_colorWithHexString:@"#1a0dab"]);
  127. XCTAssertNil(sixth.renderData.contentData.bodyText);
  128. XCTAssertNil(sixth.appData);
  129. XCTAssertNotNil(sixth.experimentPayload);
  130. XCTAssertEqual(FIRIAMRenderAsModalView, sixth.renderData.renderingEffectSettings.viewMode);
  131. XCTAssertEqual(1, sixth.renderTriggers.count);
  132. FIRIAMMessageDefinition *seventh = results[6];
  133. XCTAssertEqualObjects(@"https://example.com/recoverable_image_url",
  134. seventh.renderData.contentData.imageURL.absoluteString);
  135. XCTAssertEqualObjects(nil, seventh.renderData.contentData.landscapeImageURL.absoluteString);
  136. XCTAssertEqualObjects(@"http://example.com/recoverable_action_url_without_https",
  137. seventh.renderData.contentData.actionURL.absoluteString);
  138. XCTAssertEqualObjects(nil, seventh.renderData.contentData.secondaryActionURL.absoluteString);
  139. }
  140. - (void)testParsingTestMessage {
  141. NSString *testJsonDataFilePath = [[NSBundle bundleForClass:[self class]]
  142. pathForResource:@"TestJsonDataWithTestMessageFromFetch"
  143. ofType:@"txt"];
  144. self.jsonResponse = [[NSString alloc] initWithContentsOfFile:testJsonDataFilePath
  145. encoding:NSUTF8StringEncoding
  146. error:nil];
  147. NSData *data = [self.jsonResponse dataUsingEncoding:NSUTF8StringEncoding];
  148. NSError *errorJson = nil;
  149. NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData:data
  150. options:kNilOptions
  151. error:&errorJson];
  152. NSInteger discardCount;
  153. NSNumber *fetchWaitTime;
  154. NSArray<FIRIAMMessageDefinition *> *results =
  155. [self.parser parseAPIResponseDictionary:responseDict
  156. discardedMsgCount:&discardCount
  157. fetchWaitTimeInSeconds:&fetchWaitTime];
  158. // In our fixture file used in this test, there is no fetch expiration time
  159. XCTAssertNil(fetchWaitTime);
  160. XCTAssertEqual(2, [results count]);
  161. XCTAssertEqual(0, discardCount);
  162. // First is a test message and the second one is not.
  163. XCTAssertTrue(results[0].isTestMessage);
  164. XCTAssertTrue(results[0].renderData.renderingEffectSettings.isTestMessage);
  165. XCTAssertFalse(results[1].isTestMessage);
  166. XCTAssertFalse(results[1].renderData.renderingEffectSettings.isTestMessage);
  167. }
  168. - (void)testParsingInvalidTestMessageNodes {
  169. NSString *testJsonDataFilePath = [[NSBundle bundleForClass:[self class]]
  170. pathForResource:@"JsonDataWithInvalidMessagesFromFetch"
  171. ofType:@"txt"];
  172. self.jsonResponse = [[NSString alloc] initWithContentsOfFile:testJsonDataFilePath
  173. encoding:NSUTF8StringEncoding
  174. error:nil];
  175. NSData *data = [self.jsonResponse dataUsingEncoding:NSUTF8StringEncoding];
  176. NSError *errorJson = nil;
  177. NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData:data
  178. options:kNilOptions
  179. error:&errorJson];
  180. NSInteger discardCount;
  181. NSNumber *fetchWaitTime;
  182. NSArray<FIRIAMMessageDefinition *> *results =
  183. [self.parser parseAPIResponseDictionary:responseDict
  184. discardedMsgCount:&discardCount
  185. fetchWaitTimeInSeconds:&fetchWaitTime];
  186. XCTAssertEqual(0, [results count]);
  187. // First node missing title, second one missig triggering conditions and the third one
  188. // contains invalid type node.
  189. XCTAssertEqual(3, discardCount);
  190. }
  191. @end