FDLURLComponentsTests.m 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779
  1. /*
  2. * Copyright 2018 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 <XCTest/XCTest.h>
  17. #import "FirebaseDynamicLinks/Sources/FDLURLComponents/FDLURLComponents+Private.h"
  18. #import "FirebaseDynamicLinks/Sources/FDLURLComponents/FIRDynamicLinkComponentsKeyProvider.h"
  19. #import <OCMock/OCMock.h>
  20. static NSString *const kFDLURLDomain = @"https://xyz.page.link";
  21. static NSString *const kFDLURLCustomDomain = @"https://foo.com/path";
  22. @interface FDLURLComponentsTests : XCTestCase
  23. @end
  24. @implementation FDLURLComponentsTests
  25. #pragma mark - FIRDynamicLinkGoogleAnalyticsParameters
  26. - (void)testAnalyticsParamsFactoryReturnsInstanceOfCorrectClass {
  27. id returnValue = [FIRDynamicLinkGoogleAnalyticsParameters parameters];
  28. XCTAssertTrue([returnValue isKindOfClass:[FIRDynamicLinkGoogleAnalyticsParameters class]]);
  29. }
  30. - (void)testAnalyticsParamsFactoryReturnsInstanceWithAllNilProperties {
  31. FIRDynamicLinkGoogleAnalyticsParameters *params =
  32. [FIRDynamicLinkGoogleAnalyticsParameters parameters];
  33. XCTAssertNil(params.source);
  34. XCTAssertNil(params.medium);
  35. XCTAssertNil(params.campaign);
  36. XCTAssertNil(params.term);
  37. XCTAssertNil(params.content);
  38. }
  39. - (void)testAnalyticsParamsPropertiesSetProperly {
  40. FIRDynamicLinkGoogleAnalyticsParameters *params =
  41. [FIRDynamicLinkGoogleAnalyticsParameters parameters];
  42. params.source = @"s";
  43. params.medium = @"m";
  44. params.campaign = @"ca";
  45. params.term = @"t";
  46. params.content = @"co";
  47. XCTAssertEqualObjects(params.source, @"s");
  48. XCTAssertEqualObjects(params.medium, @"m");
  49. XCTAssertEqualObjects(params.campaign, @"ca");
  50. XCTAssertEqualObjects(params.term, @"t");
  51. XCTAssertEqualObjects(params.content, @"co");
  52. params.source = nil;
  53. params.medium = nil;
  54. params.campaign = nil;
  55. params.term = nil;
  56. params.content = nil;
  57. XCTAssertNil(params.source);
  58. XCTAssertNil(params.medium);
  59. XCTAssertNil(params.campaign);
  60. XCTAssertNil(params.term);
  61. XCTAssertNil(params.content);
  62. }
  63. - (void)testAnalyticsParamsDictionaryRepresentationReturnsCorrectDictionaryFull {
  64. FIRDynamicLinkGoogleAnalyticsParameters *params =
  65. [FIRDynamicLinkGoogleAnalyticsParameters parameters];
  66. params.source = @"s";
  67. params.medium = @"m";
  68. params.campaign = @"ca";
  69. params.term = @"t";
  70. params.content = @"co";
  71. NSDictionary *expectedDictionary = @{
  72. @"utm_source" : @"s",
  73. @"utm_medium" : @"m",
  74. @"utm_campaign" : @"ca",
  75. @"utm_term" : @"t",
  76. @"utm_content" : @"co",
  77. };
  78. XCTAssertEqualObjects(expectedDictionary, params.dictionaryRepresentation);
  79. }
  80. - (void)testAnalyticsParamsDictionaryRepresentationReturnsCorrectDictionaryEmpty {
  81. FIRDynamicLinkGoogleAnalyticsParameters *params =
  82. [FIRDynamicLinkGoogleAnalyticsParameters parameters];
  83. XCTAssertEqualObjects(@{}, params.dictionaryRepresentation);
  84. }
  85. - (void)testAnalyticsParamsFactoryWithParamsReturnsInstanceOfCorrectClass {
  86. id returnValue = [FIRDynamicLinkGoogleAnalyticsParameters parametersWithSource:@"s"
  87. medium:@"m"
  88. campaign:@"c"];
  89. XCTAssertTrue([returnValue isKindOfClass:[FIRDynamicLinkGoogleAnalyticsParameters class]]);
  90. }
  91. - (void)testAnalyticsParamsFactoryWithParamsReturnsInstanceWithCorrectInitialPropertyValues {
  92. FIRDynamicLinkGoogleAnalyticsParameters *params =
  93. [FIRDynamicLinkGoogleAnalyticsParameters parametersWithSource:@"s" medium:@"m" campaign:@"c"];
  94. XCTAssertEqualObjects(params.source, @"s");
  95. XCTAssertEqualObjects(params.medium, @"m");
  96. XCTAssertEqualObjects(params.campaign, @"c");
  97. XCTAssertNil(params.term);
  98. XCTAssertNil(params.content);
  99. }
  100. #pragma mark - FIRDynamicLinkIOSParameters
  101. - (void)testIOSParamsFactoryReturnsInstanceOfCorrectClass {
  102. id returnValue = [FIRDynamicLinkIOSParameters parametersWithBundleID:@"com.iphone.app"];
  103. XCTAssertTrue([returnValue isKindOfClass:[FIRDynamicLinkIOSParameters class]]);
  104. }
  105. - (void)testIOSParamsFactoryReturnsInstanceWithAllOptionalNilProperties {
  106. FIRDynamicLinkIOSParameters *params =
  107. [FIRDynamicLinkIOSParameters parametersWithBundleID:@"com.iphone.app"];
  108. XCTAssertNil(params.fallbackURL);
  109. XCTAssertNil(params.customScheme);
  110. XCTAssertNil(params.minimumAppVersion);
  111. XCTAssertNil(params.iPadBundleID);
  112. XCTAssertNil(params.iPadFallbackURL);
  113. XCTAssertNil(params.appStoreID);
  114. }
  115. - (void)testIOSParamsPropertiesSetProperly {
  116. FIRDynamicLinkIOSParameters *params =
  117. [FIRDynamicLinkIOSParameters parametersWithBundleID:@"com.iphone.app"];
  118. params.fallbackURL = [NSURL URLWithString:@"https://google.com/iphone"];
  119. params.customScheme = @"mycustomsheme";
  120. params.minimumAppVersion = @"1.2.3";
  121. params.iPadBundleID = @"com.ipad.app";
  122. params.iPadFallbackURL = [NSURL URLWithString:@"https://google.com/ipad"];
  123. params.appStoreID = @"666";
  124. XCTAssertEqualObjects(params.bundleID, @"com.iphone.app");
  125. XCTAssertEqualObjects(params.fallbackURL, [NSURL URLWithString:@"https://google.com/iphone"]);
  126. XCTAssertEqualObjects(params.customScheme, @"mycustomsheme");
  127. XCTAssertEqualObjects(params.minimumAppVersion, @"1.2.3");
  128. XCTAssertEqualObjects(params.iPadBundleID, @"com.ipad.app");
  129. XCTAssertEqualObjects(params.iPadFallbackURL, [NSURL URLWithString:@"https://google.com/ipad"]);
  130. XCTAssertEqualObjects(params.appStoreID, @"666");
  131. params.fallbackURL = nil;
  132. params.customScheme = nil;
  133. params.minimumAppVersion = nil;
  134. params.iPadBundleID = nil;
  135. params.iPadFallbackURL = nil;
  136. params.appStoreID = nil;
  137. XCTAssertNil(params.fallbackURL);
  138. XCTAssertNil(params.customScheme);
  139. XCTAssertNil(params.minimumAppVersion);
  140. XCTAssertNil(params.iPadBundleID);
  141. XCTAssertNil(params.iPadFallbackURL);
  142. XCTAssertNil(params.appStoreID);
  143. }
  144. - (void)testIOSParamsDictionaryRepresentationReturnsCorrectDictionaryFull {
  145. FIRDynamicLinkIOSParameters *params =
  146. [FIRDynamicLinkIOSParameters parametersWithBundleID:@"com.iphone.app"];
  147. params.fallbackURL = [NSURL URLWithString:@"https://google.com/iphone"];
  148. params.customScheme = @"mycustomscheme";
  149. params.minimumAppVersion = @"1.2.3";
  150. params.iPadBundleID = @"com.ipad.app";
  151. params.iPadFallbackURL = [NSURL URLWithString:@"https://google.com/ipad"];
  152. params.appStoreID = @"666";
  153. NSDictionary *expectedDictionary = @{
  154. @"ibi" : @"com.iphone.app",
  155. @"ifl" : [NSURL URLWithString:@"https://google.com/iphone"].absoluteString,
  156. @"ius" : @"mycustomscheme",
  157. @"imv" : @"1.2.3",
  158. @"ipbi" : @"com.ipad.app",
  159. @"ipfl" : [NSURL URLWithString:@"https://google.com/ipad"].absoluteString,
  160. @"isi" : @"666"
  161. };
  162. XCTAssertEqualObjects(expectedDictionary, params.dictionaryRepresentation);
  163. }
  164. - (void)testIOSParamsDictionaryRepresentationReturnsCorrectDictionaryOnlyReqParams {
  165. FIRDynamicLinkIOSParameters *params =
  166. [FIRDynamicLinkIOSParameters parametersWithBundleID:@"com.iphone.app"];
  167. XCTAssertEqualObjects(@{@"ibi" : @"com.iphone.app"}, params.dictionaryRepresentation);
  168. }
  169. #pragma mark - FIRDynamicLinkItunesConnectAnalyticsParameters
  170. - (void)testIOSAppStoreParamsFactoryReturnsInstanceOfCorrectClass {
  171. id returnValue = [FIRDynamicLinkItunesConnectAnalyticsParameters parameters];
  172. XCTAssertTrue([returnValue isKindOfClass:[FIRDynamicLinkItunesConnectAnalyticsParameters class]]);
  173. }
  174. - (void)testIOSAppStoreParamsFactoryReturnsInstanceWithAllNilProperties {
  175. FIRDynamicLinkItunesConnectAnalyticsParameters *params =
  176. [FIRDynamicLinkItunesConnectAnalyticsParameters parameters];
  177. XCTAssertNil(params.affiliateToken);
  178. XCTAssertNil(params.campaignToken);
  179. XCTAssertNil(params.providerToken);
  180. }
  181. - (void)testIOSAppStoreParamsPropertiesSetProperly {
  182. FIRDynamicLinkItunesConnectAnalyticsParameters *params =
  183. [FIRDynamicLinkItunesConnectAnalyticsParameters parameters];
  184. params.affiliateToken = @"affiliate";
  185. params.campaignToken = @"campaign";
  186. params.providerToken = @"provider";
  187. XCTAssertEqualObjects(params.affiliateToken, @"affiliate");
  188. XCTAssertEqualObjects(params.campaignToken, @"campaign");
  189. XCTAssertEqualObjects(params.providerToken, @"provider");
  190. params.affiliateToken = nil;
  191. params.campaignToken = nil;
  192. params.providerToken = nil;
  193. XCTAssertNil(params.affiliateToken);
  194. XCTAssertNil(params.campaignToken);
  195. XCTAssertNil(params.providerToken);
  196. }
  197. - (void)testIOSAppStoreDictionaryRepresentationReturnsCorrectDictionaryFull {
  198. FIRDynamicLinkItunesConnectAnalyticsParameters *params =
  199. [FIRDynamicLinkItunesConnectAnalyticsParameters parameters];
  200. params.affiliateToken = @"affiliate";
  201. params.campaignToken = @"campaign";
  202. params.providerToken = @"provider";
  203. NSDictionary *expectedDictionary = @{
  204. @"at" : @"affiliate",
  205. @"ct" : @"campaign",
  206. @"pt" : @"provider",
  207. };
  208. XCTAssertEqualObjects(expectedDictionary, params.dictionaryRepresentation);
  209. }
  210. - (void)testIOSAppStoreDictionaryRepresentationReturnsCorrectDictionaryEmpty {
  211. FIRDynamicLinkItunesConnectAnalyticsParameters *params =
  212. [FIRDynamicLinkItunesConnectAnalyticsParameters parameters];
  213. XCTAssertEqualObjects(@{}, params.dictionaryRepresentation);
  214. }
  215. #pragma mark - FIRDynamicLinkAndroidParameters
  216. - (void)testAndroidParamsFactoryReturnsInstanceOfCorrectClass {
  217. id returnValue =
  218. [FIRDynamicLinkAndroidParameters parametersWithPackageName:@"com.google.android.gms"];
  219. XCTAssertTrue([returnValue isKindOfClass:[FIRDynamicLinkAndroidParameters class]]);
  220. }
  221. - (void)testAndroidParamsFactoryReturnsInstanceWithAllOptionalNilProperties {
  222. FIRDynamicLinkAndroidParameters *params =
  223. [FIRDynamicLinkAndroidParameters parametersWithPackageName:@"com.google.android.gms"];
  224. XCTAssertNil(params.fallbackURL);
  225. XCTAssertEqual(params.minimumVersion, 0);
  226. }
  227. - (void)testAndroidParamsPropertiesSetProperly {
  228. FIRDynamicLinkAndroidParameters *params =
  229. [FIRDynamicLinkAndroidParameters parametersWithPackageName:@"com.google.android.gms"];
  230. params.fallbackURL = [NSURL URLWithString:@"https://google.com/android"];
  231. params.minimumVersion = 14;
  232. XCTAssertEqualObjects(params.packageName, @"com.google.android.gms");
  233. XCTAssertEqualObjects(params.fallbackURL, [NSURL URLWithString:@"https://google.com/android"]);
  234. XCTAssertEqual(params.minimumVersion, 14);
  235. params.fallbackURL = nil;
  236. params.minimumVersion = 0;
  237. XCTAssertNil(params.fallbackURL);
  238. XCTAssertEqual(params.minimumVersion, 0);
  239. }
  240. - (void)testAndroidParamsDictionaryRepresentationReturnsCorrectDictionaryFull {
  241. FIRDynamicLinkAndroidParameters *params =
  242. [FIRDynamicLinkAndroidParameters parametersWithPackageName:@"com.google.android.gms"];
  243. params.fallbackURL = [NSURL URLWithString:@"https://google.com/android"];
  244. params.minimumVersion = 14;
  245. NSDictionary *expectedDictionary = @{
  246. @"apn" : @"com.google.android.gms",
  247. @"afl" : [NSURL URLWithString:@"https://google.com/android"].absoluteString,
  248. @"amv" : @"14",
  249. };
  250. XCTAssertEqualObjects(expectedDictionary, params.dictionaryRepresentation);
  251. }
  252. - (void)testAndroidParamsDictionaryRepresentationReturnsCorrectDictionaryEmpty {
  253. FIRDynamicLinkAndroidParameters *params =
  254. [FIRDynamicLinkAndroidParameters parametersWithPackageName:@"com.google.android.gms"];
  255. XCTAssertEqualObjects(@{@"apn" : @"com.google.android.gms"}, params.dictionaryRepresentation);
  256. }
  257. #pragma mark - FIRDynamicLinkSocialMetaTagParameters
  258. - (void)testSocialParamsFactoryReturnsInstanceOfCorrectClass {
  259. id returnValue = [FIRDynamicLinkSocialMetaTagParameters parameters];
  260. XCTAssertTrue([returnValue isKindOfClass:[FIRDynamicLinkSocialMetaTagParameters class]]);
  261. }
  262. - (void)testSocialParamsFactoryReturnsInstanceWithAllNilProperties {
  263. FIRDynamicLinkSocialMetaTagParameters *params =
  264. [FIRDynamicLinkSocialMetaTagParameters parameters];
  265. XCTAssertNil(params.title);
  266. XCTAssertNil(params.descriptionText);
  267. XCTAssertNil(params.imageURL);
  268. }
  269. - (void)testSocialParamsPropertiesSetProperly {
  270. FIRDynamicLinkSocialMetaTagParameters *params =
  271. [FIRDynamicLinkSocialMetaTagParameters parameters];
  272. params.title = @"title";
  273. params.descriptionText = @"description";
  274. params.imageURL = [NSURL URLWithString:@"https://google.com/someimage"];
  275. XCTAssertEqualObjects(params.title, @"title");
  276. XCTAssertEqualObjects(params.descriptionText, @"description");
  277. XCTAssertEqualObjects(params.imageURL, [NSURL URLWithString:@"https://google.com/someimage"]);
  278. params.title = nil;
  279. params.descriptionText = nil;
  280. params.imageURL = nil;
  281. XCTAssertNil(params.title);
  282. XCTAssertNil(params.descriptionText);
  283. XCTAssertNil(params.imageURL);
  284. }
  285. - (void)testSocialParamsDictionaryRepresentationReturnsCorrectDictionaryFull {
  286. FIRDynamicLinkSocialMetaTagParameters *params =
  287. [FIRDynamicLinkSocialMetaTagParameters parameters];
  288. params.title = @"title";
  289. params.descriptionText = @"description";
  290. params.imageURL = [NSURL URLWithString:@"https://google.com/someimage"];
  291. NSDictionary *expectedDictionary = @{
  292. @"st" : @"title",
  293. @"sd" : @"description",
  294. @"si" : [NSURL URLWithString:@"https://google.com/someimage"].absoluteString,
  295. };
  296. XCTAssertEqualObjects(expectedDictionary, params.dictionaryRepresentation);
  297. }
  298. - (void)testSocialParamsDictionaryRepresentationReturnsCorrectDictionaryEmpty {
  299. FIRDynamicLinkSocialMetaTagParameters *params =
  300. [FIRDynamicLinkSocialMetaTagParameters parameters];
  301. XCTAssertEqualObjects(@{}, params.dictionaryRepresentation);
  302. }
  303. #pragma mark - FIRDynamicLinkNavigationInfoParameters
  304. - (void)testNavigationOptionsReturnsCorrectClass {
  305. id returnValue = [FIRDynamicLinkNavigationInfoParameters parameters];
  306. XCTAssertTrue([returnValue isKindOfClass:[FIRDynamicLinkNavigationInfoParameters class]]);
  307. }
  308. - (void)testNavigationOptionsFactoryReturnsInstanceWithAllNilProperties {
  309. FIRDynamicLinkNavigationInfoParameters *options =
  310. [FIRDynamicLinkNavigationInfoParameters parameters];
  311. XCTAssertEqual(options.forcedRedirectEnabled, NO);
  312. }
  313. - (void)testNavigationOptionsParamsPropertiesSetProperly {
  314. FIRDynamicLinkNavigationInfoParameters *options =
  315. [FIRDynamicLinkNavigationInfoParameters parameters];
  316. options.forcedRedirectEnabled = YES;
  317. XCTAssertEqual(options.forcedRedirectEnabled, YES);
  318. options.forcedRedirectEnabled = NO;
  319. XCTAssertEqual(options.forcedRedirectEnabled, NO);
  320. }
  321. #pragma mark - FIRDynamicLinkOtherPlatformParameters
  322. - (void)testOtherPlatformParametersReturnsCorrectClass {
  323. id returnValue = [FIRDynamicLinkOtherPlatformParameters parameters];
  324. XCTAssertTrue([returnValue isKindOfClass:[FIRDynamicLinkOtherPlatformParameters class]]);
  325. }
  326. - (void)testOtherPlatformParametersFactoryReturnsInstanceWithAllNilProperties {
  327. FIRDynamicLinkOtherPlatformParameters *options =
  328. [FIRDynamicLinkOtherPlatformParameters parameters];
  329. XCTAssertNil(options.fallbackUrl);
  330. }
  331. - (void)testOtherPlatformParametersParamsPropertiesSetProperly {
  332. FIRDynamicLinkOtherPlatformParameters *options =
  333. [FIRDynamicLinkOtherPlatformParameters parameters];
  334. options.fallbackUrl = [NSURL URLWithString:@"https://google.com"];
  335. XCTAssertEqualObjects(options.fallbackUrl, [NSURL URLWithString:@"https://google.com"]);
  336. options.fallbackUrl = nil;
  337. XCTAssertNil(options.fallbackUrl);
  338. }
  339. #pragma mark - FIRDynamicLinkComponentsOptions
  340. - (void)testLinkOptionsFactoryReturnsInstanceOfCorrectClass {
  341. id returnValue = [FIRDynamicLinkComponentsOptions options];
  342. XCTAssertTrue([returnValue isKindOfClass:[FIRDynamicLinkComponentsOptions class]]);
  343. }
  344. - (void)testLinkOptionsParamsFactoryReturnsInstanceWithAllNilProperties {
  345. FIRDynamicLinkComponentsOptions *options = [FIRDynamicLinkComponentsOptions options];
  346. XCTAssertEqual(options.pathLength, FIRShortDynamicLinkPathLengthDefault);
  347. }
  348. - (void)testLinkOptionsParamsPropertiesSetProperly {
  349. FIRDynamicLinkComponentsOptions *options = [FIRDynamicLinkComponentsOptions options];
  350. options.pathLength = FIRShortDynamicLinkPathLengthUnguessable;
  351. XCTAssertEqual(options.pathLength, FIRShortDynamicLinkPathLengthUnguessable);
  352. options.pathLength = FIRShortDynamicLinkPathLengthShort;
  353. XCTAssertEqual(options.pathLength, FIRShortDynamicLinkPathLengthShort);
  354. }
  355. #pragma mark - FIRDynamicLinkComponents
  356. - (void)testFDLComponentsFactoryReturnsInstanceOfCorrectClass {
  357. NSURL *link = [NSURL URLWithString:@"https://google.com"];
  358. id returnValue = [FIRDynamicLinkComponents componentsWithLink:link domainURIPrefix:kFDLURLDomain];
  359. XCTAssertTrue([returnValue isKindOfClass:[FIRDynamicLinkComponents class]]);
  360. }
  361. - (void)testFDLComponentsFactoryReturnsInstanceWithAllNilProperties {
  362. NSURL *link = [NSURL URLWithString:@"https://google.com"];
  363. FIRDynamicLinkComponents *components =
  364. [FIRDynamicLinkComponents componentsWithLink:link domainURIPrefix:kFDLURLDomain];
  365. XCTAssertNil(components.analyticsParameters);
  366. XCTAssertNil(components.socialMetaTagParameters);
  367. XCTAssertNil(components.iOSParameters);
  368. XCTAssertNil(components.iTunesConnectParameters);
  369. XCTAssertNil(components.analyticsParameters);
  370. XCTAssertNil(components.options);
  371. }
  372. - (void)testFDLComponentsCreatesSimplestLinkCorrectly {
  373. NSString *linkString = @"https://google.com";
  374. NSString *endcodedLinkString = @"https%3A%2F%2Fgoogle%2Ecom";
  375. NSURL *link = [NSURL URLWithString:linkString];
  376. NSString *expectedURLString =
  377. [NSString stringWithFormat:@"%@/?link=%@", kFDLURLDomain, endcodedLinkString];
  378. NSURL *expectedURL = [NSURL URLWithString:expectedURLString];
  379. FIRDynamicLinkComponents *components =
  380. [FIRDynamicLinkComponents componentsWithLink:link domainURIPrefix:kFDLURLDomain];
  381. NSURL *actualURL = components.url;
  382. XCTAssertEqualObjects(actualURL, expectedURL);
  383. }
  384. - (void)testFDLComponentsCustomDomainWithPath {
  385. NSString *linkString = @"https://google.com";
  386. NSString *endcodedLinkString = @"https%3A%2F%2Fgoogle%2Ecom";
  387. NSURL *link = [NSURL URLWithString:linkString];
  388. NSString *expectedURLString =
  389. [NSString stringWithFormat:@"%@/?link=%@", kFDLURLCustomDomain, endcodedLinkString];
  390. NSURL *expectedURL = [NSURL URLWithString:expectedURLString];
  391. FIRDynamicLinkComponents *components =
  392. [FIRDynamicLinkComponents componentsWithLink:link domainURIPrefix:kFDLURLCustomDomain];
  393. NSURL *actualURL = components.url;
  394. XCTAssertEqualObjects(actualURL, expectedURL);
  395. }
  396. - (void)testFDLComponentsFailsOnMalformedDomainURIPrefix {
  397. NSString *linkString = @"https://google.com";
  398. NSURL *link = [NSURL URLWithString:linkString];
  399. FIRDynamicLinkComponents *components =
  400. [FIRDynamicLinkComponents componentsWithLink:link
  401. domainURIPrefix:@"this is invalid domain URI Prefix"];
  402. XCTAssertNil(components.url);
  403. }
  404. - (void)testFDLComponentsNotNilOnDomainWithHTTPScheme {
  405. NSString *linkString = @"https://google.com";
  406. NSURL *link = [NSURL URLWithString:linkString];
  407. FIRDynamicLinkComponents *components =
  408. [FIRDynamicLinkComponents componentsWithLink:link domainURIPrefix:@"https://xyz.page.link"];
  409. XCTAssertNotNil(components);
  410. }
  411. - (void)testFDLComponentsNotNilOnDomainWithHTTPSScheme {
  412. NSString *linkString = @"https://google.com";
  413. NSURL *link = [NSURL URLWithString:linkString];
  414. FIRDynamicLinkComponents *components =
  415. [FIRDynamicLinkComponents componentsWithLink:link domainURIPrefix:@"https://xyz.page.link"];
  416. XCTAssertNotNil(components);
  417. }
  418. - (void)testFDLComponentsFailsOnMalformedDomain {
  419. NSString *linkString = @"https://google.com";
  420. NSURL *link = [NSURL URLWithString:linkString];
  421. FIRDynamicLinkComponents *components =
  422. [FIRDynamicLinkComponents componentsWithLink:link
  423. domainURIPrefix:@"this is invalid domain URI Prefix"];
  424. XCTAssertNil(components);
  425. }
  426. - (void)testFDLComponentsCreatesFullLinkCorrectly {
  427. FIRDynamicLinkGoogleAnalyticsParameters *analyticsParams =
  428. [FIRDynamicLinkGoogleAnalyticsParameters parameters];
  429. analyticsParams.source = @"s";
  430. analyticsParams.medium = @"m";
  431. analyticsParams.campaign = @"ca";
  432. analyticsParams.term = @"t";
  433. analyticsParams.content = @"co";
  434. FIRDynamicLinkIOSParameters *iosParams =
  435. [FIRDynamicLinkIOSParameters parametersWithBundleID:@"com.iphone.app"];
  436. iosParams.fallbackURL = [NSURL URLWithString:@"https://google.com/iphone"];
  437. iosParams.customScheme = @"mycustomsheme";
  438. iosParams.minimumAppVersion = @"1.2.3";
  439. iosParams.iPadBundleID = @"com.ipad.app";
  440. iosParams.iPadFallbackURL = [NSURL URLWithString:@"https://google.com/ipad"];
  441. iosParams.appStoreID = @"666";
  442. FIRDynamicLinkItunesConnectAnalyticsParameters *itcParams =
  443. [FIRDynamicLinkItunesConnectAnalyticsParameters parameters];
  444. itcParams.affiliateToken = @"affiliate";
  445. itcParams.campaignToken = @"campaign";
  446. itcParams.providerToken = @"provider";
  447. FIRDynamicLinkAndroidParameters *androidParams =
  448. [FIRDynamicLinkAndroidParameters parametersWithPackageName:@"com.google.android.gms"];
  449. androidParams.fallbackURL = [NSURL URLWithString:@"https://google.com/android"];
  450. androidParams.minimumVersion = 14;
  451. FIRDynamicLinkSocialMetaTagParameters *socialParams =
  452. [FIRDynamicLinkSocialMetaTagParameters parameters];
  453. socialParams.title = @"title";
  454. socialParams.descriptionText = @"description";
  455. socialParams.imageURL = [NSURL URLWithString:@"https://google.com/someimage"];
  456. FIRDynamicLinkOtherPlatformParameters *otherPlatformParams =
  457. [FIRDynamicLinkOtherPlatformParameters parameters];
  458. otherPlatformParams.fallbackUrl =
  459. [NSURL URLWithString:@"https://google.com/fallbackForOtherPlatform"];
  460. FIRDynamicLinkNavigationInfoParameters *navInfo =
  461. [FIRDynamicLinkNavigationInfoParameters parameters];
  462. navInfo.forcedRedirectEnabled = YES;
  463. FIRDynamicLinkComponentsOptions *options = [FIRDynamicLinkComponentsOptions options];
  464. options.pathLength = FIRShortDynamicLinkPathLengthUnguessable;
  465. NSURL *link = [NSURL URLWithString:@"https://google.com"];
  466. FIRDynamicLinkComponents *fdlComponents =
  467. [FIRDynamicLinkComponents componentsWithLink:link domainURIPrefix:kFDLURLDomain];
  468. fdlComponents.analyticsParameters = analyticsParams;
  469. fdlComponents.iOSParameters = iosParams;
  470. fdlComponents.iTunesConnectParameters = itcParams;
  471. fdlComponents.androidParameters = androidParams;
  472. fdlComponents.socialMetaTagParameters = socialParams;
  473. fdlComponents.navigationInfoParameters = navInfo;
  474. fdlComponents.otherPlatformParameters = otherPlatformParams;
  475. fdlComponents.options = options;
  476. // This is a long FDL URL that has been verified to be a correct representation of the expected
  477. // URL. Since the parameters are not guaranteed to be in any specific order, we must compare
  478. // arrays of properties of the URLs rather than the URLs themselves.
  479. NSString *possibleExpectedURLString =
  480. @"https://xyz.page.link/?afl=https%3A%2F%2Fgoogle%2Ecom%2F"
  481. "android&amv=14&apn=com.google.android.gms&ibi=com%2Eiphone%2Eapp&utm_term=t&link=https%3A%"
  482. "2F"
  483. "%2Fgoogle%2Ecom&ipbi=com%2Eipad%2Eapp&ius=mycustomsheme&ifl=https%3A%2F%2Fgoogle%2Ecom%2"
  484. "Fiphone&isi=666&utm_content=co&utm_source=s&utm_medium=m&imv=1%2E2%2E3&ct=campaign&ipfl="
  485. "http"
  486. "s%3A%2F%2Fgoogle%2Ecom%2Fipad&si=https%3A%2F%2Fgoogle%2Ecom%2Fsomeimage&at=affiliate&pt="
  487. "prov"
  488. "ider&st=title&utm_campaign=ca&sd=description&efr=1&ofl=https%3A%2F%2Fgoogle%2Ecom%"
  489. "2Ffallback"
  490. "ForOtherPlatform";
  491. NSURL *possibleExpectedURL = [NSURL URLWithString:possibleExpectedURLString];
  492. NSURLComponents *expectedURLComponents =
  493. [NSURLComponents componentsWithString:possibleExpectedURLString];
  494. // sort both expected/actual arrays to prevent order influencing the test results
  495. NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
  496. NSArray<NSURLQueryItem *> *expectedURLQueryItems =
  497. [expectedURLComponents.queryItems sortedArrayUsingDescriptors:@[ sort ]];
  498. NSURL *actualURL = fdlComponents.url;
  499. NSURLComponents *actualURLComponents =
  500. [NSURLComponents componentsWithString:actualURL.absoluteString];
  501. NSArray<NSURLQueryItem *> *actualQueryItems =
  502. [actualURLComponents.queryItems sortedArrayUsingDescriptors:@[ sort ]];
  503. XCTAssertEqualObjects(actualQueryItems, expectedURLQueryItems);
  504. XCTAssertEqualObjects(actualURL.host, possibleExpectedURL.host);
  505. }
  506. - (void)testFDLComponentsCorrectlySetsPathLengthInRequest {
  507. NSURL *url = [NSURL URLWithString:@"https://google.com/abc"];
  508. NSURLRequest *request;
  509. NSDictionary *JSON;
  510. FIRDynamicLinkComponentsOptions *options = [FIRDynamicLinkComponentsOptions options];
  511. // Default path-length
  512. request = [FIRDynamicLinkComponents shorteningRequestForLongURL:url options:options];
  513. JSON = [NSJSONSerialization JSONObjectWithData:request.HTTPBody options:0 error:nil];
  514. XCTAssertNil(JSON[@"suffix"]);
  515. // Unguessable
  516. options.pathLength = FIRShortDynamicLinkPathLengthUnguessable;
  517. request = [FIRDynamicLinkComponents shorteningRequestForLongURL:url options:options];
  518. JSON = [NSJSONSerialization JSONObjectWithData:request.HTTPBody options:0 error:nil];
  519. XCTAssertTrue([JSON[@"suffix"][@"option"] isEqualToString:@"UNGUESSABLE"]);
  520. // Short
  521. options.pathLength = FIRShortDynamicLinkPathLengthShort;
  522. request = [FIRDynamicLinkComponents shorteningRequestForLongURL:url options:options];
  523. JSON = [NSJSONSerialization JSONObjectWithData:request.HTTPBody options:0 error:nil];
  524. XCTAssertTrue([JSON[@"suffix"][@"option"] isEqualToString:@"SHORT"]);
  525. }
  526. - (void)testShortenURL {
  527. NSString *shortURLString = @"https://xyz.page.link/abcd";
  528. // Mock key provider
  529. id keyProviderClassMock = OCMClassMock([FIRDynamicLinkComponentsKeyProvider class]);
  530. [[[keyProviderClassMock expect] andReturn:@"fake-api-key"] APIKey];
  531. id componentsClassMock = OCMClassMock([FIRDynamicLinkComponents class]);
  532. [[componentsClassMock expect]
  533. sendHTTPRequest:OCMOCK_ANY
  534. completion:[OCMArg checkWithBlock:^BOOL(id obj) {
  535. void (^completion)(NSData *_Nullable, NSError *_Nullable) = obj;
  536. NSDictionary *JSON = @{@"shortLink" : shortURLString};
  537. NSData *JSONData = [NSJSONSerialization dataWithJSONObject:JSON options:0 error:0];
  538. completion(JSONData, nil);
  539. return YES;
  540. }]];
  541. XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
  542. NSURL *link = [NSURL URLWithString:@"https://google.com/abc"];
  543. FIRDynamicLinkComponents *components =
  544. [FIRDynamicLinkComponents componentsWithLink:link domainURIPrefix:kFDLURLDomain];
  545. [components
  546. shortenWithCompletion:^(NSURL *_Nullable shortURL, NSArray<NSString *> *_Nullable warnings,
  547. NSError *_Nullable error) {
  548. XCTAssertEqualObjects(shortURL.absoluteString, shortURLString);
  549. [expectation fulfill];
  550. }];
  551. [self waitForExpectationsWithTimeout:0.1 handler:nil];
  552. [keyProviderClassMock verify];
  553. [keyProviderClassMock stopMocking];
  554. [componentsClassMock verify];
  555. [componentsClassMock stopMocking];
  556. }
  557. - (void)testShortenURLReturnsErrorWhenAPIKeyMissing {
  558. NSString *shortURLString = @"https://xyz.page.link/abcd";
  559. // Mock key provider
  560. id keyProviderClassMock = OCMClassMock([FIRDynamicLinkComponentsKeyProvider class]);
  561. [[[keyProviderClassMock expect] andReturn:nil] APIKey];
  562. id componentsClassMock = OCMClassMock([FIRDynamicLinkComponents class]);
  563. [[componentsClassMock stub]
  564. sendHTTPRequest:OCMOCK_ANY
  565. completion:[OCMArg checkWithBlock:^BOOL(id obj) {
  566. void (^completion)(NSData *_Nullable, NSError *_Nullable) = obj;
  567. NSDictionary *JSON = @{@"shortLink" : shortURLString};
  568. NSData *JSONData = [NSJSONSerialization dataWithJSONObject:JSON options:0 error:0];
  569. completion(JSONData, nil);
  570. return YES;
  571. }]];
  572. XCTestExpectation *expectation =
  573. [self expectationWithDescription:@"completion called with error"];
  574. NSURL *link = [NSURL URLWithString:@"https://google.com/abc"];
  575. FIRDynamicLinkComponents *components =
  576. [FIRDynamicLinkComponents componentsWithLink:link domainURIPrefix:kFDLURLDomain];
  577. [components
  578. shortenWithCompletion:^(NSURL *_Nullable shortURL, NSArray<NSString *> *_Nullable warnings,
  579. NSError *_Nullable error) {
  580. XCTAssertNil(shortURL);
  581. if (error) {
  582. [expectation fulfill];
  583. }
  584. }];
  585. [self waitForExpectationsWithTimeout:0.1 handler:nil];
  586. [keyProviderClassMock verify];
  587. [keyProviderClassMock stopMocking];
  588. [componentsClassMock verify];
  589. [componentsClassMock stopMocking];
  590. }
  591. - (void)testShortenURLReturnsErrorWhenDomainIsMalformed {
  592. NSString *shortURLString = @"https://xyz.page.link/abcd";
  593. // Mock key provider
  594. id keyProviderClassMock = OCMClassMock([FIRDynamicLinkComponentsKeyProvider class]);
  595. [[keyProviderClassMock reject] APIKey];
  596. id componentsClassMock = OCMClassMock([FIRDynamicLinkComponents class]);
  597. [[componentsClassMock reject]
  598. sendHTTPRequest:OCMOCK_ANY
  599. completion:[OCMArg checkWithBlock:^BOOL(id obj) {
  600. void (^completion)(NSData *_Nullable, NSError *_Nullable) = obj;
  601. NSDictionary *JSON = @{@"shortLink" : shortURLString};
  602. NSData *JSONData = [NSJSONSerialization dataWithJSONObject:JSON options:0 error:0];
  603. completion(JSONData, nil);
  604. return YES;
  605. }]];
  606. NSURL *link = [NSURL URLWithString:@"https://google.com/abc"];
  607. FIRDynamicLinkComponents *components =
  608. [FIRDynamicLinkComponents componentsWithLink:link
  609. domainURIPrefix:@"this is invalid domain URI Prefix"];
  610. XCTAssertNil(components);
  611. [keyProviderClassMock verify];
  612. [keyProviderClassMock stopMocking];
  613. [componentsClassMock verify];
  614. [componentsClassMock stopMocking];
  615. }
  616. @end