solidus_culqi 0.0.1 → 1.0.1
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.
- checksums.yaml +5 -5
- data/.rubocop.yml +26 -37
- data/.travis.yml +12 -17
- data/Gemfile +11 -4
- data/README.md +7 -0
- data/Rakefile +2 -0
- data/app/models/concerns/solidus_culqi/inject_installments_concern.rb +3 -1
- data/app/models/concerns/solidus_culqi/permitted_attributes_concern.rb +2 -0
- data/app/models/payment_decorator.rb +5 -1
- data/app/models/permitted_attributes_decorator.rb +5 -1
- data/app/models/solidus/gateway/culqi_gateway.rb +71 -20
- data/bin/geckodriver +28 -0
- data/config/routes.rb +2 -0
- data/db/migrate/20170919145201_add_installments_to_orders.rb +3 -1
- data/lib/generators/solidus_culqi/install/install_generator.rb +2 -0
- data/lib/solidus_culqi.rb +3 -0
- data/lib/solidus_culqi/engine.rb +3 -1
- data/lib/solidus_culqi/factories.rb +3 -1
- data/lib/solidus_culqi/support.rb +9 -0
- data/lib/solidus_culqi/version.rb +3 -1
- data/solidus_culqi.gemspec +5 -5
- data/spec/models/culqi_gateway_spec.rb +11 -0
- data/spec/spec_helper.rb +5 -16
- metadata +10 -40
- data/app/views/spree/checkout/payment/_culqi.html.erb +0 -79
- data/spec/features/culqi_checkout_autocapture_spec.rb +0 -77
- data/spec/features/culqi_checkout_spec.rb +0 -50
- data/spec/support/culqi_helper.rb +0 -43
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: c623122f14e7c6ec787c93661d40fc4266fd9cefe6478d4fc30d7446496011f6
|
|
4
|
+
data.tar.gz: eddcf724e1dbf86a0269808c55ec84d76803ba21e7c1c16ec68f6a8d26d7e577
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: feb467b202a7e3ac1cad370daa66072930c1415baa3bb09a06062f2fe9443ec66fadcb84a7636efbeaa93c043394f74b9d392a6a00e556e4287aa86f128da0a8
|
|
7
|
+
data.tar.gz: 528d326dfe09348975b6ee4f3ec814e73cde89ddbc1fd77f19a2710ede1230adc51029b9193d752ddb350bd429eac3e8b0a9bf9287f8245783b38e4492114d1c
|
data/.rubocop.yml
CHANGED
|
@@ -4,22 +4,13 @@ AllCops:
|
|
|
4
4
|
Exclude:
|
|
5
5
|
- 'spec/dummy/**/*'
|
|
6
6
|
- 'vendor/bundle/**/*'
|
|
7
|
-
TargetRubyVersion: 2.
|
|
8
|
-
|
|
9
|
-
# Sometimes I believe this reads better
|
|
10
|
-
# This also causes spacing issues on multi-line fixes
|
|
11
|
-
Style/BracesAroundHashParameters:
|
|
12
|
-
Enabled: false
|
|
7
|
+
TargetRubyVersion: 2.5
|
|
13
8
|
|
|
14
9
|
# We use class vars and will have to continue doing so for compatability
|
|
15
10
|
Style/ClassVars:
|
|
16
11
|
Enabled: false
|
|
17
12
|
|
|
18
|
-
|
|
19
|
-
Style/PredicateName:
|
|
20
|
-
Enabled: false
|
|
21
|
-
|
|
22
|
-
Style/AccessorMethodName:
|
|
13
|
+
Naming/AccessorMethodName:
|
|
23
14
|
Enabled: false
|
|
24
15
|
|
|
25
16
|
# This has been used for customization
|
|
@@ -38,15 +29,16 @@ Style/WordArray:
|
|
|
38
29
|
Style/ConditionalAssignment:
|
|
39
30
|
Enabled: false
|
|
40
31
|
|
|
41
|
-
Performance/Count:
|
|
42
|
-
Enabled: false
|
|
43
|
-
|
|
44
32
|
Style/RaiseArgs:
|
|
45
33
|
Enabled: false
|
|
46
34
|
|
|
47
35
|
Naming/BinaryOperatorParameterName:
|
|
48
36
|
Enabled: false
|
|
49
37
|
|
|
38
|
+
# We need these names for backwards compatability
|
|
39
|
+
Naming/PredicateName:
|
|
40
|
+
Enabled: false
|
|
41
|
+
|
|
50
42
|
# We can use good judgement here
|
|
51
43
|
Style/RegexpLiteral:
|
|
52
44
|
Enabled: false
|
|
@@ -55,31 +47,22 @@ Style/RegexpLiteral:
|
|
|
55
47
|
Style/AsciiComments:
|
|
56
48
|
Enabled: false
|
|
57
49
|
|
|
58
|
-
|
|
50
|
+
Layout/EndAlignment:
|
|
59
51
|
Enabled: false
|
|
60
52
|
|
|
61
|
-
|
|
53
|
+
Layout/ElseAlignment:
|
|
62
54
|
Enabled: false
|
|
63
55
|
|
|
64
|
-
|
|
56
|
+
Layout/IndentationWidth:
|
|
65
57
|
Enabled: false
|
|
66
58
|
|
|
67
|
-
|
|
59
|
+
Layout/ClosingParenthesisIndentation:
|
|
68
60
|
Enabled: false
|
|
69
61
|
|
|
70
|
-
|
|
62
|
+
Layout/MultilineMethodCallIndentation:
|
|
71
63
|
Enabled: false
|
|
72
64
|
|
|
73
|
-
|
|
74
|
-
Enabled: false
|
|
75
|
-
|
|
76
|
-
Style/IndentArray:
|
|
77
|
-
Enabled: false
|
|
78
|
-
|
|
79
|
-
Style/IndentHash:
|
|
80
|
-
Enabled: false
|
|
81
|
-
|
|
82
|
-
Style/AlignHash:
|
|
65
|
+
Layout/LineLength:
|
|
83
66
|
Enabled: false
|
|
84
67
|
|
|
85
68
|
# From http://relaxed.ruby.style/
|
|
@@ -100,7 +83,7 @@ Style/Documentation:
|
|
|
100
83
|
Enabled: false
|
|
101
84
|
StyleGuide: http://relaxed.ruby.style/#styledocumentation
|
|
102
85
|
|
|
103
|
-
|
|
86
|
+
Layout/DotPosition:
|
|
104
87
|
Enabled: false
|
|
105
88
|
StyleGuide: http://relaxed.ruby.style/#styledotposition
|
|
106
89
|
|
|
@@ -168,11 +151,11 @@ Style/SingleLineMethods:
|
|
|
168
151
|
Enabled: false
|
|
169
152
|
StyleGuide: http://relaxed.ruby.style/#stylesinglelinemethods
|
|
170
153
|
|
|
171
|
-
|
|
154
|
+
Layout/SpaceBeforeBlockBraces:
|
|
172
155
|
Enabled: false
|
|
173
156
|
StyleGuide: http://relaxed.ruby.style/#stylespacebeforeblockbraces
|
|
174
157
|
|
|
175
|
-
|
|
158
|
+
Layout/SpaceInsideParens:
|
|
176
159
|
Enabled: false
|
|
177
160
|
StyleGuide: http://relaxed.ruby.style/#stylespaceinsideparens
|
|
178
161
|
|
|
@@ -191,6 +174,15 @@ Style/WhileUntilModifier:
|
|
|
191
174
|
Enabled: false
|
|
192
175
|
StyleGuide: http://relaxed.ruby.style/#stylewhileuntilmodifier
|
|
193
176
|
|
|
177
|
+
Style/HashEachMethods:
|
|
178
|
+
Enabled: true
|
|
179
|
+
|
|
180
|
+
Style/HashTransformKeys:
|
|
181
|
+
Enabled: true
|
|
182
|
+
|
|
183
|
+
Style/HashTransformValues:
|
|
184
|
+
Enabled: true
|
|
185
|
+
|
|
194
186
|
Lint/AmbiguousRegexpLiteral:
|
|
195
187
|
Enabled: false
|
|
196
188
|
StyleGuide: http://relaxed.ruby.style/#lintambiguousregexpliteral
|
|
@@ -199,7 +191,7 @@ Lint/AssignmentInCondition:
|
|
|
199
191
|
Enabled: false
|
|
200
192
|
StyleGuide: http://relaxed.ruby.style/#lintassignmentincondition
|
|
201
193
|
|
|
202
|
-
Lint/
|
|
194
|
+
Lint/SuppressedException:
|
|
203
195
|
Exclude:
|
|
204
196
|
- 'Rakefile'
|
|
205
197
|
|
|
@@ -208,7 +200,7 @@ Metrics/AbcSize:
|
|
|
208
200
|
|
|
209
201
|
Metrics/BlockLength:
|
|
210
202
|
Exclude:
|
|
211
|
-
- 'spec
|
|
203
|
+
- 'spec/**/*'
|
|
212
204
|
|
|
213
205
|
Metrics/BlockNesting:
|
|
214
206
|
Enabled: false
|
|
@@ -222,9 +214,6 @@ Metrics/ModuleLength:
|
|
|
222
214
|
Metrics/CyclomaticComplexity:
|
|
223
215
|
Enabled: false
|
|
224
216
|
|
|
225
|
-
Metrics/LineLength:
|
|
226
|
-
Enabled: false
|
|
227
|
-
|
|
228
217
|
Metrics/MethodLength:
|
|
229
218
|
Enabled: false
|
|
230
219
|
|
data/.travis.yml
CHANGED
|
@@ -5,24 +5,19 @@ bundler_args: --quiet
|
|
|
5
5
|
script:
|
|
6
6
|
- bundle exec rake
|
|
7
7
|
rvm:
|
|
8
|
-
- 2.
|
|
8
|
+
- 2.6.5
|
|
9
|
+
services:
|
|
10
|
+
- postgresql
|
|
11
|
+
- mysql
|
|
9
12
|
env:
|
|
10
13
|
matrix:
|
|
11
|
-
- SOLIDUS_BRANCH=
|
|
12
|
-
- SOLIDUS_BRANCH=
|
|
13
|
-
- SOLIDUS_BRANCH=
|
|
14
|
-
- SOLIDUS_BRANCH=
|
|
15
|
-
- SOLIDUS_BRANCH=v2.0 DB=postgres
|
|
16
|
-
- SOLIDUS_BRANCH=v2.1 DB=postgres
|
|
17
|
-
- SOLIDUS_BRANCH=v2.2 DB=postgres
|
|
18
|
-
- SOLIDUS_BRANCH=v2.3 DB=postgres
|
|
14
|
+
- SOLIDUS_BRANCH=v2.7 DB=postgres
|
|
15
|
+
- SOLIDUS_BRANCH=v2.8 DB=postgres
|
|
16
|
+
- SOLIDUS_BRANCH=v2.9 DB=postgres
|
|
17
|
+
- SOLIDUS_BRANCH=v2.10 DB=postgres
|
|
19
18
|
- SOLIDUS_BRANCH=master DB=postgres
|
|
20
|
-
- SOLIDUS_BRANCH=
|
|
21
|
-
- SOLIDUS_BRANCH=
|
|
22
|
-
- SOLIDUS_BRANCH=
|
|
23
|
-
- SOLIDUS_BRANCH=
|
|
24
|
-
- SOLIDUS_BRANCH=v2.0 DB=mysql
|
|
25
|
-
- SOLIDUS_BRANCH=v2.1 DB=mysql
|
|
26
|
-
- SOLIDUS_BRANCH=v2.2 DB=mysql
|
|
27
|
-
- SOLIDUS_BRANCH=v2.3 DB=mysql
|
|
19
|
+
- SOLIDUS_BRANCH=v2.7 DB=mysql
|
|
20
|
+
- SOLIDUS_BRANCH=v2.8 DB=mysql
|
|
21
|
+
- SOLIDUS_BRANCH=v2.9 DB=mysql
|
|
22
|
+
- SOLIDUS_BRANCH=v2.10 DB=mysql
|
|
28
23
|
- SOLIDUS_BRANCH=master DB=mysql
|
data/Gemfile
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
source 'https://rubygems.org'
|
|
2
4
|
|
|
3
5
|
git_source(:github) { |repo_name| "https://github.com/#{repo_name}.git" }
|
|
@@ -5,9 +7,14 @@ git_source(:github) { |repo_name| "https://github.com/#{repo_name}.git" }
|
|
|
5
7
|
branch = ENV.fetch('SOLIDUS_BRANCH', 'master')
|
|
6
8
|
gem 'solidus', github: 'solidusio/solidus', branch: branch
|
|
7
9
|
|
|
10
|
+
gem 'deface'
|
|
11
|
+
gem 'ffaker'
|
|
12
|
+
gem 'mysql2', '0.4.10'
|
|
13
|
+
gem 'pg', '~> 0.21'
|
|
14
|
+
gem 'puma'
|
|
15
|
+
gem 'solidus_auth_devise'
|
|
16
|
+
gem 'sqlite3'
|
|
17
|
+
|
|
8
18
|
gemspec
|
|
9
19
|
|
|
10
|
-
|
|
11
|
-
gem 'ffaker'
|
|
12
|
-
gem 'sqlite3'
|
|
13
|
-
end
|
|
20
|
+
gem 'culqi-ruby', github: 'culqi/culqi-ruby'
|
data/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
Solidus Culqi
|
|
2
2
|
=============
|
|
3
|
+
[![Gem Version][rubygems-image]][rubygems-url]
|
|
4
|
+
[![Build Status][travis-image]][travis-url]
|
|
3
5
|
|
|
4
6
|
Add [Culqi](https://www.culqi.com/) support for [solidus](https://solidus.io/) e-commerce.
|
|
5
7
|
|
|
@@ -28,3 +30,8 @@ First bundle your dependencies, then run `rake`. `rake` will default to building
|
|
|
28
30
|
bundle
|
|
29
31
|
bundle exec rake
|
|
30
32
|
```
|
|
33
|
+
|
|
34
|
+
[rubygems-image]: https://badge.fury.io/rb/solidus_culqi.svg
|
|
35
|
+
[rubygems-url]: https://badge.fury.io/rb/solidus_culqi
|
|
36
|
+
[travis-image]: https://travis-ci.org/ccarruitero/solidus_culqi.svg?branch=master
|
|
37
|
+
[travis-url]: https://travis-ci.org/ccarruitero/solidus_culqi
|
data/Rakefile
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module SolidusCulqi
|
|
2
4
|
module InjectInstallmentsConcern
|
|
3
5
|
extend ActiveSupport::Concern
|
|
@@ -8,7 +10,7 @@ module SolidusCulqi
|
|
|
8
10
|
module InstanceMethods
|
|
9
11
|
def gateway_options
|
|
10
12
|
options = super
|
|
11
|
-
installments = order.installments
|
|
13
|
+
installments = order.try(:installments)
|
|
12
14
|
options[:installments] = installments if installments
|
|
13
15
|
options
|
|
14
16
|
end
|
|
@@ -1,24 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Solidus
|
|
2
|
-
class Gateway::CulqiGateway <
|
|
4
|
+
class Gateway::CulqiGateway < Spree::PaymentMethod::CreditCard
|
|
3
5
|
preference :public_key, :string
|
|
4
6
|
preference :secret_key, :string
|
|
5
7
|
|
|
6
|
-
def
|
|
7
|
-
|
|
8
|
+
def partial_name
|
|
9
|
+
'culqi'
|
|
8
10
|
end
|
|
9
11
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
'culqi'
|
|
13
|
-
end
|
|
14
|
-
else
|
|
15
|
-
def partial_name
|
|
16
|
-
'culqi'
|
|
17
|
-
end
|
|
12
|
+
def gateway_class
|
|
13
|
+
self.class
|
|
18
14
|
end
|
|
19
15
|
|
|
20
|
-
def
|
|
21
|
-
|
|
16
|
+
def default_currency
|
|
17
|
+
"PEN"
|
|
22
18
|
end
|
|
23
19
|
|
|
24
20
|
def authorize(amount, creditcard, gateway_options)
|
|
@@ -37,21 +33,40 @@ module Solidus
|
|
|
37
33
|
parse_response(charge)
|
|
38
34
|
end
|
|
39
35
|
|
|
40
|
-
def credit(amount,
|
|
36
|
+
def credit(amount, _creditcard, response_code, _gateway_options)
|
|
41
37
|
init_culqi
|
|
42
38
|
# Culqi only accepts 'duplicado','fraudulento' o 'solicitud_comprador'
|
|
43
39
|
# like reason's value
|
|
44
40
|
refund = Culqi::Refund.create(
|
|
45
41
|
amount: amount,
|
|
46
|
-
charge_id:
|
|
42
|
+
charge_id: response_code,
|
|
47
43
|
reason: "solicitud_comprador"
|
|
48
44
|
)
|
|
49
45
|
parse_response(refund)
|
|
50
46
|
end
|
|
51
47
|
|
|
52
|
-
def void(creditcard, gateway_options)
|
|
48
|
+
def void(response_code, creditcard, gateway_options)
|
|
53
49
|
amount = gateway_options[:subtotal].to_i
|
|
54
|
-
credit(amount, creditcard, gateway_options)
|
|
50
|
+
credit(amount, creditcard, response_code, gateway_options)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def payment_profiles_supported?
|
|
54
|
+
true
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def create_profile(payment)
|
|
58
|
+
return unless payment.source.gateway_customer_profile_id.nil?
|
|
59
|
+
|
|
60
|
+
init_culqi
|
|
61
|
+
customer = get_customer(payment)
|
|
62
|
+
token = payment.source.gateway_payment_profile_id
|
|
63
|
+
card_token = generate_card(customer, token)
|
|
64
|
+
unless customer.nil? || card_token.nil?
|
|
65
|
+
payment.source.update(
|
|
66
|
+
gateway_customer_profile_id: customer,
|
|
67
|
+
gateway_payment_profile_id: card_token
|
|
68
|
+
)
|
|
69
|
+
end
|
|
55
70
|
end
|
|
56
71
|
|
|
57
72
|
private
|
|
@@ -62,7 +77,7 @@ module Solidus
|
|
|
62
77
|
end
|
|
63
78
|
|
|
64
79
|
def commit(amount, creditcard, gateway_options, capture)
|
|
65
|
-
installments = gateway_options
|
|
80
|
+
installments = gateway_options.try(:installments)
|
|
66
81
|
authorization = creditcard[:gateway_payment_profile_id]
|
|
67
82
|
charge = Culqi::Charge.create(
|
|
68
83
|
amount: amount,
|
|
@@ -79,11 +94,47 @@ module Solidus
|
|
|
79
94
|
def parse_response(response)
|
|
80
95
|
res = JSON.parse(response)
|
|
81
96
|
ActiveMerchant::Billing::Response.new(
|
|
82
|
-
res[
|
|
83
|
-
res[
|
|
97
|
+
res["object"] != "error",
|
|
98
|
+
res["merchant_message"],
|
|
84
99
|
res,
|
|
85
100
|
authorization: res["id"]
|
|
86
101
|
)
|
|
87
102
|
end
|
|
103
|
+
|
|
104
|
+
def find_customer(email)
|
|
105
|
+
res = Culqi::Customer.list
|
|
106
|
+
customers = JSON.parse(res)["data"]
|
|
107
|
+
customers.select { |customer| customer["email"] == email }.first
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def get_customer(payment)
|
|
111
|
+
address = payment.order.bill_address
|
|
112
|
+
email = payment.order.email
|
|
113
|
+
customer = find_customer(email)
|
|
114
|
+
customer = generate_customer(address, email) if customer.nil?
|
|
115
|
+
customer["id"]
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def generate_customer(address, email)
|
|
119
|
+
culqi_customer = Culqi::Customer.create(
|
|
120
|
+
address: address.address1,
|
|
121
|
+
address_city: address.state.name,
|
|
122
|
+
country_code: address.country.iso,
|
|
123
|
+
email: email,
|
|
124
|
+
first_name: address.first_name,
|
|
125
|
+
last_name: address.last_name,
|
|
126
|
+
phone_number: address.phone.tr("/() -/", "")
|
|
127
|
+
)
|
|
128
|
+
JSON.parse(culqi_customer)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def generate_card(customer, token)
|
|
132
|
+
card = Culqi::Card.create(
|
|
133
|
+
customer_id: customer,
|
|
134
|
+
token_id: token,
|
|
135
|
+
validate: false
|
|
136
|
+
)
|
|
137
|
+
JSON.parse(card)["id"]
|
|
138
|
+
end
|
|
88
139
|
end
|
|
89
140
|
end
|
data/bin/geckodriver
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require 'json'
|
|
2
|
+
require 'net/http'
|
|
3
|
+
require 'fileutils'
|
|
4
|
+
require 'open-uri'
|
|
5
|
+
require 'archive/zip'
|
|
6
|
+
|
|
7
|
+
path = 'https://api.github.com/repos/mozilla/geckodriver/releases/latest'
|
|
8
|
+
|
|
9
|
+
res = Net::HTTP.get_response(URI(path))
|
|
10
|
+
json = JSON.parse(res.body)
|
|
11
|
+
download_url = json['url']
|
|
12
|
+
|
|
13
|
+
filename = 'geckodriver'
|
|
14
|
+
|
|
15
|
+
Dir.chdir platform_install_dir do
|
|
16
|
+
FileUtils.rm_f filename
|
|
17
|
+
File.open(filename, "wb") do |saved_file|
|
|
18
|
+
URI.parse(download_url).open("rb") do |read_file|
|
|
19
|
+
saved_file.write(read_file.read)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
raise "Could not download #{download_url}" unless File.exists? filename
|
|
24
|
+
Archive::Zip.extract(filename, '.', :overwrite => :all)
|
|
25
|
+
end
|
|
26
|
+
raise "Could not unzip #{filename} to get #{binary_path}" unless File.exists? binary_path
|
|
27
|
+
FileUtils.chmod "ugo+rx", binary_path
|
|
28
|
+
File.open(version_path, 'w') { |file| file.write(download_version) }
|
data/config/routes.rb
CHANGED
data/lib/solidus_culqi.rb
CHANGED
data/lib/solidus_culqi/engine.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module SolidusCulqi
|
|
2
4
|
class Engine < Rails::Engine
|
|
3
5
|
engine_name 'solidus_culqi'
|
|
@@ -12,7 +14,7 @@ module SolidusCulqi
|
|
|
12
14
|
end
|
|
13
15
|
|
|
14
16
|
def self.activate
|
|
15
|
-
Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')) do |c|
|
|
17
|
+
Dir.glob(File.join(File.dirname(__FILE__), '../../app/**/*_decorator*.rb')).sort.map do |c|
|
|
16
18
|
Rails.configuration.cache_classes ? require(c) : load(c)
|
|
17
19
|
end
|
|
18
20
|
end
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
FactoryBot.define do
|
|
2
4
|
# Define your Spree extensions Factories within this file to enable applications, and other extensions to use and override them.
|
|
3
5
|
#
|
|
4
6
|
# Example adding this to your spec_helper will load these Factories for use:
|
data/solidus_culqi.gemspec
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
$:.push File.expand_path('lib', __dir__)
|
|
2
4
|
|
|
3
5
|
require 'solidus_culqi/version'
|
|
4
6
|
|
|
@@ -16,14 +18,12 @@ Gem::Specification.new do |s|
|
|
|
16
18
|
s.files = `git ls-files`.split("\n")
|
|
17
19
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
|
18
20
|
|
|
21
|
+
s.add_dependency 'culqi-ruby'
|
|
19
22
|
s.add_dependency 'solidus_core'
|
|
20
23
|
s.add_dependency 'solidus_support'
|
|
21
|
-
s.add_dependency 'culqi-ruby'
|
|
22
24
|
|
|
23
|
-
s.add_development_dependency 'capybara'
|
|
24
|
-
s.add_development_dependency 'poltergeist'
|
|
25
25
|
s.add_development_dependency 'database_cleaner'
|
|
26
|
-
s.add_development_dependency '
|
|
26
|
+
s.add_development_dependency 'factory_bot'
|
|
27
27
|
s.add_development_dependency 'pry'
|
|
28
28
|
s.add_development_dependency 'rspec-rails'
|
|
29
29
|
s.add_development_dependency 'rubocop'
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
|
|
5
|
+
describe Solidus::Gateway::CulqiGateway, type: :model do
|
|
6
|
+
let!(:gateway) { described_class.new }
|
|
7
|
+
|
|
8
|
+
it { gateway.respond_to?(:partial_name) }
|
|
9
|
+
it { expect(gateway.partial_name).to eq('culqi') }
|
|
10
|
+
it { expect(gateway.gateway_class).to eq(Solidus::Gateway::CulqiGateway) }
|
|
11
|
+
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
# Run Coverage report
|
|
2
4
|
require 'simplecov'
|
|
3
5
|
SimpleCov.start do
|
|
@@ -13,29 +15,19 @@ end
|
|
|
13
15
|
# Configure Rails Environment
|
|
14
16
|
ENV['RAILS_ENV'] = 'test'
|
|
15
17
|
|
|
16
|
-
require File.expand_path('
|
|
18
|
+
require File.expand_path('dummy/config/environment.rb', __dir__)
|
|
17
19
|
|
|
18
20
|
require 'rspec/rails'
|
|
19
21
|
require 'database_cleaner'
|
|
20
22
|
require 'ffaker'
|
|
21
|
-
require 'capybara/rspec'
|
|
22
|
-
require 'capybara/poltergeist'
|
|
23
23
|
require 'pry'
|
|
24
24
|
|
|
25
|
-
Capybara.register_driver(:poltergeist) do |app|
|
|
26
|
-
Capybara::Poltergeist::Driver.new app, timeout: 90
|
|
27
|
-
end
|
|
28
|
-
Capybara.javascript_driver = :poltergeist
|
|
29
|
-
Capybara.default_max_wait_time = 10
|
|
30
|
-
|
|
31
25
|
# Requires supporting ruby files with custom matchers and macros, etc,
|
|
32
26
|
# in spec/support/ and its subdirectories.
|
|
33
|
-
Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].each { |f| require f }
|
|
27
|
+
Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].sort.each { |f| require f }
|
|
34
28
|
|
|
35
29
|
# Requires factories and other useful helpers defined in spree_core.
|
|
36
30
|
require 'spree/testing_support/authorization_helpers'
|
|
37
|
-
require 'spree/testing_support/capybara_ext'
|
|
38
|
-
require 'spree/testing_support/controller_requests'
|
|
39
31
|
require 'spree/testing_support/factories'
|
|
40
32
|
require 'spree/testing_support/url_helpers'
|
|
41
33
|
require 'spree/testing_support/preferences'
|
|
@@ -44,9 +36,7 @@ require 'spree/testing_support/preferences'
|
|
|
44
36
|
require 'solidus_culqi/factories'
|
|
45
37
|
|
|
46
38
|
RSpec.configure do |config|
|
|
47
|
-
config.include
|
|
48
|
-
config.include CulqiHelper
|
|
49
|
-
config.include Spree::TestingSupport::UrlHelpers
|
|
39
|
+
config.include FactoryBot::Syntax::Methods
|
|
50
40
|
config.include Spree::TestingSupport::Preferences
|
|
51
41
|
|
|
52
42
|
# Infer an example group's spec type from the file location.
|
|
@@ -80,7 +70,6 @@ RSpec.configure do |config|
|
|
|
80
70
|
config.before :each do
|
|
81
71
|
DatabaseCleaner.strategy = RSpec.current_example.metadata[:js] ? :truncation : :transaction
|
|
82
72
|
DatabaseCleaner.start
|
|
83
|
-
reset_spree_preferences
|
|
84
73
|
end
|
|
85
74
|
|
|
86
75
|
# After each spec clean the database.
|
metadata
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: solidus_culqi
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 1.0.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- César Carruitero
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2021-01-22 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
|
-
name:
|
|
14
|
+
name: culqi-ruby
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
17
|
- - ">="
|
|
@@ -25,7 +25,7 @@ dependencies:
|
|
|
25
25
|
- !ruby/object:Gem::Version
|
|
26
26
|
version: '0'
|
|
27
27
|
- !ruby/object:Gem::Dependency
|
|
28
|
-
name:
|
|
28
|
+
name: solidus_core
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
31
|
- - ">="
|
|
@@ -39,7 +39,7 @@ dependencies:
|
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
40
|
version: '0'
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
|
-
name:
|
|
42
|
+
name: solidus_support
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
44
44
|
requirements:
|
|
45
45
|
- - ">="
|
|
@@ -52,34 +52,6 @@ dependencies:
|
|
|
52
52
|
- - ">="
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
54
|
version: '0'
|
|
55
|
-
- !ruby/object:Gem::Dependency
|
|
56
|
-
name: capybara
|
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
|
58
|
-
requirements:
|
|
59
|
-
- - ">="
|
|
60
|
-
- !ruby/object:Gem::Version
|
|
61
|
-
version: '0'
|
|
62
|
-
type: :development
|
|
63
|
-
prerelease: false
|
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
-
requirements:
|
|
66
|
-
- - ">="
|
|
67
|
-
- !ruby/object:Gem::Version
|
|
68
|
-
version: '0'
|
|
69
|
-
- !ruby/object:Gem::Dependency
|
|
70
|
-
name: poltergeist
|
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
|
72
|
-
requirements:
|
|
73
|
-
- - ">="
|
|
74
|
-
- !ruby/object:Gem::Version
|
|
75
|
-
version: '0'
|
|
76
|
-
type: :development
|
|
77
|
-
prerelease: false
|
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
-
requirements:
|
|
80
|
-
- - ">="
|
|
81
|
-
- !ruby/object:Gem::Version
|
|
82
|
-
version: '0'
|
|
83
55
|
- !ruby/object:Gem::Dependency
|
|
84
56
|
name: database_cleaner
|
|
85
57
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -95,7 +67,7 @@ dependencies:
|
|
|
95
67
|
- !ruby/object:Gem::Version
|
|
96
68
|
version: '0'
|
|
97
69
|
- !ruby/object:Gem::Dependency
|
|
98
|
-
name:
|
|
70
|
+
name: factory_bot
|
|
99
71
|
requirement: !ruby/object:Gem::Requirement
|
|
100
72
|
requirements:
|
|
101
73
|
- - ">="
|
|
@@ -197,7 +169,7 @@ files:
|
|
|
197
169
|
- app/models/payment_decorator.rb
|
|
198
170
|
- app/models/permitted_attributes_decorator.rb
|
|
199
171
|
- app/models/solidus/gateway/culqi_gateway.rb
|
|
200
|
-
-
|
|
172
|
+
- bin/geckodriver
|
|
201
173
|
- bin/rails
|
|
202
174
|
- config/locales/en.yml
|
|
203
175
|
- config/routes.rb
|
|
@@ -206,12 +178,11 @@ files:
|
|
|
206
178
|
- lib/solidus_culqi.rb
|
|
207
179
|
- lib/solidus_culqi/engine.rb
|
|
208
180
|
- lib/solidus_culqi/factories.rb
|
|
181
|
+
- lib/solidus_culqi/support.rb
|
|
209
182
|
- lib/solidus_culqi/version.rb
|
|
210
183
|
- solidus_culqi.gemspec
|
|
211
|
-
- spec/
|
|
212
|
-
- spec/features/culqi_checkout_spec.rb
|
|
184
|
+
- spec/models/culqi_gateway_spec.rb
|
|
213
185
|
- spec/spec_helper.rb
|
|
214
|
-
- spec/support/culqi_helper.rb
|
|
215
186
|
homepage: https://github.com/ccarruitero/solidus_culqi
|
|
216
187
|
licenses:
|
|
217
188
|
- MIT
|
|
@@ -231,8 +202,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
231
202
|
- !ruby/object:Gem::Version
|
|
232
203
|
version: '0'
|
|
233
204
|
requirements: []
|
|
234
|
-
|
|
235
|
-
rubygems_version: 2.6.13
|
|
205
|
+
rubygems_version: 3.1.4
|
|
236
206
|
signing_key:
|
|
237
207
|
specification_version: 4
|
|
238
208
|
summary: Adds solidus support for Culqi Gateway
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
<%= render "spree/checkout/payment/gateway", payment_method: payment_method %>
|
|
2
|
-
<% param_prefix = "payment_source[#{payment_method.id}]" %>
|
|
3
|
-
|
|
4
|
-
<p class="field installmentField">
|
|
5
|
-
<%= label_tag "installments", Spree.t(:installments) %><span class="required">*</span><br />
|
|
6
|
-
<%= select_tag "[order][installments]", [], class: "culqiInstallments" %>
|
|
7
|
-
</p>
|
|
8
|
-
|
|
9
|
-
<script type="text/javascript" src="https://checkout.culqi.com/v2"></script>
|
|
10
|
-
<script type="text/javascript">
|
|
11
|
-
Culqi.publicKey = "<%= payment_method.preferred_public_key %>";
|
|
12
|
-
Culqi.useClasses = true;
|
|
13
|
-
Culqi.init();
|
|
14
|
-
|
|
15
|
-
var paymentMethodId = "<%= payment_method.id %>";
|
|
16
|
-
Spree.culqiPaymentMethod = $('#payment_method_' + paymentMethodId);
|
|
17
|
-
$('.installmentField').toggle();
|
|
18
|
-
|
|
19
|
-
function addCulqiField(className, value) {
|
|
20
|
-
Spree.culqiPaymentMethod.append("<input type='hidden' value='" + value + "' class='"+ className +"'/>");
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function addCulqiSelectOptions(className, options) {
|
|
24
|
-
var select = Spree.culqiPaymentMethod.find(className);
|
|
25
|
-
for(var i=0; i < options.length; i++) {
|
|
26
|
-
select.append("<option value='" + options[i] + "'>" + options[i] + "</option");
|
|
27
|
-
}
|
|
28
|
-
$('.installmentField').toggle();
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function goToNextStep() {
|
|
32
|
-
Spree.culqiPaymentMethod.parents("form").get(0).submit();
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
function allowedInstallments(token) {
|
|
36
|
-
var installments = token['iin']['installments_allowed'];
|
|
37
|
-
var submitBtn = $('#checkout_form_payment [data-hook=buttons]');
|
|
38
|
-
if (installments.length > 0) {
|
|
39
|
-
(installments.indexOf(0) !== -1) ? null : installments.unshift(0);
|
|
40
|
-
Spree.culqiPaymentMethod.find('#card_number, #card_expiry, #card_code').prop("disabled", true);
|
|
41
|
-
addCulqiSelectOptions('.culqiInstallments', installments);
|
|
42
|
-
submitBtn.off('click');
|
|
43
|
-
submitBtn.click(function(e) {
|
|
44
|
-
e.preventDefault();
|
|
45
|
-
goToNextStep();
|
|
46
|
-
});
|
|
47
|
-
} else {
|
|
48
|
-
goToNextStep();
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
function culqi() {
|
|
53
|
-
if (Culqi.token) {
|
|
54
|
-
Spree.culqiPaymentMethod.append("<input type='hidden' name='<%= param_prefix %>[gateway_payment_profile_id]' value='" + Culqi.token['id'] + "'/>");
|
|
55
|
-
allowedInstallments(Culqi.token)
|
|
56
|
-
} else if (Culqi.error) {
|
|
57
|
-
$('#culqiError').html(Culqi.error['user_message']);
|
|
58
|
-
return $('#culqiError').show();
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
Spree.culqiPaymentMethod.find('.cardCode').addClass('culqi-cvv');
|
|
63
|
-
|
|
64
|
-
$(document).ready(function() {
|
|
65
|
-
Spree.culqiPaymentMethod.prepend("<div id='culqiError' class='errorExplanation' style='display:none'></div>");
|
|
66
|
-
$('#checkout_form_payment [data-hook=buttons]').click(function(e) {
|
|
67
|
-
if (Spree.culqiPaymentMethod.is(':visible')) {
|
|
68
|
-
e.preventDefault();
|
|
69
|
-
var expiration = $('.cardExpiry:visible').payment('cardExpiryVal');
|
|
70
|
-
var cardNumber = Spree.culqiPaymentMethod.find('.cardNumber').val().replace(/ /g,'')
|
|
71
|
-
addCulqiField('culqi-email', '<%= @order.email %>');
|
|
72
|
-
addCulqiField('culqi-expm', expiration['month']);
|
|
73
|
-
addCulqiField('culqi-expy', expiration['year']);
|
|
74
|
-
addCulqiField('culqi-card', cardNumber);
|
|
75
|
-
Culqi.createToken();
|
|
76
|
-
}
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
</script>
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
require "spec_helper"
|
|
2
|
-
|
|
3
|
-
RSpec.describe "Culqi checkout autocapture", type: :feature do
|
|
4
|
-
let(:zone) { create(:zone) }
|
|
5
|
-
let(:country) { create(:country) }
|
|
6
|
-
let(:product) { create(:product) }
|
|
7
|
-
|
|
8
|
-
before do
|
|
9
|
-
zone.members << Spree::ZoneMember.create!(zoneable: country)
|
|
10
|
-
create(:store)
|
|
11
|
-
create(:free_shipping_method)
|
|
12
|
-
Spree::Config.set(auto_capture: true)
|
|
13
|
-
setup_culqi_gateway
|
|
14
|
-
checkout_until_payment
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
context "with valid credit card" do
|
|
18
|
-
stub_authorization!
|
|
19
|
-
|
|
20
|
-
before do
|
|
21
|
-
fill_in "Card Number", with: "4111 1111 1111 1111"
|
|
22
|
-
page.execute_script("$('.cardNumber').trigger('change')")
|
|
23
|
-
fill_in "Card Code", with: "123"
|
|
24
|
-
fill_in "Expiration", with: "09 / 20"
|
|
25
|
-
click_button "Save and Continue"
|
|
26
|
-
sleep(5) # Wait for API to return + form to submit
|
|
27
|
-
click_button "Save and Continue"
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
it "can process a valid payment", js: true do
|
|
31
|
-
expect(page.current_url).to include("/checkout/confirm")
|
|
32
|
-
click_button "Place Order"
|
|
33
|
-
expect(page).to have_content("Your order has been processed successfully")
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
it "refunds a payment", js: true do
|
|
37
|
-
reason = FactoryGirl.create(:refund_reason)
|
|
38
|
-
|
|
39
|
-
click_button "Place Order"
|
|
40
|
-
visit spree.admin_order_payments_path(Spree::Order.last)
|
|
41
|
-
sleep(3)
|
|
42
|
-
click_icon(:reply)
|
|
43
|
-
fill_in "Amount", with: Spree::Order.last.amount.to_f
|
|
44
|
-
select reason.name, from: "Reason", visible: false
|
|
45
|
-
click_on "Refund"
|
|
46
|
-
expect(Spree::Refund.count).to be(1)
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
context "when missing credit card number" do
|
|
51
|
-
it "shows an error", js: true do
|
|
52
|
-
fill_in "Expiration", with: "01 / #{Time.now.year + 1}"
|
|
53
|
-
fill_in "Card Code", with: "123"
|
|
54
|
-
click_button "Save and Continue"
|
|
55
|
-
expect(page).to have_content("El numero de tarjeta de crédito o débito brindado no es válido.")
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
context "when missing expiration date" do
|
|
60
|
-
it "shows an error", js: true do
|
|
61
|
-
fill_in "Card Number", with: "4242 4242 4242 4242"
|
|
62
|
-
fill_in "Card Code", with: "123"
|
|
63
|
-
click_button "Save and Continue"
|
|
64
|
-
expect(page).to have_content("de expiración de tu tarjeta es inválido.")
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
context "with an invalid credit card number" do
|
|
69
|
-
it "shows an error", js: true do
|
|
70
|
-
fill_in "Card Number", with: "1111 1111 1111"
|
|
71
|
-
fill_in "Expiration", with: "02 / #{Time.now.year + 1}"
|
|
72
|
-
fill_in "Card Code", with: "123"
|
|
73
|
-
click_button "Save and Continue"
|
|
74
|
-
expect(page).to have_content("El numero de tarjeta de crédito o débito brindado no es válido.")
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
end
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
require "spec_helper"
|
|
2
|
-
|
|
3
|
-
RSpec.describe "Culqi checkout", type: :feature do
|
|
4
|
-
let(:zone) { create(:zone) }
|
|
5
|
-
let(:country) { create(:country) }
|
|
6
|
-
let(:product) { create(:product) }
|
|
7
|
-
stub_authorization!
|
|
8
|
-
|
|
9
|
-
before do
|
|
10
|
-
zone.members << Spree::ZoneMember.create!(zoneable: country)
|
|
11
|
-
create(:store)
|
|
12
|
-
create(:free_shipping_method)
|
|
13
|
-
setup_culqi_gateway
|
|
14
|
-
checkout_until_payment
|
|
15
|
-
|
|
16
|
-
fill_in "Card Number", with: "4111 1111 1111 1111"
|
|
17
|
-
page.execute_script("$('.cardNumber').trigger('change')")
|
|
18
|
-
fill_in "Card Code", with: "123"
|
|
19
|
-
fill_in "Expiration", with: "09 / 20"
|
|
20
|
-
click_button "Save and Continue"
|
|
21
|
-
sleep(5) # Wait for API to return + form to submit
|
|
22
|
-
find(".culqiInstallments").select("2")
|
|
23
|
-
click_button "Save and Continue"
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
context "with process checkout" do
|
|
27
|
-
before do
|
|
28
|
-
expect(page.current_url).to include("/checkout/confirm")
|
|
29
|
-
click_button "Place Order"
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
it "process order", js: true do
|
|
33
|
-
expect(page).to have_content("Your order has been processed successfully")
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
it "capture payment", js: true do
|
|
37
|
-
visit spree.admin_order_payments_path(Spree::Order.last)
|
|
38
|
-
sleep(3)
|
|
39
|
-
click_icon(:capture)
|
|
40
|
-
expect(page).to have_content("Payment Updated")
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
it "voids a payment", js: true do
|
|
44
|
-
visit spree.admin_order_payments_path(Spree::Order.last)
|
|
45
|
-
sleep(3)
|
|
46
|
-
click_icon(:void)
|
|
47
|
-
expect(page).to have_content("Payment Updated")
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
end
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
require "spec_helper"
|
|
2
|
-
|
|
3
|
-
module CulqiHelper
|
|
4
|
-
def setup_culqi_gateway
|
|
5
|
-
Solidus::Gateway::CulqiGateway.create!(
|
|
6
|
-
name: "Culqi",
|
|
7
|
-
preferred_secret_key: "sk_test_SpwICNI4YT0OSLHY",
|
|
8
|
-
preferred_public_key: "pk_test_CaY0noGVG8ohIj4P"
|
|
9
|
-
)
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def checkout_until_payment
|
|
13
|
-
visit spree.product_path(product)
|
|
14
|
-
click_button "Add To Cart"
|
|
15
|
-
|
|
16
|
-
# expect(page).to have_current_path("/cart")
|
|
17
|
-
click_button "Checkout"
|
|
18
|
-
|
|
19
|
-
# Address
|
|
20
|
-
# expect(page).to have_current_path("/checkout/address")
|
|
21
|
-
fill_in "Customer E-Mail", with: "han@example.com"
|
|
22
|
-
|
|
23
|
-
country = Spree::Country.first
|
|
24
|
-
within("#billing") do
|
|
25
|
-
fill_in "First Name", with: "Han"
|
|
26
|
-
fill_in "Last Name", with: "Solo"
|
|
27
|
-
fill_in "Street Address", with: "YT-1300"
|
|
28
|
-
fill_in "City", with: "Mos Eisley"
|
|
29
|
-
select "United States of America", from: "Country"
|
|
30
|
-
select country.states.first, from: "order_bill_address_attributes_state_id"
|
|
31
|
-
fill_in "Zip", with: "12010"
|
|
32
|
-
fill_in "Phone", with: "(555) 555-5555"
|
|
33
|
-
end
|
|
34
|
-
click_on "Save and Continue"
|
|
35
|
-
|
|
36
|
-
# Delivery
|
|
37
|
-
# expect(page).to have_current_path("/checkout/delivery")
|
|
38
|
-
# expect(page).to have_content("UPS Ground")
|
|
39
|
-
click_on "Save and Continue"
|
|
40
|
-
|
|
41
|
-
# expect(page).to have_current_path("/checkout/payment")
|
|
42
|
-
end
|
|
43
|
-
end
|