active-cart 0.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.
@@ -0,0 +1,2 @@
1
+ active-cart.gemspec
2
+ pkg
data/README ADDED
@@ -0,0 +1,24 @@
1
+ == ActiveCart
2
+
3
+ ActiveCart is a Shopping Cart framework, it's not a fullyfledged cart, so you will need to do some stuff to get it to work.
4
+
5
+ The cart system has a storage engine, which means you aren't bound to a particular database (Eventually there will be different engines already built to get you started
6
+
7
+ == Installation
8
+ gem install active_cart
9
+
10
+ require 'rubygems'
11
+ require 'active_cart'
12
+
13
+ @cart = ActiveCart::Cart.setup(MyStorageEngine.new) do |t|
14
+ t << ShippingOrderTotal.new
15
+ t << GstOrderTotal.new
16
+ end
17
+
18
+ In this example the ShippingOrderTotal and GstOrderTotal have been created by the developer and follow the OrderTotal interface.
19
+
20
+ == Todo
21
+
22
+ Write some actual Storage Engines and OrderTotal examples, and finish the docs.
23
+
24
+ Copyright (c) 2010 Myles Eftos (myles@madpilot.com.au), released under the MIT license
@@ -0,0 +1,55 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/testtask'
4
+ require 'rake/rdoctask'
5
+
6
+ begin
7
+ require 'jeweler'
8
+
9
+ Jeweler::Tasks.new do |gem|
10
+ gem.name = "active-cart"
11
+ gem.summary = "Shopping Cart framework gem. Supports 'storage engines' and order total plugins"
12
+ gem.description = "You can use active-cart as the basis of a shopping cart system. It's definately not complete, you need to build a website around it."
13
+ gem.email = "myles@madpilot.com.au"
14
+ gem.homepage = "http://gemcutter.org/gems/active-cart"
15
+ gem.authors = ["Myles Eftos"]
16
+ gem.version = "0.0.1"
17
+ end
18
+ Jeweler::GemcutterTasks.new
19
+ rescue LoadError
20
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
21
+ end
22
+
23
+ require 'rake/testtask'
24
+ Rake::TestTask.new(:test) do |test|
25
+ test.libs << 'lib' << 'test'
26
+ test.pattern = 'test/unit/*_test.rb'
27
+ test.verbose = true
28
+ end
29
+
30
+ begin
31
+ require 'rcov/rcovtask'
32
+ Rcov::RcovTask.new do |test|
33
+ test.libs << 'test'
34
+ test.pattern = 'test/unit/*_test.rb'
35
+ test.verbose = true
36
+ end
37
+ rescue LoadError
38
+ task :rcov do
39
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
40
+ end
41
+ end
42
+
43
+ task :test => :check_dependencies
44
+
45
+ task :default => :test
46
+
47
+ require 'rake/rdoctask'
48
+ Rake::RDocTask.new do |rdoc|
49
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
50
+
51
+ rdoc.rdoc_dir = 'rdoc'
52
+ rdoc.title = "saasu_connect #{version}"
53
+ rdoc.rdoc_files.include('README*')
54
+ rdoc.rdoc_files.include('lib/**/*.rb')
55
+ end
@@ -0,0 +1,11 @@
1
+ class SchwacmsGalleryGenerator < Rails::Generator::NamedBase
2
+ def initialize(runtime_args, runtime_options = {})
3
+ super
4
+ end
5
+
6
+ def manifest
7
+ record do |m|
8
+ m.migration_template 'schwacms_gallery_migration.rb', 'db/migrate', :migration_file_name => 'create_schwacms_gallery'
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,26 @@
1
+ class CreateSchwacmsGallery < ActiveRecord::Migration
2
+ def self.up
3
+ create_table "galleries", :force => true do |t|
4
+ t.integer "width"
5
+ t.integer "height"
6
+ t.integer "thumbnail_width"
7
+ t.integer "thumbnail_height"
8
+ t.datetime "created_at"
9
+ t.datetime "updated_at"
10
+ end
11
+
12
+ create_table "gallery_images", :force => true do |t|
13
+ t.string "path"
14
+ t.text "description"
15
+ t.integer "gallery_id"
16
+ t.integer "position"
17
+ t.datetime "created_at"
18
+ t.datetime "updated_at"
19
+ end
20
+ end
21
+
22
+ def self.down
23
+ drop_table "gallery_images"
24
+ drop_table "galleries"
25
+ end
26
+ end
@@ -0,0 +1 @@
1
+ # Install hook code here
@@ -0,0 +1,12 @@
1
+ $:.unshift(File.join(File.dirname(__FILE__), 'active_cart'))
2
+
3
+ require 'singleton'
4
+ require 'forwardable'
5
+ require 'active_cart/cart_storage'
6
+ require 'active_cart/order_total'
7
+ require 'active_cart/order_total_collection'
8
+ require 'active_cart/cart'
9
+
10
+ module ActiveCart
11
+ VERSION = "0.0.1"
12
+ end
@@ -0,0 +1,83 @@
1
+ module ActiveCart
2
+ # The Cart class is the core class in ActiveCart. It is a singleton (so you can only have one cart per application), that gets setup initially by passing in
3
+ # a storage engine instance. Storage engines abstract away the storage of the cart, and is left as an exercise to the user. See the Storage engine docs
4
+ # for details.
5
+ #
6
+ # The Cart class also takes order_total objects, which will calculate order totals. it may include thinkgs like shipping, or gift vouchers etc. See the Order Total
7
+ # docs for details.
8
+ #
9
+ # The Cart object delegates a number of Array methods:
10
+ # :[], :<<, :[]=, :at, :clear, :collect, :map, :delete, :delete_at, :each, :each_index, :empty?, :eql?, :first, :include?, :index, :inject, :last, :length, :pop, :push, :shift, :size, :unshift
11
+ class Cart
12
+ attr_accessor :storage_engine, :order_total_calculators, :customer
13
+ include Singleton
14
+ include Enumerable
15
+
16
+ #nodoc
17
+ def self.instance_with_setup_check
18
+ raise StandardError, 'Please call setup first' unless @setup_called
19
+ instance_without_setup_check
20
+ end
21
+
22
+ # The method MUST be called before you call instance, otherwise you will receive and StandardError
23
+ # You need to supply a storage engine. An optional block can be given which allows you to add order total items.
24
+ #
25
+ # A typical initialization block might look like this
26
+ #
27
+ # @cart = Cart.setup(MyAwesomeStorageEngine.new) do |o|
28
+ # o << ShippingOrderTotal.new
29
+ # o << GstOrderTotal.new
30
+ # end
31
+ def self.setup(storage_engine, &block)
32
+ @setup_called = true
33
+ instance = self.instance_without_setup_check
34
+ instance.storage_engine = storage_engine
35
+ instance.order_total_calculators = OrderTotalCollection.new(self)
36
+
37
+ if block_given?
38
+ yield instance.order_total_calculators
39
+ end
40
+ instance
41
+ end
42
+
43
+ class << self
44
+ alias_method :instance_without_setup_check, :instance
45
+ alias_method :instance, :instance_with_setup_check
46
+ end
47
+
48
+ extend Forwardable
49
+ # Storage Engine Array delegators
50
+ def_delegators :@storage_engine, :[], :<<, :[]=, :at, :clear, :collect, :map, :delete, :delete_at, :each, :each_index, :empty?, :eql?, :first, :include?, :index, :inject, :last, :length, :pop, :push, :shift, :size, :unshift
51
+
52
+ # Returns a unique id for the invoice. It's upto the storage engine to generate and track these numbers
53
+ def invoice_id
54
+ @storage_engine.invoice_id
55
+ end
56
+
57
+ # Returns the number of items in the cart. Each different item in the cart may have different quantities, and this method will return the sum of that.
58
+ # For example if the first item has a quantity of 2 and the second has a quantity of 3, this method will return 5
59
+ def quantity
60
+ @storage_engine.quantity
61
+ end
62
+
63
+ # Returns the subtotal of cart, which is effectively the total of all the items multiplied by their quantites. Does NOT include order_totals
64
+ def sub_total
65
+ @storage_engine.sub_total
66
+ end
67
+
68
+ # Adds an item (or a quantity of that item) to the cart. If the item already exists, the internal quantity will be incremented by the quantity paramater
69
+ def add_to_cart(item, quantity = 1)
70
+ @storage_engine.add_to_cart(item, quantity)
71
+ end
72
+
73
+ # Removes an item (or a quantity of that item) from the cart. If final total is 0, the item will be removed from the cart
74
+ def remove_from_cart(item, quantity = 1)
75
+ @storage_engine.remove_from_cart(item, quantity)
76
+ end
77
+
78
+ # Returns the total of the cart. THis includes all the order_total calculations
79
+ def total
80
+ sub_total + order_total_calculators.total
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,36 @@
1
+ module ActiveCart
2
+ module CartStorage
3
+ def invoice_id
4
+ raise NotImplementedError
5
+ end
6
+
7
+ def sub_total
8
+ inject(0) { |t, item| t + (item.quantity * item.price) }
9
+ end
10
+
11
+ def quantity
12
+ inject(0) { |t, item| t + item.quantity }
13
+ end
14
+
15
+ def add_to_cart(item, quantity = 1)
16
+ if self.include?(item)
17
+ index = self.index(item)
18
+ self.at(index).quantity += quantity
19
+ else
20
+ item.quantity += quantity
21
+ self << item
22
+ end
23
+ end
24
+
25
+ def remove_from_cart(item, quantity = 1)
26
+ if self.include?(item)
27
+ index = self.index(item)
28
+ if (existing = self.at(index)).quantity - quantity > 0
29
+ existing.quantity = existing.quantity - quantity
30
+ else
31
+ self.delete_at(index)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,23 @@
1
+ module ActiveCart
2
+ module OrderTotal
3
+ def active?
4
+ @active || false
5
+ end
6
+
7
+ def active=(active)
8
+ @active = active
9
+ end
10
+
11
+ def price(cart)
12
+ raise NotImplementedError
13
+ end
14
+
15
+ def name
16
+ raise NotImplementedError
17
+ end
18
+
19
+ def description
20
+ raise NotImplementedError
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,44 @@
1
+ module ActiveCart
2
+ class OrderTotalCollection < Array
3
+ # Create a new collection
4
+ def initialize(cart, *seed)
5
+ @cart = cart
6
+ seed.each do |s|
7
+ self.push(s)
8
+ end
9
+ end
10
+
11
+ # Created a new collection that is the concatenations of the old collection and the supplied collection. The supplied collections can be a normal array.
12
+ def +(tc)
13
+ tmp = OrderTotalCollection.new(@cart)
14
+ self.each { |s| tmp << s }
15
+ tc.each { |s| tmp << s }
16
+ tmp
17
+ end
18
+
19
+ # Inserts the items before the item that is currently at the supplied index
20
+ def insert_before(index, *items)
21
+ items.reverse.each do |item|
22
+ self.insert(index, item)
23
+ end
24
+ end
25
+
26
+ #Inserts the items after the item that is currently at the supplied index
27
+ def insert_after(index, *items)
28
+ items.each_with_index do |item, i|
29
+ self.insert(index + i + 1, item)
30
+ end
31
+ end
32
+
33
+ # Allows you to reorder the order totals. Moves the item at index <em>from</em> to index <em>to</em>
34
+ def move(from, to)
35
+ index = self.delete_at(from)
36
+ self.insert(to, index)
37
+ end
38
+
39
+ # Calculates the total variation caused by the order total objects
40
+ def total
41
+ self.inject(0) { |t, calculator| t + (calculator.active? ? calculator.price(@cart) : 0) }
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,7 @@
1
+ class TestCartStorage < Array
2
+ include ActiveCart::CartStorage
3
+
4
+ def invoice_id
5
+ 'Invoice #1'
6
+ end
7
+ end
@@ -0,0 +1,20 @@
1
+ class TestItem
2
+ attr_accessor :id, :price, :quantity
3
+
4
+ def ==(item)
5
+ self.id == item.id
6
+ end
7
+
8
+ def initialize(id = 1)
9
+ self.id = id
10
+ self.quantity = 0
11
+ end
12
+
13
+ def price
14
+ @price || 2
15
+ end
16
+
17
+ def inspect
18
+ "TestItem: #{self.id}: #{self.quantity}x$#{self.price}"
19
+ end
20
+ end
@@ -0,0 +1,15 @@
1
+ class TestOrderTotal
2
+ attr_accessor :price, :active
3
+ def initialize(price, active = true)
4
+ @price = price
5
+ @active = active
6
+ end
7
+
8
+ def price(cart)
9
+ @price
10
+ end
11
+
12
+ def active?
13
+ @active
14
+ end
15
+ end
@@ -0,0 +1,9 @@
1
+ require 'test_helper'
2
+ require 'performance_test_help'
3
+
4
+ # Profiling results for each test method are written to tmp/performance.
5
+ class BrowsingTest < ActionController::PerformanceTest
6
+ def test_homepage
7
+ get '/'
8
+ end
9
+ end
@@ -0,0 +1,16 @@
1
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $:.unshift(File.join(File.dirname(__FILE__)))
3
+
4
+ require 'rubygems'
5
+ require 'redgreen'
6
+ require 'test/unit'
7
+ require 'shoulda'
8
+ require 'mocha'
9
+
10
+ require 'active_cart'
11
+ require 'mocks/test_cart_storage'
12
+ require 'mocks/test_item'
13
+ require 'mocks/test_order_total'
14
+
15
+ class Test::Unit::TestCase
16
+ end
@@ -0,0 +1,137 @@
1
+ require 'test_helper'
2
+
3
+ class CartStorageTest < Test::Unit::TestCase
4
+ context '' do
5
+ setup do
6
+ @cart_storage_engine = TestCartStorage.new
7
+ @cart = ActiveCart::Cart.setup(@cart_storage_engine)
8
+ end
9
+
10
+ context 'sub_total' do
11
+ setup do
12
+ @item_1 = TestItem.new(1)
13
+ @item_2 = TestItem.new(2)
14
+ @item_3 = TestItem.new(3)
15
+ @item_1.price = 10
16
+ @item_2.price = 12
17
+ @item_3.price = 9
18
+ end
19
+
20
+
21
+ should 'return the price of a single item in the cart' do
22
+ @cart.add_to_cart(@item_1)
23
+ assert_equal 10, @cart.sub_total
24
+ end
25
+
26
+ should 'return the price of a single item with a quantity' do
27
+ @cart.add_to_cart(@item_2, 3)
28
+ assert_equal 36, @cart.sub_total
29
+ end
30
+
31
+ should 'return the sum of all the items in the cart' do
32
+ @cart.add_to_cart(@item_1)
33
+ @cart.add_to_cart(@item_2, 3)
34
+ assert_equal 46, @cart.sub_total
35
+ end
36
+ end
37
+
38
+ context 'add to cart' do
39
+ should 'add an item to the cart if the cart is empty' do
40
+ assert @cart.empty?
41
+ item = TestItem.new
42
+ @cart.add_to_cart(item)
43
+ assert_equal 1, @cart.size
44
+ assert_equal 1, @cart[0].quantity
45
+ assert_equal 1, @cart.quantity
46
+ end
47
+
48
+ should 'increase the item quantity if the same item is added to the cart again' do
49
+ assert @cart.empty?
50
+ item = TestItem.new(1)
51
+ @cart.add_to_cart(item)
52
+ assert_equal 1, @cart.size
53
+ assert_equal 1, @cart[0].quantity
54
+
55
+ item_2 = TestItem.new(1) # Has the same id, is the same as item
56
+ @cart.add_to_cart(item_2)
57
+ assert_equal 1, @cart.size
58
+ assert_equal 2, @cart[0].quantity
59
+ assert_equal 2, @cart.quantity
60
+ end
61
+
62
+ should 'increase the item quantity by the supplied number if the same item is add to the cart again and a quantity is supplied' do
63
+ assert @cart.empty?
64
+ item = TestItem.new(1)
65
+ @cart.add_to_cart(item)
66
+ assert_equal 1, @cart.size
67
+ assert_equal 1, @cart[0].quantity
68
+
69
+ item_2 = TestItem.new(1) # Has the same id, is the same as item
70
+ @cart.add_to_cart(item_2, 10)
71
+ assert_equal 1, @cart.size
72
+ assert_equal 11, @cart[0].quantity
73
+ assert_equal 11, @cart.quantity
74
+ end
75
+
76
+ should 'add another item to the cart' do
77
+ assert @cart.empty?
78
+ item = TestItem.new(1)
79
+ @cart.add_to_cart(item)
80
+ assert_equal 1, @cart.size
81
+ assert_equal 1, @cart[0].quantity
82
+
83
+ item_2 = TestItem.new(2)
84
+ @cart.add_to_cart(item_2, 10)
85
+ assert_equal 2, @cart.size
86
+ assert_equal 1, @cart[0].quantity
87
+ assert_equal 10, @cart[1].quantity
88
+ assert_equal 11, @cart.quantity
89
+ end
90
+ end
91
+
92
+ context 'remove_from_cart' do
93
+ should 'remove the quantity supplied from the cart' do
94
+ item = TestItem.new(1)
95
+ @cart.add_to_cart(item, 10)
96
+ assert_equal 1, @cart.size
97
+ assert_equal 10, @cart.quantity
98
+
99
+ @cart.remove_from_cart(item)
100
+ assert_equal 1, @cart.size
101
+ assert_equal 9, @cart.quantity
102
+ end
103
+
104
+ should 'remove the item from the cart if the quantity to be removed is equal to the number in cart' do
105
+ item = TestItem.new(1)
106
+ @cart.add_to_cart(item, 10)
107
+ assert_equal 1, @cart.size
108
+ assert_equal 10, @cart.quantity
109
+
110
+ @cart.remove_from_cart(item, 10)
111
+ assert_equal 0, @cart.size
112
+ end
113
+
114
+ should 'remove the item from the cart if the quantity to be removed is greater than the number in cart' do
115
+ item = TestItem.new(1)
116
+ @cart.add_to_cart(item, 10)
117
+ assert_equal 1, @cart.size
118
+ assert_equal 10, @cart.quantity
119
+
120
+ @cart.remove_from_cart(item, 11)
121
+ assert_equal 0, @cart.size
122
+ end
123
+
124
+ should "simply return if the item doesn't exist in the cart" do
125
+ item = TestItem.new(1)
126
+ @cart.add_to_cart(item, 10)
127
+ assert_equal 1, @cart.size
128
+ assert_equal 10, @cart.quantity
129
+
130
+ item_2 = TestItem.new(2)
131
+ @cart.remove_from_cart(item_2, 10)
132
+ assert_equal 1, @cart.size
133
+ assert_equal 10, @cart.quantity
134
+ end
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,188 @@
1
+ require 'test_helper'
2
+
3
+ class CartTest < Test::Unit::TestCase
4
+ context '' do
5
+ should 'raise exception if instance is called without calling setup first' do
6
+ assert_raise StandardError do
7
+ ActiveCart::Cart.instance_variable_set(:@setup_called, false)
8
+ ActiveCart::Cart.instance
9
+ end
10
+ end
11
+
12
+ context 'after setup' do
13
+ setup do
14
+ @cart_storage_engine = TestCartStorage.new
15
+ @cart = ActiveCart::Cart.setup(@cart_storage_engine)
16
+ end
17
+
18
+ context 'delegate to cart storage' do
19
+ should 'delegate []' do
20
+ @cart_storage_engine.expects(:[]).with(0)
21
+ @cart[0]
22
+ end
23
+
24
+ should 'delegate <<' do
25
+ test = TestItem.new
26
+ @cart_storage_engine.expects(:<<).with(test)
27
+ @cart << test
28
+ end
29
+
30
+ should 'delegate []=' do
31
+ test = TestItem.new
32
+ @cart_storage_engine.expects(:[]=).with(0, test)
33
+ @cart[0] = test
34
+ end
35
+
36
+ should 'delegate :at' do
37
+ @cart_storage_engine.expects(:at).with(1)
38
+ @cart.at(1)
39
+ end
40
+
41
+ should 'delegate :clear' do
42
+ @cart_storage_engine.expects(:clear)
43
+ @cart.clear
44
+ end
45
+
46
+ should 'delegate :collect' do
47
+ @cart_storage_engine.expects(:collect)
48
+ @cart.collect
49
+ end
50
+
51
+ should 'delegate :map' do
52
+ @cart_storage_engine.expects(:map)
53
+ @cart.map
54
+ end
55
+
56
+ should 'delegate :delete' do
57
+ test = TestItem.new
58
+ @cart_storage_engine.expects(:delete).with(test)
59
+ @cart.delete(test)
60
+ end
61
+
62
+ should 'delegate :delete_at' do
63
+ @cart_storage_engine.expects(:delete_at).with(3)
64
+ @cart.delete_at(3)
65
+ end
66
+
67
+ should 'delegate :each' do
68
+ @cart_storage_engine.expects(:each)
69
+ @cart.each
70
+ end
71
+
72
+ should 'delegate :each_index' do
73
+ @cart_storage_engine.expects(:each_index)
74
+ @cart.each_index
75
+ end
76
+
77
+ should 'delegate :empty' do
78
+ @cart_storage_engine.expects(:empty?)
79
+ @cart.empty?
80
+ end
81
+
82
+ should 'delegate :eql?' do
83
+ @cart_storage_engine.expects(:eql?)
84
+ @cart.eql?
85
+ end
86
+
87
+ should 'delegate :first' do
88
+ @cart_storage_engine.expects(:first)
89
+ @cart.first
90
+ end
91
+
92
+ should 'delegate :include?' do
93
+ @cart_storage_engine.expects(:include?)
94
+ @cart.include?
95
+ end
96
+
97
+ should 'delegate :index' do
98
+ @cart_storage_engine.expects(:index)
99
+ @cart.index
100
+ end
101
+
102
+ should 'delegate :inject' do
103
+ @cart_storage_engine.expects(:inject)
104
+ @cart.inject
105
+ end
106
+
107
+ should 'delegate :last' do
108
+ @cart_storage_engine.expects(:last)
109
+ @cart.last
110
+ end
111
+
112
+ should 'delegate :length' do
113
+ @cart_storage_engine.expects(:length)
114
+ @cart.length
115
+ end
116
+
117
+ should 'delegate :pop' do
118
+ @cart_storage_engine.expects(:pop)
119
+ @cart.pop
120
+ end
121
+
122
+ should 'delegate :push' do
123
+ @cart_storage_engine.expects(:push)
124
+ @cart.push
125
+ end
126
+
127
+ should 'delegate :shift' do
128
+ @cart_storage_engine.expects(:shift)
129
+ @cart.shift
130
+ end
131
+
132
+ should 'delegate :size' do
133
+ @cart_storage_engine.expects(:size)
134
+ @cart.size
135
+ end
136
+
137
+ should 'delegate :unshift' do
138
+ @cart_storage_engine.expects(:unshift)
139
+ @cart.unshift
140
+ end
141
+
142
+ should 'delegate :invoice_id' do
143
+ @cart_storage_engine.expects(:invoice_id)
144
+ @cart.invoice_id
145
+ end
146
+
147
+ should 'delegate :sub_total' do
148
+ @cart_storage_engine.expects(:sub_total)
149
+ @cart.sub_total
150
+ end
151
+ end
152
+
153
+ context 'setup' do
154
+ should 'take a block to add order_totals' do
155
+ @total_1 = TestOrderTotal.new(10, true)
156
+ @total_2 = TestOrderTotal.new(20, true)
157
+
158
+ @cart_storage_engine = TestCartStorage.new
159
+ @cart = ActiveCart::Cart.setup(@cart_storage_engine) do |o|
160
+ o << @total_1
161
+ o << @total_2
162
+ end
163
+ assert_equal [ @total_1, @total_2 ], @cart.order_total_calculators
164
+ end
165
+ end
166
+
167
+ context 'total' do
168
+ should 'sum all the items in the cart with order totals' do
169
+ @item_1 = TestItem.new(1)
170
+ @item_1.price = 10
171
+ @item_2 = TestItem.new(2)
172
+ @item_2.price = 20
173
+ @item_3 = TestItem.new(3)
174
+ @item_3.price = 30
175
+ @total_1 = TestOrderTotal.new(10, true)
176
+ @total_2 = TestOrderTotal.new(20, true)
177
+
178
+ @cart.order_total_calculators += [ @total_1, @total_2 ]
179
+ @cart.add_to_cart(@item_1)
180
+ @cart.add_to_cart(@item_2)
181
+ @cart.add_to_cart(@item_3)
182
+
183
+ assert_equal 90, @cart.total
184
+ end
185
+ end
186
+ end
187
+ end
188
+ end
@@ -0,0 +1,87 @@
1
+ require 'test_helper'
2
+
3
+ class OrderTotalCollectionTest < Test::Unit::TestCase
4
+ context '' do
5
+ setup do
6
+ @cart_storage_engine = TestCartStorage.new
7
+ @cart = ActiveCart::Cart.setup(@cart_storage_engine)
8
+ @collection = ActiveCart::OrderTotalCollection.new(@cart)
9
+ end
10
+
11
+ context 'insert_before' do
12
+ should 'insert an object before the item at the supplied index' do
13
+ @collection << '0'
14
+ @collection << '1'
15
+ @collection << '2'
16
+ @collection << '3'
17
+ @collection << '4'
18
+
19
+ @collection.insert_before(3, '5')
20
+ assert_equal [ '0', '1', '2', '5', '3', '4' ], @collection
21
+ end
22
+
23
+ should 'insert all the objects before the item at the supplied index' do
24
+ @collection << '0'
25
+ @collection << '1'
26
+ @collection << '2'
27
+ @collection << '3'
28
+ @collection << '4'
29
+
30
+ @collection.insert_before(3, '5', '6', '7', '8')
31
+ assert_equal [ '0', '1', '2', '5', '6', '7', '8', '3', '4' ], @collection
32
+ end
33
+
34
+ end
35
+
36
+ context 'insert_after' do
37
+ should 'insert an object after the item at the supplied index' do
38
+ @collection << '0'
39
+ @collection << '1'
40
+ @collection << '2'
41
+ @collection << '3'
42
+ @collection << '4'
43
+
44
+ @collection.insert_after(3, '5')
45
+ assert_equal [ '0', '1', '2', '3', '5', '4' ], @collection
46
+ end
47
+
48
+ should 'insert all the objects after the item at the supplied index' do
49
+ @collection << '0'
50
+ @collection << '1'
51
+ @collection << '2'
52
+ @collection << '3'
53
+ @collection << '4'
54
+
55
+ @collection.insert_after(3, '5', '6', '7', '8')
56
+ assert_equal [ '0', '1', '2', '3', '5', '6', '7', '8', '4' ], @collection
57
+ end
58
+ end
59
+
60
+ context 'move' do
61
+ should 'move the item at the from index to the to index' do
62
+ @collection << '0'
63
+ @collection << '1'
64
+ @collection << '2'
65
+ @collection << '3'
66
+ @collection << '4'
67
+
68
+ @collection.move(3, 0)
69
+ assert_equal [ '3', '0', '1', '2', '4' ], @collection
70
+ end
71
+ end
72
+
73
+ context 'total' do
74
+ setup do
75
+ @total_1 = TestOrderTotal.new(10, true)
76
+ @total_2 = TestOrderTotal.new(5, false)
77
+ @total_3 = TestOrderTotal.new(2, true)
78
+ @total_4 = TestOrderTotal.new(14, true)
79
+ end
80
+
81
+ should 'call price on each order_total item that are active' do
82
+ @collection += [ @total_1, @total_2, @total_3, @total_4 ]
83
+ assert_equal 26, @collection.total
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1 @@
1
+ # Uninstall hook code here
metadata ADDED
@@ -0,0 +1,81 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: active-cart
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Myles Eftos
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-02-25 00:00:00 +08:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: You can use active-cart as the basis of a shopping cart system. It's definately not complete, you need to build a website around it.
17
+ email: myles@madpilot.com.au
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README
24
+ files:
25
+ - .gitignore
26
+ - README
27
+ - Rakefile
28
+ - generators/schwacms-gallery/schwacms_gallery_generator.rb
29
+ - generators/schwacms-gallery/templates/schwacms_gallery_migration.rb
30
+ - install.rb
31
+ - lib/active_cart.rb
32
+ - lib/active_cart/cart.rb
33
+ - lib/active_cart/cart_storage.rb
34
+ - lib/active_cart/order_total.rb
35
+ - lib/active_cart/order_total_collection.rb
36
+ - test/mocks/test_cart_storage.rb
37
+ - test/mocks/test_item.rb
38
+ - test/mocks/test_order_total.rb
39
+ - test/performance/browsing_test.rb
40
+ - test/test_helper.rb
41
+ - test/unit/cart_storage_test.rb
42
+ - test/unit/cart_test.rb
43
+ - test/unit/order_total_collection_test.rb
44
+ - uninstall.rb
45
+ has_rdoc: true
46
+ homepage: http://gemcutter.org/gems/active-cart
47
+ licenses: []
48
+
49
+ post_install_message:
50
+ rdoc_options:
51
+ - --charset=UTF-8
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: "0"
59
+ version:
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: "0"
65
+ version:
66
+ requirements: []
67
+
68
+ rubyforge_project:
69
+ rubygems_version: 1.3.5
70
+ signing_key:
71
+ specification_version: 3
72
+ summary: Shopping Cart framework gem. Supports 'storage engines' and order total plugins
73
+ test_files:
74
+ - test/unit/order_total_collection_test.rb
75
+ - test/unit/cart_storage_test.rb
76
+ - test/unit/cart_test.rb
77
+ - test/mocks/test_cart_storage.rb
78
+ - test/mocks/test_order_total.rb
79
+ - test/mocks/test_item.rb
80
+ - test/test_helper.rb
81
+ - test/performance/browsing_test.rb