FDLURLComponentsTests.m 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853
  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 "DynamicLinks/FDLURLComponents/FDLURLComponents+Private.h"
  18. #import "DynamicLinks/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)testAnalyticsParamsFactoryWithParamsReturnsInstanceWithCorrectInitalPropertyValues {
  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 domain:@"http://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 domain:@"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. domain:@"this is invalid domain URI Prefix"];
  424. XCTAssertNotNil(components);
  425. XCTAssertNil(components.url);
  426. }
  427. - (void)testFDLComponentsCreatesFullLinkCorrectly {
  428. FIRDynamicLinkGoogleAnalyticsParameters *analyticsParams =
  429. [FIRDynamicLinkGoogleAnalyticsParameters parameters];
  430. analyticsParams.source = @"s";
  431. analyticsParams.medium = @"m";
  432. analyticsParams.campaign = @"ca";
  433. analyticsParams.term = @"t";
  434. analyticsParams.content = @"co";
  435. FIRDynamicLinkIOSParameters *iosParams =
  436. [FIRDynamicLinkIOSParameters parametersWithBundleID:@"com.iphone.app"];
  437. iosParams.fallbackURL = [NSURL URLWithString:@"https://google.com/iphone"];
  438. iosParams.customScheme = @"mycustomsheme";
  439. iosParams.minimumAppVersion = @"1.2.3";
  440. iosParams.iPadBundleID = @"com.ipad.app";
  441. iosParams.iPadFallbackURL = [NSURL URLWithString:@"https://google.com/ipad"];
  442. iosParams.appStoreID = @"666";
  443. FIRDynamicLinkItunesConnectAnalyticsParameters *itcParams =
  444. [FIRDynamicLinkItunesConnectAnalyticsParameters parameters];
  445. itcParams.affiliateToken = @"affiliate";
  446. itcParams.campaignToken = @"campaign";
  447. itcParams.providerToken = @"provider";
  448. FIRDynamicLinkAndroidParameters *androidParams =
  449. [FIRDynamicLinkAndroidParameters parametersWithPackageName:@"com.google.android.gms"];
  450. androidParams.fallbackURL = [NSURL URLWithString:@"https://google.com/android"];
  451. androidParams.minimumVersion = 14;
  452. FIRDynamicLinkSocialMetaTagParameters *socialParams =
  453. [FIRDynamicLinkSocialMetaTagParameters parameters];
  454. socialParams.title = @"title";
  455. socialParams.descriptionText = @"description";
  456. socialParams.imageURL = [NSURL URLWithString:@"https://google.com/someimage"];
  457. FIRDynamicLinkOtherPlatformParameters *otherPlatformParams =
  458. [FIRDynamicLinkOtherPlatformParameters parameters];
  459. otherPlatformParams.fallbackUrl =
  460. [NSURL URLWithString:@"https://google.com/fallbackForOtherPlatform"];
  461. FIRDynamicLinkNavigationInfoParameters *navInfo =
  462. [FIRDynamicLinkNavigationInfoParameters parameters];
  463. navInfo.forcedRedirectEnabled = YES;
  464. FIRDynamicLinkComponentsOptions *options = [FIRDynamicLinkComponentsOptions options];
  465. options.pathLength = FIRShortDynamicLinkPathLengthUnguessable;
  466. NSURL *link = [NSURL URLWithString:@"https://google.com"];
  467. FIRDynamicLinkComponents *fdlComponents =
  468. [FIRDynamicLinkComponents componentsWithLink:link domainURIPrefix:kFDLURLDomain];
  469. fdlComponents.analyticsParameters = analyticsParams;
  470. fdlComponents.iOSParameters = iosParams;
  471. fdlComponents.iTunesConnectParameters = itcParams;
  472. fdlComponents.androidParameters = androidParams;
  473. fdlComponents.socialMetaTagParameters = socialParams;
  474. fdlComponents.navigationInfoParameters = navInfo;
  475. fdlComponents.otherPlatformParameters = otherPlatformParams;
  476. fdlComponents.options = options;
  477. // This is a long FDL URL that has been verified to be a correct representation of the expected
  478. // URL. Since the parameters are not guaranteed to be in any specific order, we must compare
  479. // arrays of properties of the URLs rather than the URLs themselves.
  480. NSString *possibleExpectedURLString =
  481. @"https://xyz.page.link/?afl=https%3A%2F%2Fgoogle%2Ecom%2F"
  482. "android&amv=14&apn=com.google.android.gms&ibi=com%2Eiphone%2Eapp&utm_term=t&link=https%3A%"
  483. "2F"
  484. "%2Fgoogle%2Ecom&ipbi=com%2Eipad%2Eapp&ius=mycustomsheme&ifl=https%3A%2F%2Fgoogle%2Ecom%2"
  485. "Fiphone&isi=666&utm_content=co&utm_source=s&utm_medium=m&imv=1%2E2%2E3&ct=campaign&ipfl="
  486. "http"
  487. "s%3A%2F%2Fgoogle%2Ecom%2Fipad&si=https%3A%2F%2Fgoogle%2Ecom%2Fsomeimage&at=affiliate&pt="
  488. "prov"
  489. "ider&st=title&utm_campaign=ca&sd=description&efr=1&ofl=https%3A%2F%2Fgoogle%2Ecom%"
  490. "2Ffallback"
  491. "ForOtherPlatform";
  492. NSURL *possibleExpectedURL = [NSURL URLWithString:possibleExpectedURLString];
  493. NSURLComponents *expectedURLComponents =
  494. [NSURLComponents componentsWithString:possibleExpectedURLString];
  495. // sort both expected/actual arrays to prevent order influencing the test results
  496. NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
  497. NSArray<NSURLQueryItem *> *expectedURLQueryItems =
  498. [expectedURLComponents.queryItems sortedArrayUsingDescriptors:@[ sort ]];
  499. NSURL *actualURL = fdlComponents.url;
  500. NSURLComponents *actualURLComponents =
  501. [NSURLComponents componentsWithString:actualURL.absoluteString];
  502. NSArray<NSURLQueryItem *> *actualQueryItems =
  503. [actualURLComponents.queryItems sortedArrayUsingDescriptors:@[ sort ]];
  504. XCTAssertEqualObjects(actualQueryItems, expectedURLQueryItems);
  505. XCTAssertEqualObjects(actualURL.host, possibleExpectedURL.host);
  506. }
  507. - (void)testFDLComponentsCorrectlySetsPathLengthInRequest {
  508. NSURL *url = [NSURL URLWithString:@"https://google.com/abc"];
  509. NSURLRequest *request;
  510. NSDictionary *JSON;
  511. FIRDynamicLinkComponentsOptions *options = [FIRDynamicLinkComponentsOptions options];
  512. // Default path-length
  513. request = [FIRDynamicLinkComponents shorteningRequestForLongURL:url options:options];
  514. JSON = [NSJSONSerialization JSONObjectWithData:request.HTTPBody options:0 error:nil];
  515. XCTAssertNil(JSON[@"suffix"]);
  516. // Unguessable
  517. options.pathLength = FIRShortDynamicLinkPathLengthUnguessable;
  518. request = [FIRDynamicLinkComponents shorteningRequestForLongURL:url options:options];
  519. JSON = [NSJSONSerialization JSONObjectWithData:request.HTTPBody options:0 error:nil];
  520. XCTAssertTrue([JSON[@"suffix"][@"option"] isEqualToString:@"UNGUESSABLE"]);
  521. // Short
  522. options.pathLength = FIRShortDynamicLinkPathLengthShort;
  523. request = [FIRDynamicLinkComponents shorteningRequestForLongURL:url options:options];
  524. JSON = [NSJSONSerialization JSONObjectWithData:request.HTTPBody options:0 error:nil];
  525. XCTAssertTrue([JSON[@"suffix"][@"option"] isEqualToString:@"SHORT"]);
  526. }
  527. - (void)testShortenURL {
  528. NSString *shortURLString = @"https://xyz.page.link/abcd";
  529. // Mock key provider
  530. id keyProviderClassMock = OCMClassMock([FIRDynamicLinkComponentsKeyProvider class]);
  531. [[[keyProviderClassMock expect] andReturn:@"fake-api-key"] APIKey];
  532. id componentsClassMock = OCMClassMock([FIRDynamicLinkComponents class]);
  533. [[componentsClassMock expect]
  534. sendHTTPRequest:OCMOCK_ANY
  535. completion:[OCMArg checkWithBlock:^BOOL(id obj) {
  536. void (^completion)(NSData *_Nullable, NSError *_Nullable) = obj;
  537. NSDictionary *JSON = @{@"shortLink" : shortURLString};
  538. NSData *JSONData = [NSJSONSerialization dataWithJSONObject:JSON options:0 error:0];
  539. completion(JSONData, nil);
  540. return YES;
  541. }]];
  542. XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
  543. NSURL *link = [NSURL URLWithString:@"https://google.com/abc"];
  544. FIRDynamicLinkComponents *components =
  545. [FIRDynamicLinkComponents componentsWithLink:link domainURIPrefix:kFDLURLDomain];
  546. [components
  547. shortenWithCompletion:^(NSURL *_Nullable shortURL, NSArray<NSString *> *_Nullable warnings,
  548. NSError *_Nullable error) {
  549. XCTAssertEqualObjects(shortURL.absoluteString, shortURLString);
  550. [expectation fulfill];
  551. }];
  552. [self waitForExpectationsWithTimeout:0.1 handler:nil];
  553. [keyProviderClassMock verify];
  554. [keyProviderClassMock stopMocking];
  555. [componentsClassMock verify];
  556. [componentsClassMock stopMocking];
  557. }
  558. - (void)testDeprecatedMethodComponentsWithLinkForDomain {
  559. NSString *shortURLString = @"https://xyz.page.link/abcd";
  560. // Mock key provider
  561. id keyProviderClassMock = OCMClassMock([FIRDynamicLinkComponentsKeyProvider class]);
  562. [[[keyProviderClassMock expect] andReturn:@"fake-api-key"] APIKey];
  563. id componentsClassMock = OCMClassMock([FIRDynamicLinkComponents class]);
  564. [[componentsClassMock expect]
  565. sendHTTPRequest:OCMOCK_ANY
  566. completion:[OCMArg checkWithBlock:^BOOL(id obj) {
  567. void (^completion)(NSData *_Nullable, NSError *_Nullable) = obj;
  568. NSDictionary *JSON = @{@"shortLink" : shortURLString};
  569. NSData *JSONData = [NSJSONSerialization dataWithJSONObject:JSON options:0 error:0];
  570. completion(JSONData, nil);
  571. return YES;
  572. }]];
  573. XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
  574. NSURL *link = [NSURL URLWithString:@"https://google.com/abc"];
  575. FIRDynamicLinkComponents *components =
  576. [FIRDynamicLinkComponents componentsWithLink:link domain:@"xyz.page.link"];
  577. [components
  578. shortenWithCompletion:^(NSURL *_Nullable shortURL, NSArray<NSString *> *_Nullable warnings,
  579. NSError *_Nullable error) {
  580. XCTAssertEqualObjects(shortURL.absoluteString, shortURLString);
  581. [expectation fulfill];
  582. }];
  583. [self waitForExpectationsWithTimeout:0.1 handler:nil];
  584. [keyProviderClassMock verify];
  585. [keyProviderClassMock stopMocking];
  586. [componentsClassMock verify];
  587. [componentsClassMock stopMocking];
  588. }
  589. - (void)testDeprecatedMethodComponentsWithLinkForDomainWithInvalidDomainScheme {
  590. NSString *shortURLString = @"https://xyz.page.link/abcd";
  591. // Mock key provider
  592. id keyProviderClassMock = OCMClassMock([FIRDynamicLinkComponentsKeyProvider class]);
  593. [[[keyProviderClassMock expect] andReturn:@"fake-api-key"] APIKey];
  594. id componentsClassMock = OCMClassMock([FIRDynamicLinkComponents class]);
  595. [[componentsClassMock expect]
  596. sendHTTPRequest:OCMOCK_ANY
  597. completion:[OCMArg checkWithBlock:^BOOL(id obj) {
  598. void (^completion)(NSData *_Nullable, NSError *_Nullable) = obj;
  599. NSDictionary *JSON = @{@"shortLink" : shortURLString};
  600. NSData *JSONData = [NSJSONSerialization dataWithJSONObject:JSON options:0 error:0];
  601. completion(JSONData, nil);
  602. return YES;
  603. }]];
  604. XCTestExpectation *expectation = [self expectationWithDescription:@"completion called"];
  605. NSURL *link = [NSURL URLWithString:@"https://google.com/abc"];
  606. FIRDynamicLinkComponents *components =
  607. [FIRDynamicLinkComponents componentsWithLink:link domain:@"http://xyz.page.link"];
  608. XCTAssertNotNil(components);
  609. [components
  610. shortenWithCompletion:^(NSURL *_Nullable shortURL, NSArray<NSString *> *_Nullable warnings,
  611. NSError *_Nullable error) {
  612. XCTAssertEqualObjects(shortURL.absoluteString, shortURLString);
  613. [expectation fulfill];
  614. }];
  615. [self waitForExpectationsWithTimeout:0.1 handler:nil];
  616. [keyProviderClassMock verify];
  617. [keyProviderClassMock stopMocking];
  618. [componentsClassMock verify];
  619. [componentsClassMock stopMocking];
  620. }
  621. - (void)testShortenURLReturnsErrorWhenAPIKeyMissing {
  622. NSString *shortURLString = @"https://xyz.page.link/abcd";
  623. // Mock key provider
  624. id keyProviderClassMock = OCMClassMock([FIRDynamicLinkComponentsKeyProvider class]);
  625. [[[keyProviderClassMock expect] andReturn:nil] APIKey];
  626. id componentsClassMock = OCMClassMock([FIRDynamicLinkComponents class]);
  627. [[componentsClassMock stub]
  628. sendHTTPRequest:OCMOCK_ANY
  629. completion:[OCMArg checkWithBlock:^BOOL(id obj) {
  630. void (^completion)(NSData *_Nullable, NSError *_Nullable) = obj;
  631. NSDictionary *JSON = @{@"shortLink" : shortURLString};
  632. NSData *JSONData = [NSJSONSerialization dataWithJSONObject:JSON options:0 error:0];
  633. completion(JSONData, nil);
  634. return YES;
  635. }]];
  636. XCTestExpectation *expectation =
  637. [self expectationWithDescription:@"completion called with error"];
  638. NSURL *link = [NSURL URLWithString:@"https://google.com/abc"];
  639. FIRDynamicLinkComponents *components =
  640. [FIRDynamicLinkComponents componentsWithLink:link domainURIPrefix:kFDLURLDomain];
  641. [components
  642. shortenWithCompletion:^(NSURL *_Nullable shortURL, NSArray<NSString *> *_Nullable warnings,
  643. NSError *_Nullable error) {
  644. XCTAssertNil(shortURL);
  645. if (error) {
  646. [expectation fulfill];
  647. }
  648. }];
  649. [self waitForExpectationsWithTimeout:0.1 handler:nil];
  650. [keyProviderClassMock verify];
  651. [keyProviderClassMock stopMocking];
  652. [componentsClassMock verify];
  653. [componentsClassMock stopMocking];
  654. }
  655. - (void)testShortenURLReturnsErrorWhenDomainIsMalformed {
  656. NSString *shortURLString = @"https://xyz.page.link/abcd";
  657. // Mock key provider
  658. id keyProviderClassMock = OCMClassMock([FIRDynamicLinkComponentsKeyProvider class]);
  659. [[keyProviderClassMock reject] APIKey];
  660. id componentsClassMock = OCMClassMock([FIRDynamicLinkComponents class]);
  661. [[componentsClassMock reject]
  662. sendHTTPRequest:OCMOCK_ANY
  663. completion:[OCMArg checkWithBlock:^BOOL(id obj) {
  664. void (^completion)(NSData *_Nullable, NSError *_Nullable) = obj;
  665. NSDictionary *JSON = @{@"shortLink" : shortURLString};
  666. NSData *JSONData = [NSJSONSerialization dataWithJSONObject:JSON options:0 error:0];
  667. completion(JSONData, nil);
  668. return YES;
  669. }]];
  670. NSURL *link = [NSURL URLWithString:@"https://google.com/abc"];
  671. FIRDynamicLinkComponents *components =
  672. [FIRDynamicLinkComponents componentsWithLink:link
  673. domainURIPrefix:@"this is invalid domain URI Prefix"];
  674. XCTAssertNil(components);
  675. [keyProviderClassMock verify];
  676. [keyProviderClassMock stopMocking];
  677. [componentsClassMock verify];
  678. [componentsClassMock stopMocking];
  679. }
  680. @end