TransactionAdvancedSearchTest.php 63 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560
  1. <?php
  2. namespace Test\Integration;
  3. require_once dirname(__DIR__) . '/Setup.php';
  4. use DateTime;
  5. use DateTimeZone;
  6. use Test\Setup;
  7. use Braintree;
  8. class TransactionAdvancedSearchTest extends Setup
  9. {
  10. public function testNoMatches()
  11. {
  12. $collection = Braintree\Transaction::search([
  13. Braintree\TransactionSearch::billingFirstName()->is('thisnameisnotreal')
  14. ]);
  15. $this->assertEquals(0, $collection->maximumCount());
  16. }
  17. public function test_noRequestsWhenIterating()
  18. {
  19. $resultsReturned = false;
  20. $collection = Braintree\Transaction::search([
  21. Braintree\TransactionSearch::billingFirstName()->is('thisnameisnotreal')
  22. ]);
  23. foreach($collection as $transaction) {
  24. $resultsReturned = true;
  25. break;
  26. }
  27. $this->assertSame(0, $collection->maximumCount());
  28. $this->assertEquals(false, $resultsReturned);
  29. }
  30. public function testSearchOnTextFields()
  31. {
  32. $firstName = 'Tim' . rand();
  33. $token = 'creditcard' . rand();
  34. $customerId = 'customer' . rand();
  35. $transaction = Braintree\Transaction::saleNoValidate([
  36. 'amount' => Braintree\Test\TransactionAmounts::$authorize,
  37. 'creditCard' => [
  38. 'number' => Braintree\Test\CreditCardNumbers::$visa,
  39. 'expirationDate' => '05/2012',
  40. 'cardholderName' => 'Tom Smith',
  41. 'token' => $token,
  42. ],
  43. 'billing' => [
  44. 'company' => 'Braintree',
  45. 'countryName' => 'United States of America',
  46. 'extendedAddress' => 'Suite 123',
  47. 'firstName' => $firstName,
  48. 'lastName' => 'Smith',
  49. 'locality' => 'Chicago',
  50. 'postalCode' => '12345',
  51. 'region' => 'IL',
  52. 'streetAddress' => '123 Main St'
  53. ],
  54. 'customer' => [
  55. 'company' => 'Braintree',
  56. 'email' => 'smith@example.com',
  57. 'fax' => '5551231234',
  58. 'firstName' => 'Tom',
  59. 'id' => $customerId,
  60. 'lastName' => 'Smith',
  61. 'phone' => '5551231234',
  62. 'website' => 'http://example.com',
  63. ],
  64. 'options' => [
  65. 'storeInVault' => true
  66. ],
  67. 'orderId' => 'myorder',
  68. 'shipping' => [
  69. 'company' => 'Braintree P.S.',
  70. 'countryName' => 'Mexico',
  71. 'extendedAddress' => 'Apt 456',
  72. 'firstName' => 'Thomas',
  73. 'lastName' => 'Smithy',
  74. 'locality' => 'Braintree',
  75. 'postalCode' => '54321',
  76. 'region' => 'MA',
  77. 'streetAddress' => '456 Road'
  78. ],
  79. ]);
  80. $search_criteria = [
  81. 'billingCompany' => "Braintree",
  82. 'billingCountryName' => "United States of America",
  83. 'billingExtendedAddress' => "Suite 123",
  84. 'billingFirstName' => $firstName,
  85. 'billingLastName' => "Smith",
  86. 'billingLocality' => "Chicago",
  87. 'billingPostalCode' => "12345",
  88. 'billingRegion' => "IL",
  89. 'billingStreetAddress' => "123 Main St",
  90. 'creditCardCardholderName' => "Tom Smith",
  91. 'creditCardExpirationDate' => "05/2012",
  92. 'creditCardNumber' => Braintree\Test\CreditCardNumbers::$visa,
  93. 'creditCardUniqueIdentifier' => $transaction->creditCardDetails->uniqueNumberIdentifier,
  94. 'currency' => "USD",
  95. 'customerCompany' => "Braintree",
  96. 'customerEmail' => "smith@example.com",
  97. 'customerFax' => "5551231234",
  98. 'customerFirstName' => "Tom",
  99. 'customerId' => $customerId,
  100. 'customerLastName' => "Smith",
  101. 'customerPhone' => "5551231234",
  102. 'customerWebsite' => "http://example.com",
  103. 'orderId' => "myorder",
  104. 'paymentMethodToken' => $token,
  105. 'paymentInstrumentType' => 'CreditCardDetail',
  106. 'processorAuthorizationCode' => $transaction->processorAuthorizationCode,
  107. 'shippingCompany' => "Braintree P.S.",
  108. 'shippingCountryName' => "Mexico",
  109. 'shippingExtendedAddress' => "Apt 456",
  110. 'shippingFirstName' => "Thomas",
  111. 'shippingLastName' => "Smithy",
  112. 'shippingLocality' => "Braintree",
  113. 'shippingPostalCode' => "54321",
  114. 'shippingRegion' => "MA",
  115. 'shippingStreetAddress' => "456 Road",
  116. 'user' => "integration_user_public_id"
  117. ];
  118. $query = [Braintree\TransactionSearch::id()->is($transaction->id)];
  119. foreach ($search_criteria AS $criterion => $value) {
  120. $query[] = Braintree\TransactionSearch::$criterion()->is($value);
  121. }
  122. $collection = Braintree\Transaction::search($query);
  123. $this->assertEquals(1, $collection->maximumCount());
  124. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  125. foreach ($search_criteria AS $criterion => $value) {
  126. $collection = Braintree\Transaction::search([
  127. Braintree\TransactionSearch::$criterion()->is($value),
  128. Braintree\TransactionSearch::id()->is($transaction->id)
  129. ]);
  130. $this->assertEquals(1, $collection->maximumCount());
  131. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  132. $collection = Braintree\Transaction::search([
  133. Braintree\TransactionSearch::$criterion()->is('invalid_attribute'),
  134. Braintree\TransactionSearch::id()->is($transaction->id)
  135. ]);
  136. $this->assertEquals(0, $collection->maximumCount());
  137. }
  138. }
  139. public function testIs()
  140. {
  141. $transaction = Braintree\Transaction::saleNoValidate([
  142. 'amount' => Braintree\Test\TransactionAmounts::$authorize,
  143. 'creditCard' => [
  144. 'number' => Braintree\Test\CreditCardNumbers::$visa,
  145. 'expirationDate' => '05/2012',
  146. 'cardholderName' => 'tom smith'
  147. ]
  148. ]);
  149. $collection = Braintree\Transaction::search([
  150. Braintree\TransactionSearch::id()->is($transaction->id),
  151. Braintree\TransactionSearch::creditCardCardholderName()->is('tom smith')
  152. ]);
  153. $this->assertEquals(1, $collection->maximumCount());
  154. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  155. $collection = Braintree\Transaction::search([
  156. Braintree\TransactionSearch::id()->is($transaction->id),
  157. Braintree\TransactionSearch::creditCardCardholderName()->is('somebody else')
  158. ]);
  159. $this->assertEquals(0, $collection->maximumCount());
  160. }
  161. public function testIsNot()
  162. {
  163. $transaction = Braintree\Transaction::saleNoValidate([
  164. 'amount' => Braintree\Test\TransactionAmounts::$authorize,
  165. 'creditCard' => [
  166. 'number' => Braintree\Test\CreditCardNumbers::$visa,
  167. 'expirationDate' => '05/2012',
  168. 'cardholderName' => 'tom smith'
  169. ]
  170. ]);
  171. $collection = Braintree\Transaction::search([
  172. Braintree\TransactionSearch::id()->is($transaction->id),
  173. Braintree\TransactionSearch::creditCardCardholderName()->isNot('somebody else')
  174. ]);
  175. $this->assertEquals(1, $collection->maximumCount());
  176. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  177. $collection = Braintree\Transaction::search([
  178. Braintree\TransactionSearch::id()->is($transaction->id),
  179. Braintree\TransactionSearch::creditCardCardholderName()->isNot('tom smith')
  180. ]);
  181. $this->assertEquals(0, $collection->maximumCount());
  182. }
  183. public function testEndsWith()
  184. {
  185. $transaction = Braintree\Transaction::saleNoValidate([
  186. 'amount' => Braintree\Test\TransactionAmounts::$authorize,
  187. 'creditCard' => [
  188. 'number' => Braintree\Test\CreditCardNumbers::$visa,
  189. 'expirationDate' => '05/2012',
  190. 'cardholderName' => 'tom smith'
  191. ]
  192. ]);
  193. $collection = Braintree\Transaction::search([
  194. Braintree\TransactionSearch::id()->is($transaction->id),
  195. Braintree\TransactionSearch::creditCardCardholderName()->endsWith('m smith')
  196. ]);
  197. $this->assertEquals(1, $collection->maximumCount());
  198. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  199. $collection = Braintree\Transaction::search([
  200. Braintree\TransactionSearch::id()->is($transaction->id),
  201. Braintree\TransactionSearch::creditCardCardholderName()->endsWith('tom s')
  202. ]);
  203. $this->assertEquals(0, $collection->maximumCount());
  204. }
  205. public function testStartsWith()
  206. {
  207. $transaction = Braintree\Transaction::saleNoValidate([
  208. 'amount' => Braintree\Test\TransactionAmounts::$authorize,
  209. 'creditCard' => [
  210. 'number' => Braintree\Test\CreditCardNumbers::$visa,
  211. 'expirationDate' => '05/2012',
  212. 'cardholderName' => 'tom smith'
  213. ]
  214. ]);
  215. $collection = Braintree\Transaction::search([
  216. Braintree\TransactionSearch::id()->is($transaction->id),
  217. Braintree\TransactionSearch::creditCardCardholderName()->startsWith('tom s')
  218. ]);
  219. $this->assertEquals(1, $collection->maximumCount());
  220. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  221. $collection = Braintree\Transaction::search([
  222. Braintree\TransactionSearch::id()->is($transaction->id),
  223. Braintree\TransactionSearch::creditCardCardholderName()->startsWith('m smith')
  224. ]);
  225. $this->assertEquals(0, $collection->maximumCount());
  226. }
  227. public function testContains()
  228. {
  229. $transaction = Braintree\Transaction::saleNoValidate([
  230. 'amount' => Braintree\Test\TransactionAmounts::$authorize,
  231. 'creditCard' => [
  232. 'number' => Braintree\Test\CreditCardNumbers::$visa,
  233. 'expirationDate' => '05/2012',
  234. 'cardholderName' => 'tom smith'
  235. ]
  236. ]);
  237. $collection = Braintree\Transaction::search([
  238. Braintree\TransactionSearch::id()->is($transaction->id),
  239. Braintree\TransactionSearch::creditCardCardholderName()->contains('m sm')
  240. ]);
  241. $this->assertEquals(1, $collection->maximumCount());
  242. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  243. $collection = Braintree\Transaction::search([
  244. Braintree\TransactionSearch::id()->is($transaction->id),
  245. Braintree\TransactionSearch::creditCardCardholderName()->contains('something else')
  246. ]);
  247. $this->assertEquals(0, $collection->maximumCount());
  248. }
  249. public function test_multipleValueNode_createdUsing()
  250. {
  251. $transaction = Braintree\Transaction::saleNoValidate([
  252. 'amount' => Braintree\Test\TransactionAmounts::$authorize,
  253. 'creditCard' => [
  254. 'number' => Braintree\Test\CreditCardNumbers::$visa,
  255. 'expirationDate' => '05/2012'
  256. ]
  257. ]);
  258. $collection = Braintree\Transaction::search([
  259. Braintree\TransactionSearch::id()->is($transaction->id),
  260. Braintree\TransactionSearch::createdUsing()->is(Braintree\Transaction::FULL_INFORMATION)
  261. ]);
  262. $this->assertEquals(1, $collection->maximumCount());
  263. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  264. $collection = Braintree\Transaction::search([
  265. Braintree\TransactionSearch::id()->is($transaction->id),
  266. Braintree\TransactionSearch::createdUsing()->in(
  267. [Braintree\Transaction::FULL_INFORMATION, Braintree\Transaction::TOKEN]
  268. )
  269. ]);
  270. $this->assertEquals(1, $collection->maximumCount());
  271. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  272. $collection = Braintree\Transaction::search([
  273. Braintree\TransactionSearch::id()->is($transaction->id),
  274. Braintree\TransactionSearch::createdUsing()->in([Braintree\Transaction::TOKEN])
  275. ]);
  276. $this->assertEquals(0, $collection->maximumCount());
  277. }
  278. public function test_multipleValueNode_paymentInstrumentType_is_creditCard()
  279. {
  280. $transaction = Braintree\Transaction::saleNoValidate([
  281. 'amount' => Braintree\Test\TransactionAmounts::$authorize,
  282. 'creditCard' => [
  283. 'number' => Braintree\Test\CreditCardNumbers::$visa,
  284. 'expirationDate' => '05/2012'
  285. ]
  286. ]);
  287. $collection = Braintree\Transaction::search([
  288. Braintree\TransactionSearch::id()->is($transaction->id),
  289. Braintree\TransactionSearch::paymentInstrumentType()->is("CreditCardDetail")
  290. ]);
  291. $this->assertEquals($transaction->paymentInstrumentType, Braintree\PaymentInstrumentType::CREDIT_CARD);
  292. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  293. }
  294. public function test_multipleValueNode_paymentInstrumentType_is_paypal()
  295. {
  296. $transaction = Braintree\Transaction::saleNoValidate([
  297. 'amount' => Braintree\Test\TransactionAmounts::$authorize,
  298. 'paymentMethodNonce' => Braintree\Test\Nonces::$paypalOneTimePayment
  299. ]);
  300. $collection = Braintree\Transaction::search([
  301. Braintree\TransactionSearch::id()->is($transaction->id),
  302. Braintree\TransactionSearch::paymentInstrumentType()->is("PayPalDetail")
  303. ]);
  304. $this->assertEquals($transaction->paymentInstrumentType, Braintree\PaymentInstrumentType::PAYPAL_ACCOUNT);
  305. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  306. }
  307. public function test_multipleValueNode_paymentInstrumentType_is_applepay()
  308. {
  309. $transaction = Braintree\Transaction::saleNoValidate([
  310. 'amount' => Braintree\Test\TransactionAmounts::$authorize,
  311. 'paymentMethodNonce' => Braintree\Test\Nonces::$applePayVisa
  312. ]);
  313. $collection = Braintree\Transaction::search([
  314. Braintree\TransactionSearch::id()->is($transaction->id),
  315. Braintree\TransactionSearch::paymentInstrumentType()->is("ApplePayDetail")
  316. ]);
  317. $this->assertEquals($transaction->paymentInstrumentType, Braintree\PaymentInstrumentType::APPLE_PAY_CARD);
  318. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  319. }
  320. public function test_multipleValueNode_createdUsing_allowedValues()
  321. {
  322. $this->setExpectedException('InvalidArgumentException', 'Invalid argument(s) for created_using: noSuchCreatedUsing');
  323. $collection = Braintree\Transaction::search([
  324. Braintree\TransactionSearch::createdUsing()->is('noSuchCreatedUsing')
  325. ]);
  326. }
  327. public function test_multipleValueNode_creditCardCustomerLocation()
  328. {
  329. $transaction = Braintree\Transaction::saleNoValidate([
  330. 'amount' => Braintree\Test\TransactionAmounts::$authorize,
  331. 'creditCard' => [
  332. 'number' => Braintree\Test\CreditCardNumbers::$visa,
  333. 'expirationDate' => '05/2012'
  334. ]
  335. ]);
  336. $collection = Braintree\Transaction::search([
  337. Braintree\TransactionSearch::id()->is($transaction->id),
  338. Braintree\TransactionSearch::creditCardCustomerLocation()->is(Braintree\CreditCard::US)
  339. ]);
  340. $this->assertEquals(1, $collection->maximumCount());
  341. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  342. $collection = Braintree\Transaction::search([
  343. Braintree\TransactionSearch::id()->is($transaction->id),
  344. Braintree\TransactionSearch::creditCardCustomerLocation()->in(
  345. [Braintree\CreditCard::US, Braintree\CreditCard::INTERNATIONAL]
  346. )
  347. ]);
  348. $this->assertEquals(1, $collection->maximumCount());
  349. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  350. $collection = Braintree\Transaction::search([
  351. Braintree\TransactionSearch::id()->is($transaction->id),
  352. Braintree\TransactionSearch::creditCardCustomerLocation()->in([Braintree\CreditCard::INTERNATIONAL])
  353. ]);
  354. $this->assertEquals(0, $collection->maximumCount());
  355. }
  356. public function test_multipleValueNode_creditCardCustomerLocation_allowedValues()
  357. {
  358. $this->setExpectedException('InvalidArgumentException', 'Invalid argument(s) for credit_card_customer_location: noSuchLocation');
  359. $collection = Braintree\Transaction::search([
  360. Braintree\TransactionSearch::creditCardCustomerLocation()->is('noSuchLocation')
  361. ]);
  362. }
  363. public function test_multipleValueNode_merchantAccountId()
  364. {
  365. $transaction = Braintree\Transaction::saleNoValidate([
  366. 'amount' => Braintree\Test\TransactionAmounts::$authorize,
  367. 'creditCard' => [
  368. 'number' => Braintree\Test\CreditCardNumbers::$visa,
  369. 'expirationDate' => '05/2012'
  370. ]
  371. ]);
  372. $collection = Braintree\Transaction::search([
  373. Braintree\TransactionSearch::id()->is($transaction->id),
  374. Braintree\TransactionSearch::merchantAccountId()->is($transaction->merchantAccountId)
  375. ]);
  376. $this->assertEquals(1, $collection->maximumCount());
  377. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  378. $collection = Braintree\Transaction::search([
  379. Braintree\TransactionSearch::id()->is($transaction->id),
  380. Braintree\TransactionSearch::merchantAccountId()->in(
  381. [$transaction->merchantAccountId, "bogus_merchant_account_id"]
  382. )
  383. ]);
  384. $this->assertEquals(1, $collection->maximumCount());
  385. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  386. $collection = Braintree\Transaction::search([
  387. Braintree\TransactionSearch::id()->is($transaction->id),
  388. Braintree\TransactionSearch::merchantAccountId()->is('bogus_merchant_account_id')
  389. ]);
  390. $this->assertEquals(0, $collection->maximumCount());
  391. }
  392. public function test_multipleValueNode_creditCardType()
  393. {
  394. $transaction = Braintree\Transaction::saleNoValidate([
  395. 'amount' => Braintree\Test\TransactionAmounts::$authorize,
  396. 'creditCard' => [
  397. 'number' => Braintree\Test\CreditCardNumbers::$visa,
  398. 'expirationDate' => '05/2012'
  399. ]
  400. ]);
  401. $collection = Braintree\Transaction::search([
  402. Braintree\TransactionSearch::id()->is($transaction->id),
  403. Braintree\TransactionSearch::creditCardCardType()->is($transaction->creditCardDetails->cardType)
  404. ]);
  405. $this->assertEquals(1, $collection->maximumCount());
  406. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  407. $collection = Braintree\Transaction::search([
  408. Braintree\TransactionSearch::id()->is($transaction->id),
  409. Braintree\TransactionSearch::creditCardCardType()->in(
  410. [$transaction->creditCardDetails->cardType, Braintree\CreditCard::CHINA_UNION_PAY]
  411. )
  412. ]);
  413. $this->assertEquals(1, $collection->maximumCount());
  414. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  415. $collection = Braintree\Transaction::search([
  416. Braintree\TransactionSearch::id()->is($transaction->id),
  417. Braintree\TransactionSearch::creditCardCardType()->is(Braintree\CreditCard::CHINA_UNION_PAY)
  418. ]);
  419. $this->assertEquals(0, $collection->maximumCount());
  420. }
  421. public function test_multipleValueNode_creditCardType_allowedValues()
  422. {
  423. $this->setExpectedException('InvalidArgumentException', 'Invalid argument(s) for credit_card_card_type: noSuchCardType');
  424. $collection = Braintree\Transaction::search([
  425. Braintree\TransactionSearch::creditCardCardType()->is('noSuchCardType')
  426. ]);
  427. }
  428. public function test_multipleValueNode_status()
  429. {
  430. $transaction = Braintree\Transaction::saleNoValidate([
  431. 'amount' => Braintree\Test\TransactionAmounts::$authorize,
  432. 'creditCard' => [
  433. 'number' => Braintree\Test\CreditCardNumbers::$visa,
  434. 'expirationDate' => '05/2012'
  435. ]
  436. ]);
  437. $collection = Braintree\Transaction::search([
  438. Braintree\TransactionSearch::id()->is($transaction->id),
  439. Braintree\TransactionSearch::status()->is($transaction->status)
  440. ]);
  441. $this->assertEquals(1, $collection->maximumCount());
  442. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  443. $collection = Braintree\Transaction::search([
  444. Braintree\TransactionSearch::id()->is($transaction->id),
  445. Braintree\TransactionSearch::status()->in(
  446. [$transaction->status, Braintree\Transaction::SETTLED]
  447. )
  448. ]);
  449. $this->assertEquals(1, $collection->maximumCount());
  450. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  451. $collection = Braintree\Transaction::search([
  452. Braintree\TransactionSearch::id()->is($transaction->id),
  453. Braintree\TransactionSearch::status()->is(Braintree\Transaction::SETTLED)
  454. ]);
  455. $this->assertEquals(0, $collection->maximumCount());
  456. }
  457. public function test_multipleValueNode_status_authorizationExpired()
  458. {
  459. $collection = Braintree\Transaction::search([
  460. Braintree\TransactionSearch::status()->is(Braintree\Transaction::AUTHORIZATION_EXPIRED)
  461. ]);
  462. $this->assertGreaterThan(0, $collection->maximumCount());
  463. $this->assertEquals(Braintree\Transaction::AUTHORIZATION_EXPIRED, $collection->firstItem()->status);
  464. }
  465. public function test_multipleValueNode_status_allowedValues()
  466. {
  467. $this->setExpectedException('InvalidArgumentException', 'Invalid argument(s) for status: noSuchStatus');
  468. $collection = Braintree\Transaction::search([
  469. Braintree\TransactionSearch::status()->is('noSuchStatus')
  470. ]);
  471. }
  472. public function test_multipleValueNode_source()
  473. {
  474. $transaction = Braintree\Transaction::saleNoValidate([
  475. 'amount' => Braintree\Test\TransactionAmounts::$authorize,
  476. 'creditCard' => [
  477. 'number' => Braintree\Test\CreditCardNumbers::$visa,
  478. 'expirationDate' => '05/2012'
  479. ]
  480. ]);
  481. $collection = Braintree\Transaction::search([
  482. Braintree\TransactionSearch::id()->is($transaction->id),
  483. Braintree\TransactionSearch::source()->is(Braintree\Transaction::API)
  484. ]);
  485. $this->assertEquals(1, $collection->maximumCount());
  486. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  487. $collection = Braintree\Transaction::search([
  488. Braintree\TransactionSearch::id()->is($transaction->id),
  489. Braintree\TransactionSearch::source()->in(
  490. [Braintree\Transaction::API, Braintree\Transaction::RECURRING]
  491. )
  492. ]);
  493. $this->assertEquals(1, $collection->maximumCount());
  494. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  495. $collection = Braintree\Transaction::search([
  496. Braintree\TransactionSearch::id()->is($transaction->id),
  497. Braintree\TransactionSearch::source()->is(Braintree\Transaction::RECURRING)
  498. ]);
  499. $this->assertEquals(0, $collection->maximumCount());
  500. }
  501. public function test_multipleValueNode_type()
  502. {
  503. $customer = Braintree\Customer::createNoValidate();
  504. $creditCard = Braintree\CreditCard::create([
  505. 'customerId' => $customer->id,
  506. 'cardholderName' => 'Joe Everyman' . rand(),
  507. 'number' => '5105105105105100',
  508. 'expirationDate' => '05/12'
  509. ])->creditCard;
  510. $sale = Braintree\Transaction::saleNoValidate([
  511. 'amount' => Braintree\Test\TransactionAmounts::$authorize,
  512. 'paymentMethodToken' => $creditCard->token,
  513. 'options' => ['submitForSettlement' => true]
  514. ]);
  515. $http = new Braintree\Http(Braintree\Configuration::$global);
  516. $path = Braintree\Configuration::$global->merchantPath() . '/transactions/' . $sale->id . '/settle';
  517. $http->put($path);
  518. $refund = Braintree\Transaction::refund($sale->id)->transaction;
  519. $credit = Braintree\Transaction::creditNoValidate([
  520. 'amount' => '100.00',
  521. 'paymentMethodToken' => $creditCard->token
  522. ]);
  523. $collection = Braintree\Transaction::search([
  524. Braintree\TransactionSearch::creditCardCardholderName()->is($creditCard->cardholderName),
  525. Braintree\TransactionSearch::type()->is($sale->type)
  526. ]);
  527. $this->assertEquals(1, $collection->maximumCount());
  528. $collection = Braintree\Transaction::search([
  529. Braintree\TransactionSearch::creditCardCardholderName()->is($creditCard->cardholderName),
  530. Braintree\TransactionSearch::type()->in(
  531. [$sale->type, $credit->type]
  532. )
  533. ]);
  534. $this->assertEquals(3, $collection->maximumCount());
  535. $collection = Braintree\Transaction::search([
  536. Braintree\TransactionSearch::creditCardCardholderName()->is($creditCard->cardholderName),
  537. Braintree\TransactionSearch::type()->is($credit->type)
  538. ]);
  539. $this->assertEquals(2, $collection->maximumCount());
  540. }
  541. public function test_multipleValueNode_type_allowedValues()
  542. {
  543. $this->setExpectedException('InvalidArgumentException', 'Invalid argument(s) for type: noSuchType');
  544. $collection = Braintree\Transaction::search([
  545. Braintree\TransactionSearch::type()->is('noSuchType')
  546. ]);
  547. }
  548. public function test_multipleValueNode_type_withRefund()
  549. {
  550. $customer = Braintree\Customer::createNoValidate();
  551. $creditCard = Braintree\CreditCard::create([
  552. 'customerId' => $customer->id,
  553. 'cardholderName' => 'Joe Everyman' . rand(),
  554. 'number' => '5105105105105100',
  555. 'expirationDate' => '05/12'
  556. ])->creditCard;
  557. $sale = Braintree\Transaction::saleNoValidate([
  558. 'amount' => Braintree\Test\TransactionAmounts::$authorize,
  559. 'paymentMethodToken' => $creditCard->token,
  560. 'options' => ['submitForSettlement' => true]
  561. ]);
  562. $http = new Braintree\Http(Braintree\Configuration::$global);
  563. $path = Braintree\Configuration::$global->merchantPath() . '/transactions/' . $sale->id . '/settle';
  564. $http->put($path);
  565. $refund = Braintree\Transaction::refund($sale->id)->transaction;
  566. $credit = Braintree\Transaction::creditNoValidate([
  567. 'amount' => '100.00',
  568. 'paymentMethodToken' => $creditCard->token
  569. ]);
  570. $collection = Braintree\Transaction::search([
  571. Braintree\TransactionSearch::creditCardCardholderName()->is($creditCard->cardholderName),
  572. Braintree\TransactionSearch::type()->is($credit->type),
  573. Braintree\TransactionSearch::refund()->is(True)
  574. ]);
  575. $this->assertEquals(1, $collection->maximumCount());
  576. $this->assertEquals($refund->id, $collection->firstItem()->id);
  577. $collection = Braintree\Transaction::search([
  578. Braintree\TransactionSearch::creditCardCardholderName()->is($creditCard->cardholderName),
  579. Braintree\TransactionSearch::type()->is($credit->type),
  580. Braintree\TransactionSearch::refund()->is(False)
  581. ]);
  582. $this->assertEquals(1, $collection->maximumCount());
  583. $this->assertEquals($credit->id, $collection->firstItem()->id);
  584. }
  585. public function test_rangeNode_amount()
  586. {
  587. $customer = Braintree\Customer::createNoValidate();
  588. $creditCard = Braintree\CreditCard::create([
  589. 'customerId' => $customer->id,
  590. 'cardholderName' => 'Jane Everywoman' . rand(),
  591. 'number' => '5105105105105100',
  592. 'expirationDate' => '05/12'
  593. ])->creditCard;
  594. $t_1000 = Braintree\Transaction::saleNoValidate([
  595. 'amount' => '1000.00',
  596. 'paymentMethodToken' => $creditCard->token
  597. ]);
  598. $t_1500 = Braintree\Transaction::saleNoValidate([
  599. 'amount' => '1500.00',
  600. 'paymentMethodToken' => $creditCard->token
  601. ]);
  602. $t_1800 = Braintree\Transaction::saleNoValidate([
  603. 'amount' => '1800.00',
  604. 'paymentMethodToken' => $creditCard->token
  605. ]);
  606. $collection = Braintree\Transaction::search([
  607. Braintree\TransactionSearch::creditCardCardholderName()->is($creditCard->cardholderName),
  608. Braintree\TransactionSearch::amount()->greaterThanOrEqualTo('1700')
  609. ]);
  610. $this->assertEquals(1, $collection->maximumCount());
  611. $this->assertEquals($t_1800->id, $collection->firstItem()->id);
  612. $collection = Braintree\Transaction::search([
  613. Braintree\TransactionSearch::creditCardCardholderName()->is($creditCard->cardholderName),
  614. Braintree\TransactionSearch::amount()->lessThanOrEqualTo('1250')
  615. ]);
  616. $this->assertEquals(1, $collection->maximumCount());
  617. $this->assertEquals($t_1000->id, $collection->firstItem()->id);
  618. $collection = Braintree\Transaction::search([
  619. Braintree\TransactionSearch::creditCardCardholderName()->is($creditCard->cardholderName),
  620. Braintree\TransactionSearch::amount()->between('1100', '1600')
  621. ]);
  622. $this->assertEquals(1, $collection->maximumCount());
  623. $this->assertEquals($t_1500->id, $collection->firstItem()->id);
  624. }
  625. private function runDisbursementDateSearchTests($disbursementDateString, $comparison)
  626. {
  627. $knownDepositId = "deposittransaction";
  628. $now = new DateTime($disbursementDateString);
  629. $past = clone $now;
  630. $past->modify("-1 hour");
  631. $future = clone $now;
  632. $future->modify("+1 hour");
  633. $collections = [
  634. 'future' => Braintree\Transaction::search([
  635. Braintree\TransactionSearch::id()->is($knownDepositId),
  636. $comparison($future)
  637. ]),
  638. 'now' => Braintree\Transaction::search([
  639. Braintree\TransactionSearch::id()->is($knownDepositId),
  640. $comparison($now)
  641. ]),
  642. 'past' => Braintree\Transaction::search([
  643. Braintree\TransactionSearch::id()->is($knownDepositId),
  644. $comparison($past)
  645. ])
  646. ];
  647. return $collections;
  648. }
  649. public function test_rangeNode_disbursementDate_lessThanOrEqualTo()
  650. {
  651. $compareLessThan = function($time) {
  652. return Braintree\TransactionSearch::disbursementDate()->lessThanOrEqualTo($time);
  653. };
  654. $collection = $this->runDisbursementDateSearchTests("2013-04-10", $compareLessThan);
  655. $this->assertEquals(0, $collection['past']->maximumCount());
  656. $this->assertEquals(1, $collection['now']->maximumCount());
  657. $this->assertEquals(1, $collection['future']->maximumCount());
  658. }
  659. public function test_rangeNode_disbursementDate_GreaterThanOrEqualTo()
  660. {
  661. $comparison = function($time) {
  662. return Braintree\TransactionSearch::disbursementDate()->GreaterThanOrEqualTo($time);
  663. };
  664. $collection = $this->runDisbursementDateSearchTests("2013-04-11", $comparison);
  665. $this->assertEquals(1, $collection['past']->maximumCount());
  666. $this->assertEquals(0, $collection['now']->maximumCount());
  667. $this->assertEquals(0, $collection['future']->maximumCount());
  668. }
  669. public function test_rangeNode_disbursementDate_between()
  670. {
  671. $knownId = "deposittransaction";
  672. $now = new DateTime("2013-04-10");
  673. $past = clone $now;
  674. $past->modify("-1 day");
  675. $future = clone $now;
  676. $future->modify("+1 day");
  677. $future2 = clone $now;
  678. $future2->modify("+2 days");
  679. $collection = Braintree\Transaction::search([
  680. Braintree\TransactionSearch::id()->is($knownId),
  681. Braintree\TransactionSearch::disbursementDate()->between($past, $future)
  682. ]);
  683. $this->assertEquals(1, $collection->maximumCount());
  684. $this->assertEquals($knownId, $collection->firstItem()->id);
  685. $collection = Braintree\Transaction::search([
  686. Braintree\TransactionSearch::id()->is($knownId),
  687. Braintree\TransactionSearch::disbursementDate()->between($now, $future)
  688. ]);
  689. $this->assertEquals(1, $collection->maximumCount());
  690. $this->assertEquals($knownId, $collection->firstItem()->id);
  691. $collection = Braintree\Transaction::search([
  692. Braintree\TransactionSearch::id()->is($knownId),
  693. Braintree\TransactionSearch::disbursementDate()->between($past, $now)
  694. ]);
  695. $this->assertEquals(1, $collection->maximumCount());
  696. $this->assertEquals($knownId, $collection->firstItem()->id);
  697. $collection = Braintree\Transaction::search([
  698. Braintree\TransactionSearch::id()->is($knownId),
  699. Braintree\TransactionSearch::disbursementDate()->between($future, $future2)
  700. ]);
  701. $this->assertEquals(0, $collection->maximumCount());
  702. }
  703. public function test_rangeNode_disbursementDate_is()
  704. {
  705. $knownId = "deposittransaction";
  706. $now = new DateTime("2013-04-10");
  707. $past = clone $now;
  708. $past->modify("-1 day");
  709. $future = clone $now;
  710. $future->modify("+1 day");
  711. $future2 = clone $now;
  712. $future2->modify("+2 days");
  713. $collection = Braintree\Transaction::search([
  714. Braintree\TransactionSearch::id()->is($knownId),
  715. Braintree\TransactionSearch::disbursementDate()->is($past)
  716. ]);
  717. $this->assertEquals(0, $collection->maximumCount());
  718. $collection = Braintree\Transaction::search([
  719. Braintree\TransactionSearch::id()->is($knownId),
  720. Braintree\TransactionSearch::disbursementDate()->is($now)
  721. ]);
  722. $this->assertEquals(1, $collection->maximumCount());
  723. $this->assertEquals($knownId, $collection->firstItem()->id);
  724. $collection = Braintree\Transaction::search([
  725. Braintree\TransactionSearch::id()->is($knownId),
  726. Braintree\TransactionSearch::disbursementDate()->is($future)
  727. ]);
  728. $this->assertEquals(0, $collection->maximumCount());
  729. }
  730. private static $disputedTransaction = null;
  731. private function createTestDisputedTransaction()
  732. {
  733. if(self::$disputedTransaction !== null) {
  734. return self::$disputedTransaction;
  735. }
  736. $result = Braintree\Transaction::sale([
  737. 'amount' => '100.00',
  738. 'creditCard' => [
  739. 'number' => Braintree\Test\CreditCardNumbers::$disputes['Chargeback'],
  740. 'expirationDate' => '12/2019',
  741. ]
  742. ]);
  743. self::$disputedTransaction = $result->transaction;
  744. for($i = 0; $i < 60; $i++) {
  745. sleep(1);
  746. $collection = Braintree\Transaction::search([
  747. Braintree\TransactionSearch::id()->is($result->transaction->id),
  748. Braintree\TransactionSearch::disputeDate()->is($result->transaction->disputes[0]->receivedDate)
  749. ]);
  750. if($collection->maximumCount() > 0) {
  751. return self::$disputedTransaction;
  752. }
  753. }
  754. throw new \Exception('Unable to find the disputed transaction.');
  755. }
  756. private function rundisputeDateSearchTests($comparison)
  757. {
  758. $transactionId = $this->createTestDisputedTransaction()->id;
  759. $disputeDate = $this->createTestDisputedTransaction()->disputes[0]->receivedDate;
  760. $past = clone $disputeDate;
  761. $past->modify("-1 day");
  762. $future = clone $disputeDate;
  763. $future->modify("+1 day");
  764. $collections = [
  765. 'future' => Braintree\Transaction::search([
  766. Braintree\TransactionSearch::id()->is($transactionId),
  767. $comparison($future)
  768. ]),
  769. 'now' => Braintree\Transaction::search([
  770. Braintree\TransactionSearch::id()->is($transactionId),
  771. $comparison($disputeDate)
  772. ]),
  773. 'past' => Braintree\Transaction::search([
  774. Braintree\TransactionSearch::id()->is($transactionId),
  775. $comparison($past)
  776. ])
  777. ];
  778. return $collections;
  779. }
  780. public function test_rangeNode_disputeDate_lessThanOrEqualTo()
  781. {
  782. $compareLessThan = function($time) {
  783. return Braintree\TransactionSearch::disputeDate()->lessThanOrEqualTo($time);
  784. };
  785. $collection = $this->rundisputeDateSearchTests($compareLessThan);
  786. $this->assertEquals(0, $collection['past']->maximumCount());
  787. $this->assertEquals(1, $collection['now']->maximumCount());
  788. $this->assertEquals(1, $collection['future']->maximumCount());
  789. }
  790. public function test_rangeNode_disputeDate_GreaterThanOrEqualTo()
  791. {
  792. $comparison = function($time) {
  793. return Braintree\TransactionSearch::disputeDate()->GreaterThanOrEqualTo($time);
  794. };
  795. $collection = $this->rundisputeDateSearchTests($comparison);
  796. $this->assertEquals(1, $collection['past']->maximumCount());
  797. $this->assertEquals(1, $collection['now']->maximumCount());
  798. $this->assertEquals(0, $collection['future']->maximumCount());
  799. }
  800. public function test_rangeNode_disputeDate_between()
  801. {
  802. $disputedTransaction = $this->createTestDisputedTransaction();
  803. $knownId = $disputedTransaction->id;
  804. $receivedDate = $disputedTransaction->disputes[0]->receivedDate;
  805. $past = clone $receivedDate;
  806. $past->modify("-1 day");
  807. $future = clone $receivedDate;
  808. $future->modify("+1 day");
  809. $future2 = clone $receivedDate;
  810. $future2->modify("+2 days");
  811. $collection = Braintree\Transaction::search([
  812. Braintree\TransactionSearch::id()->is($knownId),
  813. Braintree\TransactionSearch::disputeDate()->between($past, $future)
  814. ]);
  815. $this->assertEquals(1, $collection->maximumCount());
  816. $this->assertEquals($knownId, $collection->firstItem()->id);
  817. $collection = Braintree\Transaction::search([
  818. Braintree\TransactionSearch::id()->is($knownId),
  819. Braintree\TransactionSearch::disputeDate()->between($receivedDate, $future)
  820. ]);
  821. $this->assertEquals(1, $collection->maximumCount());
  822. $this->assertEquals($knownId, $collection->firstItem()->id);
  823. $collection = Braintree\Transaction::search([
  824. Braintree\TransactionSearch::id()->is($knownId),
  825. Braintree\TransactionSearch::disputeDate()->between($past, $receivedDate)
  826. ]);
  827. $this->assertEquals(1, $collection->maximumCount());
  828. $this->assertEquals($knownId, $collection->firstItem()->id);
  829. $collection = Braintree\Transaction::search([
  830. Braintree\TransactionSearch::id()->is($knownId),
  831. Braintree\TransactionSearch::disputeDate()->between($future, $future2)
  832. ]);
  833. $this->assertEquals(0, $collection->maximumCount());
  834. }
  835. public function test_rangeNode_disputeDate_is()
  836. {
  837. $disputedTransaction = $this->createTestDisputedTransaction();
  838. $knownId = $disputedTransaction->id;
  839. $receivedDate = $disputedTransaction->disputes[0]->receivedDate;
  840. $past = clone $receivedDate;
  841. $past->modify("-1 day");
  842. $future = clone $receivedDate;
  843. $future->modify("+1 day");
  844. $collection = Braintree\Transaction::search([
  845. Braintree\TransactionSearch::id()->is($knownId),
  846. Braintree\TransactionSearch::disputeDate()->is($past)
  847. ]);
  848. $this->assertEquals(0, $collection->maximumCount());
  849. $collection = Braintree\Transaction::search([
  850. Braintree\TransactionSearch::id()->is($knownId),
  851. Braintree\TransactionSearch::disputeDate()->is($receivedDate)
  852. ]);
  853. $this->assertEquals(1, $collection->maximumCount());
  854. $this->assertEquals($knownId, $collection->firstItem()->id);
  855. $collection = Braintree\Transaction::search([
  856. Braintree\TransactionSearch::id()->is($knownId),
  857. Braintree\TransactionSearch::disputeDate()->is($future)
  858. ]);
  859. $this->assertEquals(0, $collection->maximumCount());
  860. }
  861. public function test_rangeNode_createdAt_lessThanOrEqualTo()
  862. {
  863. $transaction = Braintree\Transaction::saleNoValidate([
  864. 'amount' => '1000.00',
  865. 'creditCard' => [
  866. 'cardholderName' => 'Ted Everywoman' . rand(),
  867. 'number' => '5105105105105100',
  868. 'expirationDate' => '05/12'
  869. ]
  870. ]);
  871. $past = clone $transaction->createdAt;
  872. $past->modify("-1 hour");
  873. $now = $transaction->createdAt;
  874. $future = clone $transaction->createdAt;
  875. $future->modify("+1 hour");
  876. $collection = Braintree\Transaction::search([
  877. Braintree\TransactionSearch::creditCardCardholderName()->is($transaction->creditCardDetails->cardholderName),
  878. Braintree\TransactionSearch::createdAt()->lessThanOrEqualTo($future)
  879. ]);
  880. $this->assertEquals(1, $collection->maximumCount());
  881. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  882. $collection = Braintree\Transaction::search([
  883. Braintree\TransactionSearch::creditCardCardholderName()->is($transaction->creditCardDetails->cardholderName),
  884. Braintree\TransactionSearch::createdAt()->lessThanOrEqualTo($now)
  885. ]);
  886. $this->assertEquals(1, $collection->maximumCount());
  887. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  888. $collection = Braintree\Transaction::search([
  889. Braintree\TransactionSearch::creditCardCardholderName()->is($transaction->creditCardDetails->cardholderName),
  890. Braintree\TransactionSearch::createdAt()->lessThanOrEqualTo($past)
  891. ]);
  892. $this->assertEquals(0, $collection->maximumCount());
  893. }
  894. public function test_rangeNode_createdAt_GreaterThanOrEqualTo()
  895. {
  896. $transaction = Braintree\Transaction::saleNoValidate([
  897. 'amount' => '1000.00',
  898. 'creditCard' => [
  899. 'cardholderName' => 'Ted Everyman' . rand(),
  900. 'number' => '5105105105105100',
  901. 'expirationDate' => '05/12'
  902. ]
  903. ]);
  904. $past = clone $transaction->createdAt;
  905. $past->modify("-1 hour");
  906. $now = $transaction->createdAt;
  907. $future = clone $transaction->createdAt;
  908. $future->modify("+1 hour");
  909. $collection = Braintree\Transaction::search([
  910. Braintree\TransactionSearch::creditCardCardholderName()->is($transaction->creditCardDetails->cardholderName),
  911. Braintree\TransactionSearch::createdAt()->GreaterThanOrEqualTo($future)
  912. ]);
  913. $this->assertEquals(0, $collection->maximumCount());
  914. $collection = Braintree\Transaction::search([
  915. Braintree\TransactionSearch::creditCardCardholderName()->is($transaction->creditCardDetails->cardholderName),
  916. Braintree\TransactionSearch::createdAt()->GreaterThanOrEqualTo($now)
  917. ]);
  918. $this->assertEquals(1, $collection->maximumCount());
  919. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  920. $collection = Braintree\Transaction::search([
  921. Braintree\TransactionSearch::creditCardCardholderName()->is($transaction->creditCardDetails->cardholderName),
  922. Braintree\TransactionSearch::createdAt()->GreaterThanOrEqualTo($past)
  923. ]);
  924. $this->assertEquals(1, $collection->maximumCount());
  925. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  926. }
  927. public function test_rangeNode_createdAt_between()
  928. {
  929. $transaction = Braintree\Transaction::saleNoValidate([
  930. 'amount' => '1000.00',
  931. 'creditCard' => [
  932. 'cardholderName' => 'Ted Everyman' . rand(),
  933. 'number' => '5105105105105100',
  934. 'expirationDate' => '05/12'
  935. ]
  936. ]);
  937. $past = clone $transaction->createdAt;
  938. $past->modify("-1 hour");
  939. $now = $transaction->createdAt;
  940. $future = clone $transaction->createdAt;
  941. $future->modify("+1 hour");
  942. $future2 = clone $transaction->createdAt;
  943. $future2->modify("+1 day");
  944. $collection = Braintree\Transaction::search([
  945. Braintree\TransactionSearch::creditCardCardholderName()->is($transaction->creditCardDetails->cardholderName),
  946. Braintree\TransactionSearch::createdAt()->between($past, $future)
  947. ]);
  948. $this->assertEquals(1, $collection->maximumCount());
  949. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  950. $collection = Braintree\Transaction::search([
  951. Braintree\TransactionSearch::creditCardCardholderName()->is($transaction->creditCardDetails->cardholderName),
  952. Braintree\TransactionSearch::createdAt()->between($now, $future)
  953. ]);
  954. $this->assertEquals(1, $collection->maximumCount());
  955. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  956. $collection = Braintree\Transaction::search([
  957. Braintree\TransactionSearch::creditCardCardholderName()->is($transaction->creditCardDetails->cardholderName),
  958. Braintree\TransactionSearch::createdAt()->between($past, $now)
  959. ]);
  960. $this->assertEquals(1, $collection->maximumCount());
  961. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  962. $collection = Braintree\Transaction::search([
  963. Braintree\TransactionSearch::creditCardCardholderName()->is($transaction->creditCardDetails->cardholderName),
  964. Braintree\TransactionSearch::createdAt()->between($future, $future2)
  965. ]);
  966. $this->assertEquals(0, $collection->maximumCount());
  967. }
  968. public function test_rangeNode_createdAt_is()
  969. {
  970. $transaction = Braintree\Transaction::saleNoValidate([
  971. 'amount' => '1000.00',
  972. 'creditCard' => [
  973. 'cardholderName' => 'Ted Everyman' . rand(),
  974. 'number' => '5105105105105100',
  975. 'expirationDate' => '05/12'
  976. ]
  977. ]);
  978. $past = clone $transaction->createdAt;
  979. $past->modify("-1 hour");
  980. $now = $transaction->createdAt;
  981. $future = clone $transaction->createdAt;
  982. $future->modify("+1 hour");
  983. $collection = Braintree\Transaction::search([
  984. Braintree\TransactionSearch::creditCardCardholderName()->is($transaction->creditCardDetails->cardholderName),
  985. Braintree\TransactionSearch::createdAt()->is($future)
  986. ]);
  987. $this->assertEquals(0, $collection->maximumCount());
  988. $collection = Braintree\Transaction::search([
  989. Braintree\TransactionSearch::creditCardCardholderName()->is($transaction->creditCardDetails->cardholderName),
  990. Braintree\TransactionSearch::createdAt()->is($now)
  991. ]);
  992. $this->assertEquals(1, $collection->maximumCount());
  993. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  994. $collection = Braintree\Transaction::search([
  995. Braintree\TransactionSearch::creditCardCardholderName()->is($transaction->creditCardDetails->cardholderName),
  996. Braintree\TransactionSearch::createdAt()->is($past)
  997. ]);
  998. $this->assertEquals(0, $collection->maximumCount());
  999. }
  1000. public function test_rangeNode_createdAt_convertLocalToUTC()
  1001. {
  1002. $transaction = Braintree\Transaction::saleNoValidate([
  1003. 'amount' => '1000.00',
  1004. 'creditCard' => [
  1005. 'cardholderName' => 'Pingu Penguin' . rand(),
  1006. 'number' => '5105105105105100',
  1007. 'expirationDate' => '05/12'
  1008. ]
  1009. ]);
  1010. $ten_min_ago = date_create("now -10 minutes", new DateTimeZone("US/Pacific"));
  1011. $ten_min_from_now = date_create("now +10 minutes", new DateTimeZone("US/Pacific"));
  1012. $collection = Braintree\Transaction::search([
  1013. Braintree\TransactionSearch::id()->is($transaction->id),
  1014. Braintree\TransactionSearch::createdAt()->between($ten_min_ago, $ten_min_from_now)
  1015. ]);
  1016. $this->assertEquals(1, $collection->maximumCount());
  1017. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  1018. }
  1019. public function test_rangeNode_createdAt_handlesUTCDateTimes()
  1020. {
  1021. $transaction = Braintree\Transaction::saleNoValidate([
  1022. 'amount' => '1000.00',
  1023. 'creditCard' => [
  1024. 'cardholderName' => 'Pingu Penguin' . rand(),
  1025. 'number' => '5105105105105100',
  1026. 'expirationDate' => '05/12'
  1027. ]
  1028. ]);
  1029. $ten_min_ago = date_create("now -10 minutes", new DateTimeZone("UTC"));
  1030. $ten_min_from_now = date_create("now +10 minutes", new DateTimeZone("UTC"));
  1031. $collection = Braintree\Transaction::search([
  1032. Braintree\TransactionSearch::id()->is($transaction->id),
  1033. Braintree\TransactionSearch::createdAt()->between($ten_min_ago, $ten_min_from_now)
  1034. ]);
  1035. $this->assertEquals(1, $collection->maximumCount());
  1036. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  1037. }
  1038. public function test_rangeNode_authorizationExpiredAt()
  1039. {
  1040. $two_days_ago = date_create("now -2 days", new DateTimeZone("UTC"));
  1041. $yesterday = date_create("now -1 day", new DateTimeZone("UTC"));
  1042. $tomorrow = date_create("now +1 day", new DateTimeZone("UTC"));
  1043. $collection = Braintree\Transaction::search([
  1044. Braintree\TransactionSearch::authorizationExpiredAt()->between($two_days_ago, $yesterday)
  1045. ]);
  1046. $this->assertEquals(0, $collection->maximumCount());
  1047. $collection = Braintree\Transaction::search([
  1048. Braintree\TransactionSearch::authorizationExpiredAt()->between($yesterday, $tomorrow)
  1049. ]);
  1050. $this->assertGreaterThan(0, $collection->maximumCount());
  1051. $this->assertEquals(Braintree\Transaction::AUTHORIZATION_EXPIRED, $collection->firstItem()->status);
  1052. }
  1053. public function test_rangeNode_authorizedAt()
  1054. {
  1055. $transaction = Braintree\Transaction::saleNoValidate([
  1056. 'amount' => '1000.00',
  1057. 'creditCard' => [
  1058. 'number' => '4111111111111111',
  1059. 'expirationDate' => '05/12'
  1060. ]
  1061. ]);
  1062. $twenty_min_ago = date_create("now -20 minutes", new DateTimeZone("UTC"));
  1063. $ten_min_ago = date_create("now -10 minutes", new DateTimeZone("UTC"));
  1064. $ten_min_from_now = date_create("now +10 minutes", new DateTimeZone("UTC"));
  1065. $collection = Braintree\Transaction::search([
  1066. Braintree\TransactionSearch::id()->is($transaction->id),
  1067. Braintree\TransactionSearch::authorizedAt()->between($twenty_min_ago, $ten_min_ago)
  1068. ]);
  1069. $this->assertEquals(0, $collection->maximumCount());
  1070. $collection = Braintree\Transaction::search([
  1071. Braintree\TransactionSearch::id()->is($transaction->id),
  1072. Braintree\TransactionSearch::authorizedAt()->between($ten_min_ago, $ten_min_from_now)
  1073. ]);
  1074. $this->assertEquals(1, $collection->maximumCount());
  1075. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  1076. }
  1077. public function test_rangeNode_failedAt()
  1078. {
  1079. $transaction = Braintree\Transaction::sale([
  1080. 'amount' => '3000.00',
  1081. 'creditCard' => [
  1082. 'number' => '4111111111111111',
  1083. 'expirationDate' => '05/12'
  1084. ]
  1085. ])->transaction;
  1086. $twenty_min_ago = date_create("now -20 minutes", new DateTimeZone("UTC"));
  1087. $ten_min_ago = date_create("now -10 minutes", new DateTimeZone("UTC"));
  1088. $ten_min_from_now = date_create("now +10 minutes", new DateTimeZone("UTC"));
  1089. $collection = Braintree\Transaction::search([
  1090. Braintree\TransactionSearch::id()->is($transaction->id),
  1091. Braintree\TransactionSearch::failedAt()->between($twenty_min_ago, $ten_min_ago)
  1092. ]);
  1093. $this->assertEquals(0, $collection->maximumCount());
  1094. $collection = Braintree\Transaction::search([
  1095. Braintree\TransactionSearch::id()->is($transaction->id),
  1096. Braintree\TransactionSearch::failedAt()->between($ten_min_ago, $ten_min_from_now)
  1097. ]);
  1098. $this->assertEquals(1, $collection->maximumCount());
  1099. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  1100. }
  1101. public function test_rangeNode_gatewayRejectedAt()
  1102. {
  1103. $old_merchant_id = Braintree\Configuration::merchantId();
  1104. $old_public_key = Braintree\Configuration::publicKey();
  1105. $old_private_key = Braintree\Configuration::privateKey();
  1106. Braintree\Configuration::merchantId('processing_rules_merchant_id');
  1107. Braintree\Configuration::publicKey('processing_rules_public_key');
  1108. Braintree\Configuration::privateKey('processing_rules_private_key');
  1109. $transaction = Braintree\Transaction::sale([
  1110. 'amount' => '1000.00',
  1111. 'creditCard' => [
  1112. 'number' => '4111111111111111',
  1113. 'expirationDate' => '05/12',
  1114. 'cvv' => '200'
  1115. ]
  1116. ])->transaction;
  1117. $twenty_min_ago = date_create("now -20 minutes", new DateTimeZone("UTC"));
  1118. $ten_min_ago = date_create("now -10 minutes", new DateTimeZone("UTC"));
  1119. $ten_min_from_now = date_create("now +10 minutes", new DateTimeZone("UTC"));
  1120. $collection = Braintree\Transaction::search([
  1121. Braintree\TransactionSearch::id()->is($transaction->id),
  1122. Braintree\TransactionSearch::gatewayRejectedAt()->between($twenty_min_ago, $ten_min_ago)
  1123. ]);
  1124. $firstCount = $collection->maximumCount();
  1125. $collection = Braintree\Transaction::search([
  1126. Braintree\TransactionSearch::id()->is($transaction->id),
  1127. Braintree\TransactionSearch::gatewayRejectedAt()->between($ten_min_ago, $ten_min_from_now)
  1128. ]);
  1129. $secondCount = $collection->maximumCount();
  1130. $firstId = $collection->firstItem()->id;
  1131. Braintree\Configuration::merchantId($old_merchant_id);
  1132. Braintree\Configuration::publicKey($old_public_key);
  1133. Braintree\Configuration::privateKey($old_private_key);
  1134. $this->assertEquals(0, $firstCount);
  1135. $this->assertEquals(1, $secondCount);
  1136. $this->assertEquals($transaction->id, $firstId);
  1137. }
  1138. public function test_rangeNode_processorDeclinedAt()
  1139. {
  1140. $transaction = Braintree\Transaction::sale([
  1141. 'amount' => '2000.00',
  1142. 'creditCard' => [
  1143. 'number' => '4111111111111111',
  1144. 'expirationDate' => '05/12'
  1145. ]
  1146. ])->transaction;
  1147. $twenty_min_ago = date_create("now -20 minutes", new DateTimeZone("UTC"));
  1148. $ten_min_ago = date_create("now -10 minutes", new DateTimeZone("UTC"));
  1149. $ten_min_from_now = date_create("now +10 minutes", new DateTimeZone("UTC"));
  1150. $collection = Braintree\Transaction::search([
  1151. Braintree\TransactionSearch::id()->is($transaction->id),
  1152. Braintree\TransactionSearch::processorDeclinedAt()->between($twenty_min_ago, $ten_min_ago)
  1153. ]);
  1154. $this->assertEquals(0, $collection->maximumCount());
  1155. $collection = Braintree\Transaction::search([
  1156. Braintree\TransactionSearch::id()->is($transaction->id),
  1157. Braintree\TransactionSearch::processorDeclinedAt()->between($ten_min_ago, $ten_min_from_now)
  1158. ]);
  1159. $this->assertEquals(1, $collection->maximumCount());
  1160. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  1161. }
  1162. public function test_rangeNode_settledAt()
  1163. {
  1164. $transaction = Braintree\Transaction::saleNoValidate([
  1165. 'amount' => '1000.00',
  1166. 'creditCard' => [
  1167. 'number' => '4111111111111111',
  1168. 'expirationDate' => '05/12'
  1169. ],
  1170. 'options' => [
  1171. 'submitForSettlement' => true
  1172. ]
  1173. ]);
  1174. $http = new Braintree\Http(Braintree\Configuration::$global);
  1175. $path = Braintree\Configuration::$global->merchantPath() . '/transactions/' . $transaction->id . '/settle';
  1176. $http->put($path);
  1177. $transaction = Braintree\Transaction::find($transaction->id);
  1178. $twenty_min_ago = date_create("now -20 minutes", new DateTimeZone("UTC"));
  1179. $ten_min_ago = date_create("now -10 minutes", new DateTimeZone("UTC"));
  1180. $ten_min_from_now = date_create("now +10 minutes", new DateTimeZone("UTC"));
  1181. $collection = Braintree\Transaction::search([
  1182. Braintree\TransactionSearch::id()->is($transaction->id),
  1183. Braintree\TransactionSearch::settledAt()->between($twenty_min_ago, $ten_min_ago)
  1184. ]);
  1185. $this->assertEquals(0, $collection->maximumCount());
  1186. $collection = Braintree\Transaction::search([
  1187. Braintree\TransactionSearch::id()->is($transaction->id),
  1188. Braintree\TransactionSearch::settledAt()->between($ten_min_ago, $ten_min_from_now)
  1189. ]);
  1190. $this->assertEquals(1, $collection->maximumCount());
  1191. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  1192. }
  1193. public function test_rangeNode_submittedForSettlementAt()
  1194. {
  1195. $transaction = Braintree\Transaction::sale([
  1196. 'amount' => '1000.00',
  1197. 'creditCard' => [
  1198. 'number' => '4111111111111111',
  1199. 'expirationDate' => '05/12'
  1200. ],
  1201. 'options' => [
  1202. 'submitForSettlement' => true
  1203. ]
  1204. ])->transaction;
  1205. $twenty_min_ago = date_create("now -20 minutes", new DateTimeZone("UTC"));
  1206. $ten_min_ago = date_create("now -10 minutes", new DateTimeZone("UTC"));
  1207. $ten_min_from_now = date_create("now +10 minutes", new DateTimeZone("UTC"));
  1208. $collection = Braintree\Transaction::search([
  1209. Braintree\TransactionSearch::id()->is($transaction->id),
  1210. Braintree\TransactionSearch::submittedForSettlementAt()->between($twenty_min_ago, $ten_min_ago)
  1211. ]);
  1212. $this->assertEquals(0, $collection->maximumCount());
  1213. $collection = Braintree\Transaction::search([
  1214. Braintree\TransactionSearch::id()->is($transaction->id),
  1215. Braintree\TransactionSearch::submittedForSettlementAt()->between($ten_min_ago, $ten_min_from_now)
  1216. ]);
  1217. $this->assertEquals(1, $collection->maximumCount());
  1218. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  1219. }
  1220. public function test_rangeNode_voidedAt()
  1221. {
  1222. $transaction = Braintree\Transaction::saleNoValidate([
  1223. 'amount' => '1000.00',
  1224. 'creditCard' => [
  1225. 'number' => '4111111111111111',
  1226. 'expirationDate' => '05/12'
  1227. ]
  1228. ]);
  1229. $transaction = Braintree\Transaction::void($transaction->id)->transaction;
  1230. $twenty_min_ago = date_create("now -20 minutes", new DateTimeZone("UTC"));
  1231. $ten_min_ago = date_create("now -10 minutes", new DateTimeZone("UTC"));
  1232. $ten_min_from_now = date_create("now +10 minutes", new DateTimeZone("UTC"));
  1233. $collection = Braintree\Transaction::search([
  1234. Braintree\TransactionSearch::id()->is($transaction->id),
  1235. Braintree\TransactionSearch::voidedAt()->between($twenty_min_ago, $ten_min_ago)
  1236. ]);
  1237. $this->assertEquals(0, $collection->maximumCount());
  1238. $collection = Braintree\Transaction::search([
  1239. Braintree\TransactionSearch::id()->is($transaction->id),
  1240. Braintree\TransactionSearch::voidedAt()->between($ten_min_ago, $ten_min_from_now)
  1241. ]);
  1242. $this->assertEquals(1, $collection->maximumCount());
  1243. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  1244. }
  1245. public function test_rangeNode_canSearchOnMultipleStatuses()
  1246. {
  1247. $transaction = Braintree\Transaction::sale([
  1248. 'amount' => '1000.00',
  1249. 'creditCard' => [
  1250. 'number' => '4111111111111111',
  1251. 'expirationDate' => '05/12'
  1252. ],
  1253. 'options' => [
  1254. 'submitForSettlement' => true
  1255. ]
  1256. ])->transaction;
  1257. $twenty_min_ago = date_create("now -20 minutes", new DateTimeZone("UTC"));
  1258. $ten_min_ago = date_create("now -10 minutes", new DateTimeZone("UTC"));
  1259. $ten_min_from_now = date_create("now +10 minutes", new DateTimeZone("UTC"));
  1260. $collection = Braintree\Transaction::search([
  1261. Braintree\TransactionSearch::id()->is($transaction->id),
  1262. Braintree\TransactionSearch::authorizedAt()->between($twenty_min_ago, $ten_min_ago),
  1263. Braintree\TransactionSearch::submittedForSettlementAt()->between($twenty_min_ago, $ten_min_ago)
  1264. ]);
  1265. $this->assertEquals(0, $collection->maximumCount());
  1266. $collection = Braintree\Transaction::search([
  1267. Braintree\TransactionSearch::id()->is($transaction->id),
  1268. Braintree\TransactionSearch::authorizedAt()->between($ten_min_ago, $ten_min_from_now),
  1269. Braintree\TransactionSearch::submittedForSettlementAt()->between($ten_min_ago, $ten_min_from_now)
  1270. ]);
  1271. $this->assertEquals(1, $collection->maximumCount());
  1272. $this->assertEquals($transaction->id, $collection->firstItem()->id);
  1273. }
  1274. public function test_advancedSearchGivesIterableResult()
  1275. {
  1276. $collection = Braintree\Transaction::search([
  1277. Braintree\TransactionSearch::creditCardNumber()->startsWith("411111")
  1278. ]);
  1279. $this->assertGreaterThan(100, $collection->maximumCount());
  1280. $arr = [];
  1281. foreach($collection as $transaction) {
  1282. array_push($arr, $transaction->id);
  1283. }
  1284. $unique_transaction_ids = array_unique(array_values($arr));
  1285. $this->assertEquals($collection->maximumCount(), count($unique_transaction_ids));
  1286. }
  1287. public function test_handles_search_timeout()
  1288. {
  1289. $this->setExpectedException('Braintree\Exception\DownForMaintenance');
  1290. $collection = Braintree\Transaction::search([
  1291. Braintree\TransactionSearch::amount()->is('-5')
  1292. ]);
  1293. }
  1294. public function testHandlesPayPalAccounts()
  1295. {
  1296. $http = new HttpClientApi(Braintree\Configuration::$global);
  1297. $nonce = $http->nonceForPayPalAccount([
  1298. 'paypal_account' => [
  1299. 'access_token' => 'PAYPAL_ACCESS_TOKEN'
  1300. ]
  1301. ]);
  1302. $result = Braintree\Transaction::sale([
  1303. 'amount' => Braintree\Test\TransactionAmounts::$authorize,
  1304. 'paymentMethodNonce' => $nonce
  1305. ]);
  1306. $this->assertTrue($result->success);
  1307. $paypalDetails = $result->transaction->paypalDetails;
  1308. $collection = Braintree\Transaction::search([
  1309. Braintree\TransactionSearch::paypalPaymentId()->is($paypalDetails->paymentId),
  1310. Braintree\TransactionSearch::paypalAuthorizationId()->is($paypalDetails->authorizationId),
  1311. Braintree\TransactionSearch::paypalPayerEmail()->is($paypalDetails->payerEmail)
  1312. ]);
  1313. $this->assertEquals(1, $collection->maximumCount());
  1314. $this->assertEquals($result->transaction->id, $collection->firstItem()->id);
  1315. }
  1316. }