saferpay 0.1.0.pre

Sign up to get free protection for your applications and to get access to all the features.
@@ -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