diff --git a/CHANGELOG.md b/CHANGELOG.md index 8dcc20d4..0b70a680 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.40.0 +* Add missing criteria to credit card verification search +* Bugfix for autoloading files with Composer + ## 2.39.0 * Add oauth functionality * Add 3DS info to the server side diff --git a/lib/Braintree.php b/lib/Braintree.php index 4fac8606..7b612452 100644 --- a/lib/Braintree.php +++ b/lib/Braintree.php @@ -13,58 +13,7 @@ set_include_path(get_include_path() . PATH_SEPARATOR . realpath(dirname(__FILE__))); -abstract class Braintree -{ - /** - * @ignore - * don't permit an explicit call of the constructor! - * (like $t = new Braintree_Transaction()) - */ - protected function __construct() - { - } - /** - * @ignore - * don't permit cloning the instances (like $x = clone $v) - */ - protected function __clone() - { - } - - /** - * returns private/nonexistent instance properties - * @ignore - * @access public - * @param string $name property name - * @return mixed contents of instance properties - */ - public function __get($name) - { - if (array_key_exists($name, $this->_attributes)) { - return $this->_attributes[$name]; - } - else { - trigger_error('Undefined property on ' . get_class($this) . ': ' . $name, E_USER_NOTICE); - return null; - } - } - - /** - * used by isset() and empty() - * @access public - * @param string $name property name - * @return boolean - */ - public function __isset($name) - { - return array_key_exists($name, $this->_attributes); - } - - public function _set($key, $value) - { - $this->_attributes[$key] = $value; - } -} +require_once('Braintree/Base.php'); require_once('Braintree/Modification.php'); require_once('Braintree/Instance.php'); diff --git a/lib/Braintree/Address.php b/lib/Braintree/Address.php index 9bcf9e17..c7ebd9c6 100644 --- a/lib/Braintree/Address.php +++ b/lib/Braintree/Address.php @@ -25,7 +25,7 @@ * @property-read string $streetAddress * @property-read string $updatedAt */ -class Braintree_Address extends Braintree +class Braintree_Address extends Braintree_Base { /** * returns false if comparing object is not a Braintree_Address, diff --git a/lib/Braintree/ApplePayCard.php b/lib/Braintree/ApplePayCard.php index 28f66baf..4c189662 100644 --- a/lib/Braintree/ApplePayCard.php +++ b/lib/Braintree/ApplePayCard.php @@ -22,7 +22,7 @@ * @property-read string $paymentInstrumentName * @property-read string $updatedAt */ -class Braintree_ApplePayCard extends Braintree +class Braintree_ApplePayCard extends Braintree_Base { // Card Type const AMEX = 'Apple Pay - American Express'; diff --git a/lib/Braintree/Base.php b/lib/Braintree/Base.php new file mode 100644 index 00000000..f484af34 --- /dev/null +++ b/lib/Braintree/Base.php @@ -0,0 +1,70 @@ +_attributes)) { + return $this->_attributes[$name]; + } + else { + trigger_error('Undefined property on ' . get_class($this) . ': ' . $name, E_USER_NOTICE); + return null; + } + } + + /** + * Checks for the existance of a property stored in the private $_attributes property + * + * @ignore + * @param string $name + * @return boolean + */ + public function __isset($name) + { + return array_key_exists($name, $this->_attributes); + } + + /** + * Mutator for instance properties stored in the private $_attributes property + * + * @ignore + * @param string $key + * @param mixed $value + */ + public function _set($key, $value) + { + $this->_attributes[$key] = $value; + } +} diff --git a/lib/Braintree/CoinbaseAccount.php b/lib/Braintree/CoinbaseAccount.php index 512f7d76..7e839acc 100644 --- a/lib/Braintree/CoinbaseAccount.php +++ b/lib/Braintree/CoinbaseAccount.php @@ -22,7 +22,7 @@ * @property-read string $userName * @property-read string $userEmail */ -class Braintree_CoinbaseAccount extends Braintree +class Braintree_CoinbaseAccount extends Braintree_Base { /** * factory method: returns an instance of Braintree_CoinbaseAccount diff --git a/lib/Braintree/CreditCard.php b/lib/Braintree/CreditCard.php index 129588c2..7763b5b1 100644 --- a/lib/Braintree/CreditCard.php +++ b/lib/Braintree/CreditCard.php @@ -27,7 +27,7 @@ * @property-read string $token * @property-read string $updatedAt */ -class Braintree_CreditCard extends Braintree +class Braintree_CreditCard extends Braintree_Base { // Card Type const AMEX = 'American Express'; @@ -44,7 +44,7 @@ class Braintree_CreditCard extends Braintree const VISA = 'Visa'; const UNKNOWN = 'Unknown'; - // Credit card origination location + // Credit card origination location const INTERNATIONAL = "international"; const US = "us"; @@ -289,4 +289,23 @@ public static function delete($token) { return Braintree_Configuration::gateway()->creditCard()->delete($token); } + + public static function allCardTypes() + { + return array( + Braintree_CreditCard::AMEX, + Braintree_CreditCard::CARTE_BLANCHE, + Braintree_CreditCard::CHINA_UNION_PAY, + Braintree_CreditCard::DINERS_CLUB_INTERNATIONAL, + Braintree_CreditCard::DISCOVER, + Braintree_CreditCard::JCB, + Braintree_CreditCard::LASER, + Braintree_CreditCard::MAESTRO, + Braintree_CreditCard::MASTER_CARD, + Braintree_CreditCard::SOLO, + Braintree_CreditCard::SWITCH_TYPE, + Braintree_CreditCard::VISA, + Braintree_CreditCard::UNKNOWN + ); + } } diff --git a/lib/Braintree/CreditCardVerificationSearch.php b/lib/Braintree/CreditCardVerificationSearch.php index e7992003..faaec71b 100644 --- a/lib/Braintree/CreditCardVerificationSearch.php +++ b/lib/Braintree/CreditCardVerificationSearch.php @@ -1,33 +1,53 @@ _attributes) .']'; } + + public static function allStatuses() + { + return array( + Braintree_Result_creditCardVerification::FAILED, + Braintree_Result_creditCardVerification::GATEWAY_REJECTED, + Braintree_Result_creditCardVerification::PROCESSOR_DECLINED, + Braintree_Result_creditCardVerification::VERIFIED, + ); + } } diff --git a/lib/Braintree/Result/Error.php b/lib/Braintree/Result/Error.php index f7ad32ec..92b53865 100644 --- a/lib/Braintree/Result/Error.php +++ b/lib/Braintree/Result/Error.php @@ -25,7 +25,7 @@ * @property-read object $errors Braintree_Error_ErrorCollection * @property-read object $creditCardVerification credit card verification data */ -class Braintree_Result_Error extends Braintree +class Braintree_Result_Error extends Braintree_Base { /** * diff --git a/lib/Braintree/RiskData.php b/lib/Braintree/RiskData.php index 2be02f6c..b6ad7d5f 100644 --- a/lib/Braintree/RiskData.php +++ b/lib/Braintree/RiskData.php @@ -1,5 +1,5 @@ markTestSkipped("Requires PHP >=5.4"); + } + + $returnValue = null; + + $testFile = escapeshellarg(realpath(__DIR__ . '/Braintree/fixtures/composer_implementation.php')); + $command = sprintf('%s %s', PHP_BINARY, $testFile); + + system($command, $returnValue); + + $this->assertEquals(0, $returnValue); + } +} diff --git a/tests/integration/CreditCardVerificationAdvancedSearchTest.php b/tests/integration/CreditCardVerificationAdvancedSearchTest.php index b18c950f..15053863 100644 --- a/tests/integration/CreditCardVerificationAdvancedSearchTest.php +++ b/tests/integration/CreditCardVerificationAdvancedSearchTest.php @@ -5,34 +5,35 @@ class Braintree_CreditCardVerificationAdvancedSearchTest extends PHPUnit_Framewo { function test_searchOnTextFields() { - $search_criteria = array( + $searchCriteria = array( 'creditCardCardholderName' => 'Tim Toole', 'creditCardExpirationDate' => '05/2010', - 'creditCardNumber' => '4000111111111115', + 'creditCardNumber' => Braintree_Test_CreditCardNumbers::$failsSandboxVerification['Visa'], + 'billingAddressDetailsPostalCode' => '90210', ); - $result = Braintree_Customer::create(array( 'creditCard' => array( - 'cardholderName' => $search_criteria['creditCardCardholderName'], - 'number' => $search_criteria['creditCardNumber'], - 'expirationDate' => $search_criteria['creditCardExpirationDate'], + 'cardholderName' => $searchCriteria['creditCardCardholderName'], + 'number' => $searchCriteria['creditCardNumber'], + 'expirationDate' => $searchCriteria['creditCardExpirationDate'], + 'billingAddress' => array( + 'postalCode' => $searchCriteria['billingAddressDetailsPostalCode'] + ), 'options' => array('verifyCard' => true), ), )); - $verification = $result->creditCardVerification; + $query = array(Braintree_CreditCardVerificationSearch::id()->is($verification->id)); - foreach ($search_criteria AS $criterion => $value) { + foreach ($searchCriteria AS $criterion => $value) { $query[] = Braintree_CreditCardVerificationSearch::$criterion()->is($value); } $collection = Braintree_CreditCardVerification::search($query); - $this->assertEquals(1, $collection->maximumCount()); - $this->assertEquals($result->creditCardVerification->id, $collection->firstItem()->id); - foreach ($search_criteria AS $criterion => $value) { + foreach ($searchCriteria AS $criterion => $value) { $collection = Braintree_CreditCardVerification::search(array( Braintree_CreditCardVerificationSearch::$criterion()->is($value), Braintree_CreditCardVerificationSearch::id()->is($result->creditCardVerification->id) @@ -48,6 +49,47 @@ function test_searchOnTextFields() } } + function test_searchOnSuccessfulCustomerAndPaymentFields() + { + $customerId = uniqid(); + $searchCriteria = array( + 'customerId' => $customerId, + 'customerEmail' => $customerId . 'sandworm@example.com', + 'paymentMethodToken' => $customerId . 'token', + ); + $result = Braintree_Customer::create(array( + 'id' => $customerId, + 'email' => $searchCriteria['customerEmail'], + 'creditCard' => array( + 'token' => $searchCriteria['paymentMethodToken'], + 'number' => Braintree_Test_CreditCardNumbers::$visa, + 'expirationDate' => '05/2017', + 'options' => array('verifyCard' => true) + ) + )); + $customer = $result->customer; + + $query = array(); + foreach ($searchCriteria AS $criterion => $value) { + $query[] = Braintree_CreditCardVerificationSearch::$criterion()->is($value); + } + + $collection = Braintree_CreditCardVerification::search($query); + $this->assertEquals(1, $collection->maximumCount()); + + foreach ($searchCriteria AS $criterion => $value) { + $collection = Braintree_CreditCardVerification::search(array( + Braintree_CreditCardVerificationSearch::$criterion()->is($value), + )); + $this->assertEquals(1, $collection->maximumCount()); + + $collection = Braintree_CreditCardVerification::search(array( + Braintree_CreditCardVerificationSearch::$criterion()->is('invalid_attribute'), + )); + $this->assertEquals(0, $collection->maximumCount()); + } + } + function testGateway_searchEmpty() { $query = array(); @@ -68,9 +110,9 @@ function test_createdAt() { $result = Braintree_Customer::create(array( 'creditCard' => array( - 'cardholderName' => "Joe Smith", - 'number' => "4000111111111115", - 'expirationDate' => "12/2016", + 'cardholderName' => 'Joe Smith', + 'number' => '4000111111111115', + 'expirationDate' => '12/2016', 'options' => array('verifyCard' => true), ), )); @@ -78,9 +120,9 @@ function test_createdAt() $verification = $result->creditCardVerification; $past = clone $verification->createdAt; - $past->modify("-1 hour"); + $past->modify('-1 hour'); $future = clone $verification->createdAt; - $future->modify("+1 hour"); + $future->modify('+1 hour'); $collection = Braintree_CreditCardVerification::search(array( Braintree_CreditCardVerificationSearch::id()->is($verification->id), @@ -104,13 +146,46 @@ function test_createdAt() $this->assertEquals($verification->id, $collection->firstItem()->id); } + function test_multipleValueNode_ids() + { + $result = Braintree_Customer::create(array( + 'creditCard' => array( + 'cardholderName' => 'Joe Smith', + 'number' => '4000111111111115', + 'expirationDate' => '12/2016', + 'options' => array('verifyCard' => true), + ), + )); + + $creditCardVerification = $result->creditCardVerification; + + $collection = Braintree_CreditCardVerification::search(array( + Braintree_CreditCardVerificationSearch::ids()->is($creditCardVerification->id) + )); + $this->assertEquals(1, $collection->maximumCount()); + $this->assertEquals($creditCardVerification->id, $collection->firstItem()->id); + + $collection = Braintree_CreditCardVerification::search(array( + Braintree_CreditCardVerificationSearch::ids()->in( + array($creditCardVerification->id,'1234') + ) + )); + $this->assertEquals(1, $collection->maximumCount()); + $this->assertEquals($creditCardVerification->id, $collection->firstItem()->id); + + $collection = Braintree_CreditCardVerification::search(array( + Braintree_CreditCardVerificationSearch::ids()->is('1234') + )); + $this->assertEquals(0, $collection->maximumCount()); + } + function test_multipleValueNode_creditCardType() { $result = Braintree_Customer::create(array( 'creditCard' => array( - 'cardholderName' => "Joe Smith", - 'number' => "4000111111111115", - 'expirationDate' => "12/2016", + 'cardholderName' => 'Joe Smith', + 'number' => '4000111111111115', + 'expirationDate' => '12/2016', 'options' => array('verifyCard' => true), ), )); @@ -139,4 +214,40 @@ function test_multipleValueNode_creditCardType() )); $this->assertEquals(0, $collection->maximumCount()); } + + function test_multipleValueNode_status() + { + $result = Braintree_Customer::create(array( + 'creditCard' => array( + 'cardholderName' => 'Joe Smith', + 'number' => '4000111111111115', + 'expirationDate' => '12/2016', + 'options' => array('verifyCard' => true), + ), + )); + + $creditCardVerification = $result->creditCardVerification; + + $collection = Braintree_CreditCardVerification::search(array( + Braintree_CreditCardVerificationSearch::id()->is($creditCardVerification->id), + Braintree_CreditCardVerificationSearch::status()->is($creditCardVerification->status) + )); + $this->assertEquals(1, $collection->maximumCount()); + $this->assertEquals($creditCardVerification->id, $collection->firstItem()->id); + + $collection = Braintree_CreditCardVerification::search(array( + Braintree_CreditCardVerificationSearch::id()->is($creditCardVerification->id), + Braintree_CreditCardVerificationSearch::status()->in( + array($creditCardVerification->status, Braintree_Result_creditCardVerification::VERIFIED) + ) + )); + $this->assertEquals(1, $collection->maximumCount()); + $this->assertEquals($creditCardVerification->id, $collection->firstItem()->id); + + $collection = Braintree_CreditCardVerification::search(array( + Braintree_CreditCardVerificationSearch::id()->is($creditCardVerification->id), + Braintree_CreditCardVerificationSearch::status()->is(Braintree_Result_creditCardVerification::VERIFIED) + )); + $this->assertEquals(0, $collection->maximumCount()); + } } diff --git a/tests/integration/OAuthTest.php b/tests/integration/OAuthTest.php index 6248f5b3..62b19590 100644 --- a/tests/integration/OAuthTest.php +++ b/tests/integration/OAuthTest.php @@ -169,20 +169,8 @@ function testBuildConnectUrl() $this->assertEquals(7, $query['business']['fulfillment_completed_in']); $this->assertEquals('USD', $query['business']['currency']); $this->assertEquals('http://example.com', $query['business']['website']); - $this->assertEquals('1559ba26eee1ace1895c7bba78ecfdb5dede82306b0c579cd2b6ab79c3f651c8', $query['signature']); + $this->assertEquals(64, strlen($query['signature'])); $this->assertEquals('SHA256', $query['algorithm']); - - $curl = curl_init(); - curl_setopt($curl, CURLOPT_TIMEOUT, 60); - curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET'); - curl_setopt($curl, CURLOPT_URL, $url); - curl_setopt($curl, CURLOPT_ENCODING, 'gzip'); - curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); - curl_exec($curl); - $responseStatus = curl_getinfo($curl, CURLINFO_HTTP_CODE); - curl_close($curl); - - $this->assertEquals(302, $responseStatus); } function testBuildConnectUrlWithoutOptionalParams()