299 lines
14 KiB
Text
299 lines
14 KiB
Text
<!---
|
|
|
|
Copyright 2009 Joseph Lamoree (http://www.lamoree.com/)
|
|
Copyright 2008 Brian Ghidinelli (http://www.ghidinelli.com/)
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License"); you
|
|
may not use this file except in compliance with the License. You may
|
|
obtain a copy of the License at:
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
|
|
|
|
Create gateway configuration file: NVPGatewayTest.properties (remove leading whitespace):
|
|
gateway.username=paypal_99999999_biz_api1.paypal.com
|
|
gateway.password=abc123xyz789
|
|
gateway.credentialType=signature
|
|
gateway.signature=random_character_string
|
|
gateway.certificate=
|
|
gateway.apiVersion=56.0
|
|
gateway.returnURL=http://localhost/cfpayment/api/gateway/paypal/wpp/tests/NVPGatewayTest.cfc?method=testRemote&method=testCompleteExpressCheckout
|
|
gateway.cancelURL=http://localhost/cfpayment/api/gateway/paypal/wpp/tests/NVPGatewayTest.cfc?method=testRemote&method=testCancelExpressCheckout
|
|
gateway.testMode=true
|
|
|
|
validCustomer.UserFirstName=Jeff
|
|
validCustomer.LaerFirstName=Lebowski
|
|
validCustomer.address=609 Venenzia Ave.
|
|
validCustomer.city=Venice
|
|
validCustomer.region=CA
|
|
validCustomer.postalCode=90291
|
|
|
|
validCard.account=4111111111111111
|
|
validCard.expMonth=10
|
|
validCard.expYear=2010
|
|
validCard.verificationValue=000
|
|
|
|
invalidCard.account=4111111111111111
|
|
invalidCard.expMonth=10
|
|
invalidCard.expYear=2010
|
|
invalidCard.verificationValue=000
|
|
|
|
purchase.amount=4995
|
|
purchase.bogusAmount=0
|
|
purchase.currency=USD
|
|
purchase.bogusCurrency=XXX
|
|
purchase.ipAddress=10.1.1.1
|
|
purchase.bogusIPAddress=ipaddr
|
|
|
|
paypalCustomer.UserFirstName=Test
|
|
paypalCustomer.LaerFirstName=User
|
|
paypalCustomer.email=paypal_99999999_per@paypal.com
|
|
--->
|
|
<cfcomponent extends="mxunit.framework.TestCase">
|
|
|
|
<cfset variables.core = "null" />
|
|
<cfset variables.gateway = "null" />
|
|
<cfset variables.configFile = reReplaceNoCase(getMetaData(this).path, "\.cfc$", ".properties") />
|
|
|
|
<cffunction name="setUp" returntype="void" access="public" output="false">
|
|
<cfset var gatewayConfig = readProperties("gateway") />
|
|
|
|
<cfset gatewayConfig.path = "paypal.wpp.NVPGateway" />
|
|
<cfset variables.core = createObject("component", "cfpayment.api.core").init(config=gatewayConfig) />
|
|
<cfset variables.gateway = variables.core.getGateway() />
|
|
</cffunction>
|
|
|
|
<cffunction name="testPurchase" returntype="void" access="public" output="false">
|
|
<cfset var purchase = readProperties("purchase") />
|
|
<cfset var response = "null" />
|
|
<cfset var money = "null" />
|
|
<cfset var options = structNew() />
|
|
|
|
<!--- Valid card, proper amount --->
|
|
<cfset options.ipAddress = purchase.ipAddress />
|
|
<cfset money = variables.core.createMoney(cents=purchase.amount, currency=purchase.currency) />
|
|
<cfset response = variables.gateway.purchase(money=money, account=createValidCard(), options=options) />
|
|
<cfset assertTrue(response.getSuccess(), "The purchase should have succeeded.") />
|
|
|
|
<!--- Invalid card --->
|
|
<cfset response = variables.gateway.purchase(money=money, account=createInvalidCard(), options=options) />
|
|
<cfset assertTrue(not response.getSuccess(), "The purchase should not have succeeded, due to invalid credit card.") />
|
|
|
|
<!--- Bad IP Address --->
|
|
<cfset options.ipAddress = purchase.bogusIPAddress />
|
|
<cfset response = variables.gateway.purchase(money=money, account=createInvalidCard(), options=options) />
|
|
<cfset assertTrue(not response.getSuccess(), "The purchase should not have succeeded, due to a bogus IP address.") />
|
|
|
|
<!--- Bad purchase amount --->
|
|
<cfset money = variables.core.createMoney(cents=purchase.bogusAmount, currency=purchase.currency) />
|
|
<cfset response = variables.gateway.purchase(money=money, account=createInvalidCard(), options=options) />
|
|
<cfset assertTrue(not response.getSuccess(), "The purchase should not have succeeded, due to invalid amount.") />
|
|
|
|
<!--- Bogus currency --->
|
|
<cfset money = variables.core.createMoney(cents=purchase.amount, currency=purchase.bogusCurrency) />
|
|
<cfset response = variables.gateway.purchase(money=money, account=createInvalidCard(), options=options) />
|
|
<cfset assertTrue(not response.getSuccess(), "The purchase should not have succeeded, due to a bogus currency.") />
|
|
|
|
<!--- Duplicate Invoices --->
|
|
|
|
<!--- AVS Validation --->
|
|
|
|
<!--- CVV2 Validation --->
|
|
|
|
<!--- Expiration Validation --->
|
|
</cffunction>
|
|
|
|
|
|
|
|
|
|
<cffunction name="testBeginExpressCheckout" returntype="void" access="public" output="false">
|
|
<cfset var purchase = readProperties("purchase") />
|
|
<cfset var response = "null" />
|
|
<cfset var money = "null" />
|
|
<cfset var tokenId = "" />
|
|
|
|
<cfset money = variables.core.createMoney(cents=purchase.amount, currency=purchase.currency) />
|
|
<cfset response = variables.gateway.setExpressCheckout(money) />
|
|
<cfset assertTrue(response.getSuccess(), "The gateway response should have been successful.") />
|
|
<cfset tokenId = response.getTokenId() />
|
|
<cfset assertTrue(tokenId neq "", "The response token should not be an empty string.") />
|
|
<cflocation url="#variables.gateway.getExpressCheckoutForward(tokenId)#" addtoken="false" />
|
|
</cffunction>
|
|
|
|
<cffunction name="testCompleteExpressCheckout" returntype="void" access="public" output="false">
|
|
<cfset var purchase = readProperties("purchase") />
|
|
<cfset var customer = readProperties("paypalCustomer") />
|
|
<cfset var response = "null" />
|
|
<cfset var money = "null" />
|
|
<cfset var data = "null" />
|
|
<cfset var options = structNew() />
|
|
|
|
<cfset assertTrue(structKeyExists(url, "token"), "The URL should contain the PayPal Express Checkout token parameter.") />
|
|
<cfset assertTrue(structKeyExists(url, "payerId"), "The URL should contain the PayPal Express Checkout payerId parameter.") />
|
|
<cfset options.tokenId = URL.token />
|
|
<cfset options.payerId = URL.payerId />
|
|
|
|
<!--- Get the details of the PayPal customer --->
|
|
<cfset response = variables.gateway.getExpressCheckoutDetails(options) />
|
|
<cfset assertTrue(response.getSuccess(), "The gateway response should have been successful.") />
|
|
<cfset data = response.getParsedResult() />
|
|
<cfset assertTrue(structKeyExists(data, "email") and data.email eq customer.email, "The PayPal customer e-mail address should have been #customer.email#.") />
|
|
<cfset assertTrue(structKeyExists(data, "firstName") and data.UserFirstName eq customer.UserFirstName, "The PayPal customer first name should have been #customer.UserFirstName#.") />
|
|
<cfset assertTrue(structKeyExists(data, "lastName") and data.LaerFirstName eq customer.LaerFirstName, "The PayPal customer last name should have been #customer.LaerFirstName#.") />
|
|
|
|
<!--- Complete the payment --->
|
|
<cfset money = variables.core.createMoney(cents=purchase.amount, currency=purchase.currency) />
|
|
<cfset response = variables.gateway.doExpressCheckoutPayment(money, options) />
|
|
<cfset assertTrue(response.getSuccess(), "The gateway response should have been successful.") />
|
|
<cfset assertTrue(response.getTransactionId() neq "", "The response transactionId should not be an empty string.") />
|
|
</cffunction>
|
|
|
|
<cffunction name="testCancelExpressCheckout" returntype="void" access="public" output="false">
|
|
<cfset var options = structNew() />
|
|
|
|
<cfset options.tokenId = URL.token />
|
|
<cfset assertTrue(options.tokenId neq "", "The token should be passed in as a URL parameter.") />
|
|
<cfset variables.gateway.cancelExpressCheckout(options) />
|
|
</cffunction>
|
|
|
|
<cffunction name="testAuthorizeOnly" access="public" returntype="void" output="false">
|
|
<cfset var purchase = readProperties("purchase") />
|
|
<cfset var response = "null" />
|
|
<cfset var money = "null" />
|
|
<cfset var options = structNew() />
|
|
|
|
<cfset options.ipAddress = purchase.ipAddress />
|
|
<cfset money = variables.core.createMoney(cents=purchase.amount, currency=purchase.currency) />
|
|
<cfset response = variables.gateway.authorize(money=money, account=createValidCard(), options=options) />
|
|
<cfset assertTrue(response.getSuccess(), "The authorize did not succeed") />
|
|
</cffunction>
|
|
|
|
<cffunction name="testAuthorizeThenCapture" access="public" returntype="void" output="false">
|
|
<cfset var purchase = readProperties("purchase") />
|
|
<cfset var money = "null" />
|
|
<cfset var response = "null" />
|
|
<cfset var options = structNew() />
|
|
|
|
<cfset options.ipAddress = purchase.ipAddress />
|
|
<cfset money = variables.core.createMoney(cents=purchase.amount, currency=purchase.currency) />
|
|
<cfset response = variables.gateway.authorize(money=money, account=createValidCard(), options=options) />
|
|
<cfset assertTrue(response.getSuccess(), "The authorization did not succeed") />
|
|
|
|
<cfset response = variables.gateway.capture(money=money, authorization=response.getTransactionId(), options=options) />
|
|
<cfset assertTrue(response.getSuccess(), "The capture did not succeed") />
|
|
</cffunction>
|
|
|
|
<cffunction name="testAuthorizeThenCredit" access="public" returntype="void" output="false">
|
|
<cfset var purchase = readProperties("purchase") />
|
|
<cfset var money = "null" />
|
|
<cfset var response = "null" />
|
|
<cfset var options = structNew() />
|
|
|
|
<cfset options.ipAddress = purchase.ipAddress />
|
|
<cfset money = variables.core.createMoney(cents=purchase.amount, currency=purchase.currency) />
|
|
<cfset response = variables.gateway.authorize(money=money, account=createValidCard(), options=options) />
|
|
<cfset assertTrue(response.getSuccess(), "The authorization did not succeed") />
|
|
|
|
<cfset response = variables.gateway.credit(transactionid=response.getTransactionID(), money=money, options=options) />
|
|
<cfset assertTrue(NOT response.getSuccess(), "You cannot credit a preauth") />
|
|
</cffunction>
|
|
|
|
<cffunction name="testAuthorizeThenVoid" access="public" returntype="void" output="false">
|
|
<cfset var purchase = readProperties("purchase") />
|
|
<cfset var money = "null" />
|
|
<cfset var response = "null" />
|
|
<cfset var options = structNew() />
|
|
<cfset var account = createValidCard() />
|
|
|
|
<cfset options.ipAddress = purchase.ipAddress />
|
|
<cfset money = variables.core.createMoney(cents=purchase.amount, currency=purchase.currency) />
|
|
<cfset response = variables.gateway.authorize(money=money, account=createValidCard(), options=options) />
|
|
<cfset assertTrue(response.getSuccess(), "The authorization did not succeed") />
|
|
|
|
<cfset response = variables.gateway.void(transactionid=response.getTransactionID(), options=options) />
|
|
<cfset assertTrue(NOT response.getSuccess(), "The void of an authorization did not succeed") />
|
|
</cffunction>
|
|
|
|
<cffunction name="testPurchaseThenCredit" access="public" returntype="void" output="false">
|
|
<cfset var purchase = readProperties("purchase") />
|
|
<cfset var money = "null" />
|
|
<cfset var response = "null" />
|
|
<cfset var options = structNew() />
|
|
|
|
<cfset options.ipAddress = purchase.ipAddress />
|
|
<cfset money = variables.core.createMoney(cents=purchase.amount, currency=purchase.currency) />
|
|
<cfset response = variables.gateway.purchase(money=money, account=createValidCard(), options=options) />
|
|
<cfset assertTrue(response.getSuccess(), "The purchase did not succeed") />
|
|
|
|
<cfset response = variables.gateway.credit(transactionid=response.getTransactionID(), money=money, options=options) />
|
|
<cfset assertTrue(response.getSuccess(), "The credit of a purchase did not succeed") />
|
|
</cffunction>
|
|
|
|
|
|
|
|
<cffunction name="createValidCard" access="private" returntype="any" output="false">
|
|
<cfset var account = variables.core.createCreditCard() />
|
|
<cfset var validCustomer = readProperties("validCustomer") />
|
|
<cfset var validCard = readProperties("validCard") />
|
|
|
|
<cfset account.setAccount(validCard.account) />
|
|
<cfset account.setMonth(validCard.expMonth) />
|
|
<cfset account.setYear(validCard.expYear) />
|
|
<cfset account.setFirstName(validCustomer.UserFirstName) />
|
|
<cfset account.setLastName(validCustomer.LaerFirstName) />
|
|
<cfset account.setAddress(validCustomer.address) />
|
|
<cfset account.setPostalCode(validCustomer.postalCode) />
|
|
<cfreturn account />
|
|
</cffunction>
|
|
|
|
<cffunction name="createInvalidCard" access="private" returntype="any" output="false">
|
|
<cfset var account = variables.core.createCreditCard() />
|
|
<cfset var validCustomer = readProperties("validCustomer") />
|
|
<cfset var invalidCard = readProperties("invalidCard") />
|
|
|
|
<cfset account.setAccount(invalidCard.account) />
|
|
<cfset account.setMonth(invalidCard.expMonth) />
|
|
<cfset account.setYear(invalidCard.expYear) />
|
|
<cfset account.setFirstName(validCustomer.UserFirstName) />
|
|
<cfset account.setLastName(validCustomer.LaerFirstName) />
|
|
<cfset account.setAddress(validCustomer.address) />
|
|
<cfset account.setPostalCode(validCustomer.postalCode) />
|
|
<cfreturn account />
|
|
</cffunction>
|
|
|
|
|
|
<cffunction name="readProperties" returntype="struct" access="private" output="false">
|
|
<cfargument name="prefix" type="string" required="false" default="" />
|
|
|
|
<cfset var file = variables.configFile />
|
|
<cfset var properties = structNew() />
|
|
<cfset var line = "" />
|
|
<cfset var name = "" />
|
|
|
|
<cfif not fileExists(file)>
|
|
<cfthrow type="FileNotFoundException" message="The properties file (#file#) was not found" />
|
|
</cfif>
|
|
|
|
<cfloop file="#file#" index="line">
|
|
<cfif reFindNoCase("^[\._a-z0-9]+=", line) eq 1>
|
|
<cfset name = listFirst(line, "=") />
|
|
<cfif arguments.prefix neq "">
|
|
<cfif findNoCase(arguments.prefix & ".", name) eq 1>
|
|
<cfset properties[listLast(name, ".")] = listRest(line, "=") />
|
|
</cfif>
|
|
<cfelse>
|
|
<cfset properties[name] = listRest(line, "=") />
|
|
</cfif>
|
|
</cfif>
|
|
</cfloop>
|
|
<cfreturn properties />
|
|
</cffunction>
|
|
|
|
|
|
</cfcomponent>
|