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.
Files changed (187) hide show
  1. data/.gitignore +6 -0
  2. data/Rakefile +85 -0
  3. data/generators/gateway/USAGE +5 -0
  4. data/generators/gateway/gateway_generator.rb +61 -0
  5. data/generators/gateway/templates/gateway.rb +77 -0
  6. data/generators/gateway/templates/gateway_test.rb +49 -0
  7. data/generators/gateway/templates/remote_gateway_test.rb +57 -0
  8. data/generators/integration/USAGE +5 -0
  9. data/generators/integration/integration_generator.rb +68 -0
  10. data/generators/integration/templates/helper.rb +34 -0
  11. data/generators/integration/templates/helper_test.rb +54 -0
  12. data/generators/integration/templates/integration.rb +18 -0
  13. data/generators/integration/templates/module_test.rb +9 -0
  14. data/generators/integration/templates/notification.rb +100 -0
  15. data/generators/integration/templates/notification_test.rb +41 -0
  16. data/init.rb +3 -0
  17. data/lib/active_merchant/billing/gateways/payflow_nvp_uk.rb +18 -11
  18. data/lib/active_merchant/version.rb +3 -0
  19. data/lib/active_merchant.rb +1 -0
  20. data/script/destroy +14 -0
  21. data/script/generate +14 -0
  22. data/test/fixtures.yml +355 -0
  23. data/test/remote/gateways/remote_authorize_net_cim_test.rb +460 -0
  24. data/test/remote/gateways/remote_authorize_net_test.rb +145 -0
  25. data/test/remote/gateways/remote_beanstream_interac_test.rb +53 -0
  26. data/test/remote/gateways/remote_beanstream_test.rb +150 -0
  27. data/test/remote/gateways/remote_braintree_test.rb +147 -0
  28. data/test/remote/gateways/remote_card_stream_test.rb +148 -0
  29. data/test/remote/gateways/remote_cyber_source_test.rb +144 -0
  30. data/test/remote/gateways/remote_data_cash_test.rb +356 -0
  31. data/test/remote/gateways/remote_efsnet_test.rb +81 -0
  32. data/test/remote/gateways/remote_elavon_test.rb +66 -0
  33. data/test/remote/gateways/remote_eway_test.rb +74 -0
  34. data/test/remote/gateways/remote_exact_test.rb +60 -0
  35. data/test/remote/gateways/remote_first_pay_test.rb +87 -0
  36. data/test/remote/gateways/remote_instapay_test.rb +61 -0
  37. data/test/remote/gateways/remote_jetpay_test.rb +103 -0
  38. data/test/remote/gateways/remote_linkpoint_test.rb +121 -0
  39. data/test/remote/gateways/remote_merchant_e_solutions_test.rb +173 -0
  40. data/test/remote/gateways/remote_merchant_ware_test.rb +113 -0
  41. data/test/remote/gateways/remote_modern_payments_cim_test.rb +58 -0
  42. data/test/remote/gateways/remote_modern_payments_test.rb +57 -0
  43. data/test/remote/gateways/remote_moneris_test.rb +82 -0
  44. data/test/remote/gateways/remote_net_registry_test.rb +85 -0
  45. data/test/remote/gateways/remote_netbilling_test.rb +70 -0
  46. data/test/remote/gateways/remote_ogone_test.rb +115 -0
  47. data/test/remote/gateways/remote_pay_junction_test.rb +143 -0
  48. data/test/remote/gateways/remote_pay_secure_test.rb +39 -0
  49. data/test/remote/gateways/remote_payflow_express_test.rb +50 -0
  50. data/test/remote/gateways/remote_payflow_nvp_uk_test.rb +57 -0
  51. data/test/remote/gateways/remote_payflow_test.rb +237 -0
  52. data/test/remote/gateways/remote_payflow_uk_test.rb +173 -0
  53. data/test/remote/gateways/remote_payment_express_test.rb +136 -0
  54. data/test/remote/gateways/remote_paypal_express_test.rb +49 -0
  55. data/test/remote/gateways/remote_paypal_test.rb +191 -0
  56. data/test/remote/gateways/remote_plugnpay_test.rb +72 -0
  57. data/test/remote/gateways/remote_psigate_test.rb +50 -0
  58. data/test/remote/gateways/remote_psl_card_test.rb +123 -0
  59. data/test/remote/gateways/remote_quickpay_test.rb +190 -0
  60. data/test/remote/gateways/remote_realex_test.rb +224 -0
  61. data/test/remote/gateways/remote_sage_bankcard_test.rb +109 -0
  62. data/test/remote/gateways/remote_sage_pay_test.rb +219 -0
  63. data/test/remote/gateways/remote_sage_test.rb +87 -0
  64. data/test/remote/gateways/remote_sage_virtual_check_test.rb +62 -0
  65. data/test/remote/gateways/remote_sallie_mae_test.rb +51 -0
  66. data/test/remote/gateways/remote_secure_pay_au_test.rb +40 -0
  67. data/test/remote/gateways/remote_secure_pay_tech_test.rb +37 -0
  68. data/test/remote/gateways/remote_secure_pay_test.rb +28 -0
  69. data/test/remote/gateways/remote_skipjack_test.rb +105 -0
  70. data/test/remote/gateways/remote_trans_first_test.rb +34 -0
  71. data/test/remote/gateways/remote_transax_test.rb +112 -0
  72. data/test/remote/gateways/remote_trust_commerce_test.rb +152 -0
  73. data/test/remote/gateways/remote_usa_epay_test.rb +46 -0
  74. data/test/remote/gateways/remote_verifi_test.rb +107 -0
  75. data/test/remote/gateways/remote_viaklix_test.rb +43 -0
  76. data/test/remote/gateways/remote_wirecard_test.rb +111 -0
  77. data/test/remote/integrations/remote_gestpay_integration_test.rb +37 -0
  78. data/test/remote/integrations/remote_paypal_integration_test.rb +26 -0
  79. data/test/test_helper.rb +184 -0
  80. data/test/unit/avs_result_test.rb +59 -0
  81. data/test/unit/base_test.rb +54 -0
  82. data/test/unit/check_test.rb +88 -0
  83. data/test/unit/connection_test.rb +129 -0
  84. data/test/unit/country_code_test.rb +33 -0
  85. data/test/unit/country_test.rb +64 -0
  86. data/test/unit/credit_card_formatting_test.rb +19 -0
  87. data/test/unit/credit_card_methods_test.rb +179 -0
  88. data/test/unit/credit_card_test.rb +318 -0
  89. data/test/unit/cvv_result_test.rb +33 -0
  90. data/test/unit/expiry_date_test.rb +32 -0
  91. data/test/unit/gateways/authorize_net_cim_test.rb +676 -0
  92. data/test/unit/gateways/authorize_net_test.rb +290 -0
  93. data/test/unit/gateways/beanstream_interac_test.rb +51 -0
  94. data/test/unit/gateways/beanstream_test.rb +144 -0
  95. data/test/unit/gateways/bogus_test.rb +58 -0
  96. data/test/unit/gateways/braintree_test.rb +118 -0
  97. data/test/unit/gateways/card_stream_test.rb +90 -0
  98. data/test/unit/gateways/cyber_source_test.rb +188 -0
  99. data/test/unit/gateways/data_cash_test.rb +133 -0
  100. data/test/unit/gateways/efsnet_test.rb +123 -0
  101. data/test/unit/gateways/elavon_test.rb +139 -0
  102. data/test/unit/gateways/eway_test.rb +118 -0
  103. data/test/unit/gateways/exact_test.rb +156 -0
  104. data/test/unit/gateways/first_pay_test.rb +125 -0
  105. data/test/unit/gateways/gateway_test.rb +48 -0
  106. data/test/unit/gateways/instapay_test.rb +102 -0
  107. data/test/unit/gateways/jetpay_test.rb +185 -0
  108. data/test/unit/gateways/linkpoint_test.rb +197 -0
  109. data/test/unit/gateways/merchant_e_solutions_test.rb +169 -0
  110. data/test/unit/gateways/merchant_ware_test.rb +188 -0
  111. data/test/unit/gateways/modern_payments_cim_test.rb +162 -0
  112. data/test/unit/gateways/moneris_test.rb +158 -0
  113. data/test/unit/gateways/net_registry_test.rb +416 -0
  114. data/test/unit/gateways/netbilling_test.rb +54 -0
  115. data/test/unit/gateways/ogone_test.rb +319 -0
  116. data/test/unit/gateways/pay_junction_test.rb +123 -0
  117. data/test/unit/gateways/pay_secure_test.rb +71 -0
  118. data/test/unit/gateways/payflow_express_test.rb +173 -0
  119. data/test/unit/gateways/payflow_express_uk_test.rb +86 -0
  120. data/test/unit/gateways/payflow_nvp_uk_test.rb +201 -0
  121. data/test/unit/gateways/payflow_test.rb +305 -0
  122. data/test/unit/gateways/payflow_uk_test.rb +30 -0
  123. data/test/unit/gateways/payment_express_test.rb +195 -0
  124. data/test/unit/gateways/paypal_express_test.rb +382 -0
  125. data/test/unit/gateways/paypal_test.rb +569 -0
  126. data/test/unit/gateways/plugnpay_test.rb +86 -0
  127. data/test/unit/gateways/psigate_test.rb +169 -0
  128. data/test/unit/gateways/psl_card_test.rb +64 -0
  129. data/test/unit/gateways/quickpay_test.rb +112 -0
  130. data/test/unit/gateways/realex_test.rb +151 -0
  131. data/test/unit/gateways/sage_bankcard_test.rb +196 -0
  132. data/test/unit/gateways/sage_pay_test.rb +139 -0
  133. data/test/unit/gateways/sage_virtual_check_test.rb +71 -0
  134. data/test/unit/gateways/sallie_mae_test.rb +53 -0
  135. data/test/unit/gateways/secure_pay_au_test.rb +207 -0
  136. data/test/unit/gateways/secure_pay_tech_test.rb +44 -0
  137. data/test/unit/gateways/secure_pay_test.rb +101 -0
  138. data/test/unit/gateways/skip_jack_test.rb +228 -0
  139. data/test/unit/gateways/trans_first_test.rb +112 -0
  140. data/test/unit/gateways/trust_commerce_test.rb +90 -0
  141. data/test/unit/gateways/usa_epay_test.rb +128 -0
  142. data/test/unit/gateways/verifi_test.rb +96 -0
  143. data/test/unit/gateways/viaklix_test.rb +78 -0
  144. data/test/unit/gateways/wirecard_test.rb +250 -0
  145. data/test/unit/generators/test_gateway_generator.rb +46 -0
  146. data/test/unit/generators/test_generator_helper.rb +20 -0
  147. data/test/unit/generators/test_integration_generator.rb +53 -0
  148. data/test/unit/integrations/action_view_helper_test.rb +50 -0
  149. data/test/unit/integrations/bogus_module_test.rb +20 -0
  150. data/test/unit/integrations/chronopay_module_test.rb +13 -0
  151. data/test/unit/integrations/gestpay_module_test.rb +14 -0
  152. data/test/unit/integrations/helpers/bogus_helper_test.rb +28 -0
  153. data/test/unit/integrations/helpers/chronopay_helper_test.rb +110 -0
  154. data/test/unit/integrations/helpers/gestpay_helper_test.rb +100 -0
  155. data/test/unit/integrations/helpers/hi_trust_helper_test.rb +16 -0
  156. data/test/unit/integrations/helpers/nochex_helper_test.rb +53 -0
  157. data/test/unit/integrations/helpers/paypal_helper_test.rb +171 -0
  158. data/test/unit/integrations/helpers/quickpay_helper_test.rb +40 -0
  159. data/test/unit/integrations/helpers/two_checkout_helper_test.rb +92 -0
  160. data/test/unit/integrations/hi_trust_module_test.rb +13 -0
  161. data/test/unit/integrations/nochex_module_test.rb +13 -0
  162. data/test/unit/integrations/notifications/chronopay_notification_test.rb +66 -0
  163. data/test/unit/integrations/notifications/gestpay_notification_test.rb +60 -0
  164. data/test/unit/integrations/notifications/hi_trust_notification_test.rb +59 -0
  165. data/test/unit/integrations/notifications/nochex_notification_test.rb +51 -0
  166. data/test/unit/integrations/notifications/notification_test.rb +54 -0
  167. data/test/unit/integrations/notifications/paypal_notification_test.rb +85 -0
  168. data/test/unit/integrations/notifications/quickpay_notification_test.rb +69 -0
  169. data/test/unit/integrations/notifications/two_checkout_notification_test.rb +55 -0
  170. data/test/unit/integrations/paypal_module_test.rb +28 -0
  171. data/test/unit/integrations/quickpay_module_test.rb +9 -0
  172. data/test/unit/integrations/returns/chronopay_return_test.rb +11 -0
  173. data/test/unit/integrations/returns/gestpay_return_test.rb +10 -0
  174. data/test/unit/integrations/returns/hi_trust_return_test.rb +24 -0
  175. data/test/unit/integrations/returns/nochex_return_test.rb +10 -0
  176. data/test/unit/integrations/returns/paypal_return_test.rb +10 -0
  177. data/test/unit/integrations/returns/return_test.rb +11 -0
  178. data/test/unit/integrations/returns/two_checkout_return_test.rb +24 -0
  179. data/test/unit/integrations/two_checkout_module_test.rb +13 -0
  180. data/test/unit/post_data_test.rb +55 -0
  181. data/test/unit/posts_data_test.rb +48 -0
  182. data/test/unit/response_test.rb +28 -0
  183. data/test/unit/utils_test.rb +7 -0
  184. data/test/unit/validateable_test.rb +60 -0
  185. data.tar.gz.sig +0 -0
  186. metadata +453 -107
  187. metadata.gz.sig +0 -0
data/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ .DS_Store
2
+ *.orig
3
+ *.swp
4
+ *.swo
5
+ .autotest
6
+ *.gemspec
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,5 @@
1
+ Description:
2
+
3
+
4
+ Usage:
5
+
@@ -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,5 @@
1
+ Description:
2
+
3
+
4
+ Usage:
5
+
@@ -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
@@ -0,0 +1,3 @@
1
+ require 'active_merchant'
2
+ require 'active_merchant/billing/integrations/action_view_helper'
3
+ ActionView::Base.send(:include, ActiveMerchant::Billing::Integrations::ActionViewHelper)