tb_checkout 1.0.3 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/tb_checkout/transactions_controller.rb +7 -1
- data/app/models/concerns/tb_checkout/belongs_to_user_session.rb +32 -3
- data/app/models/tb_checkout/transaction.rb +23 -11
- data/app/views/tb_checkout/admin/carts/index.html.erb +35 -33
- data/app/views/tb_checkout/admin/carts/show.html.erb +22 -20
- data/app/views/tb_checkout/admin/transactions/_table.html.erb +26 -24
- data/app/views/tb_checkout/admin/transactions/show.html.erb +69 -63
- data/lib/tb_checkout/engine.rb +1 -0
- data/lib/tb_checkout/version.rb +1 -1
- data/spec/concerns/belongs_to_spud_user_session.rb +21 -0
- data/spec/controllers/tb_checkout/transactions_controller_spec.rb +3 -12
- data/spec/dummy/config/environments/production.rb +1 -1
- data/spec/dummy/config/environments/test.rb +1 -1
- data/spec/dummy/db/schema.rb +59 -59
- data/spec/factories/tb_checkout_transactions.rb +2 -0
- data/spec/models/tb_checkout/transaction_spec.rb +2 -0
- data/spec/rails_helper.rb +4 -4
- metadata +14 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc4ded5e6adfb731fce1878469f183f0258a7e82
|
4
|
+
data.tar.gz: 45b6793854f8d49cd4e7309c312fc3f42d090dec
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 705fdb06fda7d99561ad6f0c2ffbb367692730d94c2e0bd3334395876d0eb2a7776a29c5f9daa1a6c8ad21e8f38b5b1fef17985d140dbdfcb4e1c51a8833fa26
|
7
|
+
data.tar.gz: c517cbb1f55f91e905d88f29dd6ad40b0d19c9aaa2381fcb4430c413679e5a438f94d2a803cb00eb616a0303655266f1359ac474d200321f711d2b8eefa8ebc5
|
@@ -3,7 +3,12 @@ class TbCheckout::TransactionsController < TbCheckout::ApplicationController
|
|
3
3
|
before_action :load_cart, :only => [:new, :create, :confirm, :capture]
|
4
4
|
|
5
5
|
def index
|
6
|
-
@transactions = TbCheckout::Transaction.captured.
|
6
|
+
@transactions = TbCheckout::Transaction.captured.includes(:cart => :cart_items).paginate(:page => params[:page], :per_page => 10)
|
7
|
+
if current_user
|
8
|
+
@transactions = @transactions.for_user(current_user)
|
9
|
+
else
|
10
|
+
@transactions = @transactions.for_session(session.id)
|
11
|
+
end
|
7
12
|
respond_with @transactions
|
8
13
|
end
|
9
14
|
|
@@ -20,6 +25,7 @@ class TbCheckout::TransactionsController < TbCheckout::ApplicationController
|
|
20
25
|
|
21
26
|
def create
|
22
27
|
@transaction = @cart.transactions.new(transaction_params)
|
28
|
+
@transaction.session_id = session.id
|
23
29
|
if @transaction.save() && @transaction.authorize!
|
24
30
|
redirect_to confirm_tb_checkout_transaction_path(@transaction)
|
25
31
|
else
|
@@ -3,13 +3,42 @@ module TbCheckout::BelongsToUserSession
|
|
3
3
|
|
4
4
|
included do
|
5
5
|
belongs_to :spud_user
|
6
|
-
|
7
|
-
|
6
|
+
validate :spud_user_id_is_not_zero
|
7
|
+
validates :session_id, :presence => true
|
8
|
+
|
9
|
+
# Return all records where the user matches
|
10
|
+
# Should return zero results of the passed user is nil
|
11
|
+
#
|
12
|
+
scope :for_user, ->(user){
|
13
|
+
if user.present?
|
14
|
+
where(:spud_user => user)
|
15
|
+
else
|
16
|
+
none()
|
17
|
+
end
|
18
|
+
}
|
19
|
+
|
20
|
+
# Return all records where the session_id matches
|
21
|
+
# Should return zero results of the passed session_id is nil
|
22
|
+
#
|
23
|
+
scope :for_session, ->(session_id){
|
24
|
+
if session_id.present?
|
25
|
+
where(:session_id => session_id)
|
26
|
+
else
|
27
|
+
none()
|
28
|
+
end
|
8
29
|
}
|
9
30
|
end
|
10
31
|
|
11
32
|
def belongs_to?(user_id:nil, session_id:nil)
|
12
|
-
return (self.session_id == session_id) || (self.spud_user_id.present? && self.spud_user_id == user_id)
|
33
|
+
return (self.session_id == session_id) || (self.spud_user_id.present? && self.spud_user_id != 0 && self.spud_user_id == user_id)
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def spud_user_id_is_not_zero
|
39
|
+
if spud_user_id == 0
|
40
|
+
errors.add(:spud_user_id, 'cannot be 0')
|
41
|
+
end
|
13
42
|
end
|
14
43
|
|
15
44
|
end
|
@@ -6,13 +6,12 @@ module TbCheckout
|
|
6
6
|
attr_accessor :card_number
|
7
7
|
attr_accessor :card_ccv
|
8
8
|
attr_reader :card_expiration
|
9
|
-
self.columns_hash['card_expiration'] = OpenStruct.new(type: :date, klass: Date)
|
10
|
-
|
11
9
|
attr_reader :response
|
12
10
|
|
13
11
|
validates_presence_of :cart, :billing_first_name, :billing_last_name, :billing_address_1,
|
14
12
|
:billing_city, :billing_state, :billing_postal, :card_type
|
15
13
|
validates_numericality_of :amount_charged, :greater_than => 0
|
14
|
+
validate :card_expiration_is_valid, :on => :create
|
16
15
|
validate :credit_card_is_valid, :on => :create
|
17
16
|
before_validation :set_amount_charged
|
18
17
|
before_create :set_invoice_num, :set_spud_user_and_session_id
|
@@ -73,7 +72,7 @@ module TbCheckout
|
|
73
72
|
if self.status != Status::AUTHORIZED
|
74
73
|
raise StandardError, 'Payment must be in Authorized state before capture'
|
75
74
|
end
|
76
|
-
@response = TbCheckout.gateway.capture(amount_in_cents, self.gateway_transaction_id)
|
75
|
+
@response = TbCheckout.gateway.capture(amount_in_cents, self.gateway_transaction_id.to_s)
|
77
76
|
if @response.success? || @response.params['action'] == 'PRIOR_AUTH_CAPTURE'
|
78
77
|
self.update_columns(:status => Status::CAPTURED, :response_text => @response.to_json)
|
79
78
|
else
|
@@ -120,15 +119,20 @@ module TbCheckout
|
|
120
119
|
|
121
120
|
# Check for card_expiration value in String format and convert to Date format
|
122
121
|
#
|
123
|
-
def card_expiration=(
|
124
|
-
if
|
122
|
+
def card_expiration=(input)
|
123
|
+
if input.is_a? Date
|
124
|
+
@card_expiration = input
|
125
|
+
elsif input.is_a?(Hash) && input.has_key?(1) && input.has_key?(2)
|
126
|
+
@card_expiration = Date.new(input[1], input[2])
|
127
|
+
elsif input.is_a? String
|
125
128
|
begin
|
126
|
-
@card_expiration = Date.parse(
|
129
|
+
@card_expiration = Date.parse(input)
|
127
130
|
rescue ArgumentError => e
|
131
|
+
logger.debug "Failed to parse card_expiration '#{input}' with error: #{e.message}"
|
128
132
|
@card_expiration = nil
|
129
133
|
end
|
130
134
|
else
|
131
|
-
@card_expiration =
|
135
|
+
@card_expiration = nil
|
132
136
|
end
|
133
137
|
end
|
134
138
|
|
@@ -139,7 +143,7 @@ private
|
|
139
143
|
if self.status != Status::CAPTURED
|
140
144
|
raise StandardError, 'Payment must be in captured state before it can be voided'
|
141
145
|
end
|
142
|
-
@response = TbCheckout.gateway.void(gateway_transaction_id)
|
146
|
+
@response = TbCheckout.gateway.void(gateway_transaction_id.to_s)
|
143
147
|
if @response.success?
|
144
148
|
self.update_columns(:status => Status::VOIDED, :response_text => @response.to_json)
|
145
149
|
return true
|
@@ -157,7 +161,7 @@ private
|
|
157
161
|
raise StandardError, 'Payment must be in captured state before it can be voided'
|
158
162
|
end
|
159
163
|
cc_last_four_digits = self.card_display.chars.last(4).join()
|
160
|
-
@response = TbCheckout.gateway.refund(amount_in_cents, self.gateway_transaction_id, {
|
164
|
+
@response = TbCheckout.gateway.refund(amount_in_cents, self.gateway_transaction_id.to_s, {
|
161
165
|
:order_id => invoice_num,
|
162
166
|
:description => "REFUND: #{self.cart.description}",
|
163
167
|
:card_number => cc_last_four_digits,
|
@@ -176,6 +180,14 @@ private
|
|
176
180
|
end
|
177
181
|
end
|
178
182
|
|
183
|
+
def card_expiration_is_valid
|
184
|
+
if self.card_expiration.blank?
|
185
|
+
errors.add(:card_expiration, 'cannot be blank')
|
186
|
+
elsif !card_expiration.is_a? Date
|
187
|
+
errors.add(:card_expiration, 'must be a date')
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
179
191
|
def credit_card_is_valid
|
180
192
|
if self.card_number.blank?
|
181
193
|
errors.add(:card_number, 'cannot be blank')
|
@@ -237,8 +249,8 @@ private
|
|
237
249
|
end
|
238
250
|
|
239
251
|
def set_spud_user_and_session_id
|
240
|
-
self.spud_user_id = self.cart.spud_user_id
|
241
|
-
self.session_id = self.cart.session_id
|
252
|
+
self.spud_user_id = self.cart.spud_user_id
|
253
|
+
self.session_id = self.cart.session_id
|
242
254
|
end
|
243
255
|
|
244
256
|
def country_for_billing_state
|
@@ -5,43 +5,45 @@
|
|
5
5
|
['Complete', 'completed'],
|
6
6
|
['In Progress', 'in-progress'],
|
7
7
|
['Abandoned', 'abandoned']
|
8
|
-
], params[:status]) %>
|
8
|
+
], params[:status]), :class => 'form-control' %>
|
9
9
|
<% end %>
|
10
10
|
<% end %>
|
11
11
|
|
12
12
|
<% content_for :detail do %>
|
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
|
-
|
13
|
+
<div class="table-responsive">
|
14
|
+
<table class="table table-striped table-hover">
|
15
|
+
<thead>
|
16
|
+
<th>User</th>
|
17
|
+
<th>Description</th>
|
18
|
+
<th>Total Price</th>
|
19
|
+
<th>Status</th>
|
20
|
+
<th>Last Modified</th>
|
21
|
+
<th></th>
|
22
|
+
</thead>
|
23
|
+
<tbody>
|
24
|
+
<% @carts.each do |cart| %>
|
25
|
+
<tr>
|
26
|
+
<td class="no-wrap"><%= cart.user_full_name %></td>
|
27
|
+
<td><%= cart.description %></td>
|
28
|
+
<td>
|
29
|
+
<% if cart.is_empty? %>
|
30
|
+
Empty
|
31
|
+
<% else %>
|
32
|
+
<%= number_to_currency cart.total_price %>
|
33
|
+
<% end %>
|
34
|
+
</td>
|
35
|
+
<td>
|
36
|
+
<%= tb_checkout_status_label_for_cart(cart) %>
|
37
|
+
</td>
|
38
|
+
<td class="no-wrap"><%= cart.updated_at.strftime('%I:%M %p, %D') %></td>
|
39
|
+
<td>
|
40
|
+
<%= link_to 'Detail', tb_checkout_admin_cart_path(cart, :status => params[:status]), :class => 'btn btn-sm btn-default' %>
|
41
|
+
</td>
|
42
|
+
</tr>
|
43
|
+
<% end %>
|
44
|
+
</tbody>
|
45
|
+
</table>
|
46
|
+
</div>
|
45
47
|
<%= will_paginate @carts %>
|
46
48
|
|
47
49
|
<script>
|
@@ -12,28 +12,30 @@
|
|
12
12
|
<% if @cart.is_empty? %>
|
13
13
|
<p>This cart does not contain any items.</p>
|
14
14
|
<% else %>
|
15
|
-
|
16
|
-
<
|
17
|
-
<
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
15
|
+
<div class="table-responsive">
|
16
|
+
<table class="table table-striped table-hover">
|
17
|
+
<thead>
|
18
|
+
<th>Product</th>
|
19
|
+
<th>Quantity</th>
|
20
|
+
<th>Price</th>
|
21
|
+
</thead>
|
22
|
+
<tbody>
|
23
|
+
<% @cart.cart_items.each do |cart_item| %>
|
24
|
+
<tr>
|
25
|
+
<td><%= cart_item.item_description %></td>
|
26
|
+
<td><%= cart_item.quantity %></td>
|
27
|
+
<td><%= number_to_currency cart_item.total_price %></td>
|
28
|
+
</tr>
|
29
|
+
<% end %>
|
30
|
+
</tbody>
|
31
|
+
<tfoot>
|
23
32
|
<tr>
|
24
|
-
<td
|
25
|
-
<td><%=
|
26
|
-
<td><%= number_to_currency cart_item.total_price %></td>
|
33
|
+
<td colspan="2">Total</td>
|
34
|
+
<td><%= number_to_currency @cart.total_price %></td>
|
27
35
|
</tr>
|
28
|
-
|
29
|
-
</
|
30
|
-
|
31
|
-
<tr>
|
32
|
-
<td colspan="2">Total</td>
|
33
|
-
<td><%= number_to_currency @cart.total_price %></td>
|
34
|
-
</tr>
|
35
|
-
</tfoot>
|
36
|
-
</table>
|
36
|
+
</tfoot>
|
37
|
+
</table>
|
38
|
+
</div>
|
37
39
|
<% end %>
|
38
40
|
|
39
41
|
<h3>Transactions</h3>
|
@@ -1,24 +1,26 @@
|
|
1
|
-
<
|
2
|
-
<
|
3
|
-
<
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
<
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
</
|
1
|
+
<div class="table-responsive">
|
2
|
+
<table class="table table-striped table-hover">
|
3
|
+
<thead>
|
4
|
+
<th>Invoice Number</th>
|
5
|
+
<th>Transaction ID</th>
|
6
|
+
<th>Billing Name</th>
|
7
|
+
<th>Card</th>
|
8
|
+
<th>Amount Charged</th>
|
9
|
+
<th>Status</th>
|
10
|
+
<th></th>
|
11
|
+
</thead>
|
12
|
+
<tbody>
|
13
|
+
<% transactions.each do |transaction| %>
|
14
|
+
<tr>
|
15
|
+
<td><%= transaction.invoice_num %></td>
|
16
|
+
<td><%= transaction.gateway_transaction_id %></td>
|
17
|
+
<td class="no-wrap"><%= transaction.billing_full_name %></td>
|
18
|
+
<td class="no-wrap"><%= transaction.card_display %> (<%= transaction.card_type %>)</td>
|
19
|
+
<td><%= number_to_currency transaction.amount_charged %></td>
|
20
|
+
<td><%= tb_checkout_status_label_for_transaction(transaction.status) %></td>
|
21
|
+
<td><%= link_to 'Detail', tb_checkout_admin_transaction_path(transaction), :class => 'btn btn-sm btn-default' %></td>
|
22
|
+
</tr>
|
23
|
+
<% end %>
|
24
|
+
</tbody>
|
25
|
+
</table>
|
26
|
+
</div>
|
@@ -1,70 +1,76 @@
|
|
1
1
|
<h3>Summary</h3>
|
2
|
-
<
|
3
|
-
<
|
4
|
-
<
|
5
|
-
<
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
<
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
</
|
2
|
+
<div class="table-responsive">
|
3
|
+
<table class="table table-bordered">
|
4
|
+
<thead>
|
5
|
+
<tr>
|
6
|
+
<th>User</th>
|
7
|
+
<th>Invoice Number</th>
|
8
|
+
<th>Transaction ID</th>
|
9
|
+
<th>Card</th>
|
10
|
+
<th>Amount Charged</th>
|
11
|
+
<th>Status</th>
|
12
|
+
</tr>
|
13
|
+
</thead>
|
14
|
+
<tbody>
|
15
|
+
<td><%= @transaction.cart.user_full_name %></td>
|
16
|
+
<td><%= @transaction.invoice_num %></td>
|
17
|
+
<td><%= @transaction.gateway_transaction_id %></td>
|
18
|
+
<td><%= @transaction.card_display %> (<%= @transaction.card_type %>)</td>
|
19
|
+
<td><%= number_to_currency @transaction.amount_charged %></td>
|
20
|
+
<td><%= tb_checkout_status_label_for_transaction(@transaction.status) %></td>
|
21
|
+
</tbody>
|
22
|
+
</table>
|
23
|
+
</div>
|
22
24
|
|
23
25
|
<h3>Billing Address</h3>
|
24
|
-
<
|
25
|
-
<
|
26
|
-
<
|
27
|
-
<
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
<
|
37
|
-
<
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
</
|
26
|
+
<div class="table-responsive">
|
27
|
+
<table class="table table-bordered">
|
28
|
+
<thead>
|
29
|
+
<tr>
|
30
|
+
<th>Name</th>
|
31
|
+
<th>Address</th>
|
32
|
+
<th>Address 2</th>
|
33
|
+
<th>City</th>
|
34
|
+
<th>State</th>
|
35
|
+
<th>Postal</th>
|
36
|
+
</tr>
|
37
|
+
</thead>
|
38
|
+
<tbody>
|
39
|
+
<tr>
|
40
|
+
<td><%= @transaction.billing_full_name %></td>
|
41
|
+
<td><%= @transaction.billing_address_1 %></td>
|
42
|
+
<td><%= @transaction.billing_address_2 || "--" %></td>
|
43
|
+
<td><%= @transaction.billing_city %></td>
|
44
|
+
<td><%= @transaction.billing_state %></td>
|
45
|
+
<td><%= @transaction.billing_postal %></td>
|
46
|
+
</tr>
|
47
|
+
</table>
|
48
|
+
</tbody>
|
45
49
|
|
46
50
|
<h3>Line Items</h3>
|
47
|
-
<
|
48
|
-
<
|
49
|
-
<
|
50
|
-
<
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
51
|
+
<div class="table-responsive">
|
52
|
+
<table class="table table-bordered">
|
53
|
+
<thead>
|
54
|
+
<tr>
|
55
|
+
<th>Product</th>
|
56
|
+
<th>Quantity</th>
|
57
|
+
<th>Price</th>
|
58
|
+
</tr>
|
59
|
+
</thead>
|
60
|
+
<tbody>
|
61
|
+
<% @transaction.cart.cart_items.each do |cart_item| %>
|
62
|
+
<tr>
|
63
|
+
<td><%= cart_item.item_description %></td>
|
64
|
+
<td><%= cart_item.quantity %></td>
|
65
|
+
<td><%= number_to_currency cart_item.total_price %></td>
|
66
|
+
</tr>
|
67
|
+
<% end %>
|
68
|
+
</tbody>
|
69
|
+
<tfoot>
|
57
70
|
<tr>
|
58
|
-
<td
|
59
|
-
<td><%=
|
60
|
-
<td><%= number_to_currency cart_item.total_price %></td>
|
71
|
+
<td colspan="2">Total</td>
|
72
|
+
<td><%= number_to_currency @transaction.cart.total_price %></td>
|
61
73
|
</tr>
|
62
|
-
|
63
|
-
</
|
64
|
-
|
65
|
-
<tr>
|
66
|
-
<td colspan="2">Total</td>
|
67
|
-
<td><%= number_to_currency @transaction.cart.total_price %></td>
|
68
|
-
</tr>
|
69
|
-
</tfoot>
|
70
|
-
</table>
|
74
|
+
</tfoot>
|
75
|
+
</table>
|
76
|
+
</div>
|
data/lib/tb_checkout/engine.rb
CHANGED
data/lib/tb_checkout/version.rb
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
shared_examples_for "belongs_to_spud_user_session" do |related_model_factory|
|
4
|
+
|
5
|
+
describe '.for_user' do
|
6
|
+
it 'should return all records for the given user'
|
7
|
+
it 'should not return any records of the given user is nil'
|
8
|
+
end
|
9
|
+
|
10
|
+
describe '.for_session' do
|
11
|
+
it 'should return all records for the given session_id'
|
12
|
+
it 'should not return any records of the given session_id is nil'
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '#belongs_to?' do
|
16
|
+
it 'should return true if the user matches'
|
17
|
+
it 'should return true if the session_id matches'
|
18
|
+
it 'should return false'
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -10,8 +10,8 @@ RSpec.describe TbCheckout::TransactionsController, :type => :controller do
|
|
10
10
|
it "should list transactions for the current session" do
|
11
11
|
iterations = 3
|
12
12
|
iterations.times do |i|
|
13
|
-
cart = FactoryGirl.create(:tb_checkout_cart, :session_id => session.id)
|
14
|
-
|
13
|
+
cart = FactoryGirl.create(:tb_checkout_cart, :spud_user => nil, :session_id => session.id)
|
14
|
+
FactoryGirl.create(:tb_checkout_transaction, :captured, :cart => cart)
|
15
15
|
end
|
16
16
|
get :index
|
17
17
|
expect(response).to be_success
|
@@ -28,7 +28,7 @@ RSpec.describe TbCheckout::TransactionsController, :type => :controller do
|
|
28
28
|
it "should list transactions for the current user" do
|
29
29
|
iterations = 3
|
30
30
|
iterations.times do |i|
|
31
|
-
|
31
|
+
FactoryGirl.create(:tb_checkout_transaction, :captured, :cart => cart)
|
32
32
|
end
|
33
33
|
get :index
|
34
34
|
expect(response).to be_success
|
@@ -90,15 +90,6 @@ RSpec.describe TbCheckout::TransactionsController, :type => :controller do
|
|
90
90
|
end
|
91
91
|
end
|
92
92
|
|
93
|
-
it "should autofill the most recent billing info" do
|
94
|
-
controller.tb_checkout_current_cart.add_to_cart(FactoryGirl.create(:tb_checkout_basic_product))
|
95
|
-
transaction = FactoryGirl.create(:tb_checkout_transaction, :captured, :cart => controller.tb_checkout_current_cart, :spud_user => user)
|
96
|
-
|
97
|
-
controller.tb_checkout_current_cart.add_to_cart(FactoryGirl.create(:tb_checkout_basic_product))
|
98
|
-
get :new
|
99
|
-
expect(assigns(:transaction).billing_first_name).to eq(transaction.billing_first_name)
|
100
|
-
end
|
101
|
-
|
102
93
|
it "should show the transaction detail" do
|
103
94
|
transaction = FactoryGirl.create(:tb_checkout_transaction, :captured, :cart => cart, :spud_user => user)
|
104
95
|
get :show, :id => transaction.id
|
@@ -20,7 +20,7 @@ Rails.application.configure do
|
|
20
20
|
# config.action_dispatch.rack_cache = true
|
21
21
|
|
22
22
|
# Disable Rails's static asset server (Apache or nginx will already do this).
|
23
|
-
config.
|
23
|
+
config.serve_static_files = false
|
24
24
|
|
25
25
|
# Compress JavaScripts and CSS.
|
26
26
|
config.assets.js_compressor = :uglifier
|
@@ -13,7 +13,7 @@ Rails.application.configure do
|
|
13
13
|
config.eager_load = false
|
14
14
|
|
15
15
|
# Configure static asset server for tests with Cache-Control for performance.
|
16
|
-
config.
|
16
|
+
config.serve_static_files = true
|
17
17
|
config.static_cache_control = 'public, max-age=3600'
|
18
18
|
|
19
19
|
# Show full error reports and disable caching.
|
data/spec/dummy/db/schema.rb
CHANGED
@@ -13,18 +13,18 @@
|
|
13
13
|
|
14
14
|
ActiveRecord::Schema.define(version: 20140915234534) do
|
15
15
|
|
16
|
-
create_table "spud_permissions", force:
|
17
|
-
t.string "name", null: false
|
18
|
-
t.string "tag", null: false
|
16
|
+
create_table "spud_permissions", force: :cascade do |t|
|
17
|
+
t.string "name", limit: 255, null: false
|
18
|
+
t.string "tag", limit: 255, null: false
|
19
19
|
t.datetime "created_at"
|
20
20
|
t.datetime "updated_at"
|
21
21
|
end
|
22
22
|
|
23
23
|
add_index "spud_permissions", ["tag"], name: "index_spud_permissions_on_tag", unique: true, using: :btree
|
24
24
|
|
25
|
-
create_table "spud_role_permissions", force:
|
26
|
-
t.integer "spud_role_id", null: false
|
27
|
-
t.string "spud_permission_tag", null: false
|
25
|
+
create_table "spud_role_permissions", force: :cascade do |t|
|
26
|
+
t.integer "spud_role_id", limit: 4, null: false
|
27
|
+
t.string "spud_permission_tag", limit: 255, null: false
|
28
28
|
t.datetime "created_at"
|
29
29
|
t.datetime "updated_at"
|
30
30
|
end
|
@@ -32,62 +32,62 @@ ActiveRecord::Schema.define(version: 20140915234534) do
|
|
32
32
|
add_index "spud_role_permissions", ["spud_permission_tag"], name: "index_spud_role_permissions_on_spud_permission_tag", using: :btree
|
33
33
|
add_index "spud_role_permissions", ["spud_role_id"], name: "index_spud_role_permissions_on_spud_role_id", using: :btree
|
34
34
|
|
35
|
-
create_table "spud_roles", force:
|
36
|
-
t.string "name"
|
35
|
+
create_table "spud_roles", force: :cascade do |t|
|
36
|
+
t.string "name", limit: 255
|
37
37
|
t.datetime "created_at"
|
38
38
|
t.datetime "updated_at"
|
39
39
|
end
|
40
40
|
|
41
|
-
create_table "spud_user_settings", force:
|
42
|
-
t.integer "spud_user_id"
|
43
|
-
t.string "key"
|
44
|
-
t.string "value"
|
41
|
+
create_table "spud_user_settings", force: :cascade do |t|
|
42
|
+
t.integer "spud_user_id", limit: 4
|
43
|
+
t.string "key", limit: 255
|
44
|
+
t.string "value", limit: 255
|
45
45
|
t.datetime "created_at"
|
46
46
|
t.datetime "updated_at"
|
47
47
|
end
|
48
48
|
|
49
|
-
create_table "spud_users", force:
|
50
|
-
t.string "first_name"
|
51
|
-
t.string "last_name"
|
52
|
-
t.boolean "super_admin"
|
53
|
-
t.string "login",
|
54
|
-
t.string "email",
|
55
|
-
t.string "crypted_password",
|
56
|
-
t.string "password_salt",
|
57
|
-
t.string "persistence_token",
|
58
|
-
t.string "single_access_token", null: false
|
59
|
-
t.string "perishable_token",
|
60
|
-
t.integer "login_count", default: 0, null: false
|
61
|
-
t.integer "failed_login_count", default: 0, null: false
|
49
|
+
create_table "spud_users", force: :cascade do |t|
|
50
|
+
t.string "first_name", limit: 255
|
51
|
+
t.string "last_name", limit: 255
|
52
|
+
t.boolean "super_admin", limit: 1
|
53
|
+
t.string "login", limit: 255, null: false
|
54
|
+
t.string "email", limit: 255, null: false
|
55
|
+
t.string "crypted_password", limit: 255, null: false
|
56
|
+
t.string "password_salt", limit: 255, null: false
|
57
|
+
t.string "persistence_token", limit: 255, null: false
|
58
|
+
t.string "single_access_token", limit: 255, null: false
|
59
|
+
t.string "perishable_token", limit: 255, null: false
|
60
|
+
t.integer "login_count", limit: 4, default: 0, null: false
|
61
|
+
t.integer "failed_login_count", limit: 4, default: 0, null: false
|
62
62
|
t.datetime "last_request_at"
|
63
63
|
t.datetime "current_login_at"
|
64
64
|
t.datetime "last_login_at"
|
65
|
-
t.string "current_login_ip"
|
66
|
-
t.string "last_login_ip"
|
65
|
+
t.string "current_login_ip", limit: 255
|
66
|
+
t.string "last_login_ip", limit: 255
|
67
67
|
t.datetime "created_at"
|
68
68
|
t.datetime "updated_at"
|
69
|
-
t.string "time_zone"
|
70
|
-
t.integer "spud_role_id"
|
69
|
+
t.string "time_zone", limit: 255
|
70
|
+
t.integer "spud_role_id", limit: 4
|
71
71
|
end
|
72
72
|
|
73
73
|
add_index "spud_users", ["email"], name: "index_spud_users_on_email", using: :btree
|
74
74
|
add_index "spud_users", ["login"], name: "index_spud_users_on_login", using: :btree
|
75
75
|
add_index "spud_users", ["spud_role_id"], name: "index_spud_users_on_spud_role_id", using: :btree
|
76
76
|
|
77
|
-
create_table "tb_checkout_basic_products", force:
|
78
|
-
t.string "description"
|
79
|
-
t.decimal "price",
|
77
|
+
create_table "tb_checkout_basic_products", force: :cascade do |t|
|
78
|
+
t.string "description", limit: 255
|
79
|
+
t.decimal "price", precision: 8, scale: 2
|
80
80
|
t.datetime "created_at"
|
81
81
|
t.datetime "updated_at"
|
82
82
|
end
|
83
83
|
|
84
|
-
create_table "tb_checkout_cart_items", force:
|
85
|
-
t.integer "cart_id",
|
86
|
-
t.integer "item_id",
|
87
|
-
t.string "item_type",
|
88
|
-
t.string "item_description"
|
89
|
-
t.decimal "item_price",
|
90
|
-
t.integer "quantity",
|
84
|
+
create_table "tb_checkout_cart_items", force: :cascade do |t|
|
85
|
+
t.integer "cart_id", limit: 4, null: false
|
86
|
+
t.integer "item_id", limit: 4, null: false
|
87
|
+
t.string "item_type", limit: 255, null: false
|
88
|
+
t.string "item_description", limit: 255
|
89
|
+
t.decimal "item_price", precision: 8, scale: 2
|
90
|
+
t.integer "quantity", limit: 4, default: 1
|
91
91
|
t.datetime "created_at"
|
92
92
|
t.datetime "updated_at"
|
93
93
|
end
|
@@ -95,36 +95,36 @@ ActiveRecord::Schema.define(version: 20140915234534) do
|
|
95
95
|
add_index "tb_checkout_cart_items", ["cart_id"], name: "index_tb_checkout_cart_items_on_cart_id", using: :btree
|
96
96
|
add_index "tb_checkout_cart_items", ["item_id", "item_type"], name: "index_tb_checkout_cart_items_on_item_id_and_item_type", using: :btree
|
97
97
|
|
98
|
-
create_table "tb_checkout_carts", force:
|
99
|
-
t.integer "spud_user_id"
|
98
|
+
create_table "tb_checkout_carts", force: :cascade do |t|
|
99
|
+
t.integer "spud_user_id", limit: 4
|
100
100
|
t.string "session_id", limit: 32
|
101
|
-
t.boolean "is_completed",
|
102
|
-
t.boolean "is_abandoned",
|
101
|
+
t.boolean "is_completed", limit: 1, default: false
|
102
|
+
t.boolean "is_abandoned", limit: 1, default: false
|
103
103
|
t.datetime "created_at"
|
104
104
|
t.datetime "updated_at"
|
105
105
|
end
|
106
106
|
|
107
107
|
add_index "tb_checkout_carts", ["spud_user_id"], name: "index_tb_checkout_carts_on_spud_user_id", using: :btree
|
108
108
|
|
109
|
-
create_table "tb_checkout_transactions", force:
|
110
|
-
t.integer "cart_id"
|
111
|
-
t.string "status",
|
112
|
-
t.string "invoice_num"
|
109
|
+
create_table "tb_checkout_transactions", force: :cascade do |t|
|
110
|
+
t.integer "cart_id", limit: 4
|
111
|
+
t.string "status", limit: 255, default: "pending"
|
112
|
+
t.string "invoice_num", limit: 255
|
113
113
|
t.integer "gateway_transaction_id", limit: 8
|
114
|
-
t.decimal "amount_charged",
|
115
|
-
t.string "card_display"
|
116
|
-
t.string "card_type"
|
117
|
-
t.string "billing_first_name"
|
118
|
-
t.string "billing_last_name"
|
119
|
-
t.string "billing_address_1"
|
120
|
-
t.string "billing_address_2"
|
121
|
-
t.string "billing_city"
|
122
|
-
t.string "billing_state"
|
123
|
-
t.string "billing_postal"
|
124
|
-
t.text "response_text"
|
114
|
+
t.decimal "amount_charged", precision: 8, scale: 2
|
115
|
+
t.string "card_display", limit: 255
|
116
|
+
t.string "card_type", limit: 255
|
117
|
+
t.string "billing_first_name", limit: 255
|
118
|
+
t.string "billing_last_name", limit: 255
|
119
|
+
t.string "billing_address_1", limit: 255
|
120
|
+
t.string "billing_address_2", limit: 255
|
121
|
+
t.string "billing_city", limit: 255
|
122
|
+
t.string "billing_state", limit: 255
|
123
|
+
t.string "billing_postal", limit: 255
|
124
|
+
t.text "response_text", limit: 65535
|
125
125
|
t.datetime "created_at"
|
126
126
|
t.datetime "updated_at"
|
127
|
-
t.integer "spud_user_id"
|
127
|
+
t.integer "spud_user_id", limit: 4
|
128
128
|
t.string "session_id", limit: 32
|
129
129
|
end
|
130
130
|
|
@@ -3,9 +3,11 @@
|
|
3
3
|
FactoryGirl.define do
|
4
4
|
factory :tb_checkout_transaction, :class => 'TbCheckout::Transaction' do
|
5
5
|
association :cart, :factory => :tb_checkout_cart
|
6
|
+
spud_user nil
|
6
7
|
amount_charged 0
|
7
8
|
card_type "visa"
|
8
9
|
card_number "4024007152451281"
|
10
|
+
session_id "8f74e68687a91c13901ae8809e8fdb6b"
|
9
11
|
|
10
12
|
# The following is NOT a valid cc number and should throw a basic validation error
|
11
13
|
trait :with_invalid_card do
|
data/spec/rails_helper.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
# This file is copied to spec/ when you run 'rails generate rspec:install'
|
2
2
|
ENV["RAILS_ENV"] ||= 'test'
|
3
|
-
|
4
|
-
require File.expand_path("../dummy/config/environment.rb", __FILE__)
|
5
3
|
require 'spec_helper'
|
4
|
+
require File.expand_path("../dummy/config/environment.rb", __FILE__)
|
6
5
|
require 'rspec/rails'
|
6
|
+
|
7
7
|
require 'database_cleaner'
|
8
|
-
require 'simplecov'
|
9
8
|
require 'factory_girl_rails'
|
9
|
+
require 'simplecov'
|
10
10
|
|
11
11
|
# Authlogic helpers
|
12
12
|
require "authlogic/test_case"
|
@@ -31,7 +31,7 @@ SimpleCov.start 'rails'
|
|
31
31
|
# require only the support files necessary.
|
32
32
|
#
|
33
33
|
# Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
|
34
|
-
Dir[
|
34
|
+
Dir[TbCheckout::Engine.root.join("spec/concerns/**/*.rb")].each { |f| require f }
|
35
35
|
|
36
36
|
# Checks for pending migrations before tests are run.
|
37
37
|
# If you are not using ActiveRecord, you can remove this line.
|
metadata
CHANGED
@@ -1,57 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tb_checkout
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Westlake Design
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: tb_core
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 1.3.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: tb_core
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 1.2.7
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: 1.2.7
|
26
|
+
version: 1.3.0
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: activemerchant
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
44
30
|
requirements:
|
45
31
|
- - "~>"
|
46
32
|
- !ruby/object:Gem::Version
|
47
|
-
version: 1.
|
33
|
+
version: 1.46.0
|
48
34
|
type: :runtime
|
49
35
|
prerelease: false
|
50
36
|
version_requirements: !ruby/object:Gem::Requirement
|
51
37
|
requirements:
|
52
38
|
- - "~>"
|
53
39
|
- !ruby/object:Gem::Version
|
54
|
-
version: 1.
|
40
|
+
version: 1.46.0
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
42
|
name: mysql2
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,14 +72,14 @@ dependencies:
|
|
86
72
|
requirements:
|
87
73
|
- - "~>"
|
88
74
|
- !ruby/object:Gem::Version
|
89
|
-
version: 4.
|
75
|
+
version: 4.5.0
|
90
76
|
type: :development
|
91
77
|
prerelease: false
|
92
78
|
version_requirements: !ruby/object:Gem::Requirement
|
93
79
|
requirements:
|
94
80
|
- - "~>"
|
95
81
|
- !ruby/object:Gem::Version
|
96
|
-
version: 4.
|
82
|
+
version: 4.5.0
|
97
83
|
- !ruby/object:Gem::Dependency
|
98
84
|
name: database_cleaner
|
99
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -114,14 +100,14 @@ dependencies:
|
|
114
100
|
requirements:
|
115
101
|
- - "~>"
|
116
102
|
- !ruby/object:Gem::Version
|
117
|
-
version: 0.
|
103
|
+
version: 0.9.1
|
118
104
|
type: :development
|
119
105
|
prerelease: false
|
120
106
|
version_requirements: !ruby/object:Gem::Requirement
|
121
107
|
requirements:
|
122
108
|
- - "~>"
|
123
109
|
- !ruby/object:Gem::Version
|
124
|
-
version: 0.
|
110
|
+
version: 0.9.1
|
125
111
|
description: TB Checkout is a shopping cart and payments system designed for use with
|
126
112
|
Twice Baked and Active Merchant
|
127
113
|
email:
|
@@ -192,6 +178,7 @@ files:
|
|
192
178
|
- lib/tb_checkout/engine.rb
|
193
179
|
- lib/tb_checkout/schema.rb
|
194
180
|
- lib/tb_checkout/version.rb
|
181
|
+
- spec/concerns/belongs_to_spud_user_session.rb
|
195
182
|
- spec/controllers/tb_checkout/carts_controller_spec.rb
|
196
183
|
- spec/controllers/tb_checkout/transactions_controller_spec.rb
|
197
184
|
- spec/dummy/README.rdoc
|
@@ -270,11 +257,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
270
257
|
version: '0'
|
271
258
|
requirements: []
|
272
259
|
rubyforge_project:
|
273
|
-
rubygems_version: 2.
|
260
|
+
rubygems_version: 2.4.5
|
274
261
|
signing_key:
|
275
262
|
specification_version: 4
|
276
263
|
summary: Simple shopping cart and checkout system for Twice Baked
|
277
264
|
test_files:
|
265
|
+
- spec/concerns/belongs_to_spud_user_session.rb
|
278
266
|
- spec/controllers/tb_checkout/carts_controller_spec.rb
|
279
267
|
- spec/controllers/tb_checkout/transactions_controller_spec.rb
|
280
268
|
- spec/dummy/app/assets/javascripts/application.js
|