spreedly-core-ruby 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +15 -0
- data/README.md +213 -0
- data/Rakefile +34 -0
- data/lib/spreedly_core.rb +72 -0
- data/lib/spreedly_core/base.rb +95 -0
- data/lib/spreedly_core/gateway.rb +23 -0
- data/lib/spreedly_core/payment_method.rb +118 -0
- data/lib/spreedly_core/test_extensions.rb +62 -0
- data/lib/spreedly_core/test_gateway.rb +32 -0
- data/lib/spreedly_core/transactions.rb +142 -0
- data/lib/spreedly_core/version.rb +4 -0
- data/test/config/spreedly_core.yml.example +3 -0
- data/test/configuration_test.rb +27 -0
- data/test/factories.rb +103 -0
- data/test/spreedly_core_test.rb +204 -0
- data/test/test_factory.rb +99 -0
- data/test/test_helper.rb +33 -0
- data/test/transaction_test.rb +62 -0
- metadata +113 -0
@@ -0,0 +1,204 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
|
4
|
+
# In order to run tests
|
5
|
+
# 1. cp test/config/spreedly_core.yml.example to test/config/spreedly_core.yml
|
6
|
+
# 2. Add your spreedly core credentials to test/config/spreedly_core.yml
|
7
|
+
module SpreedlyCore
|
8
|
+
class SpreedlyCoreTest < Test::Unit::TestCase
|
9
|
+
include TestHelper
|
10
|
+
include TestFactory
|
11
|
+
|
12
|
+
def setup
|
13
|
+
config = YAML.load(File.read(File.dirname(__FILE__) + '/config/spreedly_core.yml'))
|
14
|
+
SpreedlyCore.configure(config)
|
15
|
+
PaymentMethod.reset_additional_required_cc_fields
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_mocked_500_error
|
19
|
+
with_disabled_network do
|
20
|
+
stub_request(:put, "#{mocked_base_uri_string}/payment_methods/FAKE.xml").
|
21
|
+
to_return(:body => '', :status => 500)
|
22
|
+
assert_raises InvalidResponse do
|
23
|
+
Base.verify_put('/payment_methods/FAKE.xml', :has_key => "test") {}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_can_get_payment_token
|
29
|
+
payment_method = given_a_payment_method(:master,
|
30
|
+
:credit_card => {:year => 2015})
|
31
|
+
assert_equal "John", payment_method.first_name
|
32
|
+
assert_equal "Foo", payment_method.last_name
|
33
|
+
assert_equal "XXX", payment_method.verification_value
|
34
|
+
assert payment_method.errors.empty?
|
35
|
+
assert_equal 4, payment_method.month
|
36
|
+
assert_equal 2015, payment_method.year
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_can_find_payment_method
|
40
|
+
payment_method = given_a_payment_method
|
41
|
+
assert PaymentMethod.find(payment_method.token)
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_not_found_payment_method
|
45
|
+
assert_raises InvalidResponse do
|
46
|
+
PaymentMethod.find("NOT-FOUND")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_can_retain_payment_method
|
51
|
+
given_a_retained_transaction
|
52
|
+
end
|
53
|
+
|
54
|
+
# Here we change the token to get an invalid response from spreedly core
|
55
|
+
def test_bad_response_on_retain
|
56
|
+
payment_method = given_a_payment_method
|
57
|
+
payment_method.instance_variable_set("@token", "NOT-FOUND")
|
58
|
+
assert_raises InvalidResponse do
|
59
|
+
payment_method.retain
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_can_not_retain_after_redact
|
64
|
+
retained_transaction = given_a_retained_transaction
|
65
|
+
payment_method = retained_transaction.payment_method
|
66
|
+
redact_transaction = payment_method.redact
|
67
|
+
assert redact_transaction.succeeded?
|
68
|
+
retained_transaction2 = payment_method.retain
|
69
|
+
assert_false retained_transaction2.succeeded?
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_can_redact_payment_method
|
73
|
+
given_a_redacted_transaction
|
74
|
+
end
|
75
|
+
|
76
|
+
# Here we change the token to get an invalid response from spreedly core
|
77
|
+
def test_bad_response_on_redact
|
78
|
+
payment_method = given_a_payment_method
|
79
|
+
payment_method.instance_variable_set("@token", "NOT-FOUND")
|
80
|
+
assert_raises InvalidResponse do
|
81
|
+
payment_method.redact
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_can_make_purchase
|
86
|
+
given_a_purchase
|
87
|
+
end
|
88
|
+
|
89
|
+
# Here we change the token to get an invalid response from spreedly core
|
90
|
+
def test_bad_response_on_purchase
|
91
|
+
payment_method = given_a_payment_method
|
92
|
+
payment_method.instance_variable_set("@token", "NOT-FOUND")
|
93
|
+
assert_raises InvalidResponse do
|
94
|
+
payment_method.purchase(20)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_can_authorize
|
99
|
+
given_an_authorized_transaction
|
100
|
+
end
|
101
|
+
|
102
|
+
# Here we change the token to get an invalid response from spreedly core
|
103
|
+
def test_bad_response_on_authorize
|
104
|
+
payment_method = given_a_payment_method
|
105
|
+
payment_method.instance_variable_set("@token", "NOT-FOUND")
|
106
|
+
assert_raises InvalidResponse do
|
107
|
+
payment_method.authorize(20)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_payment_failed
|
112
|
+
payment_method = given_a_payment_method(:master, :card_number => :failed)
|
113
|
+
|
114
|
+
assert transaction = payment_method.purchase(100)
|
115
|
+
assert !transaction.succeeded?
|
116
|
+
assert_equal("Unable to obtain a successful response from the gateway.",
|
117
|
+
transaction.message)
|
118
|
+
|
119
|
+
assert_equal("Unable to process the transaction.", transaction.response.message)
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_can_capture_after_authorize
|
123
|
+
given_a_capture
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_can_capture_partial_after_authorize
|
127
|
+
given_a_capture 50
|
128
|
+
end
|
129
|
+
|
130
|
+
# Here we change the token to get an invalid response from spreedly core
|
131
|
+
def test_bad_response_on_capture_after_authorize
|
132
|
+
transaction = given_an_authorized_transaction
|
133
|
+
transaction.instance_variable_set("@token", "NOT-FOUND")
|
134
|
+
assert_raises InvalidResponse do
|
135
|
+
transaction.capture
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_can_void_after_purchase
|
140
|
+
given_a_purchase_void
|
141
|
+
end
|
142
|
+
|
143
|
+
# Here we change the token to get an invalid response from spreedly core
|
144
|
+
def test_bad_response_on_void
|
145
|
+
purchase = given_a_purchase
|
146
|
+
purchase.instance_variable_set("@token", "NOT-FOUND")
|
147
|
+
assert_raises InvalidResponse do
|
148
|
+
purchase.void
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
def test_can_void_after_capture
|
153
|
+
given_a_capture_void
|
154
|
+
end
|
155
|
+
|
156
|
+
def test_can_credit_after_purchase
|
157
|
+
given_a_purchase_credit
|
158
|
+
end
|
159
|
+
|
160
|
+
# Here we change the token to get an invalid response from spreedly core
|
161
|
+
def test_bad_response_on_credit
|
162
|
+
purchase = given_a_purchase
|
163
|
+
purchase.instance_variable_set("@token", "NOT-FOUND")
|
164
|
+
assert_raises InvalidResponse do
|
165
|
+
purchase.credit
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
def test_can_credit_partial_after_purchase
|
170
|
+
given_a_purchase_credit(100, 50)
|
171
|
+
end
|
172
|
+
|
173
|
+
def test_can_credit_after_capture
|
174
|
+
given_a_capture_credit
|
175
|
+
end
|
176
|
+
|
177
|
+
def test_can_credit_partial_after_capture
|
178
|
+
given_a_capture_credit(50, 25)
|
179
|
+
end
|
180
|
+
|
181
|
+
|
182
|
+
def test_can_enforce_additional_payment_method_validations
|
183
|
+
PaymentMethod.additional_required_cc_fields :state
|
184
|
+
|
185
|
+
token = PaymentMethod.create_test_token(cc_data(:master))
|
186
|
+
assert payment_method = PaymentMethod.find(token)
|
187
|
+
assert !payment_method.valid?
|
188
|
+
assert_equal 1, payment_method.errors.size
|
189
|
+
|
190
|
+
assert_equal "State can't be blank", payment_method.errors.first
|
191
|
+
|
192
|
+
token = PaymentMethod.
|
193
|
+
create_test_token(cc_data(:master, :credit_card => {:state => "IL"}))
|
194
|
+
|
195
|
+
assert payment_method = PaymentMethod.find(token)
|
196
|
+
|
197
|
+
assert payment_method.valid?
|
198
|
+
end
|
199
|
+
|
200
|
+
def test_can_list_supported_gateways
|
201
|
+
assert Gateway.supported_gateways.any?
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
module SpreedlyCore
|
2
|
+
module TestFactory
|
3
|
+
def given_a_payment_method(cc_card=:master, card_options={})
|
4
|
+
token = PaymentMethod.create_test_token cc_data(cc_card, card_options), "customer-42"
|
5
|
+
assert payment_method = PaymentMethod.find(token)
|
6
|
+
assert_equal "customer-42", payment_method.data
|
7
|
+
assert_equal token, payment_method.token
|
8
|
+
payment_method
|
9
|
+
end
|
10
|
+
|
11
|
+
def given_a_purchase(purchase_amount=100, ip_address='127.0.0.1')
|
12
|
+
payment_method = given_a_payment_method
|
13
|
+
assert transaction = payment_method.purchase(purchase_amount, nil, nil, ip_address=nil)
|
14
|
+
assert_equal purchase_amount, transaction.amount
|
15
|
+
assert_equal "USD", transaction.currency_code
|
16
|
+
assert_equal "Purchase", transaction.transaction_type
|
17
|
+
assert_equal ip_address, transaction.ip
|
18
|
+
assert transaction.succeeded?
|
19
|
+
transaction
|
20
|
+
end
|
21
|
+
|
22
|
+
def given_a_retained_transaction
|
23
|
+
payment_method = given_a_payment_method
|
24
|
+
assert transaction = payment_method.retain
|
25
|
+
assert transaction.succeeded?
|
26
|
+
assert_equal "RetainPaymentMethod", transaction.transaction_type
|
27
|
+
transaction
|
28
|
+
end
|
29
|
+
|
30
|
+
def given_a_redacted_transaction
|
31
|
+
retained_transaction = given_a_retained_transaction
|
32
|
+
assert payment_method = retained_transaction.payment_method
|
33
|
+
transaction = payment_method.redact
|
34
|
+
assert transaction.succeeded?
|
35
|
+
assert_equal "RedactPaymentMethod", transaction.transaction_type
|
36
|
+
assert !transaction.token.blank?
|
37
|
+
transaction
|
38
|
+
end
|
39
|
+
|
40
|
+
def given_an_authorized_transaction(amount=100, ip_address='127.0.0.1')
|
41
|
+
payment_method = given_a_payment_method
|
42
|
+
assert transaction = payment_method.authorize(100, nil, nil, ip_address)
|
43
|
+
assert_equal 100, transaction.amount
|
44
|
+
assert_equal "USD", transaction.currency_code
|
45
|
+
assert_equal ip_address, transaction.ip
|
46
|
+
assert_equal AuthorizeTransaction, transaction.class
|
47
|
+
transaction
|
48
|
+
end
|
49
|
+
|
50
|
+
def given_a_capture(amount=100, ip_address='127.0.0.1')
|
51
|
+
transaction = given_an_authorized_transaction(amount, ip_address)
|
52
|
+
capture = transaction.capture(amount, ip_address)
|
53
|
+
assert capture.succeeded?
|
54
|
+
assert_equal amount, capture.amount
|
55
|
+
assert_equal "Capture", capture.transaction_type
|
56
|
+
assert_equal ip_address, capture.ip
|
57
|
+
assert_equal CaptureTransaction, capture.class
|
58
|
+
capture
|
59
|
+
end
|
60
|
+
|
61
|
+
def given_a_purchase_void(ip_address='127.0.0.1')
|
62
|
+
purchase = given_a_purchase
|
63
|
+
assert void = purchase.void(ip_address)
|
64
|
+
assert_equal purchase.token, void.reference_token
|
65
|
+
assert_equal ip_address, void.ip
|
66
|
+
assert void.succeeded?
|
67
|
+
void
|
68
|
+
end
|
69
|
+
|
70
|
+
def given_a_capture_void(ip_address='127.0.0.1')
|
71
|
+
capture = given_a_capture
|
72
|
+
assert void = capture.void(ip_address)
|
73
|
+
assert_equal capture.token, void.reference_token
|
74
|
+
assert_equal ip_address, void.ip
|
75
|
+
assert void.succeeded?
|
76
|
+
void
|
77
|
+
end
|
78
|
+
|
79
|
+
def given_a_purchase_credit(purchase_amount=100, credit_amount=100, ip_address='127.0.0.1')
|
80
|
+
purchase = given_a_purchase(purchase_amount, ip_address)
|
81
|
+
given_a_credit(purchase, credit_amount, ip_address)
|
82
|
+
end
|
83
|
+
|
84
|
+
def given_a_capture_credit(capture_amount=100, credit_amount=100, ip_address='127.0.0.1')
|
85
|
+
capture = given_a_capture(capture_amount, ip_address)
|
86
|
+
given_a_credit(capture, credit_amount, ip_address)
|
87
|
+
end
|
88
|
+
|
89
|
+
def given_a_credit(trans, credit_amount=100, ip_address='127.0.0.1')
|
90
|
+
assert credit = trans.credit(credit_amount, ip_address)
|
91
|
+
assert_equal trans.token, credit.reference_token
|
92
|
+
assert_equal credit_amount, credit.amount
|
93
|
+
assert_equal ip_address, credit.ip
|
94
|
+
assert credit.succeeded?
|
95
|
+
assert CreditTransaction, credit.class
|
96
|
+
credit
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler'
|
5
|
+
|
6
|
+
Bundler.setup(:default, :development)
|
7
|
+
|
8
|
+
Bundler.require(:default, :development)
|
9
|
+
|
10
|
+
$LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
|
11
|
+
require 'spreedly_core'
|
12
|
+
require 'spreedly_core/test_extensions'
|
13
|
+
require 'test_factory'
|
14
|
+
|
15
|
+
require 'webmock/test_unit'
|
16
|
+
# Allow real connections, see https://github.com/bblimke/webmock for more info
|
17
|
+
WebMock.allow_net_connect!
|
18
|
+
|
19
|
+
require 'webmock'
|
20
|
+
|
21
|
+
class Test::Unit::TestCase
|
22
|
+
def assert_false(test, failure_message=nil)
|
23
|
+
assert(!test, failure_message)
|
24
|
+
end
|
25
|
+
|
26
|
+
def with_disabled_network(&block)
|
27
|
+
WebMock.disable_net_connect!
|
28
|
+
block.call
|
29
|
+
ensure
|
30
|
+
WebMock.allow_net_connect!
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module SpreedlyCore
|
4
|
+
class TransactionTest < Test::Unit::TestCase
|
5
|
+
include TestHelper
|
6
|
+
include TestFactory
|
7
|
+
|
8
|
+
def setup
|
9
|
+
config = YAML.load(File.read(File.dirname(__FILE__) + '/config/spreedly_core.yml'))
|
10
|
+
SpreedlyCore.configure(config)
|
11
|
+
PaymentMethod.reset_additional_required_cc_fields
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_not_found_transaction
|
15
|
+
assert_raises InvalidResponse do
|
16
|
+
Transaction.find("NOT-FOUND")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_find_returns_retain_transaction_type
|
21
|
+
retain = given_a_retained_transaction
|
22
|
+
assert_find_transaction(retain, RetainTransaction)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_find_returns_redact_transaction_type
|
26
|
+
redact = given_a_redacted_transaction
|
27
|
+
assert_find_transaction(redact, RedactTransaction)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_find_returns_authorize_transaction_type
|
31
|
+
authorize = given_an_authorized_transaction
|
32
|
+
assert_find_transaction(authorize, AuthorizeTransaction)
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_find_returns_purchase_transaction_type
|
36
|
+
purchase = given_a_purchase
|
37
|
+
assert_find_transaction(purchase, PurchaseTransaction)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_find_returns_capture_transaction_type
|
41
|
+
capture = given_a_capture
|
42
|
+
assert_find_transaction(capture, CaptureTransaction)
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_find_returns_voided_transaction_type
|
46
|
+
void = given_a_capture_void
|
47
|
+
assert_find_transaction(void, VoidedTransaction)
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_find_returns_credit_transaction_type
|
51
|
+
credit = given_a_capture_credit
|
52
|
+
assert_find_transaction(credit, CreditTransaction)
|
53
|
+
end
|
54
|
+
|
55
|
+
protected
|
56
|
+
|
57
|
+
def assert_find_transaction(trans, expected_class)
|
58
|
+
assert actual = Transaction.find(trans.token)
|
59
|
+
assert_equal expected_class, actual.class
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
metadata
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: spreedly-core-ruby
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Spreedly
|
9
|
+
- 403 Labs
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2012-03-14 00:00:00.000000000Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: httparty
|
17
|
+
requirement: &70176154487420 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - =
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 0.7.7
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *70176154487420
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: ruby-debug19
|
28
|
+
requirement: &70176154486600 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *70176154486600
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: rake
|
39
|
+
requirement: &70176154411740 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - =
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: 0.8.7
|
45
|
+
type: :development
|
46
|
+
prerelease: false
|
47
|
+
version_requirements: *70176154411740
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: webmock
|
50
|
+
requirement: &70176154410180 !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ~>
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 1.6.2
|
56
|
+
type: :development
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: *70176154410180
|
59
|
+
description:
|
60
|
+
email: support@spreedly.com
|
61
|
+
executables: []
|
62
|
+
extensions: []
|
63
|
+
extra_rdoc_files: []
|
64
|
+
files:
|
65
|
+
- README.md
|
66
|
+
- Rakefile
|
67
|
+
- LICENSE
|
68
|
+
- lib/spreedly_core/base.rb
|
69
|
+
- lib/spreedly_core/gateway.rb
|
70
|
+
- lib/spreedly_core/payment_method.rb
|
71
|
+
- lib/spreedly_core/test_extensions.rb
|
72
|
+
- lib/spreedly_core/test_gateway.rb
|
73
|
+
- lib/spreedly_core/transactions.rb
|
74
|
+
- lib/spreedly_core/version.rb
|
75
|
+
- lib/spreedly_core.rb
|
76
|
+
- test/config/spreedly_core.yml.example
|
77
|
+
- test/configuration_test.rb
|
78
|
+
- test/factories.rb
|
79
|
+
- test/spreedly_core_test.rb
|
80
|
+
- test/test_factory.rb
|
81
|
+
- test/test_helper.rb
|
82
|
+
- test/transaction_test.rb
|
83
|
+
homepage: http://github.com/spreedly/spreedly-core-ruby
|
84
|
+
licenses: []
|
85
|
+
post_install_message:
|
86
|
+
rdoc_options: []
|
87
|
+
require_paths:
|
88
|
+
- lib
|
89
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
segments:
|
96
|
+
- 0
|
97
|
+
hash: 2785672719963464473
|
98
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
99
|
+
none: false
|
100
|
+
requirements:
|
101
|
+
- - ! '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
segments:
|
105
|
+
- 0
|
106
|
+
hash: 2785672719963464473
|
107
|
+
requirements: []
|
108
|
+
rubyforge_project:
|
109
|
+
rubygems_version: 1.8.17
|
110
|
+
signing_key:
|
111
|
+
specification_version: 3
|
112
|
+
summary: Ruby API for Spreedly Core
|
113
|
+
test_files: []
|