active_cart 0.0.7 → 0.0.8

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.
data/.gitignore CHANGED
@@ -2,3 +2,4 @@
2
2
  pkg
3
3
  rdoc
4
4
  test/log/*.log
5
+ coverage
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.7
1
+ 0.0.8
@@ -78,9 +78,16 @@ module ActiveCart
78
78
  # @cart[0].size # => 7
79
79
  # @cart[1].size # => 4
80
80
  #
81
+ # Callbacks:
82
+ #
83
+ # Calls the storage engines before_add_to_cart(item, quantity) and after_add_to_cart(item, quantity) methods (if they exist). If before_add_to_cart returns false, the add will be halted.
84
+ # Calls the items before_add_to_item(quantity) and after_add_to_cart(quantity) methods (if they exist). If before_add_to_cart returns false, the add will be halted.
85
+ #
81
86
  def add_to_cart(item, quantity = 1)
82
87
  return false unless item.before_add_to_cart(quantity) if item.respond_to?(:before_add_to_cart)
88
+ return false unless @storage_engine.before_add_to_cart(item, quantity) if @storage_engine.respond_to?(:before_add_to_cart)
83
89
  @storage_engine.add_to_cart(item, quantity)
90
+ @storage_engine.after_add_to_cart(item, quantity) if @storage_engine.respond_to?(:after_add_to_cart)
84
91
  item.after_add_to_cart(quantity) if item.respond_to?(:after_add_to_cart)
85
92
  end
86
93
 
@@ -93,9 +100,16 @@ module ActiveCart
93
100
  # @cart.remove_from_cart(item, 2)
94
101
  # @cart[0] # => nil
95
102
  #
103
+ # Callbacks:
104
+ #
105
+ # Calls the storage engines before_remove_from_cart(item, quantity) and after_remove_from_cart(item, quantity) methods (if they exist). If before_remove_from_cart returns false, the remove will be halted.
106
+ # Calls the items before_remove_from_item(quantity) and after_remove_from_cart(quantity) methods (if they exist). If before_remove_from_cart returns false, the remove will be halted.
107
+ #
96
108
  def remove_from_cart(item, quantity = 1)
97
109
  return false unless item.before_remove_from_cart(quantity) if item.respond_to?(:before_remove_from_cart)
110
+ return false unless @storage_engine.before_remove_from_cart(item, quantity) if @storage_engine.respond_to?(:before_remove_from_cart)
98
111
  @storage_engine.remove_from_cart(item, quantity)
112
+ @storage_engine.after_remove_from_cart(item, quantity) if @storage_engine.respond_to?(:after_remove_from_cart)
99
113
  item.after_remove_from_cart(quantity) if item.respond_to?(:after_remove_from_cart)
100
114
  end
101
115
 
@@ -111,29 +125,14 @@ module ActiveCart
111
125
  storage_engine.state
112
126
  end
113
127
 
114
- # Transitions to the cart's :shopping state
115
- def continue_shopping!
116
- storage_engine.continue_shopping!
117
- end
118
-
119
- # Transitions to the cart's :checkout state
120
- def checkout!
121
- storage_engine.checkout!
122
- end
123
-
124
- # Transitions to the cart's :verifying_payment state
125
- def check_payment!
126
- storage_engine.check_payment!
127
- end
128
-
129
- # Transitions to the cart's :successful state
130
- def payment_successful!
131
- storage_engine.payment_successful!
132
- end
133
-
134
- # Transitions to the cart's :failed state
135
- def payment_failed!
136
- storage_engine.payment_failed!
128
+ # :nodoc
129
+ def method_missing(symbol, *args)
130
+ # This allows developers to add extra aasm event transaction, and still allow them to called from the cart
131
+ if @storage_engine.class.aasm_events.keys.include?(symbol.to_s[0..-2].to_sym)
132
+ @storage_engine.send(symbol)
133
+ else
134
+ super
135
+ end
137
136
  end
138
137
  end
139
138
  end
@@ -15,73 +15,104 @@ module ActiveCart
15
15
  module CartStorage
16
16
  def self.included(base) #:nodoc:
17
17
  base.send :include, AASM
18
+
18
19
  base.aasm_initial_state :shopping
19
- base.aasm_state :shopping
20
- base.aasm_state :checkout
21
- base.aasm_state :verifying_payment
22
- base.aasm_state :completed
23
- base.aasm_state :failed
20
+ base.aasm_state :shopping, :enter => :enter_shopping, :exit => :exit_shopping
21
+ base.aasm_state :checkout, :enter => :enter_checkout, :exit => :exit_checkout
22
+ base.aasm_state :verifying_payment, :enter => :enter_verifying_payment, :exit => :exit_verifying_payment
23
+ base.aasm_state :completed, :enter => :enter_completed, :ext => :exit_completed
24
+ base.aasm_state :failed, :enter => :enter_failed, :exit => :exit_failed
24
25
 
25
26
  base.aasm_event :continue_shopping do
26
- transitions :from => [ :checkout, :verifying_payment ], :to => :shopping, :enter => :before_continue_shopping, :exit => :after_continue_shopping
27
+ transitions :from => [ :checkout, :verifying_payment ], :to => :shopping, :guard => :guard_continue_shopping
27
28
  end
28
29
 
29
30
  base.aasm_event :checkout do
30
- transitions :from => [ :shopping, :verifying_payment ], :to => :checkout, :enter => :before_checkout, :exit => :after_checkout
31
+ transitions :from => [ :shopping, :verifying_payment ], :to => :checkout, :guard => :guard_checkout
31
32
  end
32
33
 
33
34
  base.aasm_event :check_payment do
34
- transitions :from => :checkout, :to => :verifying_payment, :enter => :before_check_payment, :exit => :after_check_payment
35
+ transitions :from => :checkout, :to => :verifying_payment, :guard => :guard_check_payment
35
36
  end
36
37
 
37
38
  base.aasm_event :payment_successful do
38
- transitions :from => :verifying_payment, :to => :completed, :enter => :before_payment_successful, :exit => :after_payment_successful
39
+ transitions :from => :verifying_payment, :to => :completed, :guard => :guard_payment_successful
39
40
  end
40
41
 
41
42
  base.aasm_event :payment_failed do
42
- transitions :from => :verifying_payment, :to => :failed, :enter => :before_payment_failed, :exit => :after_payment_failed
43
+ transitions :from => :verifying_payment, :to => :failed, :guard => :guard_payment_failed
43
44
  end
44
45
  end
45
46
 
46
- # Called before transitioning into continuing_shopping
47
+ # Guard continue shopping. If this method returns false, the transition will be halted
48
+ #
49
+ def guard_continue_shopping
50
+ true
51
+ end
52
+
53
+ # Guard checkout. If this method returns false, the transition will be halted
54
+ #
55
+ def guard_checkout
56
+ true
57
+ end
58
+
59
+ # Guard check payment. If this method returns false, the transition will be halted
60
+ #
61
+ def guard_check_payment
62
+ true
63
+ end
64
+
65
+ # Guard payment successful. If this method returns false, the transition will be halted
66
+ #
67
+ def guard_payment_successful
68
+ true
69
+ end
70
+
71
+ # Guard payment failed. If this method returns false, the transition will be halted
72
+ #
73
+ def guard_payment_failed
74
+ true
75
+ end
76
+
77
+ # Called when entering the shopping state
47
78
  #
48
- def before_continuing_shopping; end
79
+ def enter_shopping; end
49
80
 
50
- # Called after transitioning into continuing_shopping
81
+ # Called when exiting the shopping state
51
82
  #
52
- def after_continuing_shopping; end
83
+ def exit_shopping; end
53
84
 
54
- # Called before transitioning into checkout
85
+ # Called when entering the checkout state
55
86
  #
56
- def before_checkout; end
87
+ def enter_checkout; end
57
88
 
58
- # Called after transitioning into checkout
89
+ # Called when existing the checkout state
59
90
  #
60
- def after_checkout; end
91
+ def exit_checkout; end
61
92
 
62
- # Called before transitioning into check_payment
93
+ # Called when entering the verifying_payment state
63
94
  #
64
- def before_check_payment; end
95
+ def enter_verifying_payment; end
65
96
 
66
- # Called after transitioning into check_payment
97
+ # Called when exiting the verifying_payment state
67
98
  #
68
- def after_check_payment; end
99
+ def exit_verifying_payment; end
69
100
 
70
- # Called before transitioning into payment_successful
101
+ # Called when entering the completed state
71
102
  #
72
- def before_payment_successful; end
103
+ def enter_completed; end
73
104
 
74
- # Called after transitioning into payment_successful
105
+ # Called when existing the completed state
75
106
  #
76
- def after_payment_successful; end
107
+ def exit_completed; end
77
108
 
78
- # Called before transitioning into failed
109
+ # Called when entering the failed state
79
110
  #
80
- def before_payment_failed; end
111
+ def enter_failed; end
81
112
 
82
- # Called after transitioning into failed
113
+ # Called when existing the failed state
83
114
  #
84
- def after_payment_failed; end
115
+ def exit_failed; end
85
116
 
86
117
  # Returns the unique invoice_id for this cart instance. This MUST be overriden by the concrete class this module is mixed into, otherwise you
87
118
  # will get a NotImplementedError
@@ -14,13 +14,33 @@ class CartStorageTest < ActiveSupport::TestCase
14
14
  end
15
15
 
16
16
  should 'transition from shopping to checkout' do
17
+ @cart_storage_engine.expects(:exit_shopping)
18
+ @cart_storage_engine.expects(:enter_checkout)
19
+ @cart_storage_engine.expects(:guard_checkout).returns(true)
20
+
17
21
  assert_nothing_raised do
18
22
  @cart_storage_engine.checkout!
19
23
  end
20
24
  assert_equal :checkout, @cart_storage_engine.state
21
25
  end
22
26
 
27
+ should 'not transition from shopping to checkout if guard_checkout is false' do
28
+ @cart_storage_engine.expects(:guard_checkout).returns(false)
29
+ @cart_storage_engine.expects(:exit_shopping)
30
+ @cart_storage_engine.expects(:enter_shopping)
31
+ @cart_storage_engine.expects(:enter_checkout).never
32
+
33
+ assert_nothing_raised do
34
+ @cart_storage_engine.checkout!
35
+ end
36
+ assert_equal :shopping, @cart_storage_engine.state
37
+ end
38
+
23
39
  should 'transition from checkout to check_payment' do
40
+ @cart_storage_engine.expects(:enter_verifying_payment)
41
+ @cart_storage_engine.expects(:exit_checkout)
42
+ @cart_storage_engine.expects(:guard_check_payment).returns(true)
43
+
24
44
  @cart_storage_engine.checkout!
25
45
  assert_nothing_raised do
26
46
  @cart_storage_engine.check_payment!
@@ -28,7 +48,24 @@ class CartStorageTest < ActiveSupport::TestCase
28
48
  assert_equal :verifying_payment, @cart_storage_engine.state
29
49
  end
30
50
 
51
+ should 'not transition from checkout to check_payment if guard_check_payment is false' do
52
+ @cart_storage_engine.expects(:enter_verifying_payment).never
53
+ @cart_storage_engine.expects(:exit_checkout)
54
+ @cart_storage_engine.expects(:enter_checkout)
55
+ @cart_storage_engine.expects(:guard_check_payment).returns(false)
56
+
57
+ @cart_storage_engine.checkout!
58
+ assert_nothing_raised do
59
+ @cart_storage_engine.check_payment!
60
+ end
61
+ assert_equal :checkout, @cart_storage_engine.state
62
+ end
63
+
31
64
  should 'transition from verifying_payment to completed' do
65
+ @cart_storage_engine.expects(:enter_completed)
66
+ @cart_storage_engine.expects(:exit_verifying_payment)
67
+ @cart_storage_engine.expects(:guard_payment_successful).returns(true)
68
+
32
69
  @cart_storage_engine.checkout!
33
70
  @cart_storage_engine.check_payment!
34
71
  assert_nothing_raised do
@@ -37,7 +74,25 @@ class CartStorageTest < ActiveSupport::TestCase
37
74
  assert_equal :completed, @cart_storage_engine.state
38
75
  end
39
76
 
77
+ should 'not transition from verifying_payment to completed if guard payment_successful is false' do
78
+ @cart_storage_engine.expects(:enter_completed).never
79
+ @cart_storage_engine.expects(:exit_verifying_payment)
80
+ @cart_storage_engine.expects(:enter_verifying_payment)
81
+ @cart_storage_engine.expects(:guard_payment_successful).returns(false)
82
+
83
+ @cart_storage_engine.checkout!
84
+ @cart_storage_engine.check_payment!
85
+ assert_nothing_raised do
86
+ @cart_storage_engine.payment_successful!
87
+ end
88
+ assert_equal :verifying_payment, @cart_storage_engine.state
89
+ end
90
+
40
91
  should 'transition from verifying_payment to shopping' do
92
+ @cart_storage_engine.expects(:enter_shopping).twice
93
+ @cart_storage_engine.expects(:exit_verifying_payment)
94
+ @cart_storage_engine.expects(:guard_continue_shopping).returns(true)
95
+
41
96
  @cart_storage_engine.checkout!
42
97
  @cart_storage_engine.check_payment!
43
98
  assert_nothing_raised do
@@ -46,16 +101,52 @@ class CartStorageTest < ActiveSupport::TestCase
46
101
  assert_equal :shopping, @cart_storage_engine.state
47
102
  end
48
103
 
104
+ should 'not transition from verifying_payment to shopping if guard_continue_shopping is false' do
105
+ @cart_storage_engine.expects(:enter_shopping).once
106
+ @cart_storage_engine.expects(:exit_verifying_payment)
107
+ @cart_storage_engine.expects(:enter_verifying_payment)
108
+ @cart_storage_engine.expects(:guard_continue_shopping).returns(false)
109
+
110
+ @cart_storage_engine.checkout!
111
+ @cart_storage_engine.check_payment!
112
+ assert_nothing_raised do
113
+ @cart_storage_engine.continue_shopping!
114
+ end
115
+ assert_equal :verifying_payment, @cart_storage_engine.state
116
+ end
117
+
49
118
  should 'transition from verifying_payment to checkout' do
119
+ @cart_storage_engine.expects(:enter_completed)
120
+ @cart_storage_engine.expects(:exit_verifying_payment)
121
+ @cart_storage_engine.expects(:guard_payment_successful).returns(true)
122
+
50
123
  @cart_storage_engine.checkout!
51
124
  @cart_storage_engine.check_payment!
52
125
  assert_nothing_raised do
53
- @cart_storage_engine.checkout!
126
+ @cart_storage_engine.payment_successful!
54
127
  end
55
- assert_equal :checkout, @cart_storage_engine.state
128
+ assert_equal :completed, @cart_storage_engine.state
129
+ end
130
+
131
+ should 'not transition from verifying_payment to checkout if guard_payment_successful is false' do
132
+ @cart_storage_engine.expects(:enter_completed).never
133
+ @cart_storage_engine.expects(:exit_verifying_payment)
134
+ @cart_storage_engine.expects(:enter_verifying_payment)
135
+ @cart_storage_engine.expects(:guard_payment_successful).returns(false)
136
+
137
+ @cart_storage_engine.checkout!
138
+ @cart_storage_engine.check_payment!
139
+ assert_nothing_raised do
140
+ @cart_storage_engine.payment_successful!
141
+ end
142
+ assert_equal :verifying_payment, @cart_storage_engine.state
56
143
  end
57
144
 
58
145
  should 'transition from verifying_payment to failed' do
146
+ @cart_storage_engine.expects(:enter_failed)
147
+ @cart_storage_engine.expects(:exit_verifying_payment)
148
+ @cart_storage_engine.expects(:guard_payment_failed).returns(true)
149
+
59
150
  @cart_storage_engine.checkout!
60
151
  @cart_storage_engine.check_payment!
61
152
  assert_nothing_raised do
@@ -63,6 +154,21 @@ class CartStorageTest < ActiveSupport::TestCase
63
154
  end
64
155
  assert_equal :failed, @cart_storage_engine.state
65
156
  end
157
+
158
+ should 'not transition from verifying_payment to failed if guard_payment_failed if false' do
159
+ @cart_storage_engine.expects(:enter_failed).never
160
+ @cart_storage_engine.expects(:exit_verifying_payment)
161
+ @cart_storage_engine.expects(:enter_verifying_payment)
162
+ @cart_storage_engine.expects(:guard_payment_failed).returns(false)
163
+
164
+ @cart_storage_engine.checkout!
165
+ @cart_storage_engine.check_payment!
166
+ assert_nothing_raised do
167
+ @cart_storage_engine.payment_failed!
168
+ end
169
+ assert_equal :verifying_payment, @cart_storage_engine.state
170
+ end
171
+
66
172
  end
67
173
  end
68
174
 
@@ -9,46 +9,92 @@ class CartTest < ActiveSupport::TestCase
9
9
  end
10
10
 
11
11
  context 'callbacks' do
12
- should 'fire the item before_add_to_cart callback on add to cart' do
13
- item = TestItem.new
14
- item.expects(:before_add_to_cart).with(1).returns(true)
15
- @cart.add_to_cart(item, 1)
16
- assert_equal 1, @cart.quantity
17
- end
12
+ context 'items' do
13
+ should 'fire the item before_add_to_cart callback on add to cart' do
14
+ item = TestItem.new
15
+ item.expects(:before_add_to_cart).with(1).returns(true)
16
+ @cart.add_to_cart(item, 1)
17
+ assert_equal 1, @cart.quantity
18
+ end
18
19
 
19
- should 'halt and return false if beforee_add_to_cart returnds false' do
20
- item = TestItem.new
21
- item.expects(:before_add_to_cart).with(1).returns(false)
22
- assert !@cart.add_to_cart(item, 1)
23
- assert_equal 0, @cart.quantity
24
- end
20
+ should 'halt and return false if beforee_add_to_cart returnds false' do
21
+ item = TestItem.new
22
+ item.expects(:before_add_to_cart).with(1).returns(false)
23
+ assert !@cart.add_to_cart(item, 1)
24
+ assert_equal 0, @cart.quantity
25
+ end
25
26
 
26
- should 'fire the item after_add_to_cart callback' do
27
- item = TestItem.new
28
- item.expects(:after_add_to_cart).with(1)
29
- @cart.add_to_cart(item, 1)
30
- end
27
+ should 'fire the item after_add_to_cart callback' do
28
+ item = TestItem.new
29
+ item.expects(:after_add_to_cart).with(1)
30
+ @cart.add_to_cart(item, 1)
31
+ end
31
32
 
32
- should 'fire the item before_remove_from_cart callback on add to cart' do
33
- item = TestItem.new
34
- item.expects(:before_remove_from_cart).with(1).returns(true)
35
- @cart.remove_from_cart(item, 1)
36
- assert_equal 0, @cart.quantity
37
- end
33
+ should 'fire the item before_remove_from_cart callback on add to cart' do
34
+ item = TestItem.new
35
+ item.expects(:before_remove_from_cart).with(1).returns(true)
36
+ @cart.remove_from_cart(item, 1)
37
+ assert_equal 0, @cart.quantity
38
+ end
38
39
 
39
- should 'halt and return false if beforee_add_to_cart returns false' do
40
- item = TestItem.new
41
- @cart.add_to_cart(item, 1)
42
- assert_equal 1, @cart.quantity
43
- item.expects(:before_remove_from_cart).with(1).returns(false)
44
- assert !@cart.remove_from_cart(item, 1)
45
- assert_equal 1, @cart.quantity
40
+ should 'halt and return false if beforee_add_to_cart returns false' do
41
+ item = TestItem.new
42
+ @cart.add_to_cart(item, 1)
43
+ assert_equal 1, @cart.quantity
44
+ item.expects(:before_remove_from_cart).with(1).returns(false)
45
+ assert !@cart.remove_from_cart(item, 1)
46
+ assert_equal 1, @cart.quantity
47
+ end
48
+
49
+ should 'fire the item after_remove_from_cart callback' do
50
+ item = TestItem.new
51
+ item.expects(:after_remove_from_cart).with(1)
52
+ @cart.remove_from_cart(item, 1)
53
+ end
46
54
  end
47
55
 
48
- should 'fire the item after_remove_from_cart callback' do
49
- item = TestItem.new
50
- item.expects(:after_remove_from_cart).with(1)
51
- @cart.remove_from_cart(item, 1)
56
+ context 'storage engines' do
57
+ should 'fire the storage engines before_add_to_cart callback on add to cart' do
58
+ item = TestItem.new
59
+ @cart_storage_engine.expects(:before_add_to_cart).with(item, 1).returns(true)
60
+ @cart.add_to_cart(item, 1)
61
+ assert_equal 1, @cart.quantity
62
+ end
63
+
64
+ should 'halt and return false if before_add_to_cart returns false' do
65
+ item = TestItem.new
66
+ @cart_storage_engine.expects(:before_add_to_cart).with(item, 1).returns(false)
67
+ assert !@cart.add_to_cart(item, 1)
68
+ assert_equal 0, @cart.quantity
69
+ end
70
+
71
+ should 'fire the storage engines after_add_to_cart callback' do
72
+ item = TestItem.new
73
+ @cart_storage_engine.expects(:after_add_to_cart).with(item, 1)
74
+ @cart.add_to_cart(item, 1)
75
+ end
76
+
77
+ should 'fire the storage engines before_remove_from_cart callback on add to cart' do
78
+ item = TestItem.new
79
+ @cart_storage_engine.expects(:before_remove_from_cart).with(item, 1).returns(true)
80
+ @cart.remove_from_cart(item, 1)
81
+ assert_equal 0, @cart.quantity
82
+ end
83
+
84
+ should 'halt and return false if beforee_add_to_cart returns false' do
85
+ item = TestItem.new
86
+ @cart.add_to_cart(item, 1)
87
+ assert_equal 1, @cart.quantity
88
+ @cart_storage_engine.expects(:before_remove_from_cart).with(item, 1).returns(false)
89
+ assert !@cart.remove_from_cart(item, 1)
90
+ assert_equal 1, @cart.quantity
91
+ end
92
+
93
+ should 'fire the storage engines after_remove_from_cart callback' do
94
+ item = TestItem.new
95
+ @cart_storage_engine.expects(:after_remove_from_cart).with(item, 1)
96
+ @cart.remove_from_cart(item, 1)
97
+ end
52
98
  end
53
99
  end
54
100
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_cart
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Myles Eftos
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-03-01 00:00:00 +08:00
12
+ date: 2010-03-13 00:00:00 +08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency