saferpay 0.1.0.pre

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.
@@ -0,0 +1,83 @@
1
+ shared_examples_for 'the get payment url response' do
2
+ let(:response) { subject.get_payment_url(options) }
3
+
4
+ it 'is a string' do
5
+ expect(response).to be_a String
6
+ end
7
+
8
+ it 'contains the payment url' do
9
+ expect(response).to match /^https:\/\/www.saferpay.com\/.+/
10
+ end
11
+ end
12
+
13
+ shared_examples_for 'the verify pay confirm response' do
14
+ let(:response) { subject.handle_pay_confirm(options) }
15
+
16
+ it 'is an hash' do
17
+ expect(response).to be_an Hash
18
+ end
19
+
20
+ it 'contains normalized keys' do
21
+ expect(response.keys).to include(:id, :callback_data, :token)
22
+ end
23
+
24
+ it 'contains the id' do
25
+ expect(response[:id]).to match /\w{28}/
26
+ end
27
+
28
+ it 'contains callback data' do
29
+ expect(response[:callback_data]).not_to be_nil
30
+ end
31
+
32
+ describe 'the callback data' do
33
+ let(:callback_data) { response[:callback_data] }
34
+
35
+ it 'is an hash' do
36
+ expect(callback_data).to be_an Hash
37
+ end
38
+
39
+ it 'contains normalized keys' do
40
+ expect(callback_data.keys).to include(:data, :signature)
41
+ end
42
+
43
+ it 'contains the XML data' do
44
+ expect(callback_data[:data]).to be_an Hash
45
+ end
46
+
47
+ it 'contains the expected Message Type' do
48
+ expect(callback_data[:data][:msgtype]).to eq 'PayConfirm'
49
+ end
50
+
51
+ it 'contains the expected Account ID' do
52
+ expect(callback_data[:data][:accountid]).to eq subject.account_id
53
+ end
54
+
55
+ it 'contains the expected Amount' do
56
+ expect(callback_data[:data][:amount]).to eq '1000'
57
+ end
58
+ end
59
+ end
60
+
61
+ shared_examples_for 'the complete payment response' do
62
+ let(:response) { subject.complete_payment(options) }
63
+
64
+ it 'is an hash' do
65
+ expect(response).to be_an Hash
66
+ end
67
+
68
+ it 'contains normalized keys' do
69
+ expect(response.keys).to include(:id, :successful, :result, :msgtype)
70
+ end
71
+
72
+ it 'contains the id' do
73
+ expect(response[:id]).to eq options['ID']
74
+ end
75
+
76
+ it 'specifies if the request was successfully processed' do
77
+ expect(response[:successful]).to be_true
78
+ end
79
+
80
+ it 'contains the expected Message Type' do
81
+ expect(response[:msgtype]).to eq 'PayConfirm'
82
+ end
83
+ end
@@ -0,0 +1,264 @@
1
+ require 'spec_helper'
2
+ require 'saferpay'
3
+
4
+ shared_examples_for 'default redefinition' do
5
+ context 'when account_id is redefined' do
6
+ let (:redefined_options) { options.merge( {'ACCOUNTID' => 'random-ID'} ) }
7
+
8
+ it 'uses the new value instead of the default' do
9
+ expect(subject.class).to receive(:get).with anything, { :query => redefined_options }
10
+ subject.send(testing_method, redefined_options) rescue nil # don't care if it fails after
11
+ end
12
+ end
13
+ end
14
+
15
+ describe Saferpay::API do
16
+ subject { Saferpay::API.new }
17
+
18
+ before do
19
+ VCR.insert_cassette 'saferpay_api', :record => :new_episodes
20
+ end
21
+
22
+ after do
23
+ VCR.eject_cassette
24
+ end
25
+
26
+ describe 'configuration' do
27
+ context 'by default' do
28
+ Saferpay::Configuration::DEFAULTS.each do |key, val|
29
+ its(key) { should eq(val) }
30
+ end
31
+ end
32
+
33
+ context 'with a custom global configuration' do
34
+ Saferpay::Configuration::VALID_CONFIG_KEYS.each do |key|
35
+ before(:each) { Saferpay.configure { |config| config.send "#{key}=", key } }
36
+
37
+ it "passes the user-defined global #{key} to the API instance" do
38
+ expect(subject.send(key)).to eq(key)
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+ describe 'HTTParty configuration' do
45
+ subject { Saferpay::API }
46
+
47
+ it 'includes HTTParty' do
48
+ expect(subject).to include(HTTParty)
49
+ end
50
+
51
+ context 'with default endpoint' do
52
+ subject { Saferpay::API.new.class }
53
+ its(:base_uri) { should eq Saferpay::Configuration::DEFAULTS[:endpoint] }
54
+ end
55
+
56
+ context 'with custom endpoint (via params)' do
57
+ subject { Saferpay::API.new(:endpoint => 'http://example.com').class }
58
+ its(:base_uri) { should_not eq 'http://example.com' }
59
+ end
60
+ end
61
+
62
+ describe 'GET payment url' do
63
+
64
+ context 'when amount is missing' do
65
+ let (:options) { {} }
66
+ it 'raises Missing AMOUNT error' do
67
+ expect { subject.get_payment_url(options) }.to raise_error(Saferpay::Error::BadRequest, 'Missing AMOUNT attribute')
68
+ end
69
+ end
70
+
71
+ context 'when currency is missing' do
72
+ let (:options) { {'AMOUNT' => 1000} }
73
+ it 'raises Missing CURRENCY error' do
74
+ expect { subject.get_payment_url(options) }.to raise_error(Saferpay::Error::BadRequest, 'Missing CURRENCY attribute')
75
+ end
76
+ end
77
+
78
+ context 'when description is missing' do
79
+ let (:options) { {'AMOUNT' => 1000, 'CURRENCY' => 'EUR'} }
80
+ it 'raises Missing DESCRIPTION error' do
81
+ expect { subject.get_payment_url(options) }.to raise_error(Saferpay::Error::BadRequest, 'Missing DESCRIPTION attribute')
82
+ end
83
+ end
84
+
85
+ context 'when amount, currency and description are defined' do
86
+ let (:options) { {'AMOUNT' => 1000, 'CURRENCY' => 'EUR', 'DESCRIPTION' => 'Test description.'} }
87
+
88
+ it 'does not raise an error' do
89
+ expect { subject.get_payment_url(options) }.not_to raise_error
90
+ end
91
+
92
+ it_behaves_like 'the get payment url response'
93
+
94
+ include_examples 'default redefinition' do
95
+ let (:testing_method) { :get_payment_url }
96
+ end
97
+ end
98
+
99
+ end
100
+
101
+ context 'when directly accessing a non-existent URL' do
102
+
103
+ %w(GET POST HEAD).each do |method|
104
+ context "via #{method}" do
105
+ it 'raises 404 NotFound error' do
106
+ expect { subject.class.send(method.downcase, '/foobar') }.to raise_error(Saferpay::Error::NotFound, 'Not Found')
107
+ end
108
+ end
109
+ end
110
+
111
+ %w(PUT DELETE MOVE COPY).each do |method|
112
+ context "via #{method}" do
113
+ it 'raises 405 MethodNotAllowed error' do
114
+ expect { subject.class.send(method.downcase, '/foobar') }.to raise_error(Saferpay::Error, 'Method Not Allowed')
115
+ end
116
+ end
117
+ end
118
+ end
119
+
120
+ describe 'GET verify pay confirm' do
121
+
122
+ context 'when data is missing' do
123
+ let (:options) { {} }
124
+ it 'raises Missing DATA error' do
125
+ expect { subject.handle_pay_confirm(options) }.to raise_error(Saferpay::Error::BadRequest, 'Missing DATA attribute')
126
+ end
127
+ end
128
+
129
+ context 'when signature is missing' do
130
+ let (:options) { {'DATA' => 'test-data'} }
131
+ it 'raises Missing SIGNATURE error' do
132
+ expect { subject.handle_pay_confirm(options) }.to raise_error(Saferpay::Error::BadRequest, 'Missing SIGNATURE attribute')
133
+ end
134
+ end
135
+
136
+ context 'when data and signature are defined' do
137
+
138
+ context 'when data is not valid XML' do
139
+ let (:options) { {'DATA' => 'test-data', 'SIGNATURE' => 'test-signature'} }
140
+ it 'raises could not load DATA XML error' do
141
+ expect { subject.handle_pay_confirm(options) }.to raise_error(Saferpay::Error::BadRequest, 'Could not load DATA XML')
142
+ end
143
+ end
144
+
145
+ context 'when data and signature don\'t match' do
146
+ let (:options) { {'DATA' => URI.encode('<IDP MSGTYPE="PayConfirm" TOKEN="(unused)" VTVERIFY="(obsolete)" KEYID="1-0" ID="A668MSAprOj4tAzv7G9lAQUfUr3A" ACCOUNTID="99867-94913159" PROVIDERID="90" PROVIDERNAME="Saferpay Test Card" ORDERID="123456789-001" AMOUNT="1000" CURRENCY="EUR" IP="193.247.180.193" IPCOUNTRY="CH" CCCOUNTRY="XX" MPI_LIABILITYSHIFT="yes" MPI_TX_CAVV="AAABBIIFmAAAAAAAAAAAAAAAAAA=" MPI_XID="CxMTYwhoUXtCBAEndBULcRIQaAY=" ECI="1" CAVV="AAABBIIFmAAAAAAAAAAAAAAAAAA=" XID="CxMTYwhoUXtCBAEndBULcRIQaAY=" />'), 'SIGNATURE' => 'test-signature'} }
147
+ it 'raises generic error' do
148
+ expect { subject.handle_pay_confirm(options) }.to raise_error(Saferpay::Error::BadRequest, 'An Error occurred')
149
+ end
150
+ end
151
+
152
+ context 'when data and signature match' do
153
+ let (:options) { {'DATA' => URI.encode('<IDP MSGTYPE="PayConfirm" TOKEN="(unused)" VTVERIFY="(obsolete)" KEYID="1-0" ID="A668MSAprOj4tAzv7G9lAQUfUr3A" ACCOUNTID="99867-94913159" PROVIDERID="90" PROVIDERNAME="Saferpay Test Card" ORDERID="123456789-001" AMOUNT="1000" CURRENCY="EUR" IP="193.247.180.193" IPCOUNTRY="CH" CCCOUNTRY="XX" MPI_LIABILITYSHIFT="yes" MPI_TX_CAVV="AAABBIIFmAAAAAAAAAAAAAAAAAA=" MPI_XID="CxMTYwhoUXtCBAEndBULcRIQaAY=" ECI="1" CAVV="AAABBIIFmAAAAAAAAAAAAAAAAAA=" XID="CxMTYwhoUXtCBAEndBULcRIQaAY=" />'), 'SIGNATURE' => '7b2bb163f4ef86d969d992b4e2d61ad48d3b9022e0ec68177e35fe53184e6b3399730d1a3641d2a984ce38699daad72ab006d5d6a9565c5ae1cff8bdc8a1eb63'} }
154
+
155
+ it 'does not raise an error' do
156
+ expect { subject.handle_pay_confirm(options) }.not_to raise_error
157
+ end
158
+
159
+ it_behaves_like 'the verify pay confirm response'
160
+
161
+ describe 'the original options parameter' do
162
+ subject { Saferpay::API.new(:account_id => '99867-94913159') }
163
+
164
+ context 'when nothing matches' do
165
+ subject { Saferpay::API.new(:account_id => '123123') }
166
+ let (:original_options) { {} }
167
+ it 'raises Possible Manipulation error' do
168
+ expect { subject.handle_pay_confirm(options, original_options) }.to raise_error(Saferpay::Error::BadRequest, 'Possible manipulation - AMOUNT, CURRENCY, ORDERID, ACCOUNTID not matching')
169
+ end
170
+ end
171
+
172
+ context 'when amount doesn\'t match' do
173
+ let (:original_options) { { 'CURRENCY' => 'EUR', 'ORDERID' => '123456789-001' } }
174
+ it 'raises Possible Manipulation error' do
175
+ expect { subject.handle_pay_confirm(options, original_options) }.to raise_error(Saferpay::Error::BadRequest, 'Possible manipulation - AMOUNT not matching')
176
+ end
177
+ end
178
+
179
+ context 'when currency doesn\'t match' do
180
+ let (:original_options) { { 'AMOUNT' => '1000', 'ORDERID' => '123456789-001' } }
181
+ it 'raises Possible Manipulation error' do
182
+ expect { subject.handle_pay_confirm(options, original_options) }.to raise_error(Saferpay::Error::BadRequest, 'Possible manipulation - CURRENCY not matching')
183
+ end
184
+ end
185
+
186
+ context 'when orderid doesn\'t match' do
187
+ let (:original_options) { { 'AMOUNT' => '1000', 'CURRENCY' => 'EUR', 'ORDERID' => 'random' } }
188
+ it 'raises Possible Manipulation error' do
189
+ expect { subject.handle_pay_confirm(options, original_options) }.to raise_error(Saferpay::Error::BadRequest, 'Possible manipulation - ORDERID not matching')
190
+ end
191
+ end
192
+
193
+ context 'when account_id doesn\'t match' do
194
+ subject { Saferpay::API.new(:account_id => '123123') }
195
+ let (:original_options) { { 'AMOUNT' => '1000', 'CURRENCY' => 'EUR', 'ORDERID' => '123456789-001' } }
196
+ it 'raises Possible Manipulation error' do
197
+ expect { subject.handle_pay_confirm(options, original_options) }.to raise_error(Saferpay::Error::BadRequest, 'Possible manipulation - ACCOUNTID not matching')
198
+ end
199
+ end
200
+
201
+ context 'when everything matches' do
202
+ let (:original_options) { { 'AMOUNT' => '1000', 'CURRENCY' => 'EUR', 'ORDERID' => '123456789-001' } }
203
+ it 'does not raise an error' do
204
+ expect { subject.handle_pay_confirm(options, original_options) }.not_to raise_error
205
+ end
206
+ end
207
+
208
+ end
209
+ end
210
+
211
+ context 'when more than data and signature are defined' do
212
+ let (:options) { {:id => 1, :controller => 'test', 'DATA' => URI.encode('<IDP MSGTYPE="PayConfirm" TOKEN="(unused)" VTVERIFY="(obsolete)" KEYID="1-0" ID="A668MSAprOj4tAzv7G9lAQUfUr3A" ACCOUNTID="99867-94913159" PROVIDERID="90" PROVIDERNAME="Saferpay Test Card" ORDERID="123456789-001" AMOUNT="1000" CURRENCY="EUR" IP="193.247.180.193" IPCOUNTRY="CH" CCCOUNTRY="XX" MPI_LIABILITYSHIFT="yes" MPI_TX_CAVV="AAABBIIFmAAAAAAAAAAAAAAAAAA=" MPI_XID="CxMTYwhoUXtCBAEndBULcRIQaAY=" ECI="1" CAVV="AAABBIIFmAAAAAAAAAAAAAAAAAA=" XID="CxMTYwhoUXtCBAEndBULcRIQaAY=" />'), 'SIGNATURE' => '7b2bb163f4ef86d969d992b4e2d61ad48d3b9022e0ec68177e35fe53184e6b3399730d1a3641d2a984ce38699daad72ab006d5d6a9565c5ae1cff8bdc8a1eb63'} }
213
+
214
+ it 'does not raise an error' do
215
+ expect { subject.handle_pay_confirm(options) }.not_to raise_error
216
+ end
217
+
218
+ it_behaves_like 'the verify pay confirm response'
219
+
220
+ include_examples 'default redefinition' do
221
+ let (:testing_method) { :handle_pay_confirm }
222
+ end
223
+ end
224
+ end
225
+
226
+ end
227
+
228
+ describe 'GET complete payment' do
229
+ let (:default_options) { {'spPassword' => 'XAjc3Kna'} } # only for test account on PayComplete method (via HTTPs interface)
230
+
231
+ context 'when id is missing' do
232
+ let (:options) { default_options.merge({}) }
233
+ it 'raises Missing ID error' do
234
+ expect { subject.complete_payment(options) }.to raise_error(Saferpay::Error::BadRequest, 'Missing ID attribute')
235
+ end
236
+ end
237
+
238
+ context 'when id is defined' do
239
+
240
+ context 'when id is not valid' do
241
+ let (:options) { default_options.merge({'ID' => 'test-id'}) }
242
+ it 'raises invalid ID error' do
243
+ expect { subject.complete_payment(options) }.to raise_error(Saferpay::Error::BadRequest, 'Transaction not available')
244
+ end
245
+ end
246
+
247
+ context 'when id is valid' do
248
+ let (:options) { default_options.merge({'ID' => 'WxWrIlA48W06rAjKKOp5bzS80E5A'}) }
249
+
250
+ it 'does not raise an error' do
251
+ expect { subject.complete_payment(options) }.not_to raise_error
252
+ end
253
+
254
+ it_behaves_like 'the complete payment response'
255
+
256
+ include_examples 'default redefinition' do
257
+ let (:testing_method) { :complete_payment }
258
+ end
259
+ end
260
+ end
261
+
262
+ end
263
+
264
+ end
@@ -0,0 +1,48 @@
1
+ require 'spec_helper'
2
+ require 'saferpay'
3
+
4
+ describe Saferpay do
5
+ subject { Saferpay }
6
+
7
+ describe 'configuration' do
8
+ context 'by default' do
9
+ Saferpay::Configuration::VALID_CONFIG_KEYS.each do |key|
10
+ its(key) { should eq Saferpay::Configuration::DEFAULTS[key] }
11
+ end
12
+ end
13
+
14
+ describe '.configure' do
15
+ Saferpay::Configuration::VALID_CONFIG_KEYS.each do |key|
16
+ it "sets #{key}" do
17
+ Saferpay.configure do |config|
18
+ config.send("#{key}=", key)
19
+ expect(Saferpay.send(key)).to eq(key)
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ describe '.reset' do
26
+
27
+ Saferpay::Configuration::VALID_CONFIG_KEYS.each do |key|
28
+
29
+ it "resets #{key} to default value" do
30
+ subject.configure { |config| config.send "#{key}=", key }
31
+ subject.reset
32
+
33
+ expect(subject.send(key)).to eq Saferpay::Configuration::DEFAULTS[key]
34
+ end
35
+ end
36
+ end
37
+
38
+ describe 'DEFAULTS hash' do
39
+
40
+ Saferpay::Configuration::VALID_CONFIG_KEYS.each do |key|
41
+ it "does not allow direct manipulation of #{key}" do
42
+ expect { subject.options[key] = 'someothervalue' }.to raise_error
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+ require 'saferpay'
3
+
4
+ describe Saferpay do
5
+ subject { Saferpay }
6
+
7
+ end
@@ -0,0 +1,25 @@
1
+ require 'bundler/setup'
2
+ Bundler.setup
3
+
4
+ require 'saferpay'
5
+ require 'vcr'
6
+
7
+ # Requires supporting ruby files with custom matchers and macros, etc,
8
+ # in spec/support/ and its subdirectories.
9
+ Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].each { |f| require f }
10
+
11
+ RSpec.configure do |config|
12
+ # Run specs in random order to surface order dependencies. If you find an
13
+ # order dependency and want to debug it, you can fix the order by providing
14
+ # the seed, which is printed after each run.
15
+ # --seed 1234
16
+ config.order = 'random'
17
+
18
+ config.expect_with :rspec do |c|
19
+ c.syntax = :expect
20
+ end
21
+
22
+ config.after(:each) do
23
+ Saferpay.reset
24
+ end
25
+ end
@@ -0,0 +1,7 @@
1
+ VCR.configure do |c|
2
+ #the directory where your cassettes will be saved
3
+ c.cassette_library_dir = 'spec/fixtures/vcr'
4
+
5
+ # your HTTP request service. You can also use fakeweb, webmock, and more
6
+ c.hook_into :webmock
7
+ end
metadata ADDED
@@ -0,0 +1,157 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: saferpay
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0.pre
5
+ platform: ruby
6
+ authors:
7
+ - Pedro Gaspar
8
+ - Whitesmith
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-04-04 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: httparty
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ~>
19
+ - !ruby/object:Gem::Version
20
+ version: '0.12'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ version: '0.12'
28
+ - !ruby/object:Gem::Dependency
29
+ name: bundler
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ~>
33
+ - !ruby/object:Gem::Version
34
+ version: '1.5'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ~>
40
+ - !ruby/object:Gem::Version
41
+ version: '1.5'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rake
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ~>
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ~>
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rspec
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ version: 2.14.1
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 2.14.1
70
+ - !ruby/object:Gem::Dependency
71
+ name: webmock
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - '='
75
+ - !ruby/object:Gem::Version
76
+ version: 1.15.2
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - '='
82
+ - !ruby/object:Gem::Version
83
+ version: 1.15.2
84
+ - !ruby/object:Gem::Dependency
85
+ name: vcr
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ~>
89
+ - !ruby/object:Gem::Version
90
+ version: '2.8'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ~>
96
+ - !ruby/object:Gem::Version
97
+ version: '2.8'
98
+ description: Interact with Saferpay's HTTPS Interface with an object-oriented API
99
+ wrapper built with HTTParty.
100
+ email:
101
+ - me@pedrogaspar.com
102
+ - info@whitesmith.co
103
+ executables: []
104
+ extensions: []
105
+ extra_rdoc_files: []
106
+ files:
107
+ - .gitignore
108
+ - .rspec
109
+ - Gemfile
110
+ - LICENSE
111
+ - README.md
112
+ - Rakefile
113
+ - lib/saferpay.rb
114
+ - lib/saferpay/client.rb
115
+ - lib/saferpay/configuration.rb
116
+ - lib/saferpay/error.rb
117
+ - lib/saferpay/version.rb
118
+ - saferpay.gemspec
119
+ - spec/fixtures/vcr/saferpay_api.yml
120
+ - spec/saferpay/api_responses_spec.rb
121
+ - spec/saferpay/api_spec.rb
122
+ - spec/saferpay/configuration_spec.rb
123
+ - spec/saferpay/saferpay_spec.rb
124
+ - spec/spec_helper.rb
125
+ - spec/support/vcr_setup.rb
126
+ homepage: http://github.com/whitesmith/saferpay-gem
127
+ licenses:
128
+ - MIT
129
+ metadata: {}
130
+ post_install_message:
131
+ rdoc_options: []
132
+ require_paths:
133
+ - lib
134
+ required_ruby_version: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ required_rubygems_version: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - '>'
142
+ - !ruby/object:Gem::Version
143
+ version: 1.3.1
144
+ requirements: []
145
+ rubyforge_project:
146
+ rubygems_version: 2.2.1
147
+ signing_key:
148
+ specification_version: 4
149
+ summary: A Ruby Saferpay API wrapper
150
+ test_files:
151
+ - spec/fixtures/vcr/saferpay_api.yml
152
+ - spec/saferpay/api_responses_spec.rb
153
+ - spec/saferpay/api_spec.rb
154
+ - spec/saferpay/configuration_spec.rb
155
+ - spec/saferpay/saferpay_spec.rb
156
+ - spec/spec_helper.rb
157
+ - spec/support/vcr_setup.rb