/
fake_braintree.rb
118 lines (97 loc) · 3.11 KB
/
fake_braintree.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
require 'fileutils'
require 'braintree'
require 'capybara'
require 'capybara/server'
require 'fake_braintree/helpers'
require 'fake_braintree/customer'
require 'fake_braintree/subscription'
require 'fake_braintree/redirect'
require 'fake_braintree/sinatra_app'
require 'fake_braintree/valid_credit_cards'
require 'fake_braintree/version'
module FakeBraintree
class << self
@customers = {}
@subscriptions = {}
@failures = {}
@transaction = {}
@redirects = {}
@decline_all_cards = false
@verify_all_cards = false
attr_accessor :customers, :subscriptions, :failures, :transaction, :decline_all_cards, :verify_all_cards, :redirects
end
def self.activate!
set_configuration
clear!
boot_server
end
def self.log_file_path
'tmp/log'
end
def self.clear!
self.customers = {}
self.subscriptions = {}
self.failures = {}
self.transaction = {}
self.redirects = {}
self.decline_all_cards = false
clear_log!
end
def self.clear_log!
FileUtils.mkdir_p(File.dirname(log_file_path))
File.new(log_file_path, 'w').close
end
def self.failure?(card_number)
self.failures.include?(card_number)
end
def self.failure_response(card_number)
failure = self.failures[card_number] || {}
failure["errors"] ||= { "errors" => [] }
{ "message" => failure["message"],
"verification" => { "status" => failure["status"],
"processor_response_text" => failure["message"],
"processor_response_code" => failure["code"],
"gateway_rejection_reason" => "cvv",
"cvv_response_code" => failure["code"] },
"errors" => failure["errors"],
"params" => {}}
end
def self.create_failure
{ "message" => "Do Not Honor",
"verification" => { "status" => "processor_declined",
"processor_response_text" => "Do Not Honor",
"processor_response_code" => '2000' },
"errors" => { 'errors' => [] },
"params" => {} }
end
def self.decline_all_cards!
self.decline_all_cards = true
end
def self.decline_all_cards?
self.decline_all_cards
end
def self.verify_all_cards!
self.verify_all_cards = true
end
def self.credit_card_from_token(token)
self.customers.values.detect do |customer|
next unless customer.key?("credit_cards")
card = customer["credit_cards"].detect {|card| card["token"] == token }
return card if card
end
end
private
def self.set_configuration
Braintree::Configuration.environment = :development
Braintree::Configuration.merchant_id = "xxx"
Braintree::Configuration.public_key = "xxx"
Braintree::Configuration.private_key = "xxx"
end
def self.boot_server
server = Capybara::Server.new(FakeBraintree::SinatraApp)
server.boot
ENV['GATEWAY_PORT'] = server.port.to_s
end
end
FakeBraintree.activate!
Braintree::Configuration.logger = Logger.new(FakeBraintree.log_file_path)