smulube-activemerchant 1.5.1.1 → 1.5.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +6 -0
- data/Rakefile +85 -0
- data/generators/gateway/USAGE +5 -0
- data/generators/gateway/gateway_generator.rb +61 -0
- data/generators/gateway/templates/gateway.rb +77 -0
- data/generators/gateway/templates/gateway_test.rb +49 -0
- data/generators/gateway/templates/remote_gateway_test.rb +57 -0
- data/generators/integration/USAGE +5 -0
- data/generators/integration/integration_generator.rb +68 -0
- data/generators/integration/templates/helper.rb +34 -0
- data/generators/integration/templates/helper_test.rb +54 -0
- data/generators/integration/templates/integration.rb +18 -0
- data/generators/integration/templates/module_test.rb +9 -0
- data/generators/integration/templates/notification.rb +100 -0
- data/generators/integration/templates/notification_test.rb +41 -0
- data/init.rb +3 -0
- data/lib/active_merchant/billing/gateways/payflow_nvp_uk.rb +18 -11
- data/lib/active_merchant/version.rb +3 -0
- data/lib/active_merchant.rb +1 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/test/fixtures.yml +355 -0
- data/test/remote/gateways/remote_authorize_net_cim_test.rb +460 -0
- data/test/remote/gateways/remote_authorize_net_test.rb +145 -0
- data/test/remote/gateways/remote_beanstream_interac_test.rb +53 -0
- data/test/remote/gateways/remote_beanstream_test.rb +150 -0
- data/test/remote/gateways/remote_braintree_test.rb +147 -0
- data/test/remote/gateways/remote_card_stream_test.rb +148 -0
- data/test/remote/gateways/remote_cyber_source_test.rb +144 -0
- data/test/remote/gateways/remote_data_cash_test.rb +356 -0
- data/test/remote/gateways/remote_efsnet_test.rb +81 -0
- data/test/remote/gateways/remote_elavon_test.rb +66 -0
- data/test/remote/gateways/remote_eway_test.rb +74 -0
- data/test/remote/gateways/remote_exact_test.rb +60 -0
- data/test/remote/gateways/remote_first_pay_test.rb +87 -0
- data/test/remote/gateways/remote_instapay_test.rb +61 -0
- data/test/remote/gateways/remote_jetpay_test.rb +103 -0
- data/test/remote/gateways/remote_linkpoint_test.rb +121 -0
- data/test/remote/gateways/remote_merchant_e_solutions_test.rb +173 -0
- data/test/remote/gateways/remote_merchant_ware_test.rb +113 -0
- data/test/remote/gateways/remote_modern_payments_cim_test.rb +58 -0
- data/test/remote/gateways/remote_modern_payments_test.rb +57 -0
- data/test/remote/gateways/remote_moneris_test.rb +82 -0
- data/test/remote/gateways/remote_net_registry_test.rb +85 -0
- data/test/remote/gateways/remote_netbilling_test.rb +70 -0
- data/test/remote/gateways/remote_ogone_test.rb +115 -0
- data/test/remote/gateways/remote_pay_junction_test.rb +143 -0
- data/test/remote/gateways/remote_pay_secure_test.rb +39 -0
- data/test/remote/gateways/remote_payflow_express_test.rb +50 -0
- data/test/remote/gateways/remote_payflow_nvp_uk_test.rb +57 -0
- data/test/remote/gateways/remote_payflow_test.rb +237 -0
- data/test/remote/gateways/remote_payflow_uk_test.rb +173 -0
- data/test/remote/gateways/remote_payment_express_test.rb +136 -0
- data/test/remote/gateways/remote_paypal_express_test.rb +49 -0
- data/test/remote/gateways/remote_paypal_test.rb +191 -0
- data/test/remote/gateways/remote_plugnpay_test.rb +72 -0
- data/test/remote/gateways/remote_psigate_test.rb +50 -0
- data/test/remote/gateways/remote_psl_card_test.rb +123 -0
- data/test/remote/gateways/remote_quickpay_test.rb +190 -0
- data/test/remote/gateways/remote_realex_test.rb +224 -0
- data/test/remote/gateways/remote_sage_bankcard_test.rb +109 -0
- data/test/remote/gateways/remote_sage_pay_test.rb +219 -0
- data/test/remote/gateways/remote_sage_test.rb +87 -0
- data/test/remote/gateways/remote_sage_virtual_check_test.rb +62 -0
- data/test/remote/gateways/remote_sallie_mae_test.rb +51 -0
- data/test/remote/gateways/remote_secure_pay_au_test.rb +40 -0
- data/test/remote/gateways/remote_secure_pay_tech_test.rb +37 -0
- data/test/remote/gateways/remote_secure_pay_test.rb +28 -0
- data/test/remote/gateways/remote_skipjack_test.rb +105 -0
- data/test/remote/gateways/remote_trans_first_test.rb +34 -0
- data/test/remote/gateways/remote_transax_test.rb +112 -0
- data/test/remote/gateways/remote_trust_commerce_test.rb +152 -0
- data/test/remote/gateways/remote_usa_epay_test.rb +46 -0
- data/test/remote/gateways/remote_verifi_test.rb +107 -0
- data/test/remote/gateways/remote_viaklix_test.rb +43 -0
- data/test/remote/gateways/remote_wirecard_test.rb +111 -0
- data/test/remote/integrations/remote_gestpay_integration_test.rb +37 -0
- data/test/remote/integrations/remote_paypal_integration_test.rb +26 -0
- data/test/test_helper.rb +184 -0
- data/test/unit/avs_result_test.rb +59 -0
- data/test/unit/base_test.rb +54 -0
- data/test/unit/check_test.rb +88 -0
- data/test/unit/connection_test.rb +129 -0
- data/test/unit/country_code_test.rb +33 -0
- data/test/unit/country_test.rb +64 -0
- data/test/unit/credit_card_formatting_test.rb +19 -0
- data/test/unit/credit_card_methods_test.rb +179 -0
- data/test/unit/credit_card_test.rb +318 -0
- data/test/unit/cvv_result_test.rb +33 -0
- data/test/unit/expiry_date_test.rb +32 -0
- data/test/unit/gateways/authorize_net_cim_test.rb +676 -0
- data/test/unit/gateways/authorize_net_test.rb +290 -0
- data/test/unit/gateways/beanstream_interac_test.rb +51 -0
- data/test/unit/gateways/beanstream_test.rb +144 -0
- data/test/unit/gateways/bogus_test.rb +58 -0
- data/test/unit/gateways/braintree_test.rb +118 -0
- data/test/unit/gateways/card_stream_test.rb +90 -0
- data/test/unit/gateways/cyber_source_test.rb +188 -0
- data/test/unit/gateways/data_cash_test.rb +133 -0
- data/test/unit/gateways/efsnet_test.rb +123 -0
- data/test/unit/gateways/elavon_test.rb +139 -0
- data/test/unit/gateways/eway_test.rb +118 -0
- data/test/unit/gateways/exact_test.rb +156 -0
- data/test/unit/gateways/first_pay_test.rb +125 -0
- data/test/unit/gateways/gateway_test.rb +48 -0
- data/test/unit/gateways/instapay_test.rb +102 -0
- data/test/unit/gateways/jetpay_test.rb +185 -0
- data/test/unit/gateways/linkpoint_test.rb +197 -0
- data/test/unit/gateways/merchant_e_solutions_test.rb +169 -0
- data/test/unit/gateways/merchant_ware_test.rb +188 -0
- data/test/unit/gateways/modern_payments_cim_test.rb +162 -0
- data/test/unit/gateways/moneris_test.rb +158 -0
- data/test/unit/gateways/net_registry_test.rb +416 -0
- data/test/unit/gateways/netbilling_test.rb +54 -0
- data/test/unit/gateways/ogone_test.rb +319 -0
- data/test/unit/gateways/pay_junction_test.rb +123 -0
- data/test/unit/gateways/pay_secure_test.rb +71 -0
- data/test/unit/gateways/payflow_express_test.rb +173 -0
- data/test/unit/gateways/payflow_express_uk_test.rb +86 -0
- data/test/unit/gateways/payflow_nvp_uk_test.rb +201 -0
- data/test/unit/gateways/payflow_test.rb +305 -0
- data/test/unit/gateways/payflow_uk_test.rb +30 -0
- data/test/unit/gateways/payment_express_test.rb +195 -0
- data/test/unit/gateways/paypal_express_test.rb +382 -0
- data/test/unit/gateways/paypal_test.rb +569 -0
- data/test/unit/gateways/plugnpay_test.rb +86 -0
- data/test/unit/gateways/psigate_test.rb +169 -0
- data/test/unit/gateways/psl_card_test.rb +64 -0
- data/test/unit/gateways/quickpay_test.rb +112 -0
- data/test/unit/gateways/realex_test.rb +151 -0
- data/test/unit/gateways/sage_bankcard_test.rb +196 -0
- data/test/unit/gateways/sage_pay_test.rb +139 -0
- data/test/unit/gateways/sage_virtual_check_test.rb +71 -0
- data/test/unit/gateways/sallie_mae_test.rb +53 -0
- data/test/unit/gateways/secure_pay_au_test.rb +207 -0
- data/test/unit/gateways/secure_pay_tech_test.rb +44 -0
- data/test/unit/gateways/secure_pay_test.rb +101 -0
- data/test/unit/gateways/skip_jack_test.rb +228 -0
- data/test/unit/gateways/trans_first_test.rb +112 -0
- data/test/unit/gateways/trust_commerce_test.rb +90 -0
- data/test/unit/gateways/usa_epay_test.rb +128 -0
- data/test/unit/gateways/verifi_test.rb +96 -0
- data/test/unit/gateways/viaklix_test.rb +78 -0
- data/test/unit/gateways/wirecard_test.rb +250 -0
- data/test/unit/generators/test_gateway_generator.rb +46 -0
- data/test/unit/generators/test_generator_helper.rb +20 -0
- data/test/unit/generators/test_integration_generator.rb +53 -0
- data/test/unit/integrations/action_view_helper_test.rb +50 -0
- data/test/unit/integrations/bogus_module_test.rb +20 -0
- data/test/unit/integrations/chronopay_module_test.rb +13 -0
- data/test/unit/integrations/gestpay_module_test.rb +14 -0
- data/test/unit/integrations/helpers/bogus_helper_test.rb +28 -0
- data/test/unit/integrations/helpers/chronopay_helper_test.rb +110 -0
- data/test/unit/integrations/helpers/gestpay_helper_test.rb +100 -0
- data/test/unit/integrations/helpers/hi_trust_helper_test.rb +16 -0
- data/test/unit/integrations/helpers/nochex_helper_test.rb +53 -0
- data/test/unit/integrations/helpers/paypal_helper_test.rb +171 -0
- data/test/unit/integrations/helpers/quickpay_helper_test.rb +40 -0
- data/test/unit/integrations/helpers/two_checkout_helper_test.rb +92 -0
- data/test/unit/integrations/hi_trust_module_test.rb +13 -0
- data/test/unit/integrations/nochex_module_test.rb +13 -0
- data/test/unit/integrations/notifications/chronopay_notification_test.rb +66 -0
- data/test/unit/integrations/notifications/gestpay_notification_test.rb +60 -0
- data/test/unit/integrations/notifications/hi_trust_notification_test.rb +59 -0
- data/test/unit/integrations/notifications/nochex_notification_test.rb +51 -0
- data/test/unit/integrations/notifications/notification_test.rb +54 -0
- data/test/unit/integrations/notifications/paypal_notification_test.rb +85 -0
- data/test/unit/integrations/notifications/quickpay_notification_test.rb +69 -0
- data/test/unit/integrations/notifications/two_checkout_notification_test.rb +55 -0
- data/test/unit/integrations/paypal_module_test.rb +28 -0
- data/test/unit/integrations/quickpay_module_test.rb +9 -0
- data/test/unit/integrations/returns/chronopay_return_test.rb +11 -0
- data/test/unit/integrations/returns/gestpay_return_test.rb +10 -0
- data/test/unit/integrations/returns/hi_trust_return_test.rb +24 -0
- data/test/unit/integrations/returns/nochex_return_test.rb +10 -0
- data/test/unit/integrations/returns/paypal_return_test.rb +10 -0
- data/test/unit/integrations/returns/return_test.rb +11 -0
- data/test/unit/integrations/returns/two_checkout_return_test.rb +24 -0
- data/test/unit/integrations/two_checkout_module_test.rb +13 -0
- data/test/unit/post_data_test.rb +55 -0
- data/test/unit/posts_data_test.rb +48 -0
- data/test/unit/response_test.rb +28 -0
- data/test/unit/utils_test.rb +7 -0
- data/test/unit/validateable_test.rb +60 -0
- data.tar.gz.sig +0 -0
- metadata +453 -107
- metadata.gz.sig +0 -0
data/.gitignore
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'lib/support/gateway_support'
|
3
|
+
require 'lib/active_merchant'
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'jeweler'
|
7
|
+
Jeweler::Tasks.new do |gemspec|
|
8
|
+
gemspec.name = "smulube-activemerchant"
|
9
|
+
gemspec.version = ActiveMerchant::VERSION
|
10
|
+
gemspec.summary = 'Framework and tools for dealing with credit card transactions.'
|
11
|
+
gemspec.description = 'Active Merchant is a simple payment abstraction library used in and sponsored by Shopify. It is written by Tobias Luetke, Cody Fauser, and contributors. The aim of the project is to feel natural to Ruby users and to abstract as many parts as possible away from the user to offer a consistent interface across all supported gateways.'
|
12
|
+
gemspec.email = "tobi@leetsoft.com"
|
13
|
+
gemspec.authors = ["Tobias Luetke", "Cody Fauser", "Dennis Thiesen", "Sam Mulube"]
|
14
|
+
gemspec.homepage = 'http://activemerchant.org/'
|
15
|
+
gemspec.add_dependency('activesupport', '>= 2.3.2')
|
16
|
+
gemspec.add_dependency('builder', '>= 2.0.0')
|
17
|
+
|
18
|
+
gemspec.signing_key = ENV['GEM_PRIVATE_KEY']
|
19
|
+
gemspec.cert_chain = ['gem-public_cert.pem']
|
20
|
+
end
|
21
|
+
Jeweler::GemcutterTasks.new
|
22
|
+
rescue LoadError
|
23
|
+
puts "Jeweler not available. Install it with: gem install jeweler"
|
24
|
+
end
|
25
|
+
|
26
|
+
require 'rake/testtask'
|
27
|
+
namespace :test do
|
28
|
+
Rake::TestTask.new(:units) do |test|
|
29
|
+
test.libs << 'lib' << 'test'
|
30
|
+
test.pattern = 'test/unit/**/*_test.rb'
|
31
|
+
test.verbose = true
|
32
|
+
test.ruby_opts << '-rubygems'
|
33
|
+
end
|
34
|
+
|
35
|
+
Rake::TestTask.new(:remote) do |test|
|
36
|
+
test.libs << 'lib' << 'test'
|
37
|
+
test.pattern = 'test/remote/**/*_test.rb'
|
38
|
+
test.verbose = true
|
39
|
+
test.ruby_opts << '-rubygems'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
desc "Run the unit test suite"
|
44
|
+
task :default => 'test:units'
|
45
|
+
|
46
|
+
require 'rake/rdoctask'
|
47
|
+
Rake::RDocTask.new do |rdoc|
|
48
|
+
rdoc.rdoc_dir = 'doc'
|
49
|
+
rdoc.title = "ActiveMerchant library"
|
50
|
+
rdoc.options << '--line-numbers' << '--inline-source' << '--main=README.rdoc'
|
51
|
+
rdoc.rdoc_files.include('README.rdoc', 'CHANGELOG')
|
52
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
53
|
+
rdoc.rdoc_files.exclude('lib/tasks')
|
54
|
+
end
|
55
|
+
|
56
|
+
require 'rake/clean'
|
57
|
+
CLEAN.include("pkg")
|
58
|
+
|
59
|
+
namespace :gateways do
|
60
|
+
desc 'Print the currently supported gateways'
|
61
|
+
task :print do
|
62
|
+
support = GatewaySupport.new
|
63
|
+
support.to_s
|
64
|
+
end
|
65
|
+
|
66
|
+
namespace :print do
|
67
|
+
desc 'Print the currently supported gateways in RDoc format'
|
68
|
+
task :rdoc do
|
69
|
+
support = GatewaySupport.new
|
70
|
+
support.to_rdoc
|
71
|
+
end
|
72
|
+
|
73
|
+
desc 'Print the currently supported gateways in Textile format'
|
74
|
+
task :textile do
|
75
|
+
support = GatewaySupport.new
|
76
|
+
support.to_textile
|
77
|
+
end
|
78
|
+
|
79
|
+
desc 'Print the gateway functionality supported by each gateway'
|
80
|
+
task :features do
|
81
|
+
support = GatewaySupport.new
|
82
|
+
support.features
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
class GatewayGenerator < RubiGen::Base
|
2
|
+
LIB_DIR = "lib/active_merchant/billing/gateways/"
|
3
|
+
UNIT_TEST_DIR = "test/unit/gateways/"
|
4
|
+
REMOTE_TEST_DIR = "test/remote/gateways/"
|
5
|
+
|
6
|
+
|
7
|
+
default_options :author => nil
|
8
|
+
|
9
|
+
attr_reader :name
|
10
|
+
|
11
|
+
def initialize(runtime_args, runtime_options = {})
|
12
|
+
super
|
13
|
+
usage if args.length < 1
|
14
|
+
@name = args.shift
|
15
|
+
extract_options
|
16
|
+
end
|
17
|
+
|
18
|
+
def class_name
|
19
|
+
@name.classify
|
20
|
+
end
|
21
|
+
|
22
|
+
def manifest
|
23
|
+
record do |m|
|
24
|
+
|
25
|
+
m.directory LIB_DIR
|
26
|
+
m.directory UNIT_TEST_DIR
|
27
|
+
m.directory REMOTE_TEST_DIR
|
28
|
+
|
29
|
+
m.template 'gateway.rb', LIB_DIR + "#{name}.rb"
|
30
|
+
m.template 'gateway_test.rb', UNIT_TEST_DIR + "#{name}_test.rb"
|
31
|
+
m.template 'remote_gateway_test.rb', REMOTE_TEST_DIR + "remote_#{name}_test.rb"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
protected
|
36
|
+
def banner
|
37
|
+
<<-EOS
|
38
|
+
Creates a ...
|
39
|
+
|
40
|
+
USAGE: #{$0} #{spec.name} name"
|
41
|
+
EOS
|
42
|
+
end
|
43
|
+
|
44
|
+
def add_options!(opts)
|
45
|
+
# opts.separator ''
|
46
|
+
# opts.separator 'Options:'
|
47
|
+
# For each option below, place the default
|
48
|
+
# at the top of the file next to "default_options"
|
49
|
+
# opts.on("-a", "--author=\"Your Name\"", String,
|
50
|
+
# "Some comment about this option",
|
51
|
+
# "Default: none") { |options[:author]| }
|
52
|
+
# opts.on("-v", "--version", "Show the #{File.basename($0)} version number and quit.")
|
53
|
+
end
|
54
|
+
|
55
|
+
def extract_options
|
56
|
+
# for each option, extract it into a local variable (and create an "attr_reader :author" at the top)
|
57
|
+
# Templates can access these value via the attr_reader-generated methods, but not the
|
58
|
+
# raw instance variable value.
|
59
|
+
# @author = options[:author]
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
2
|
+
module Billing #:nodoc:
|
3
|
+
class <%= class_name %>Gateway < Gateway
|
4
|
+
TEST_URL = 'https://example.com/test'
|
5
|
+
LIVE_URL = 'https://example.com/live'
|
6
|
+
|
7
|
+
# The countries the gateway supports merchants from as 2 digit ISO country codes
|
8
|
+
self.supported_countries = ['US']
|
9
|
+
|
10
|
+
# The card types supported by the payment gateway
|
11
|
+
self.supported_cardtypes = [:visa, :master, :american_express, :discover]
|
12
|
+
|
13
|
+
# The homepage URL of the gateway
|
14
|
+
self.homepage_url = 'http://www.example.net/'
|
15
|
+
|
16
|
+
# The name of the gateway
|
17
|
+
self.display_name = 'New Gateway'
|
18
|
+
|
19
|
+
def initialize(options = {})
|
20
|
+
#requires!(options, :login, :password)
|
21
|
+
@options = options
|
22
|
+
super
|
23
|
+
end
|
24
|
+
|
25
|
+
def authorize(money, creditcard, options = {})
|
26
|
+
post = {}
|
27
|
+
add_invoice(post, options)
|
28
|
+
add_creditcard(post, creditcard)
|
29
|
+
add_address(post, creditcard, options)
|
30
|
+
add_customer_data(post, options)
|
31
|
+
|
32
|
+
commit('authonly', money, post)
|
33
|
+
end
|
34
|
+
|
35
|
+
def purchase(money, creditcard, options = {})
|
36
|
+
post = {}
|
37
|
+
add_invoice(post, options)
|
38
|
+
add_creditcard(post, creditcard)
|
39
|
+
add_address(post, creditcard, options)
|
40
|
+
add_customer_data(post, options)
|
41
|
+
|
42
|
+
commit('sale', money, post)
|
43
|
+
end
|
44
|
+
|
45
|
+
def capture(money, authorization, options = {})
|
46
|
+
commit('capture', money, post)
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def add_customer_data(post, options)
|
52
|
+
end
|
53
|
+
|
54
|
+
def add_address(post, creditcard, options)
|
55
|
+
end
|
56
|
+
|
57
|
+
def add_invoice(post, options)
|
58
|
+
end
|
59
|
+
|
60
|
+
def add_creditcard(post, creditcard)
|
61
|
+
end
|
62
|
+
|
63
|
+
def parse(body)
|
64
|
+
end
|
65
|
+
|
66
|
+
def commit(action, money, parameters)
|
67
|
+
end
|
68
|
+
|
69
|
+
def message_from(response)
|
70
|
+
end
|
71
|
+
|
72
|
+
def post_data(action, parameters = {})
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class <%= class_name %>Test < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@gateway = <%= class_name %>Gateway.new(
|
6
|
+
:login => 'login',
|
7
|
+
:password => 'password'
|
8
|
+
)
|
9
|
+
|
10
|
+
@credit_card = credit_card
|
11
|
+
@amount = 100
|
12
|
+
|
13
|
+
@options = {
|
14
|
+
:order_id => '1',
|
15
|
+
:billing_address => address,
|
16
|
+
:description => 'Store Purchase'
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_successful_purchase
|
21
|
+
@gateway.expects(:ssl_post).returns(successful_purchase_response)
|
22
|
+
|
23
|
+
assert response = @gateway.purchase(@amount, @credit_card, @options)
|
24
|
+
assert_instance_of
|
25
|
+
assert_success response
|
26
|
+
|
27
|
+
# Replace with authorization number from the successful response
|
28
|
+
assert_equal '', response.authorization
|
29
|
+
assert response.test?
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_unsuccessful_request
|
33
|
+
@gateway.expects(:ssl_post).returns(failed_purchase_response)
|
34
|
+
|
35
|
+
assert response = @gateway.purchase(@amount, @credit_card, @options)
|
36
|
+
assert_failure response
|
37
|
+
assert response.test?
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
# Place raw successful response from gateway here
|
43
|
+
def successful_purchase_response
|
44
|
+
end
|
45
|
+
|
46
|
+
# Place raw failed response from gateway here
|
47
|
+
def failed_purcahse_response
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Remote<%= class_name %>Test < Test::Unit::TestCase
|
4
|
+
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@gateway = <%= class_name %>Gateway.new(fixtures(:<%= class_name.underscore %>))
|
8
|
+
|
9
|
+
@amount = 100
|
10
|
+
@credit_card = credit_card('4000100011112224')
|
11
|
+
@declined_card = credit_card('4000300011112220')
|
12
|
+
|
13
|
+
@options = {
|
14
|
+
:order_id => '1',
|
15
|
+
:billing_address => address,
|
16
|
+
:description => 'Store Purchase'
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_successful_purchase
|
21
|
+
assert response = @gateway.purchase(@amount, @credit_card, @options)
|
22
|
+
assert_success response
|
23
|
+
assert_equal 'REPLACE WITH SUCCESS MESSAGE', response.message
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_unsuccessful_purchase
|
27
|
+
assert response = @gateway.purchase(@amount, @declined_card, @options)
|
28
|
+
assert_failure response
|
29
|
+
assert_equal 'REPLACE WITH FAILED PURCHASE MESSAGE', response.message
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_authorize_and_capture
|
33
|
+
amount = @amount
|
34
|
+
assert auth = @gateway.authorize(amount, @credit_card, @options)
|
35
|
+
assert_success auth
|
36
|
+
assert_equal 'Success', auth.message
|
37
|
+
assert auth.authorization
|
38
|
+
assert capture = @gateway.capture(amount, auth.authorization)
|
39
|
+
assert_success capture
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_failed_capture
|
43
|
+
assert response = @gateway.capture(@amount, '')
|
44
|
+
assert_failure response
|
45
|
+
assert_equal 'REPLACE WITH GATEWAY FAILURE MESSAGE', response.message
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_invalid_login
|
49
|
+
gateway = <%= class_name %>Gateway.new(
|
50
|
+
:login => '',
|
51
|
+
:password => ''
|
52
|
+
)
|
53
|
+
assert response = gateway.purchase(@amount, @credit_card, @options)
|
54
|
+
assert_failure response
|
55
|
+
assert_equal 'REPLACE WITH FAILURE MESSAGE', response.message
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
class IntegrationGenerator < RubiGen::Base
|
2
|
+
BASE_DIR = "lib/active_merchant/billing/integrations/"
|
3
|
+
TEST_DIR = "test/unit/integrations/"
|
4
|
+
|
5
|
+
default_options :author => nil
|
6
|
+
|
7
|
+
attr_reader :name
|
8
|
+
|
9
|
+
def initialize(runtime_args, runtime_options = {})
|
10
|
+
super
|
11
|
+
usage if args.size < 1
|
12
|
+
@name = args.shift
|
13
|
+
extract_options
|
14
|
+
end
|
15
|
+
|
16
|
+
def class_name
|
17
|
+
name.classify
|
18
|
+
end
|
19
|
+
|
20
|
+
def lib_dir
|
21
|
+
BASE_DIR + name
|
22
|
+
end
|
23
|
+
|
24
|
+
def manifest
|
25
|
+
record do |m|
|
26
|
+
# Ensure appropriate folder(s) exists
|
27
|
+
m.directory lib_dir
|
28
|
+
m.directory TEST_DIR
|
29
|
+
m.directory TEST_DIR + "helpers"
|
30
|
+
m.directory TEST_DIR + "notifications"
|
31
|
+
|
32
|
+
m.template 'integration.rb', "#{lib_dir}.rb"
|
33
|
+
m.template 'helper.rb', lib_dir + "/helper.rb"
|
34
|
+
m.template 'notification.rb', lib_dir + "/notification.rb"
|
35
|
+
|
36
|
+
m.template 'module_test.rb', TEST_DIR + "#{name}_module_test.rb"
|
37
|
+
m.template 'helper_test.rb', TEST_DIR + "helpers/#{name}_helper_test.rb"
|
38
|
+
m.template 'notification_test.rb', TEST_DIR + "notifications/#{name}_notification_test.rb"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
protected
|
43
|
+
def banner
|
44
|
+
<<-EOS
|
45
|
+
Creates a ...
|
46
|
+
|
47
|
+
USAGE: #{$0} #{spec.name} name"
|
48
|
+
EOS
|
49
|
+
end
|
50
|
+
|
51
|
+
def add_options!(opts)
|
52
|
+
# opts.separator ''
|
53
|
+
# opts.separator 'Options:'
|
54
|
+
# For each option below, place the default
|
55
|
+
# at the top of the file next to "default_options"
|
56
|
+
# opts.on("-a", "--author=\"Your Name\"", String,
|
57
|
+
# "Some comment about this option",
|
58
|
+
# "Default: none") { |options[:author]| }
|
59
|
+
# opts.on("-v", "--version", "Show the #{File.basename($0)} version number and quit.")
|
60
|
+
end
|
61
|
+
|
62
|
+
def extract_options
|
63
|
+
# for each option, extract it into a local variable (and create an "attr_reader :author" at the top)
|
64
|
+
# Templates can access these value via the attr_reader-generated methods, but not the
|
65
|
+
# raw instance variable value.
|
66
|
+
# @author = options[:author]
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
2
|
+
module Billing #:nodoc:
|
3
|
+
module Integrations #:nodoc:
|
4
|
+
module <%= class_name %>
|
5
|
+
class Helper < ActiveMerchant::Billing::Integrations::Helper
|
6
|
+
# Replace with the real mapping
|
7
|
+
mapping :account, ''
|
8
|
+
mapping :amount, ''
|
9
|
+
|
10
|
+
mapping :order, ''
|
11
|
+
|
12
|
+
mapping :customer, :first_name => '',
|
13
|
+
:last_name => '',
|
14
|
+
:email => '',
|
15
|
+
:phone => ''
|
16
|
+
|
17
|
+
mapping :billing_address, :city => '',
|
18
|
+
:address1 => '',
|
19
|
+
:address2 => '',
|
20
|
+
:state => '',
|
21
|
+
:zip => '',
|
22
|
+
:country => ''
|
23
|
+
|
24
|
+
mapping :notify_url, ''
|
25
|
+
mapping :return_url, ''
|
26
|
+
mapping :cancel_return_url, ''
|
27
|
+
mapping :description, ''
|
28
|
+
mapping :tax, ''
|
29
|
+
mapping :shipping, ''
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class <%= class_name %>HelperTest < Test::Unit::TestCase
|
4
|
+
include ActiveMerchant::Billing::Integrations
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@helper = <%= class_name %>::Helper.new('order-500','cody@example.com', :amount => 500, :currency => 'USD')
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_basic_helper_fields
|
11
|
+
assert_field '', 'cody@example.com'
|
12
|
+
|
13
|
+
assert_field '', '5.00'
|
14
|
+
assert_field '', 'order-500'
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_customer_fields
|
18
|
+
@helper.customer :first_name => 'Cody', :last_name => 'Fauser', :email => 'cody@example.com'
|
19
|
+
assert_field '', 'Cody'
|
20
|
+
assert_field '', 'Fauser'
|
21
|
+
assert_field '', 'cody@example.com'
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_address_mapping
|
25
|
+
@helper.billing_address :address1 => '1 My Street',
|
26
|
+
:address2 => '',
|
27
|
+
:city => 'Leeds',
|
28
|
+
:state => 'Yorkshire',
|
29
|
+
:zip => 'LS2 7EE',
|
30
|
+
:country => 'CA'
|
31
|
+
|
32
|
+
assert_field '', '1 My Street'
|
33
|
+
assert_field '', 'Leeds'
|
34
|
+
assert_field '', 'Yorkshire'
|
35
|
+
assert_field '', 'LS2 7EE'
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_unknown_address_mapping
|
39
|
+
@helper.billing_address :farm => 'CA'
|
40
|
+
assert_equal 3, @helper.fields.size
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_unknown_mapping
|
44
|
+
assert_nothing_raised do
|
45
|
+
@helper.company_address :address => '500 Dwemthy Fox Road'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_setting_invalid_address_field
|
50
|
+
fields = @helper.fields.dup
|
51
|
+
@helper.billing_address :street => 'My Street'
|
52
|
+
assert_equal fields, @helper.fields
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/<%= name %>/helper.rb'
|
2
|
+
require File.dirname(__FILE__) + '/<%= name %>/notification.rb'
|
3
|
+
|
4
|
+
module ActiveMerchant #:nodoc:
|
5
|
+
module Billing #:nodoc:
|
6
|
+
module Integrations #:nodoc:
|
7
|
+
module <%= class_name %>
|
8
|
+
|
9
|
+
mattr_accessor :service_url
|
10
|
+
self.service_url = 'https://www.example.com'
|
11
|
+
|
12
|
+
def self.notification(post)
|
13
|
+
Notification.new(post)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class <%= class_name %>ModuleTest < Test::Unit::TestCase
|
4
|
+
include ActiveMerchant::Billing::Integrations
|
5
|
+
|
6
|
+
def test_notification_method
|
7
|
+
assert_instance_of <%= class_name %>::Notification, <%= class_name %>.notification('name=cody')
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
|
3
|
+
module ActiveMerchant #:nodoc:
|
4
|
+
module Billing #:nodoc:
|
5
|
+
module Integrations #:nodoc:
|
6
|
+
module <%= class_name %>
|
7
|
+
class Notification < ActiveMerchant::Billing::Integrations::Notification
|
8
|
+
def complete?
|
9
|
+
params['']
|
10
|
+
end
|
11
|
+
|
12
|
+
def item_id
|
13
|
+
params['']
|
14
|
+
end
|
15
|
+
|
16
|
+
def transaction_id
|
17
|
+
params['']
|
18
|
+
end
|
19
|
+
|
20
|
+
# When was this payment received by the client.
|
21
|
+
def received_at
|
22
|
+
params['']
|
23
|
+
end
|
24
|
+
|
25
|
+
def payer_email
|
26
|
+
params['']
|
27
|
+
end
|
28
|
+
|
29
|
+
def receiver_email
|
30
|
+
params['']
|
31
|
+
end
|
32
|
+
|
33
|
+
def security_key
|
34
|
+
params['']
|
35
|
+
end
|
36
|
+
|
37
|
+
# the money amount we received in X.2 decimal.
|
38
|
+
def gross
|
39
|
+
params['']
|
40
|
+
end
|
41
|
+
|
42
|
+
# Was this a test transaction?
|
43
|
+
def test?
|
44
|
+
params[''] == 'test'
|
45
|
+
end
|
46
|
+
|
47
|
+
def status
|
48
|
+
params['']
|
49
|
+
end
|
50
|
+
|
51
|
+
# Acknowledge the transaction to <%= class_name %>. This method has to be called after a new
|
52
|
+
# apc arrives. <%= class_name %> will verify that all the information we received are correct and will return a
|
53
|
+
# ok or a fail.
|
54
|
+
#
|
55
|
+
# Example:
|
56
|
+
#
|
57
|
+
# def ipn
|
58
|
+
# notify = <%= class_name %>Notification.new(request.raw_post)
|
59
|
+
#
|
60
|
+
# if notify.acknowledge
|
61
|
+
# ... process order ... if notify.complete?
|
62
|
+
# else
|
63
|
+
# ... log possible hacking attempt ...
|
64
|
+
# end
|
65
|
+
def acknowledge
|
66
|
+
payload = raw
|
67
|
+
|
68
|
+
uri = URI.parse(<%= class_name %>.notification_confirmation_url)
|
69
|
+
|
70
|
+
request = Net::HTTP::Post.new(uri.path)
|
71
|
+
|
72
|
+
request['Content-Length'] = "#{payload.size}"
|
73
|
+
request['User-Agent'] = "Active Merchant -- http://home.leetsoft.com/am"
|
74
|
+
request['Content-Type'] = "application/x-www-form-urlencoded"
|
75
|
+
|
76
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
77
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE unless @ssl_strict
|
78
|
+
http.use_ssl = true
|
79
|
+
|
80
|
+
response = http.request(request, payload)
|
81
|
+
|
82
|
+
# Replace with the appropriate codes
|
83
|
+
raise StandardError.new("Faulty <%= class_name %> result: #{response.body}") unless ["AUTHORISED", "DECLINED"].include?(response.body)
|
84
|
+
response.body == "AUTHORISED"
|
85
|
+
end
|
86
|
+
private
|
87
|
+
|
88
|
+
# Take the posted data and move the relevant data into a hash
|
89
|
+
def parse(post)
|
90
|
+
@raw = post
|
91
|
+
for line in post.split('&')
|
92
|
+
key, value = *line.scan( %r{^(\w+)\=(.*)$} ).flatten
|
93
|
+
params[key] = value
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class <%= class_name %>NotificationTest < Test::Unit::TestCase
|
4
|
+
include ActiveMerchant::Billing::Integrations
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@<%= name %> = <%= class_name %>::Notification.new(http_raw_data)
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_accessors
|
11
|
+
assert @<%= name %>.complete?
|
12
|
+
assert_equal "", @<%= name %>.status
|
13
|
+
assert_equal "", @<%= name %>.transaction_id
|
14
|
+
assert_equal "", @<%= name %>.item_id
|
15
|
+
assert_equal "", @<%= name %>.gross
|
16
|
+
assert_equal "", @<%= name %>.currency
|
17
|
+
assert_equal "", @<%= name %>.received_at
|
18
|
+
assert @<%= name %>.test?
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_compositions
|
22
|
+
assert_equal Money.new(3166, 'USD'), @<%= name %>.amount
|
23
|
+
end
|
24
|
+
|
25
|
+
# Replace with real successful acknowledgement code
|
26
|
+
def test_acknowledgement
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_send_acknowledgement
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_respond_to_acknowledge
|
34
|
+
assert @<%= name %>.respond_to?(:acknowledge)
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
def http_raw_data
|
39
|
+
""
|
40
|
+
end
|
41
|
+
end
|
data/init.rb
ADDED