killbill 3.1.3 → 3.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Jarfile +7 -5
- data/NEWS +3 -0
- data/README.md +41 -17
- data/VERSION +1 -1
- data/generators/active_merchant/templates/Jarfile.rb +7 -5
- data/generators/active_merchant/templates/config.yml.rb +3 -3
- data/generators/active_merchant/templates/db/ddl.sql.rb +4 -0
- data/generators/active_merchant/templates/db/schema.rb +4 -0
- data/generators/active_merchant/templates/lib/api.rb +42 -22
- data/generators/active_merchant/templates/lib/models/response.rb +3 -1
- data/generators/active_merchant/templates/plugin.gemspec.rb +1 -1
- data/lib/killbill.rb +7 -4
- data/lib/killbill/gen/api/account.rb +4 -3
- data/lib/killbill/gen/api/account_api_exception.rb +4 -3
- data/lib/killbill/gen/api/account_audit_logs.rb +12 -68
- data/lib/killbill/gen/api/account_audit_logs_for_object_type.rb +4 -3
- data/lib/killbill/gen/api/account_data.rb +4 -3
- data/lib/killbill/gen/api/account_email.rb +4 -3
- data/lib/killbill/gen/api/account_user_api.rb +4 -3
- data/lib/killbill/gen/api/audit_log.rb +4 -3
- data/lib/killbill/gen/api/audit_user_api.rb +4 -3
- data/lib/killbill/gen/api/billing_exception_base.rb +4 -3
- data/lib/killbill/gen/api/block.rb +4 -3
- data/lib/killbill/gen/api/blockable.rb +4 -3
- data/lib/killbill/gen/api/blocking_api_exception.rb +4 -3
- data/lib/killbill/gen/api/blocking_state.rb +4 -3
- data/lib/killbill/gen/api/call_context.rb +4 -3
- data/lib/killbill/gen/api/catalog.rb +4 -3
- data/lib/killbill/gen/api/catalog_api_exception.rb +4 -3
- data/lib/killbill/gen/api/catalog_user_api.rb +4 -3
- data/lib/killbill/gen/api/column_info.rb +4 -3
- data/lib/killbill/gen/api/control_tag.rb +4 -3
- data/lib/killbill/gen/api/currency_conversion.rb +4 -3
- data/lib/killbill/gen/api/currency_conversion_api.rb +4 -3
- data/lib/killbill/gen/api/currency_conversion_exception.rb +4 -3
- data/lib/killbill/gen/api/currency_value_null.rb +4 -3
- data/lib/killbill/gen/api/custom_field.rb +4 -3
- data/lib/killbill/gen/api/custom_field_api_exception.rb +4 -3
- data/lib/killbill/gen/api/custom_field_user_api.rb +4 -3
- data/lib/killbill/gen/api/database_export_output_stream.rb +4 -3
- data/lib/killbill/gen/api/direct_payment.rb +39 -11
- data/lib/killbill/gen/api/direct_payment_api.rb +643 -31
- data/lib/killbill/gen/api/direct_payment_transaction.rb +37 -12
- data/lib/killbill/gen/api/duration.rb +4 -3
- data/lib/killbill/gen/api/entitlement.rb +4 -3
- data/lib/killbill/gen/api/entitlement_ao_status_dry_run.rb +4 -3
- data/lib/killbill/gen/api/entitlement_api.rb +4 -3
- data/lib/killbill/gen/api/entitlement_api_exception.rb +4 -3
- data/lib/killbill/gen/api/entity.rb +4 -3
- data/lib/killbill/gen/api/fixed.rb +4 -3
- data/lib/killbill/gen/api/illegal_plan_change.rb +4 -3
- data/lib/killbill/gen/api/international_price.rb +4 -3
- data/lib/killbill/gen/api/invalid_config_exception.rb +4 -3
- data/lib/killbill/gen/api/invoice.rb +4 -3
- data/lib/killbill/gen/api/invoice_api_exception.rb +4 -3
- data/lib/killbill/gen/api/invoice_creation_event.rb +4 -3
- data/lib/killbill/gen/api/invoice_formatter.rb +4 -3
- data/lib/killbill/gen/api/invoice_item.rb +4 -3
- data/lib/killbill/gen/api/invoice_item_formatter.rb +4 -3
- data/lib/killbill/gen/api/invoice_payment.rb +7 -7
- data/lib/killbill/gen/api/invoice_payment_api.rb +7 -153
- data/lib/killbill/gen/api/invoice_user_api.rb +22 -3
- data/lib/killbill/gen/api/limit.rb +4 -3
- data/lib/killbill/gen/api/listing.rb +4 -3
- data/lib/killbill/gen/api/migration_plan.rb +4 -3
- data/lib/killbill/gen/api/mutable_account_data.rb +4 -3
- data/lib/killbill/gen/api/osgi_killbill.rb +15 -7
- data/lib/killbill/gen/api/osgi_plugin_properties.rb +4 -3
- data/lib/killbill/gen/api/pagination.rb +4 -3
- data/lib/killbill/gen/api/payment_api_exception.rb +4 -3
- data/lib/killbill/gen/api/payment_gateway_api.rb +4 -3
- data/lib/killbill/gen/api/payment_method.rb +11 -4
- data/lib/killbill/gen/api/payment_method_plugin.rb +5 -76
- data/lib/killbill/gen/api/payment_options.rb +68 -0
- data/lib/killbill/gen/api/plan.rb +4 -3
- data/lib/killbill/gen/api/plan_change_result.rb +4 -3
- data/lib/killbill/gen/api/plan_phase.rb +4 -3
- data/lib/killbill/gen/api/plan_phase_specifier.rb +4 -3
- data/lib/killbill/gen/api/plan_specifier.rb +4 -3
- data/lib/killbill/gen/api/plugin_config_service_api.rb +4 -3
- data/lib/killbill/gen/api/plugin_property.rb +4 -3
- data/lib/killbill/gen/api/price.rb +4 -3
- data/lib/killbill/gen/api/price_list.rb +4 -3
- data/lib/killbill/gen/api/price_list_set.rb +4 -3
- data/lib/killbill/gen/api/product.rb +4 -3
- data/lib/killbill/gen/api/rate.rb +4 -3
- data/lib/killbill/gen/api/record_id_api.rb +4 -3
- data/lib/killbill/gen/api/recurring.rb +4 -3
- data/lib/killbill/gen/api/refund.rb +7 -6
- data/lib/killbill/gen/api/require_gen.rb +5 -6
- data/lib/killbill/gen/api/rolled_up_usage.rb +4 -3
- data/lib/killbill/gen/api/security_api_exception.rb +4 -3
- data/lib/killbill/gen/api/static_catalog.rb +4 -3
- data/lib/killbill/gen/api/subscription.rb +4 -3
- data/lib/killbill/gen/api/subscription_api.rb +4 -3
- data/lib/killbill/gen/api/subscription_api_exception.rb +4 -3
- data/lib/killbill/gen/api/subscription_bundle.rb +4 -3
- data/lib/killbill/gen/api/subscription_bundle_timeline.rb +4 -3
- data/lib/killbill/gen/api/subscription_event.rb +4 -3
- data/lib/killbill/gen/api/tag.rb +4 -3
- data/lib/killbill/gen/api/tag_api_exception.rb +4 -3
- data/lib/killbill/gen/api/tag_definition.rb +4 -3
- data/lib/killbill/gen/api/tag_definition_api_exception.rb +4 -3
- data/lib/killbill/gen/api/tag_user_api.rb +4 -3
- data/lib/killbill/gen/api/tenant.rb +4 -3
- data/lib/killbill/gen/api/tenant_api_exception.rb +4 -3
- data/lib/killbill/gen/api/tenant_context.rb +4 -3
- data/lib/killbill/gen/api/tenant_data.rb +4 -3
- data/lib/killbill/gen/api/tenant_kv.rb +4 -3
- data/lib/killbill/gen/api/tenant_user_api.rb +4 -3
- data/lib/killbill/gen/api/tier.rb +4 -3
- data/lib/killbill/gen/api/tiered_block.rb +4 -3
- data/lib/killbill/gen/api/unit.rb +4 -3
- data/lib/killbill/gen/api/usage.rb +4 -3
- data/lib/killbill/gen/api/usage_user_api.rb +4 -3
- data/lib/killbill/gen/plugin-api/currency_plugin_api.rb +4 -3
- data/lib/killbill/gen/plugin-api/ext_bus_event.rb +4 -3
- data/lib/killbill/gen/plugin-api/gateway_notification.rb +4 -3
- data/lib/killbill/gen/plugin-api/hosted_payment_page_form_descriptor.rb +4 -3
- data/lib/killbill/gen/plugin-api/notification_plugin_api.rb +4 -3
- data/lib/killbill/gen/plugin-api/payment_method_info_plugin.rb +4 -3
- data/lib/killbill/gen/plugin-api/payment_plugin_api.rb +75 -81
- data/lib/killbill/gen/plugin-api/payment_plugin_api_exception.rb +4 -3
- data/lib/killbill/gen/plugin-api/{payment_info_plugin.rb → payment_transaction_info_plugin.rb} +21 -6
- data/lib/killbill/gen/plugin-api/require_gen.rb +5 -5
- data/lib/killbill/helpers/active_merchant/active_record/models/payment_method.rb +20 -36
- data/lib/killbill/helpers/active_merchant/active_record/models/response.rb +72 -81
- data/lib/killbill/helpers/active_merchant/active_record/models/transaction.rb +62 -43
- data/lib/killbill/helpers/active_merchant/killbill_spec_helper.rb +0 -13
- data/lib/killbill/helpers/active_merchant/payment_plugin.rb +127 -125
- data/lib/killbill/http_servlet.rb +16 -1
- data/lib/killbill/killbill_api.rb +0 -3
- data/lib/killbill/payment.rb +22 -6
- data/lib/killbill/rake_task.rb +93 -31
- data/spec/killbill/helpers/payment_method_spec.rb +153 -0
- data/spec/killbill/helpers/response_spec.rb +58 -15
- data/spec/killbill/helpers/test_schema.rb +12 -8
- data/spec/killbill/helpers/transaction_spec.rb +134 -0
- data/spec/killbill/payment_plugin_api_spec.rb +18 -18
- data/spec/killbill/payment_plugin_spec.rb +26 -15
- data/spec/killbill/payment_test.rb +6 -7
- data/spec/spec_helper.rb +3 -0
- metadata +6 -5
- data/lib/killbill/gen/api/payment.rb +0 -187
- data/lib/killbill/gen/plugin-api/refund_info_plugin.rb +0 -152
data/lib/killbill/payment.rb
CHANGED
@@ -7,27 +7,35 @@ module Killbill
|
|
7
7
|
class OperationUnsupportedByGatewayError < NotImplementedError
|
8
8
|
end
|
9
9
|
|
10
|
-
def
|
10
|
+
def authorize_payment(kb_account_id, kb_payment_id, kb_payment_transaction_id, kb_payment_method_id, amount, currency, properties, context)
|
11
11
|
raise OperationUnsupportedByGatewayError
|
12
12
|
end
|
13
13
|
|
14
|
-
def
|
14
|
+
def capture_payment(kb_account_id, kb_payment_id, kb_payment_transaction_id, kb_payment_method_id, amount, currency, properties, context)
|
15
15
|
raise OperationUnsupportedByGatewayError
|
16
16
|
end
|
17
17
|
|
18
|
-
def
|
18
|
+
def purchase_payment(kb_account_id, kb_payment_id, kb_payment_transaction_id, kb_payment_method_id, amount, currency, properties, context)
|
19
|
+
raise OperationUnsupportedByGatewayError
|
20
|
+
end
|
21
|
+
|
22
|
+
def void_payment(kb_account_id, kb_payment_id, kb_payment_transaction_id, kb_payment_method_id, properties, context)
|
23
|
+
raise OperationUnsupportedByGatewayError
|
24
|
+
end
|
25
|
+
|
26
|
+
def credit_payment(kb_account_id, kb_payment_id, kb_payment_transaction_id, kb_payment_method_id, amount, currency, properties, context)
|
19
27
|
raise OperationUnsupportedByGatewayError
|
20
28
|
end
|
21
29
|
|
22
|
-
def
|
30
|
+
def refund_payment(kb_account_id, kb_payment_id, kb_payment_transaction_id, kb_payment_method_id, amount, currency, properties, context)
|
23
31
|
raise OperationUnsupportedByGatewayError
|
24
32
|
end
|
25
33
|
|
26
|
-
def
|
34
|
+
def get_payment_info(kb_account_id, kb_payment_id, properties, context)
|
27
35
|
raise OperationUnsupportedByGatewayError
|
28
36
|
end
|
29
37
|
|
30
|
-
def
|
38
|
+
def search_payments(search_key, offset, limit, properties, context)
|
31
39
|
raise OperationUnsupportedByGatewayError
|
32
40
|
end
|
33
41
|
|
@@ -58,6 +66,14 @@ module Killbill
|
|
58
66
|
def reset_payment_methods(kb_account_id, payment_methods, properties, context)
|
59
67
|
raise OperationUnsupportedByGatewayError
|
60
68
|
end
|
69
|
+
|
70
|
+
def build_form_descriptor(kb_account_id, descriptor_fields, properties, context)
|
71
|
+
raise OperationUnsupportedByGatewayError
|
72
|
+
end
|
73
|
+
|
74
|
+
def process_notification(notification, properties, context)
|
75
|
+
raise OperationUnsupportedByGatewayError
|
76
|
+
end
|
61
77
|
end
|
62
78
|
end
|
63
79
|
end
|
data/lib/killbill/rake_task.rb
CHANGED
@@ -15,14 +15,17 @@ module Killbill
|
|
15
15
|
opts[:plugin_name], # Plugin name, e.g. 'klogger'
|
16
16
|
opts[:gem_name], # Gem file name, e.g. 'klogger-1.0.0.gem'
|
17
17
|
opts[:gemfile_name] || "Gemfile", # Gemfile name
|
18
|
-
opts[:gemfile_lock_name] || "Gemfile.lock"
|
18
|
+
opts[:gemfile_lock_name] || "Gemfile.lock", # Gemfile.lock name
|
19
|
+
opts[:verbose] || false)
|
19
20
|
.install
|
20
21
|
end
|
21
22
|
end
|
22
23
|
|
23
|
-
def initialize(base_name, plugin_name, gem_name, gemfile_name, gemfile_lock_name)
|
24
|
+
def initialize(base_name, plugin_name, gem_name, gemfile_name, gemfile_lock_name, verbose)
|
25
|
+
@verbose = verbose
|
26
|
+
|
24
27
|
@logger = Logger.new(STDOUT)
|
25
|
-
@logger.level = Logger::INFO
|
28
|
+
@logger.level = @verbose ? Logger::DEBUG : Logger::INFO
|
26
29
|
|
27
30
|
@base_name = base_name
|
28
31
|
@plugin_name = plugin_name
|
@@ -53,26 +56,30 @@ module Killbill
|
|
53
56
|
# Rely on the Gemfile definition, if it exists, to get all dependencies
|
54
57
|
# (we assume the Gemfile includes the plugin gemspec, as it should).
|
55
58
|
# Otherwise, use only the plugin gemspec.
|
56
|
-
|
59
|
+
# When using the Gemfile definition, don't include the :development group -- should this be configurable?
|
60
|
+
@specs ||= @gemfile_definition ? @gemfile_definition.specs_for([:default]) : [@plugin_gemspec]
|
57
61
|
end
|
58
62
|
|
59
63
|
def install
|
60
64
|
namespace :killbill do
|
61
65
|
desc "Validate plugin tree"
|
62
66
|
# The killbill.properties file is required, but not the config.ru one
|
63
|
-
task :validate => killbill_properties_file do
|
67
|
+
task :validate, [:verbose] => killbill_properties_file do |t, args|
|
68
|
+
set_verbosity(args)
|
64
69
|
validate
|
65
70
|
end
|
66
71
|
|
67
72
|
# Build the .tar.gz and .zip packages
|
68
|
-
task :package => :stage
|
73
|
+
task :package, [:verbose] => :stage
|
69
74
|
package_task = Rake::PackageTask.new(name, version) do |p|
|
70
75
|
p.need_tar_gz = true
|
71
76
|
p.need_zip = true
|
72
77
|
end
|
73
78
|
|
74
79
|
desc "Stage all dependencies"
|
75
|
-
task :stage => :validate do
|
80
|
+
task :stage, [:verbose] => :validate do |t, args|
|
81
|
+
set_verbosity(args)
|
82
|
+
|
76
83
|
stage_dependencies
|
77
84
|
stage_extra_files
|
78
85
|
|
@@ -80,6 +87,32 @@ module Killbill
|
|
80
87
|
package_task.package_files = Rake::FileList.new("#{@package_dir.basename}/**/*")
|
81
88
|
end
|
82
89
|
|
90
|
+
desc "Deploy the plugin to Kill Bill"
|
91
|
+
task :deploy, [:force, :plugin_dir, :verbose] => :stage do |t, args|
|
92
|
+
set_verbosity(args)
|
93
|
+
|
94
|
+
plugins_dir = Pathname.new("#{args.plugin_dir || '/var/tmp/bundles/plugins/ruby'}").expand_path
|
95
|
+
mkdir_p plugins_dir, :verbose => @verbose
|
96
|
+
|
97
|
+
plugin_path = Pathname.new("#{plugins_dir}/#{name}")
|
98
|
+
if plugin_path.exist?
|
99
|
+
if args.force == "true"
|
100
|
+
@logger.info "Deleting previous plugin deployment #{plugin_path}"
|
101
|
+
rm_rf plugin_path, :verbose => @verbose
|
102
|
+
else
|
103
|
+
raise "Cowardly not deleting previous plugin deployment #{plugin_path} - override with rake killbill:deploy[true]"
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
cp_r @package_dir, plugins_dir, :verbose => @verbose
|
108
|
+
|
109
|
+
Rake::FileList.new("#{@base}/*.yml").each do |config_file|
|
110
|
+
config_file_path = Pathname.new("#{plugin_path}/#{version}/#{File.basename(config_file)}").expand_path
|
111
|
+
@logger.info "Deploying #{config_file} to #{config_file_path}"
|
112
|
+
cp config_file, config_file_path, :verbose => @verbose
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
83
116
|
desc "List all dependencies"
|
84
117
|
task :dependency => :validate do
|
85
118
|
print_dependencies
|
@@ -94,8 +127,13 @@ module Killbill
|
|
94
127
|
|
95
128
|
private
|
96
129
|
|
130
|
+
def set_verbosity(args)
|
131
|
+
return unless args.verbose == 'true'
|
132
|
+
@verbose = true
|
133
|
+
@logger.level = Logger::DEBUG
|
134
|
+
end
|
135
|
+
|
97
136
|
def validate
|
98
|
-
@plugin_gem_file = find_plugin_gem
|
99
137
|
@gemfile_definition = find_gemfile
|
100
138
|
end
|
101
139
|
|
@@ -121,21 +159,25 @@ module Killbill
|
|
121
159
|
Bundler.load_gemspec(spec_path)
|
122
160
|
end
|
123
161
|
|
124
|
-
def find_plugin_gem
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
162
|
+
def find_plugin_gem(spec)
|
163
|
+
gem_name = spec.file_name
|
164
|
+
# spec.loaded_from is the path to the gemspec file
|
165
|
+
base = Pathname.new(File.dirname(spec.loaded_from)).expand_path
|
166
|
+
|
167
|
+
# Try in the base directory first
|
168
|
+
plugin_gem_file = Pathname.new(gem_name).expand_path
|
169
|
+
plugin_gem_file = base.join(gem_name).expand_path unless plugin_gem_file.file?
|
170
|
+
|
171
|
+
# Try in subdirectories next
|
172
|
+
unless plugin_gem_file.file?
|
173
|
+
plugin_gem_files = Dir[File.join(base, "**/#{spec.file_name}")]
|
133
174
|
@logger.debug "Gem candidates found: #{plugin_gem_files}"
|
134
|
-
raise "Unable to find your plugin gem in #{@base}. Did you build it? (`rake build')" unless plugin_gem_files.size >= 1
|
135
175
|
# Take the first one, assume the other ones are from build directories (e.g. pkg)
|
136
|
-
plugin_gem_file = plugin_gem_files.first
|
176
|
+
plugin_gem_file = Pathname.new(plugin_gem_files.first).expand_path unless plugin_gem_files.empty?
|
137
177
|
end
|
138
178
|
|
179
|
+
raise "Unable to find #{gem_name} in #{base}. Did you build it? (`rake build')" unless plugin_gem_file.file?
|
180
|
+
|
139
181
|
@logger.debug "Found #{plugin_gem_file}"
|
140
182
|
Pathname.new(plugin_gem_file).expand_path
|
141
183
|
end
|
@@ -159,34 +201,54 @@ module Killbill
|
|
159
201
|
|
160
202
|
def stage_dependencies
|
161
203
|
# Create the target directory
|
162
|
-
mkdir_p @target_dir.to_s
|
204
|
+
mkdir_p @target_dir.to_s, :verbose => @verbose
|
163
205
|
|
164
206
|
@logger.debug "Installing all gem dependencies to #{@target_dir}"
|
165
207
|
# We can't simply use Bundler::Installer unfortunately, because we can't tell it to copy the gems for cached ones
|
166
208
|
# (it will default to using Bundler::Source::Path references to the gemspecs on "install").
|
167
209
|
specs.each do |spec|
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
@logger.warn "Unable to stage #{spec.name} (#{spec.version}) from #{spec.cache_file}: #{e}"
|
210
|
+
plugin_gem_file = Pathname.new(spec.cache_file).expand_path
|
211
|
+
if plugin_gem_file.file?
|
212
|
+
@logger.debug "Staging #{spec.name} (#{spec.version}) from #{plugin_gem_file}"
|
213
|
+
else
|
214
|
+
plugin_gem_file = find_plugin_gem(spec)
|
215
|
+
@logger.info "Staging custom gem #{spec.full_name} from #{plugin_gem_file}"
|
175
216
|
end
|
217
|
+
|
218
|
+
do_install_gem(plugin_gem_file, spec.name, spec.version)
|
176
219
|
end
|
220
|
+
end
|
177
221
|
|
178
|
-
|
179
|
-
Gem::Installer.new(
|
222
|
+
def do_install_gem(path, name, version)
|
223
|
+
gem_installer = Gem::Installer.new(path,
|
224
|
+
{
|
225
|
+
:force => true,
|
226
|
+
:install_dir => @target_dir,
|
227
|
+
# Should be redundant with the tweaks below
|
228
|
+
:development => false,
|
229
|
+
:wrappers => true
|
230
|
+
})
|
231
|
+
|
232
|
+
# Tweak the spec file as there are a lot of things we don't care about
|
233
|
+
gem_installer.spec.executables = nil
|
234
|
+
gem_installer.spec.extensions = nil
|
235
|
+
gem_installer.spec.extra_rdoc_files = nil
|
236
|
+
gem_installer.spec.test_files = nil
|
237
|
+
|
238
|
+
gem_installer.install
|
239
|
+
rescue => e
|
240
|
+
@logger.warn "Unable to stage #{name} (#{version}) from #{path}: #{e}"
|
241
|
+
raise e
|
180
242
|
end
|
181
243
|
|
182
244
|
def stage_extra_files
|
183
245
|
unless killbill_properties_file.nil?
|
184
246
|
@logger.debug "Staging #{killbill_properties_file} to #{@plugin_root_target_dir}"
|
185
|
-
cp killbill_properties_file, @plugin_root_target_dir
|
247
|
+
cp killbill_properties_file, @plugin_root_target_dir, :verbose => @verbose
|
186
248
|
end
|
187
249
|
unless config_ru_file.nil?
|
188
250
|
@logger.debug "Staging #{config_ru_file} to #{@plugin_root_target_dir}"
|
189
|
-
cp config_ru_file, @plugin_root_target_dir
|
251
|
+
cp config_ru_file, @plugin_root_target_dir, :verbose => @verbose
|
190
252
|
end
|
191
253
|
end
|
192
254
|
|
@@ -16,6 +16,145 @@ describe Killbill::Plugin::ActiveMerchant::ActiveRecord::PaymentMethod do
|
|
16
16
|
::Killbill::Test::TestPaymentMethod.delete_all
|
17
17
|
end
|
18
18
|
|
19
|
+
it 'should construct payment methods correctly' do
|
20
|
+
kb_account_id = SecureRandom.uuid
|
21
|
+
kb_payment_method_id = SecureRandom.uuid
|
22
|
+
kb_tenant_id = SecureRandom.uuid
|
23
|
+
response = ::ActiveMerchant::Billing::Response.new(true, nil, {}, {:authorization => SecureRandom.uuid})
|
24
|
+
options = {
|
25
|
+
:billing_address => {
|
26
|
+
:address1 => SecureRandom.uuid,
|
27
|
+
:address2 => SecureRandom.uuid,
|
28
|
+
:city => SecureRandom.uuid,
|
29
|
+
:state => SecureRandom.uuid,
|
30
|
+
:zip => SecureRandom.uuid,
|
31
|
+
:country => SecureRandom.uuid
|
32
|
+
}
|
33
|
+
}
|
34
|
+
cc = ::ActiveMerchant::Billing::CreditCard.new(
|
35
|
+
:first_name => 'Steve',
|
36
|
+
:last_name => 'Smith',
|
37
|
+
:month => '9',
|
38
|
+
:year => '2010',
|
39
|
+
:brand => 'visa',
|
40
|
+
:number => '4242424242424242'
|
41
|
+
)
|
42
|
+
token = SecureRandom.uuid
|
43
|
+
|
44
|
+
# Test storage of CC details
|
45
|
+
pm = ::Killbill::Test::TestPaymentMethod.from_response(kb_account_id, kb_payment_method_id, kb_tenant_id, cc, response, options, {}, ::Killbill::Test::TestPaymentMethod)
|
46
|
+
pm.kb_account_id.should == kb_account_id
|
47
|
+
pm.kb_payment_method_id.should == kb_payment_method_id
|
48
|
+
pm.kb_tenant_id.should == kb_tenant_id
|
49
|
+
pm.token.should == response.authorization
|
50
|
+
pm.cc_first_name.should == cc.first_name
|
51
|
+
pm.cc_last_name.should == cc.last_name
|
52
|
+
pm.cc_type.should == cc.brand
|
53
|
+
pm.cc_exp_month.should == cc.month.to_i
|
54
|
+
pm.cc_exp_year.should == cc.year.to_i
|
55
|
+
pm.cc_last_4.should == cc.last_digits.to_i
|
56
|
+
pm.address1.should == options[:billing_address][:address1]
|
57
|
+
pm.address2.should == options[:billing_address][:address2]
|
58
|
+
pm.city.should == options[:billing_address][:city]
|
59
|
+
pm.state.should == options[:billing_address][:state]
|
60
|
+
pm.zip.should == options[:billing_address][:zip]
|
61
|
+
pm.country.should == options[:billing_address][:country]
|
62
|
+
# Verify conversions
|
63
|
+
verify_conversion_to_kb_objects(pm, kb_account_id, kb_payment_method_id, response.authorization)
|
64
|
+
|
65
|
+
# Test storage of CC details with no billing address
|
66
|
+
pm = ::Killbill::Test::TestPaymentMethod.from_response(kb_account_id, kb_payment_method_id, kb_tenant_id, cc, response, {}, {}, ::Killbill::Test::TestPaymentMethod)
|
67
|
+
pm.kb_account_id.should == kb_account_id
|
68
|
+
pm.kb_payment_method_id.should == kb_payment_method_id
|
69
|
+
pm.kb_tenant_id.should == kb_tenant_id
|
70
|
+
pm.token.should == response.authorization
|
71
|
+
pm.cc_first_name.should == cc.first_name
|
72
|
+
pm.cc_last_name.should == cc.last_name
|
73
|
+
pm.cc_type.should == cc.brand
|
74
|
+
pm.cc_exp_month.should == cc.month.to_i
|
75
|
+
pm.cc_exp_year.should == cc.year.to_i
|
76
|
+
pm.cc_last_4.should == cc.last_digits.to_i
|
77
|
+
pm.address1.should be_nil
|
78
|
+
pm.address2.should be_nil
|
79
|
+
pm.city.should be_nil
|
80
|
+
pm.state.should be_nil
|
81
|
+
pm.zip.should be_nil
|
82
|
+
pm.country.should be_nil
|
83
|
+
# Verify conversions
|
84
|
+
verify_conversion_to_kb_objects(pm, kb_account_id, kb_payment_method_id, response.authorization)
|
85
|
+
|
86
|
+
# Test storage of token
|
87
|
+
pm = ::Killbill::Test::TestPaymentMethod.from_response(kb_account_id, kb_payment_method_id, kb_tenant_id, token, response, options, {}, ::Killbill::Test::TestPaymentMethod)
|
88
|
+
pm.kb_account_id.should == kb_account_id
|
89
|
+
pm.kb_payment_method_id.should == kb_payment_method_id
|
90
|
+
pm.kb_tenant_id.should == kb_tenant_id
|
91
|
+
pm.token.should == token
|
92
|
+
pm.cc_first_name.should be_nil
|
93
|
+
pm.cc_last_name.should be_nil
|
94
|
+
pm.cc_type.should be_nil
|
95
|
+
pm.cc_exp_month.should be_nil
|
96
|
+
pm.cc_exp_year.should be_nil
|
97
|
+
pm.cc_last_4.should be_nil
|
98
|
+
pm.address1.should == options[:billing_address][:address1]
|
99
|
+
pm.address2.should == options[:billing_address][:address2]
|
100
|
+
pm.city.should == options[:billing_address][:city]
|
101
|
+
pm.state.should == options[:billing_address][:state]
|
102
|
+
pm.zip.should == options[:billing_address][:zip]
|
103
|
+
pm.country.should == options[:billing_address][:country]
|
104
|
+
# Verify conversions
|
105
|
+
verify_conversion_to_kb_objects(pm, kb_account_id, kb_payment_method_id, token)
|
106
|
+
|
107
|
+
# Test storage of token with no billing address
|
108
|
+
pm = ::Killbill::Test::TestPaymentMethod.from_response(kb_account_id, kb_payment_method_id, kb_tenant_id, token, response, {}, {}, ::Killbill::Test::TestPaymentMethod)
|
109
|
+
pm.kb_account_id.should == kb_account_id
|
110
|
+
pm.kb_payment_method_id.should == kb_payment_method_id
|
111
|
+
pm.kb_tenant_id.should == kb_tenant_id
|
112
|
+
pm.token.should == token
|
113
|
+
pm.cc_first_name.should be_nil
|
114
|
+
pm.cc_last_name.should be_nil
|
115
|
+
pm.cc_type.should be_nil
|
116
|
+
pm.cc_exp_month.should be_nil
|
117
|
+
pm.cc_exp_year.should be_nil
|
118
|
+
pm.cc_last_4.should be_nil
|
119
|
+
pm.address1.should be_nil
|
120
|
+
pm.address2.should be_nil
|
121
|
+
pm.city.should be_nil
|
122
|
+
pm.state.should be_nil
|
123
|
+
pm.zip.should be_nil
|
124
|
+
pm.country.should be_nil
|
125
|
+
# Verify conversions
|
126
|
+
verify_conversion_to_kb_objects(pm, kb_account_id, kb_payment_method_id, token)
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'should store and retrieve payment methods correctly' do
|
130
|
+
kb_account_id = SecureRandom.uuid
|
131
|
+
kb_payment_method_id = SecureRandom.uuid
|
132
|
+
kb_tenant_id = SecureRandom.uuid
|
133
|
+
response = ::ActiveMerchant::Billing::Response.new(true, nil, {}, {:authorization => SecureRandom.uuid})
|
134
|
+
token = SecureRandom.uuid
|
135
|
+
pm = ::Killbill::Test::TestPaymentMethod.from_response(kb_account_id, kb_payment_method_id, kb_tenant_id, token, response, {}, {}, ::Killbill::Test::TestPaymentMethod)
|
136
|
+
pm.save!
|
137
|
+
|
138
|
+
# Retrieve by account id
|
139
|
+
::Killbill::Test::TestPaymentMethod.from_kb_account_id(kb_account_id, nil).size.should == 0
|
140
|
+
::Killbill::Test::TestPaymentMethod.from_kb_account_id(kb_account_id, SecureRandom.uuid).size.should == 0
|
141
|
+
::Killbill::Test::TestPaymentMethod.from_kb_account_id(SecureRandom.uuid, kb_tenant_id).size.should == 0
|
142
|
+
pms = ::Killbill::Test::TestPaymentMethod.from_kb_account_id(kb_account_id, kb_tenant_id)
|
143
|
+
pms.size.should == 1
|
144
|
+
pms[0].kb_payment_method_id.should == kb_payment_method_id
|
145
|
+
|
146
|
+
# Retrieve by payment method id
|
147
|
+
expect { ::Killbill::Test::TestPaymentMethod.from_kb_payment_method_id(kb_payment_method_id, nil) }.to raise_error
|
148
|
+
expect { ::Killbill::Test::TestPaymentMethod.from_kb_payment_method_id(kb_payment_method_id, SecureRandom.uuid) }.to raise_error
|
149
|
+
expect { ::Killbill::Test::TestPaymentMethod.from_kb_payment_method_id(SecureRandom.uuid, kb_tenant_id) }.to raise_error
|
150
|
+
::Killbill::Test::TestPaymentMethod.from_kb_payment_method_id(kb_payment_method_id, kb_tenant_id).kb_payment_method_id.should == kb_payment_method_id
|
151
|
+
|
152
|
+
# Delete the payment method and verify we cannot find it anymore
|
153
|
+
::Killbill::Test::TestPaymentMethod.mark_as_deleted!(kb_payment_method_id, kb_tenant_id)
|
154
|
+
::Killbill::Test::TestPaymentMethod.from_kb_account_id(kb_account_id, kb_tenant_id).size.should == 0
|
155
|
+
expect { ::Killbill::Test::TestPaymentMethod.from_kb_payment_method_id(kb_payment_method_id, kb_tenant_id) }.to raise_error
|
156
|
+
end
|
157
|
+
|
19
158
|
it 'should generate the right SQL query' do
|
20
159
|
# Check count query (search query numeric)
|
21
160
|
expected_query = "SELECT COUNT(DISTINCT \"test_payment_methods\".\"id\") FROM \"test_payment_methods\" WHERE ((((((((((((((\"test_payment_methods\".\"kb_account_id\" = '1234' OR \"test_payment_methods\".\"kb_payment_method_id\" = '1234') OR \"test_payment_methods\".\"token\" = '1234') OR \"test_payment_methods\".\"cc_type\" = '1234') OR \"test_payment_methods\".\"state\" = '1234') OR \"test_payment_methods\".\"zip\" = '1234') OR \"test_payment_methods\".\"cc_first_name\" LIKE '%1234%') OR \"test_payment_methods\".\"cc_last_name\" LIKE '%1234%') OR \"test_payment_methods\".\"address1\" LIKE '%1234%') OR \"test_payment_methods\".\"address2\" LIKE '%1234%') OR \"test_payment_methods\".\"city\" LIKE '%1234%') OR \"test_payment_methods\".\"country\" LIKE '%1234%') OR \"test_payment_methods\".\"cc_exp_month\" = 1234) OR \"test_payment_methods\".\"cc_exp_year\" = 1234) OR \"test_payment_methods\".\"cc_last_4\" = 1234) AND \"test_payment_methods\".\"kb_tenant_id\" = '11-22-33' ORDER BY \"test_payment_methods\".\"id\""
|
@@ -100,4 +239,18 @@ describe Killbill::Plugin::ActiveMerchant::ActiveRecord::PaymentMethod do
|
|
100
239
|
pagination.total_nb_records.should == results.size
|
101
240
|
results
|
102
241
|
end
|
242
|
+
|
243
|
+
def verify_conversion_to_kb_objects(pm, kb_account_id, kb_payment_method_id, external_payment_method_id)
|
244
|
+
# Verify conversion to PaymentMethodPlugin
|
245
|
+
pmp = pm.to_payment_method_plugin
|
246
|
+
pmp.kb_payment_method_id.should == kb_payment_method_id
|
247
|
+
pmp.external_payment_method_id.should == external_payment_method_id
|
248
|
+
pmp.properties.size.should == 12
|
249
|
+
|
250
|
+
# Verify conversion to PaymentMethodInfoPlugin
|
251
|
+
pmip = pm.to_payment_method_info_plugin
|
252
|
+
pmip.account_id.should == kb_account_id
|
253
|
+
pmip.payment_method_id.should == kb_payment_method_id
|
254
|
+
pmip.external_payment_method_id.should == external_payment_method_id
|
255
|
+
end
|
103
256
|
end
|
@@ -16,24 +16,74 @@ describe Killbill::Plugin::ActiveMerchant::ActiveRecord::Response do
|
|
16
16
|
::Killbill::Test::TestResponse.delete_all
|
17
17
|
end
|
18
18
|
|
19
|
+
it 'should construct responses correctly' do
|
20
|
+
api_call = 'for debugging only'
|
21
|
+
kb_account_id = SecureRandom.uuid
|
22
|
+
kb_payment_id = SecureRandom.uuid
|
23
|
+
kb_payment_transaction_id = SecureRandom.uuid
|
24
|
+
transaction_type = :PURCHASE
|
25
|
+
kb_tenant_id = SecureRandom.uuid
|
26
|
+
response = ::ActiveMerchant::Billing::Response.new(true, 'Message', {}, {
|
27
|
+
:authorization => SecureRandom.uuid,
|
28
|
+
:avs_result => ::ActiveMerchant::Billing::AVSResult.new(:code => 'P')
|
29
|
+
})
|
30
|
+
|
31
|
+
r = ::Killbill::Test::TestResponse.from_response(api_call, kb_account_id, kb_payment_id, kb_payment_transaction_id, transaction_type, kb_tenant_id, response, {}, ::Killbill::Test::TestResponse)
|
32
|
+
r.api_call.should == api_call
|
33
|
+
r.kb_account_id.should ==kb_account_id
|
34
|
+
r.kb_payment_id.should ==kb_payment_id
|
35
|
+
r.kb_payment_transaction_id.should ==kb_payment_transaction_id
|
36
|
+
r.transaction_type.should ==transaction_type
|
37
|
+
r.kb_tenant_id.should ==kb_tenant_id
|
38
|
+
r.message.should == response.message
|
39
|
+
r.authorization.should == response.authorization
|
40
|
+
r.fraud_review.should == response.fraud_review?
|
41
|
+
r.test.should == response.test
|
42
|
+
r.avs_result_code.should == 'P'
|
43
|
+
r.avs_result_message.should == 'Postal code matches, but street address not verified.'
|
44
|
+
r.avs_result_street_match.should be_nil
|
45
|
+
r.avs_result_postal_match.should == 'Y'
|
46
|
+
r.cvv_result_code.should be_nil
|
47
|
+
r.cvv_result_message.should be_nil
|
48
|
+
r.success.should == response.success?
|
49
|
+
|
50
|
+
# Verify conversion to PaymentTransactionInfoPlugin
|
51
|
+
ptip = r.to_transaction_info_plugin
|
52
|
+
ptip.kb_payment_id.should == kb_payment_id
|
53
|
+
ptip.kb_transaction_payment_id.should == kb_payment_transaction_id
|
54
|
+
ptip.transaction_type.should == transaction_type
|
55
|
+
# No associated transaction
|
56
|
+
ptip.amount.should be_nil
|
57
|
+
ptip.currency.should be_nil
|
58
|
+
# Row not created
|
59
|
+
ptip.created_date.should be_nil
|
60
|
+
ptip.effective_date.should be_nil
|
61
|
+
ptip.status.should == :PROCESSED
|
62
|
+
ptip.gateway_error.should == 'Message'
|
63
|
+
ptip.gateway_error_code.should be_nil
|
64
|
+
ptip.first_payment_reference_id.should be_nil
|
65
|
+
ptip.second_payment_reference_id.should be_nil
|
66
|
+
ptip.properties.size.should == 11
|
67
|
+
end
|
68
|
+
|
19
69
|
it 'should generate the right SQL query' do
|
20
70
|
# Check count query (search query numeric)
|
21
|
-
expected_query = "SELECT COUNT(DISTINCT \"test_responses\".\"id\") FROM \"test_responses\" WHERE (((\"test_responses\".\"kb_payment_id\" = '1234' OR \"test_responses\".\"
|
71
|
+
expected_query = "SELECT COUNT(DISTINCT \"test_responses\".\"id\") FROM \"test_responses\" WHERE ((((\"test_responses\".\"kb_payment_id\" = '1234' OR \"test_responses\".\"kb_payment_transaction_id\" = '1234') OR \"test_responses\".\"message\" = '1234') OR \"test_responses\".\"authorization\" = '1234') OR \"test_responses\".\"fraud_review\" = '1234') AND \"test_responses\".\"success\" = 't' AND \"test_responses\".\"kb_tenant_id\" = '11-22-33' ORDER BY \"test_responses\".\"id\""
|
22
72
|
# Note that Kill Bill will pass a String, even for numeric types
|
23
|
-
::Killbill::Test::TestResponse.search_query('
|
73
|
+
::Killbill::Test::TestResponse.search_query('1234', '11-22-33').to_sql.should == expected_query
|
24
74
|
|
25
75
|
# Check query with results (search query numeric)
|
26
|
-
expected_query = "SELECT DISTINCT \"test_responses\".* FROM \"test_responses\" WHERE (((\"test_responses\".\"kb_payment_id\" = '1234' OR \"test_responses\".\"
|
76
|
+
expected_query = "SELECT DISTINCT \"test_responses\".* FROM \"test_responses\" WHERE ((((\"test_responses\".\"kb_payment_id\" = '1234' OR \"test_responses\".\"kb_payment_transaction_id\" = '1234') OR \"test_responses\".\"message\" = '1234') OR \"test_responses\".\"authorization\" = '1234') OR \"test_responses\".\"fraud_review\" = '1234') AND \"test_responses\".\"success\" = 't' AND \"test_responses\".\"kb_tenant_id\" = '11-22-33' ORDER BY \"test_responses\".\"id\" LIMIT 10 OFFSET 0"
|
27
77
|
# Note that Kill Bill will pass a String, even for numeric types
|
28
|
-
::Killbill::Test::TestResponse.search_query('
|
78
|
+
::Killbill::Test::TestResponse.search_query('1234', '11-22-33', 0, 10).to_sql.should == expected_query
|
29
79
|
|
30
80
|
# Check count query (search query string)
|
31
|
-
expected_query = "SELECT COUNT(DISTINCT \"test_responses\".\"id\") FROM \"test_responses\" WHERE (((\"test_responses\".\"kb_payment_id\" = 'XXX' OR \"test_responses\".\"
|
32
|
-
::Killbill::Test::TestResponse.search_query('
|
81
|
+
expected_query = "SELECT COUNT(DISTINCT \"test_responses\".\"id\") FROM \"test_responses\" WHERE ((((\"test_responses\".\"kb_payment_id\" = 'XXX' OR \"test_responses\".\"kb_payment_transaction_id\" = 'XXX') OR \"test_responses\".\"message\" = 'XXX') OR \"test_responses\".\"authorization\" = 'XXX') OR \"test_responses\".\"fraud_review\" = 'XXX') AND \"test_responses\".\"success\" = 't' AND \"test_responses\".\"kb_tenant_id\" = '11-22-33' ORDER BY \"test_responses\".\"id\""
|
82
|
+
::Killbill::Test::TestResponse.search_query('XXX', '11-22-33').to_sql.should == expected_query
|
33
83
|
|
34
84
|
# Check query with results (search query string)
|
35
|
-
expected_query = "SELECT DISTINCT \"test_responses\".* FROM \"test_responses\" WHERE (((\"test_responses\".\"kb_payment_id\" = 'XXX' OR \"test_responses\".\"
|
36
|
-
::Killbill::Test::TestResponse.search_query('
|
85
|
+
expected_query = "SELECT DISTINCT \"test_responses\".* FROM \"test_responses\" WHERE ((((\"test_responses\".\"kb_payment_id\" = 'XXX' OR \"test_responses\".\"kb_payment_transaction_id\" = 'XXX') OR \"test_responses\".\"message\" = 'XXX') OR \"test_responses\".\"authorization\" = 'XXX') OR \"test_responses\".\"fraud_review\" = 'XXX') AND \"test_responses\".\"success\" = 't' AND \"test_responses\".\"kb_tenant_id\" = '11-22-33' ORDER BY \"test_responses\".\"id\" LIMIT 10 OFFSET 0"
|
86
|
+
::Killbill::Test::TestResponse.search_query('XXX', '11-22-33', 0, 10).to_sql.should == expected_query
|
37
87
|
end
|
38
88
|
|
39
89
|
it 'should search all fields' do
|
@@ -45,13 +95,6 @@ describe Killbill::Plugin::ActiveMerchant::ActiveRecord::Response do
|
|
45
95
|
:kb_tenant_id => '11-22-33',
|
46
96
|
:success => true
|
47
97
|
|
48
|
-
# Wrong api_call
|
49
|
-
ignored1 = ::Killbill::Test::TestResponse.create :api_call => 'add_payment_method',
|
50
|
-
:kb_account_id => '55-66-77-88',
|
51
|
-
:kb_payment_id => pm.kb_payment_id,
|
52
|
-
:kb_tenant_id => '11-22-33',
|
53
|
-
:success => true
|
54
|
-
|
55
98
|
# Not successful
|
56
99
|
ignored2 = ::Killbill::Test::TestResponse.create :api_call => 'charge',
|
57
100
|
:kb_account_id => '55-66-77-88',
|