veritrans 2.2.0 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.rubocop.yml +35 -0
- data/.travis.yml +11 -5
- data/CHANGELOG.md +12 -0
- data/Gemfile +14 -6
- data/Gemfile.lock +131 -109
- data/README.md +46 -24
- data/api_reference.md +85 -3
- data/lib/generators/templates/payments_controller.rb +1 -1
- data/lib/generators/templates/views/_credit_card_form.erb +1 -1
- data/lib/veritrans.rb +15 -6
- data/lib/veritrans/api.rb +33 -6
- data/lib/veritrans/client.rb +1 -1
- data/lib/veritrans/result.rb +5 -0
- data/lib/veritrans/testing.rb +1 -1
- data/lib/veritrans/version.rb +1 -1
- data/spec/fixtures/cancel_failed.yml +18 -18
- data/spec/fixtures/cancel_success.yml +48 -28
- data/spec/fixtures/deny_failed.yml +144 -0
- data/spec/fixtures/refund_failed.yml +54 -0
- data/spec/fixtures/status_fail.yml +19 -17
- data/spec/fixtures/status_success.yml +51 -32
- data/spec/fixtures/test_token.yml +49 -0
- data/spec/rails_plugin_spec.rb +105 -86
- data/spec/spec_helper.rb +18 -7
- data/spec/veritrans_client_spec.rb +60 -9
- data/spec/veritrans_snap_spec.rb +17 -2
- data/veritrans.gemspec +0 -6
- metadata +7 -79
data/spec/rails_plugin_spec.rb
CHANGED
@@ -3,18 +3,18 @@ require 'open3'
|
|
3
3
|
require 'shellwords'
|
4
4
|
require 'socket'
|
5
5
|
|
6
|
-
describe
|
6
|
+
describe 'Rails plugin', vcr: false do
|
7
7
|
include Capybara::DSL
|
8
8
|
|
9
|
-
MAIN_RAILS_VER =
|
10
|
-
APP_DIR =
|
11
|
-
PLUGIN_DIR = File.expand_path(
|
9
|
+
MAIN_RAILS_VER = '5.2.3'.freeze
|
10
|
+
APP_DIR = 'plugin_test'.freeze
|
11
|
+
PLUGIN_DIR = File.expand_path('..', File.dirname(__FILE__))
|
12
12
|
|
13
|
-
RAILS_VERSIONS = [
|
13
|
+
RAILS_VERSIONS = %w[4.2.11.1 5.0.7.2 5.1.7 5.2.3].freeze
|
14
14
|
|
15
15
|
before :all do
|
16
16
|
FileUtils.mkdir_p("#{PLUGIN_DIR}/tmp")
|
17
|
-
#Capybara::Screenshot.instance_variable_set(:@capybara_root, "#{PLUGIN_DIR}/tmp")
|
17
|
+
# Capybara::Screenshot.instance_variable_set(:@capybara_root, "#{PLUGIN_DIR}/tmp")
|
18
18
|
end
|
19
19
|
|
20
20
|
def capture_stdout(&block)
|
@@ -37,24 +37,21 @@ describe "Rails plugin", vcr: false do
|
|
37
37
|
|
38
38
|
if status != 0
|
39
39
|
puts "CMD: #{full_cmd}"
|
40
|
-
puts
|
40
|
+
puts 'FAILED'
|
41
41
|
puts output
|
42
42
|
|
43
43
|
exit 1
|
44
44
|
end
|
45
|
-
|
46
|
-
#puts stdout_str
|
47
|
-
|
48
|
-
return output
|
45
|
+
output
|
49
46
|
end
|
50
47
|
|
51
48
|
def install_rails_in_tmp(rails_version = MAIN_RAILS_VER)
|
52
|
-
@rails_dir = Dir.mktmpdir
|
49
|
+
@rails_dir = Dir.mktmpdir
|
53
50
|
@app_abs_path = "#{@rails_dir}/#{APP_DIR}"
|
54
51
|
|
55
52
|
Dir.chdir(@rails_dir) do
|
56
53
|
Bundler.with_clean_env do
|
57
|
-
ENV[
|
54
|
+
ENV['RAILS_ENV'] = 'development'
|
58
55
|
find_or_install_rails(rails_version)
|
59
56
|
generate_rails_app(rails_version)
|
60
57
|
generate_plugin_things
|
@@ -64,11 +61,10 @@ describe "Rails plugin", vcr: false do
|
|
64
61
|
|
65
62
|
def find_or_install_rails(rails_version)
|
66
63
|
response = run_cmd('gem list \^rails\$ -q')
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
end
|
64
|
+
|
65
|
+
return true if response =~ /[^\d]#{rails_version}[^\d]/
|
66
|
+
|
67
|
+
run_cmd("gem install rails -v #{rails_version}")
|
72
68
|
end
|
73
69
|
|
74
70
|
def generate_rails_app(rails_version)
|
@@ -76,30 +72,35 @@ describe "Rails plugin", vcr: false do
|
|
76
72
|
source 'https://rubygems.org'
|
77
73
|
|
78
74
|
gem 'rails', '#{rails_version}'
|
79
|
-
gem 'sqlite3'
|
75
|
+
gem 'sqlite3', '~> 1.3.13'
|
80
76
|
gem 'turbolinks'
|
81
77
|
gem 'jquery-rails'
|
82
78
|
gem 'veritrans', path: '#{PLUGIN_DIR}'
|
83
79
|
".gsub(/^\s+/, '')
|
84
80
|
|
85
|
-
File.open(
|
86
|
-
run_cmd(
|
81
|
+
File.open('./Gemfile', 'w') { |f| f.write(gemfile_content) }
|
82
|
+
run_cmd('bundle _1.17.3_')
|
83
|
+
|
84
|
+
extra_rails_args = []
|
85
|
+
if rails_version >= '5.2.0'
|
86
|
+
extra_rails_args << '--skip-bootsnap'
|
87
|
+
end
|
87
88
|
|
88
|
-
gen = "bundle exec rails _#{rails_version}_ new #{APP_DIR} -B -G --skip-spring -d sqlite3 --skip-turbolinks --skip-test-unit --skip-action-cable --no-rc --skip-puma --skip-listen"
|
89
|
+
gen = "bundle exec rails _#{rails_version}_ new #{APP_DIR} -B -G --skip-spring -d sqlite3 --skip-turbolinks --skip-test-unit --skip-action-cable --no-rc --skip-puma --skip-listen #{extra_rails_args.join(' ')}"
|
89
90
|
|
90
91
|
run_cmd(gen)
|
91
92
|
|
92
|
-
File.open("#{@app_abs_path}/Gemfile",
|
93
|
+
File.open("#{@app_abs_path}/Gemfile", 'w') { |f| f.write(gemfile_content) }
|
93
94
|
|
94
95
|
Dir.chdir(@app_abs_path) do
|
95
|
-
run_cmd(
|
96
|
+
run_cmd('bundle _1.17.3_')
|
96
97
|
end
|
97
98
|
end
|
98
99
|
|
99
100
|
def generate_plugin_things
|
100
101
|
Dir.chdir(@app_abs_path) do
|
101
|
-
run_cmd(
|
102
|
-
run_cmd(
|
102
|
+
run_cmd('rails g veritrans:install')
|
103
|
+
run_cmd('rails g veritrans:payment_form')
|
103
104
|
end
|
104
105
|
|
105
106
|
config_content = "
|
@@ -109,26 +110,26 @@ development:
|
|
109
110
|
api_host: https://api.sandbox.midtrans.com
|
110
111
|
"
|
111
112
|
|
112
|
-
File.open("#{@app_abs_path}/config/veritrans.yml",
|
113
|
+
File.open("#{@app_abs_path}/config/veritrans.yml", 'w') { |f| f.write(config_content) }
|
113
114
|
end
|
114
115
|
|
115
116
|
def run_rails_app
|
116
117
|
@rails_port = find_open_port
|
117
118
|
|
118
119
|
server_cmd = "./bin/rails server -p #{@rails_port} -b 127.0.0.1"
|
119
|
-
server_env = {"RAILS_ENV" =>
|
120
|
-
spawn_opts = {chdir: @app_abs_path}
|
121
|
-
spawn_opts
|
120
|
+
server_env = { "RAILS_ENV" => 'development', "BUNDLE_GEMFILE" => @app_abs_path + '/Gemfile' }
|
121
|
+
spawn_opts = { chdir: @app_abs_path }
|
122
|
+
spawn_opts[%i[err out]] = '/dev/null' unless ENV['DEBUG']
|
122
123
|
|
123
124
|
Bundler.with_clean_env do
|
124
125
|
puts "RUN: #{server_cmd} #{spawn_opts}" if ENV['DEBUG']
|
125
126
|
@runner_pid = spawn(server_env, server_cmd, spawn_opts)
|
126
|
-
puts "Process running PID: #{
|
127
|
+
puts "Process running PID: #{@runner_pid}" if ENV['DEBUG']
|
127
128
|
end
|
128
129
|
|
129
130
|
Capybara.app_host = "http://127.0.0.1:#{@rails_port}"
|
130
131
|
|
131
|
-
#puts "RAILS_DIR: #{@app_abs_path}"
|
132
|
+
# puts "RAILS_DIR: #{@app_abs_path}"
|
132
133
|
|
133
134
|
check_cmd = "curl #{Capybara.app_host}/payments/new"
|
134
135
|
|
@@ -137,35 +138,33 @@ development:
|
|
137
138
|
puts "Check if rails server UP (#{Capybara.app_host})" if ENV['DEBUG']
|
138
139
|
output, status = Open3.capture2e(check_cmd)
|
139
140
|
if status == 0 && output =~ /credit_card_number/
|
140
|
-
|
141
|
-
|
141
|
+
if ENV['DEBUG']
|
142
|
+
puts 'Server is running, output:'
|
143
|
+
puts output[0..300]
|
144
|
+
end
|
142
145
|
break
|
143
146
|
else
|
144
147
|
failed += 1
|
145
|
-
#p error
|
146
|
-
#puts "Retry"
|
147
148
|
sleep 0.3
|
148
149
|
end
|
149
150
|
end
|
150
151
|
|
151
|
-
if failed
|
152
|
-
|
153
|
-
|
154
|
-
|
152
|
+
return if failed != 100
|
153
|
+
|
154
|
+
puts `tail -100 #{@app_abs_path}/log/development.log`
|
155
|
+
raise Exception, 'cannot start rails server'
|
155
156
|
end
|
156
157
|
|
157
158
|
def stop_rails_app
|
158
159
|
Dir.chdir(@app_abs_path) do
|
159
|
-
if File.exist?(
|
160
|
-
run_cmd("kill `cat tmp/pids/server.pid`")
|
161
|
-
end
|
160
|
+
run_cmd('kill `cat tmp/pids/server.pid`') if File.exist?('./tmp/pids/server.pid')
|
162
161
|
end
|
163
162
|
end
|
164
163
|
|
165
164
|
def find_open_port
|
166
165
|
socket = Socket.new(:INET, :STREAM, 0)
|
167
|
-
socket.bind(Addrinfo.tcp(
|
168
|
-
|
166
|
+
socket.bind(Addrinfo.tcp('127.0.0.1', 0))
|
167
|
+
socket.local_address.ip_port
|
169
168
|
ensure
|
170
169
|
socket.close
|
171
170
|
end
|
@@ -177,18 +176,17 @@ development:
|
|
177
176
|
|
178
177
|
def submit_payment_form(card_number)
|
179
178
|
# CREATE PAYMENT 1
|
180
|
-
visit
|
179
|
+
visit '/payments/new'
|
181
180
|
|
182
181
|
fill_in 'credit_card_number', with: card_number
|
183
|
-
|
184
|
-
|
185
|
-
puts "Clicked Pay"
|
182
|
+
click_button 'Pay via VT-Direct'
|
183
|
+
puts 'Clicked Pay'
|
186
184
|
|
187
185
|
# Waiting for get token request in javascript...
|
188
186
|
Timeout.timeout(60.seconds) do
|
189
187
|
loop do
|
190
|
-
|
191
|
-
|
188
|
+
break if current_path != '/payments/new'
|
189
|
+
|
192
190
|
sleep 1
|
193
191
|
end
|
194
192
|
end
|
@@ -196,14 +194,14 @@ development:
|
|
196
194
|
Timeout.timeout(10.seconds) do
|
197
195
|
loop do
|
198
196
|
break if page.body =~ /<body>/
|
197
|
+
|
199
198
|
sleep 0.1
|
200
199
|
end
|
201
200
|
end
|
202
201
|
end
|
203
202
|
|
204
203
|
RAILS_VERSIONS.each_with_index do |rails_version, spec_index|
|
205
|
-
next if rails_version.start_with?(
|
206
|
-
next if RUBY_VERSION >= "2.4.0" && rails_version < "4.2.0"
|
204
|
+
next if rails_version.start_with?('5') && RUBY_VERSION < '2.2.2'
|
207
205
|
|
208
206
|
it "should tests plugin (Rails #{rails_version})" do
|
209
207
|
puts "Testing with Rails #{rails_version} and Ruby #{RUBY_VERSION}"
|
@@ -212,13 +210,13 @@ development:
|
|
212
210
|
run_rails_app
|
213
211
|
|
214
212
|
card_numbers = [
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
213
|
+
'5481 1611 1111 1081',
|
214
|
+
'5410 1111 1111 1116',
|
215
|
+
'4011 1111 1111 1112',
|
216
|
+
'4411 1111 1111 1118',
|
217
|
+
'4811 1111 1111 1114',
|
218
|
+
'3528 6647 7942 9687',
|
219
|
+
'3528 2033 2456 4357'
|
222
220
|
]
|
223
221
|
spec_index = (spec_index + RUBY_VERSION.gsub(/[^\d]/, '').to_i) % card_numbers.size
|
224
222
|
card_number = card_numbers[spec_index]
|
@@ -226,31 +224,29 @@ development:
|
|
226
224
|
submit_payment_form(card_number)
|
227
225
|
|
228
226
|
if page.body =~ /too many transactions/
|
229
|
-
puts
|
230
|
-
puts
|
231
|
-
puts
|
232
|
-
#page.should have_content("Merchant has sent too many transactions to the same card number")
|
233
|
-
puts
|
227
|
+
puts '!!!!'
|
228
|
+
puts 'Merchant has sent too many transactions to the same card number'
|
229
|
+
puts '!!!!'
|
230
|
+
# page.should have_content("Merchant has sent too many transactions to the same card number")
|
231
|
+
puts 'Wait 10 seconds and retry'
|
234
232
|
sleep 10
|
235
233
|
submit_payment_form(card_number)
|
236
234
|
end
|
237
235
|
|
238
|
-
if page.body !~ /transaction is successful/
|
239
|
-
|
240
|
-
|
241
|
-
page.should have_content("Success, Credit Card transaction is successful")
|
236
|
+
puts page.body if page.body !~ /transaction is successful/
|
237
|
+
|
238
|
+
page.should have_content('Success, Credit Card transaction is successful')
|
242
239
|
|
243
|
-
order_info = ActiveSupport::JSON.decode(find(
|
240
|
+
order_info = ActiveSupport::JSON.decode(find('pre').text)
|
244
241
|
puts "Order Info: #{order_info}"
|
245
|
-
created_order_id = order_info[
|
246
|
-
#Capybara::Screenshot.screenshot_and_open_image
|
242
|
+
created_order_id = order_info['order_id']
|
243
|
+
# Capybara::Screenshot.screenshot_and_open_image
|
247
244
|
|
248
245
|
# CREATE PAYMENT 2
|
249
|
-
visit
|
250
|
-
click_link
|
246
|
+
visit '/payments/new'
|
247
|
+
click_link 'Pay via VT-Web'
|
251
248
|
|
252
|
-
page.should have_content(
|
253
|
-
#Capybara::Screenshot.screenshot_and_open_image
|
249
|
+
page.should have_content('ATM/Bank Transfer')
|
254
250
|
|
255
251
|
# TEST CALLBACK FOR WRONG DATA
|
256
252
|
stub_const("CONFIG", {})
|
@@ -261,38 +257,61 @@ development:
|
|
261
257
|
result1.should =~ /status: 404/
|
262
258
|
|
263
259
|
# TEST CALLBACK FOR CORRECT DATA
|
264
|
-
stub_const(
|
260
|
+
stub_const('CONFIG', order: created_order_id, config_path: "#{@app_abs_path}/config/veritrans.yml")
|
265
261
|
result2 = capture_stdout do
|
266
262
|
Veritrans::CLI.test_webhook(["#{Capybara.app_host}/payments/receive_webhook"])
|
267
263
|
end
|
268
264
|
|
269
|
-
if result2 !~ /status: 200/
|
270
|
-
puts `tail -40 #{@app_abs_path}/log/development.log`
|
271
|
-
end
|
265
|
+
puts `tail -40 #{@app_abs_path}/log/development.log` if result2 !~ /status: 200/
|
272
266
|
|
273
267
|
result2.should =~ /status: 200/
|
274
268
|
result2.should =~ /body: ok/
|
275
269
|
end
|
276
270
|
end
|
277
271
|
|
278
|
-
it
|
272
|
+
it 'should print message if running in staging' do
|
279
273
|
# PREPARE APP
|
280
274
|
install_rails_in_tmp
|
281
|
-
File.open("#{@app_abs_path}/config/database.yml", 'a') {|f|
|
275
|
+
File.open("#{@app_abs_path}/config/database.yml", 'a') { |f|
|
282
276
|
f.puts
|
283
|
-
f.puts(
|
284
|
-
f.puts(
|
277
|
+
f.puts('staging:')
|
278
|
+
f.puts(' adapter: sqlite3')
|
285
279
|
f.puts(" database: ':memory:'")
|
286
280
|
}
|
287
281
|
|
288
282
|
Bundler.with_clean_env do
|
289
|
-
ENV[
|
283
|
+
ENV['RAILS_ENV'] = 'staging'
|
290
284
|
Dir.chdir(@app_abs_path) do
|
291
|
-
stdout_str, stderr_str, status = Open3.capture3(%
|
285
|
+
stdout_str, stderr_str, status = Open3.capture3(%(./bin/rails r 'p :started'))
|
292
286
|
stderr_str.should include('Veritrans: Can not find section "staging"')
|
293
287
|
stderr_str.should include('Available sections: ["development"]')
|
294
288
|
stderr_str.should include('Veritrans: Using first section "development"')
|
295
289
|
end
|
296
290
|
end
|
297
291
|
end
|
292
|
+
|
293
|
+
it 'should create logs for log/veritrans.log' do
|
294
|
+
install_rails_in_tmp
|
295
|
+
FileUtils.rm_rf(@app_abs_path + '/log')
|
296
|
+
File.open(@app_abs_path + '/config/application.rb', 'a') do |f|
|
297
|
+
f.write %{
|
298
|
+
logger = ActiveSupport::Logger.new(STDOUT)
|
299
|
+
Rails.application.config.logger = ActiveSupport::TaggedLogging.new(logger)
|
300
|
+
}
|
301
|
+
end
|
302
|
+
run_rails_app
|
303
|
+
|
304
|
+
response = Excon.post(
|
305
|
+
"#{Capybara.app_host}/payments/receive_webhook",
|
306
|
+
body: { transaction_id: '111' }.to_json,
|
307
|
+
headers: { 'Content-Type' => 'application/json' }
|
308
|
+
)
|
309
|
+
expect(response.body).to eq 'error'
|
310
|
+
expect(response.status).to eq 404
|
311
|
+
|
312
|
+
expect(File.exist?(@app_abs_path + '/log/development.log')).to eq false
|
313
|
+
expect(File.exist?(@app_abs_path + '/log/veritrans.log')).to eq true
|
314
|
+
|
315
|
+
File.read(@app_abs_path + '/log/veritrans.log').should include('Callback verification failed for order')
|
316
|
+
end
|
298
317
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'bundler/setup'
|
2
2
|
|
3
|
-
|
3
|
+
$LOAD_PATH.push(File.expand_path('../lib', __dir__))
|
4
4
|
|
5
5
|
require 'rspec'
|
6
6
|
require 'veritrans'
|
@@ -9,15 +9,19 @@ require 'veritrans/events'
|
|
9
9
|
require 'rails'
|
10
10
|
require 'webmock/rspec'
|
11
11
|
require 'vcr'
|
12
|
+
require 'timecop'
|
12
13
|
|
13
14
|
require 'capybara/rspec'
|
15
|
+
require 'capybara-screenshot/rspec'
|
14
16
|
require 'capybara/poltergeist'
|
15
17
|
require 'active_support/testing/stream'
|
16
18
|
|
17
19
|
Capybara.register_driver :poltergeist do |app|
|
18
|
-
Capybara::Poltergeist::Driver.new(
|
20
|
+
Capybara::Poltergeist::Driver.new(
|
21
|
+
app,
|
22
|
+
js_errors: false,
|
19
23
|
# phantomjs don't much like ssl of cloudfront.net
|
20
|
-
phantomjs_options: [
|
24
|
+
phantomjs_options: %w[--ignore-ssl-errors=yes --ssl-protocol=any]
|
21
25
|
# logger: STDOUT
|
22
26
|
)
|
23
27
|
end
|
@@ -28,24 +32,30 @@ Capybara.configure do |config|
|
|
28
32
|
config.run_server = false
|
29
33
|
end
|
30
34
|
|
31
|
-
GEM_ROOT = File.expand_path(
|
35
|
+
GEM_ROOT = File.expand_path('..', __dir__)
|
32
36
|
ENV['RAILS_ENV'] = 'development'
|
33
37
|
|
34
38
|
VCR.configure do |c|
|
35
39
|
c.cassette_library_dir = 'spec/fixtures'
|
36
40
|
c.hook_into :webmock # or :fakeweb
|
37
|
-
#c.debug_logger = STDOUT
|
41
|
+
# c.debug_logger = STDOUT
|
42
|
+
end
|
43
|
+
|
44
|
+
module SpecHelper
|
45
|
+
def show_image
|
46
|
+
Capybara::Screenshot.screenshot_and_open_image
|
47
|
+
end
|
38
48
|
end
|
39
49
|
|
40
50
|
RSpec.configure do |config|
|
41
51
|
config.mock_with :rspec
|
42
52
|
|
43
53
|
config.expect_with :rspec do |c|
|
44
|
-
c.syntax = [
|
54
|
+
c.syntax = %i[should expect]
|
45
55
|
end
|
46
56
|
|
47
57
|
config.mock_with :rspec do |c|
|
48
|
-
c.syntax = [
|
58
|
+
c.syntax = %i[should expect]
|
49
59
|
end
|
50
60
|
|
51
61
|
config.around(:each) do |example|
|
@@ -57,4 +67,5 @@ RSpec.configure do |config|
|
|
57
67
|
example.run
|
58
68
|
end
|
59
69
|
end
|
70
|
+
config.include(SpecHelper)
|
60
71
|
end
|
@@ -8,6 +8,15 @@ describe Veritrans::Client do
|
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
+
def test_card_data
|
12
|
+
{
|
13
|
+
card_number: 4811_1111_1111_1114,
|
14
|
+
card_cvv: 123,
|
15
|
+
card_exp_month: 1,
|
16
|
+
card_exp_year: Time.now.year + 1
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
11
20
|
it "should use Veritrans.http_options", vcr: false do
|
12
21
|
Veritrans::Config.stub(:http_options) do
|
13
22
|
{ omit_default_port: true }
|
@@ -16,7 +25,7 @@ describe Veritrans::Client do
|
|
16
25
|
api_request = nil
|
17
26
|
stub_request(:any, /.*/).to_return(lambda { |request|
|
18
27
|
api_request = request
|
19
|
-
{body: request.body}
|
28
|
+
{ body: request.body }
|
20
29
|
})
|
21
30
|
|
22
31
|
result = Veritrans.request_with_logging(:get, Veritrans.config.api_host + "/ping", {})
|
@@ -32,7 +41,7 @@ describe Veritrans::Client do
|
|
32
41
|
api_request = nil
|
33
42
|
stub_request(:any, /.*/).to_return(lambda { |request|
|
34
43
|
api_request = request
|
35
|
-
{body: request.body}
|
44
|
+
{ body: request.body }
|
36
45
|
})
|
37
46
|
|
38
47
|
result = Veritrans.request_with_logging(:get, Veritrans.config.api_host + "/ping", {})
|
@@ -72,7 +81,8 @@ describe Veritrans::Client do
|
|
72
81
|
other_result = other_client.status(result.transaction_id)
|
73
82
|
|
74
83
|
other_result.status_code.should == 404
|
75
|
-
|
84
|
+
|
85
|
+
other_result.status_message.should == "Transaction doesn't exist."
|
76
86
|
|
77
87
|
#p other_result.request_options
|
78
88
|
|
@@ -83,7 +93,7 @@ describe Veritrans::Client do
|
|
83
93
|
|
84
94
|
it "should send charge vt-web request" do
|
85
95
|
VCR.use_cassette('charge_vtweb') do
|
86
|
-
result = Veritrans.charge('vtweb', transaction: { order_id: Time.now.to_s, gross_amount: 100_000 }
|
96
|
+
result = Veritrans.charge('vtweb', transaction: { order_id: Time.now.to_s, gross_amount: 100_000 })
|
87
97
|
|
88
98
|
result.status_message.should == "OK, success do VTWeb transaction, please go to redirect_url"
|
89
99
|
result.success?.should == true
|
@@ -105,16 +115,16 @@ describe Veritrans::Client do
|
|
105
115
|
VCR.use_cassette('status_fail') do
|
106
116
|
result = Veritrans.status("not-exists")
|
107
117
|
result.success?.should == false
|
108
|
-
result.status_message.should == "
|
118
|
+
result.status_message.should == "Transaction doesn't exist."
|
109
119
|
end
|
110
120
|
end
|
111
121
|
|
112
122
|
it "should send status request and get response" do
|
113
123
|
VCR.use_cassette('status_success') do
|
114
|
-
result_charge = Veritrans.charge('permata', transaction: { order_id: Time.now.to_i, gross_amount: 100_000 }
|
124
|
+
result_charge = Veritrans.charge('permata', transaction: { order_id: Time.now.to_i, gross_amount: 100_000 })
|
115
125
|
result = Veritrans.status(result_charge.order_id)
|
116
126
|
result.success?.should == true
|
117
|
-
result.status_message.should == "Success, transaction found"
|
127
|
+
result.status_message.should == "Success, transaction is found"
|
118
128
|
result.transaction_status.should == "pending"
|
119
129
|
end
|
120
130
|
end
|
@@ -123,13 +133,13 @@ describe Veritrans::Client do
|
|
123
133
|
VCR.use_cassette('cancel_failed') do
|
124
134
|
result = Veritrans.cancel("not-exists")
|
125
135
|
result.success?.should == false
|
126
|
-
result.status_message.should == "
|
136
|
+
result.status_message.should == "Transaction doesn't exist."
|
127
137
|
end
|
128
138
|
end
|
129
139
|
|
130
140
|
it "should send status request and get response" do
|
131
141
|
VCR.use_cassette('cancel_success') do
|
132
|
-
result_charge = Veritrans.charge('permata', transaction: { order_id: Time.now.to_i, gross_amount: 100_000 }
|
142
|
+
result_charge = Veritrans.charge('permata', transaction: { order_id: Time.now.to_i, gross_amount: 100_000 })
|
133
143
|
result = Veritrans.cancel(result_charge.order_id)
|
134
144
|
result.success?.should == true
|
135
145
|
result.status_message.should == "Success, transaction is canceled"
|
@@ -145,6 +155,22 @@ describe Veritrans::Client do
|
|
145
155
|
end
|
146
156
|
end
|
147
157
|
|
158
|
+
it 'should get token for testing' do
|
159
|
+
VCR.use_cassette('test_token') do
|
160
|
+
result = Veritrans.test_token(test_card_data)
|
161
|
+
result.should be_a_kind_of(String)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
# Can only refund after it has been settled after one day
|
166
|
+
it 'should send refund request' do
|
167
|
+
VCR.use_cassette('refund_failed') do
|
168
|
+
result = Veritrans.refund('1415110696')
|
169
|
+
result.success?.should == false
|
170
|
+
result.status_message.should == 'Merchant cannot modify the status of the transaction'
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
148
174
|
it "should send capture request" do
|
149
175
|
VCR.use_cassette('capture_failed') do
|
150
176
|
result = Veritrans.capture("not-exists", 1000)
|
@@ -153,6 +179,31 @@ describe Veritrans::Client do
|
|
153
179
|
end
|
154
180
|
end
|
155
181
|
|
182
|
+
it 'should send deny request' do
|
183
|
+
VCR.use_cassette('deny_failed') do
|
184
|
+
Timecop.freeze(Time.utc(2019, 4, 1)) do
|
185
|
+
order_id = Time.now.to_i.to_s
|
186
|
+
|
187
|
+
charge_result = Veritrans.charge(
|
188
|
+
payment_type: 'credit_card',
|
189
|
+
credit_card: {
|
190
|
+
token_id: Veritrans.test_token(test_card_data)
|
191
|
+
},
|
192
|
+
transaction_details: {
|
193
|
+
order_id: order_id,
|
194
|
+
gross_amount: 3000
|
195
|
+
}
|
196
|
+
)
|
197
|
+
|
198
|
+
charge_result.status_message.should == "Success, Credit Card transaction is successful"
|
199
|
+
|
200
|
+
result = Veritrans.deny(order_id)
|
201
|
+
result.success?.should == false
|
202
|
+
result.status_message.should == 'Transaction status cannot be updated.'
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
156
207
|
it "should send expire request" do
|
157
208
|
VCR.use_cassette('expire_success', record: :once) do
|
158
209
|
result = Veritrans.expire("af3fb136-c405-4103-9a36-5a6a9e2855a9")
|