SubscriptionSearchTest.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479
  1. <?php
  2. namespace Test\Integration;
  3. require_once dirname(__DIR__) . '/Setup.php';
  4. use DateTime;
  5. use DateTimeZone;
  6. use Test;
  7. use Test\Setup;
  8. use Braintree;
  9. class SubscriptionSearchTest extends Setup
  10. {
  11. public function testSearch_planIdIs()
  12. {
  13. $creditCard = SubscriptionHelper::createCreditCard();
  14. $triallessPlan = SubscriptionHelper::triallessPlan();
  15. $trialPlan = SubscriptionHelper::trialPlan();
  16. $trialSubscription = Braintree\Subscription::create([
  17. 'paymentMethodToken' => $creditCard->token,
  18. 'planId' => $trialPlan['id'],
  19. 'price' => '1'
  20. ])->subscription;
  21. $triallessSubscription = Braintree\Subscription::create([
  22. 'paymentMethodToken' => $creditCard->token,
  23. 'planId' => $triallessPlan['id'],
  24. 'price' => '1'
  25. ])->subscription;
  26. $collection = Braintree\Subscription::search([
  27. Braintree\SubscriptionSearch::planId()->is('integration_trial_plan'),
  28. Braintree\SubscriptionSearch::price()->is('1')
  29. ]);
  30. $this->assertTrue(Test\Helper::includes($collection, $trialSubscription));
  31. $this->assertFalse(Test\Helper::includes($collection, $triallessSubscription));
  32. }
  33. public function test_noRequestsWhenIterating()
  34. {
  35. $resultsReturned = false;
  36. $collection = Braintree\Subscription::search([
  37. Braintree\SubscriptionSearch::planId()->is('imaginary')
  38. ]);
  39. foreach ($collection as $transaction) {
  40. $resultsReturned = true;
  41. break;
  42. }
  43. $this->assertSame(0, $collection->maximumCount());
  44. $this->assertEquals(false, $resultsReturned);
  45. }
  46. public function testSearch_inTrialPeriod()
  47. {
  48. $creditCard = SubscriptionHelper::createCreditCard();
  49. $triallessPlan = SubscriptionHelper::triallessPlan();
  50. $trialPlan = SubscriptionHelper::trialPlan();
  51. $trialSubscription = Braintree\Subscription::create([
  52. 'paymentMethodToken' => $creditCard->token,
  53. 'planId' => $trialPlan['id'],
  54. 'price' => '1'
  55. ])->subscription;
  56. $triallessSubscription = Braintree\Subscription::create([
  57. 'paymentMethodToken' => $creditCard->token,
  58. 'planId' => $triallessPlan['id'],
  59. 'price' => '1'
  60. ])->subscription;
  61. $subscriptions_in_trial = Braintree\Subscription::search([
  62. Braintree\SubscriptionSearch::inTrialPeriod()->is(true)
  63. ]);
  64. $this->assertTrue(Test\Helper::includes($subscriptions_in_trial, $trialSubscription));
  65. $this->assertFalse(Test\Helper::includes($subscriptions_in_trial, $triallessSubscription));
  66. $subscriptions_not_in_trial = Braintree\Subscription::search([
  67. Braintree\SubscriptionSearch::inTrialPeriod()->is(false)
  68. ]);
  69. $this->assertTrue(Test\Helper::includes($subscriptions_not_in_trial, $triallessSubscription));
  70. $this->assertFalse(Test\Helper::includes($subscriptions_not_in_trial, $trialSubscription));
  71. }
  72. public function testSearch_statusIsPastDue()
  73. {
  74. $found = false;
  75. $collection = Braintree\Subscription::search([
  76. Braintree\SubscriptionSearch::status()->in([Braintree\Subscription::PAST_DUE])
  77. ]);
  78. foreach ($collection AS $item) {
  79. $found = true;
  80. $this->assertEquals(Braintree\Subscription::PAST_DUE, $item->status);
  81. }
  82. $this->assertTrue($found);
  83. }
  84. public function testSearch_statusIsExpired()
  85. {
  86. $found = false;
  87. $collection = Braintree\Subscription::search([
  88. Braintree\SubscriptionSearch::status()->in([Braintree\Subscription::EXPIRED])
  89. ]);
  90. foreach ($collection as $item) {
  91. $found = true;
  92. $this->assertEquals(Braintree\Subscription::EXPIRED, $item->status);
  93. }
  94. $this->assertTrue($found);
  95. }
  96. public function testSearch_billingCyclesRemaing()
  97. {
  98. $creditCard = SubscriptionHelper::createCreditCard();
  99. $triallessPlan = SubscriptionHelper::triallessPlan();
  100. $subscription_4 = Braintree\Subscription::create([
  101. 'paymentMethodToken' => $creditCard->token,
  102. 'planId' => $triallessPlan['id'],
  103. 'numberOfBillingCycles' => 4
  104. ])->subscription;
  105. $subscription_8 = Braintree\Subscription::create([
  106. 'paymentMethodToken' => $creditCard->token,
  107. 'planId' => $triallessPlan['id'],
  108. 'numberOfBillingCycles' => 8
  109. ])->subscription;
  110. $subscription_10 = Braintree\Subscription::create([
  111. 'paymentMethodToken' => $creditCard->token,
  112. 'planId' => $triallessPlan['id'],
  113. 'numberOfBillingCycles' => 10
  114. ])->subscription;
  115. $collection = Braintree\Subscription::search([
  116. Braintree\SubscriptionSearch::billingCyclesRemaining()->between(5, 10)
  117. ]);
  118. $this->assertFalse(Test\Helper::includes($collection, $subscription_4));
  119. $this->assertTrue(Test\Helper::includes($collection, $subscription_8));
  120. $this->assertTrue(Test\Helper::includes($collection, $subscription_10));
  121. }
  122. public function testSearch_subscriptionId()
  123. {
  124. $creditCard = SubscriptionHelper::createCreditCard();
  125. $triallessPlan = SubscriptionHelper::triallessPlan();
  126. $rand_id = strval(rand());
  127. $subscription_1 = Braintree\Subscription::create([
  128. 'paymentMethodToken' => $creditCard->token,
  129. 'planId' => $triallessPlan['id'],
  130. 'id' => 'subscription_123_id_' . $rand_id
  131. ])->subscription;
  132. $subscription_2 = Braintree\Subscription::create([
  133. 'paymentMethodToken' => $creditCard->token,
  134. 'planId' => $triallessPlan['id'],
  135. 'id' => 'subscription_23_id_' . $rand_id
  136. ])->subscription;
  137. $subscription_3 = Braintree\Subscription::create([
  138. 'paymentMethodToken' => $creditCard->token,
  139. 'planId' => $triallessPlan['id'],
  140. 'id' => 'subscription_3_id_' . $rand_id
  141. ])->subscription;
  142. $collection = Braintree\Subscription::search([
  143. Braintree\SubscriptionSearch::id()->contains('23_id_')
  144. ]);
  145. $this->assertTrue(Test\Helper::includes($collection, $subscription_1));
  146. $this->assertTrue(Test\Helper::includes($collection, $subscription_2));
  147. $this->assertFalse(Test\Helper::includes($collection, $subscription_3));
  148. }
  149. public function testSearch_merchantAccountId()
  150. {
  151. $creditCard = SubscriptionHelper::createCreditCard();
  152. $triallessPlan = SubscriptionHelper::triallessPlan();
  153. $rand_id = strval(rand());
  154. $subscription_1 = Braintree\Subscription::create([
  155. 'paymentMethodToken' => $creditCard->token,
  156. 'planId' => $triallessPlan['id'],
  157. 'id' => strval(rand()) . '_subscription_' . $rand_id,
  158. 'price' => '2'
  159. ])->subscription;
  160. $subscription_2 = Braintree\Subscription::create([
  161. 'paymentMethodToken' => $creditCard->token,
  162. 'planId' => $triallessPlan['id'],
  163. 'id' => strval(rand()) . '_subscription_' . $rand_id,
  164. 'merchantAccountId' => Test\Helper::nonDefaultMerchantAccountId(),
  165. 'price' => '2'
  166. ])->subscription;
  167. $collection = Braintree\Subscription::search([
  168. Braintree\SubscriptionSearch::id()->endsWith('subscription_' . $rand_id),
  169. Braintree\SubscriptionSearch::merchantAccountId()->in([Test\Helper::nonDefaultMerchantAccountId()]),
  170. Braintree\SubscriptionSearch::price()->is('2')
  171. ]);
  172. $this->assertFalse(Test\Helper::includes($collection, $subscription_1));
  173. $this->assertTrue(Test\Helper::includes($collection, $subscription_2));
  174. }
  175. public function testSearch_bogusMerchantAccountId()
  176. {
  177. $creditCard = SubscriptionHelper::createCreditCard();
  178. $triallessPlan = SubscriptionHelper::triallessPlan();
  179. $rand_id = strval(rand());
  180. $subscription = Braintree\Subscription::create([
  181. 'paymentMethodToken' => $creditCard->token,
  182. 'planId' => $triallessPlan['id'],
  183. 'id' => strval(rand()) . '_subscription_' . $rand_id,
  184. 'price' => '11.38'
  185. ])->subscription;
  186. $collection = Braintree\Subscription::search([
  187. Braintree\SubscriptionSearch::id()->endsWith('subscription_' . $rand_id),
  188. Braintree\SubscriptionSearch::merchantAccountId()->in(['bogus_merchant_account']),
  189. Braintree\SubscriptionSearch::price()->is('11.38')
  190. ]);
  191. $this->assertFalse(Test\Helper::includes($collection, $subscription));
  192. }
  193. public function testSearch_daysPastDue()
  194. {
  195. $creditCard = SubscriptionHelper::createCreditCard();
  196. $triallessPlan = SubscriptionHelper::triallessPlan();
  197. $subscription = Braintree\Subscription::create([
  198. 'paymentMethodToken' => $creditCard->token,
  199. 'planId' => $triallessPlan['id']
  200. ])->subscription;
  201. $http = new Braintree\Http(Braintree\Configuration::$global);
  202. $path = Braintree\Configuration::$global->merchantPath() . '/subscriptions/' . $subscription->id . '/make_past_due';
  203. $http->put($path, ['daysPastDue' => 5]);
  204. $found = false;
  205. $collection = Braintree\Subscription::search([
  206. Braintree\SubscriptionSearch::daysPastDue()->between(2, 10)
  207. ]);
  208. foreach ($collection AS $item) {
  209. $found = true;
  210. $this->assertTrue($item->daysPastDue <= 10);
  211. $this->assertTrue($item->daysPastDue >= 2);
  212. }
  213. $this->assertTrue($found);
  214. }
  215. public function testSearch_price()
  216. {
  217. $creditCard = SubscriptionHelper::createCreditCard();
  218. $triallessPlan = SubscriptionHelper::triallessPlan();
  219. $subscription_850 = Braintree\Subscription::create([
  220. 'paymentMethodToken' => $creditCard->token,
  221. 'planId' => $triallessPlan['id'],
  222. 'price' => '8.50'
  223. ])->subscription;
  224. $subscription_851 = Braintree\Subscription::create([
  225. 'paymentMethodToken' => $creditCard->token,
  226. 'planId' => $triallessPlan['id'],
  227. 'price' => '8.51'
  228. ])->subscription;
  229. $subscription_852 = Braintree\Subscription::create([
  230. 'paymentMethodToken' => $creditCard->token,
  231. 'planId' => $triallessPlan['id'],
  232. 'price' => '8.52'
  233. ])->subscription;
  234. $collection = Braintree\Subscription::search([
  235. Braintree\SubscriptionSearch::price()->between('8.51', '8.52')
  236. ]);
  237. $this->assertTrue(Test\Helper::includes($collection, $subscription_851));
  238. $this->assertTrue(Test\Helper::includes($collection, $subscription_852));
  239. $this->assertFalse(Test\Helper::includes($collection, $subscription_850));
  240. }
  241. public function testSearch_nextBillingDate()
  242. {
  243. $creditCard = SubscriptionHelper::createCreditCard();
  244. $triallessPlan = SubscriptionHelper::triallessPlan();
  245. $trialPlan = SubscriptionHelper::trialPlan();
  246. $triallessSubscription = Braintree\Subscription::create([
  247. 'paymentMethodToken' => $creditCard->token,
  248. 'planId' => $triallessPlan['id'],
  249. ])->subscription;
  250. $trialSubscription = Braintree\Subscription::create([
  251. 'paymentMethodToken' => $creditCard->token,
  252. 'planId' => $trialPlan['id'],
  253. ])->subscription;
  254. $fiveDaysFromNow = new DateTime();
  255. $fiveDaysFromNow->modify("+5 days");
  256. $collection = Braintree\Subscription::search([
  257. Braintree\SubscriptionSearch::nextBillingDate()->greaterThanOrEqualTo($fiveDaysFromNow),
  258. ]);
  259. $this->assertTrue(Test\Helper::includes($collection, $triallessSubscription));
  260. $this->assertFalse(Test\Helper::includes($collection, $trialSubscription));
  261. }
  262. public function testSearch_createdAt_lessThanOrEqualTo()
  263. {
  264. $creditCard = SubscriptionHelper::createCreditCard();
  265. $plan = SubscriptionHelper::trialPlan();
  266. $subscription= Braintree\Subscription::create([
  267. 'paymentMethodToken' => $creditCard->token,
  268. 'planId' => $plan['id'],
  269. ])->subscription;
  270. $fiveDaysFromNow = new DateTime();
  271. $fiveDaysFromNow->modify("+5 days");
  272. $collection = Braintree\Subscription::search([
  273. Braintree\SubscriptionSearch::createdAt()->lessThanOrEqualTo($fiveDaysFromNow),
  274. ]);
  275. $this->assertTrue(Test\Helper::includes($collection, $subscription));
  276. $fiveDaysAgo = new DateTime();
  277. $fiveDaysAgo->modify("-5 days");
  278. $emptyCollection = Braintree\Subscription::search([
  279. Braintree\SubscriptionSearch::createdAt()->lessThanOrEqualTo($fiveDaysAgo),
  280. ]);
  281. $this->assertFalse(Test\Helper::includes($emptyCollection, $subscription));
  282. }
  283. public function testSearch_createdAt_greaterThanOrEqualTo()
  284. {
  285. $creditCard = SubscriptionHelper::createCreditCard();
  286. $plan = SubscriptionHelper::trialPlan();
  287. $subscription= Braintree\Subscription::create([
  288. 'paymentMethodToken' => $creditCard->token,
  289. 'planId' => $plan['id'],
  290. ])->subscription;
  291. $fiveDaysAgo = new DateTime();
  292. $fiveDaysAgo->modify("-5 days");
  293. $collection = Braintree\Subscription::search([
  294. Braintree\SubscriptionSearch::createdAt()->greaterThanOrEqualTo($fiveDaysAgo),
  295. ]);
  296. $this->assertTrue(Test\Helper::includes($collection, $subscription));
  297. $fiveDaysFromNow = new DateTime();
  298. $fiveDaysFromNow->modify("+5 days");
  299. $emptyCollection = Braintree\Subscription::search([
  300. Braintree\SubscriptionSearch::createdAt()->greaterThanOrEqualTo($fiveDaysFromNow),
  301. ]);
  302. $this->assertFalse(Test\Helper::includes($emptyCollection, $subscription));
  303. }
  304. public function testSearch_createdAt_between()
  305. {
  306. $creditCard = SubscriptionHelper::createCreditCard();
  307. $plan = SubscriptionHelper::trialPlan();
  308. $subscription= Braintree\Subscription::create([
  309. 'paymentMethodToken' => $creditCard->token,
  310. 'planId' => $plan['id'],
  311. ])->subscription;
  312. $fiveDaysAgo = new DateTime();
  313. $fiveDaysFromNow = new DateTime();
  314. $tenDaysFromNow = new DateTime();
  315. $fiveDaysAgo->modify("-5 days");
  316. $fiveDaysFromNow->modify("+5 days");
  317. $tenDaysFromNow->modify("+10 days");
  318. $collection = Braintree\Subscription::search([
  319. Braintree\SubscriptionSearch::createdAt()->between($fiveDaysAgo, $fiveDaysFromNow),
  320. ]);
  321. $this->assertTrue(Test\Helper::includes($collection, $subscription));
  322. $emptyCollection = Braintree\Subscription::search([
  323. Braintree\SubscriptionSearch::createdAt()->between($fiveDaysFromNow, $tenDaysFromNow),
  324. ]);
  325. $this->assertFalse(Test\Helper::includes($emptyCollection, $subscription));
  326. }
  327. public function testSearch_createdAt_is()
  328. {
  329. $creditCard = SubscriptionHelper::createCreditCard();
  330. $plan = SubscriptionHelper::trialPlan();
  331. $subscription= Braintree\Subscription::create([
  332. 'paymentMethodToken' => $creditCard->token,
  333. 'planId' => $plan['id'],
  334. ])->subscription;
  335. $collection = Braintree\Subscription::search([
  336. Braintree\SubscriptionSearch::createdAt()->is($subscription->createdAt),
  337. ]);
  338. $this->assertTrue(Test\Helper::includes($collection, $subscription));
  339. $oneDayAgo = $subscription->createdAt;
  340. $oneDayAgo->modify("-1 days");
  341. $emptyCollection = Braintree\Subscription::search([
  342. Braintree\SubscriptionSearch::createdAt()->is($oneDayAgo),
  343. ]);
  344. $this->assertFalse(Test\Helper::includes($emptyCollection, $subscription));
  345. }
  346. public function testSearch_createdAt_convertLocalToUTC()
  347. {
  348. $creditCard = SubscriptionHelper::createCreditCard();
  349. $plan = SubscriptionHelper::trialPlan();
  350. $subscription= Braintree\Subscription::create([
  351. 'paymentMethodToken' => $creditCard->token,
  352. 'planId' => $plan['id'],
  353. ])->subscription;
  354. $tenMinAgo = date_create("now -10 minutes", new DateTimeZone("US/Pacific"));
  355. $tenMinFromNow = date_create("now +10 minutes", new DateTimeZone("US/Pacific"));
  356. $collection = Braintree\Subscription::search([
  357. Braintree\SubscriptionSearch::createdAt()->between($tenMinAgo, $tenMinFromNow),
  358. ]);
  359. $this->assertTrue(Test\Helper::includes($collection, $subscription));
  360. }
  361. public function testSearch_transactionId()
  362. {
  363. $creditCard = SubscriptionHelper::createCreditCard();
  364. $triallessPlan = SubscriptionHelper::triallessPlan();
  365. $matchingSubscription = Braintree\Subscription::create([
  366. 'paymentMethodToken' => $creditCard->token,
  367. 'planId' => $triallessPlan['id'],
  368. ])->subscription;
  369. $nonMatchingSubscription = Braintree\Subscription::create([
  370. 'paymentMethodToken' => $creditCard->token,
  371. 'planId' => $triallessPlan['id'],
  372. ])->subscription;
  373. $collection = Braintree\Subscription::search([
  374. Braintree\SubscriptionSearch::transactionId()->is($matchingSubscription->transactions[0]->id),
  375. ]);
  376. $this->assertTrue(Test\Helper::includes($collection, $matchingSubscription));
  377. $this->assertFalse(Test\Helper::includes($collection, $nonMatchingSubscription));
  378. }
  379. }