Commit 61dfd21faf76766294bc167ffeb5ef06f191c2b5

Authored by Antonio Terceiro
1 parent a341e67e

Moving controller out of the profile scope

plugins/shopping_cart/controllers/shopping_cart_plugin_controller.rb 0 → 100644
@@ -0,0 +1,289 @@ @@ -0,0 +1,289 @@
  1 +require 'base64'
  2 +
  3 +class ShoppingCartPluginController < ProfileController
  4 +
  5 + include ShoppingCartPlugin::CartHelper
  6 +
  7 + append_view_path File.join(File.dirname(__FILE__) + '/../views')
  8 + before_filter :login_required, :only => []
  9 +
  10 + before_filter :login_required, :only => []
  11 +
  12 + def get
  13 + has_products = !cart.nil? && (cart[:items].keys.size > 0) || false
  14 + config = { 'enterprise' => profile.identifier, 'hasProducts' => has_products }
  15 + render :text => config.to_json
  16 + end
  17 +
  18 + def add
  19 + self.cart = { :enterprise_id => profile.id, :items => {} } if self.cart.nil?
  20 + if validate_same_enterprise && product = validate_enterprise_has_product(params[:id])
  21 + self.cart[:items][product.id] = 0 if self.cart[:items][product.id].nil?
  22 + self.cart[:items][product.id] += 1
  23 + render :text => {
  24 + :ok => true,
  25 + :error => {:code => 0},
  26 + :products => [{
  27 + :id => product.id,
  28 + :name => product.name,
  29 + :price => get_price(product, profile.environment),
  30 + :description => product.description,
  31 + :picture => product.default_image(:minor),
  32 + :quantity => self.cart[:items][product.id]
  33 + }]
  34 + }.to_json
  35 + end
  36 + end
  37 +
  38 + def remove
  39 + id = params[:id].to_i
  40 + if validate_cart_presence && validate_cart_has_product(id)
  41 + self.cart[:items].delete(id)
  42 + self.cart = nil if self.cart[:items].empty?
  43 + render :text => {
  44 + :ok => true,
  45 + :error => {:code => 0},
  46 + :product_id => id
  47 + }.to_json
  48 + end
  49 + end
  50 +
  51 + def list
  52 + if validate_cart_presence
  53 + products = self.cart[:items].collect do |id, quantity|
  54 + product = Product.find(id)
  55 + { :id => product.id,
  56 + :name => product.name,
  57 + :price => get_price(product, profile.environment),
  58 + :description => product.description,
  59 + :picture => product.default_image(:minor),
  60 + :quantity => quantity
  61 + }
  62 + end
  63 + render :text => {
  64 + :ok => true,
  65 + :error => {:code => 0},
  66 + :enterprise => Enterprise.find(self.cart[:enterprise_id]).identifier,
  67 + :products => products
  68 + }.to_json
  69 + end
  70 + end
  71 +
  72 + def update_quantity
  73 + quantity = params[:quantity].to_i
  74 + id = params[:id].to_i
  75 + if validate_cart_presence && validate_cart_has_product(id) && validate_item_quantity(quantity)
  76 + product = Product.find(id)
  77 + self.cart[:items][product.id] = quantity
  78 + render :text => {
  79 + :ok => true,
  80 + :error => {:code => 0},
  81 + :product_id => id,
  82 + :quantity => quantity
  83 + }.to_json
  84 + end
  85 + end
  86 +
  87 + def clean
  88 + self.cart = nil
  89 + render :text => {
  90 + :ok => true,
  91 + :error => {:code => 0}
  92 + }.to_json
  93 + end
  94 +
  95 + def buy
  96 + @environment = profile.environment
  97 + @cart = cart
  98 + render :layout => false
  99 + end
  100 +
  101 + def send_request
  102 + register_order(params[:customer], self.cart[:items])
  103 + begin
  104 + ShoppingCartPlugin::Mailer.deliver_customer_notification(params[:customer], profile, self.cart[:items])
  105 + ShoppingCartPlugin::Mailer.deliver_supplier_notification(params[:customer], profile, self.cart[:items])
  106 + render :text => {
  107 + :ok => true,
  108 + :message => _('Request sent successfully. Check your email.'),
  109 + :error => {:code => 0}
  110 + }.to_json
  111 + rescue Exception => exception
  112 + render :text => {
  113 + :ok => false,
  114 + :error => {
  115 + :code => 6,
  116 + :message => exception.message
  117 + }
  118 + }.to_json
  119 + end
  120 + end
  121 +
  122 + def visibility
  123 + render :text => self.cart.has_key?(:visibility) ? self.cart[:visibility].to_json : true.to_json
  124 + end
  125 +
  126 + def show
  127 + begin
  128 + self.cart[:visibility] = true
  129 + render :text => {
  130 + :ok => true,
  131 + :message => _('Basket displayed.'),
  132 + :error => {:code => 0}
  133 + }.to_json
  134 + rescue Exception => exception
  135 + render :text => {
  136 + :ok => false,
  137 + :error => {
  138 + :code => 7,
  139 + :message => exception.message
  140 + }
  141 + }.to_json
  142 + end
  143 + end
  144 +
  145 + def hide
  146 + begin
  147 + self.cart[:visibility] = false
  148 + render :text => {
  149 + :ok => true,
  150 + :message => _('Basket hidden.'),
  151 + :error => {:code => 0}
  152 + }.to_json
  153 + rescue Exception => exception
  154 + render :text => {
  155 + :ok => false,
  156 + :error => {
  157 + :code => 8,
  158 + :message => exception.message
  159 + }
  160 + }.to_json
  161 + end
  162 + end
  163 +
  164 + private
  165 +
  166 + def validate_same_enterprise
  167 + if profile.id != self.cart[:enterprise_id]
  168 + render :text => {
  169 + :ok => false,
  170 + :error => {
  171 + :code => 1,
  172 + :message => _("Can't join items from different enterprises.")
  173 + }
  174 + }.to_json
  175 + return false
  176 + end
  177 + true
  178 + end
  179 +
  180 + def validate_cart_presence
  181 + if self.cart.nil?
  182 + render :text => {
  183 + :ok => false,
  184 + :error => {
  185 + :code => 2,
  186 + :message => _("There is no basket.")
  187 + }
  188 + }.to_json
  189 + return false
  190 + end
  191 + true
  192 + end
  193 +
  194 + def validate_enterprise_has_product(id)
  195 + begin
  196 + product = profile.products.find(id)
  197 + rescue
  198 + render :text => {
  199 + :ok => false,
  200 + :error => {
  201 + :code => 3,
  202 + :message => _("This enterprise doesn't have this product.")
  203 + }
  204 + }.to_json
  205 + return nil
  206 + end
  207 + product
  208 + end
  209 +
  210 + def validate_cart_has_product(id)
  211 + if !self.cart[:items].has_key?(id)
  212 + render :text => {
  213 + :ok => false,
  214 + :error => {
  215 + :code => 4,
  216 + :message => _("The basket doesn't have this product.")
  217 + }
  218 + }.to_json
  219 + return false
  220 + end
  221 + true
  222 + end
  223 +
  224 + def validate_item_quantity(quantity)
  225 + if quantity.to_i < 1
  226 + render :text => {
  227 + :ok => false,
  228 + :error => {
  229 + :code => 5,
  230 + :message => _("Invalid quantity.")
  231 + }
  232 + }.to_json
  233 + return false
  234 + end
  235 + true
  236 + end
  237 +
  238 + def register_order(custumer, items)
  239 + new_items = {}
  240 + items.each do |id, quantity|
  241 + product = Product.find(id)
  242 + price = product.price || 0
  243 + new_items[id] = {:quantity => quantity, :price => price, :name => product.name}
  244 + end
  245 + ShoppingCartPlugin::PurchaseOrder.create!(
  246 + :seller => profile,
  247 + :customer => user,
  248 + :status => ShoppingCartPlugin::PurchaseOrder::Status::OPENED,
  249 + :products_list => new_items,
  250 + :customer_name => params[:customer][:name],
  251 + :customer_email => params[:customer][:email],
  252 + :customer_contact_phone => params[:customer][:contact_phone],
  253 + :customer_address => params[:customer][:address],
  254 + :customer_city => params[:customer][:city],
  255 + :customer_zip_code => params[:customer][:zip_code]
  256 + )
  257 + end
  258 +
  259 + protected
  260 +
  261 + def cart
  262 + @cart ||=
  263 + begin
  264 + cookies[cookie_key] && YAML.load(Base64.decode64(cookies[cookie_key])) || nil
  265 + end
  266 + @cart
  267 + end
  268 +
  269 + def cart=(data)
  270 + @cart = data
  271 + end
  272 +
  273 + after_filter :save_cookie
  274 + def save_cookie
  275 + if @cart.nil? && cookies[cookie_key]
  276 + cookies.delete(cookie_key)
  277 + else
  278 + cookies[cookie_key] = {
  279 + :value => Base64.encode64(@cart.to_yaml),
  280 + :path => "/profile/#{profile.identifier}/plugin/shopping_cart"
  281 + }
  282 + end
  283 + end
  284 +
  285 + def cookie_key
  286 + :_noosfero_session_shopping_cart
  287 + end
  288 +
  289 +end
plugins/shopping_cart/controllers/shopping_cart_plugin_profile_controller.rb
@@ -1,288 +0,0 @@ @@ -1,288 +0,0 @@
1 -require 'base64'  
2 -  
3 -include ShoppingCartPlugin::CartHelper  
4 -  
5 -class ShoppingCartPluginProfileController < ProfileController  
6 - append_view_path File.join(File.dirname(__FILE__) + '/../views')  
7 - before_filter :login_required, :only => []  
8 -  
9 - before_filter :login_required, :only => []  
10 -  
11 - def get  
12 - has_products = !cart.nil? && (cart[:items].keys.size > 0) || false  
13 - config = { 'enterprise' => profile.identifier, 'hasProducts' => has_products }  
14 - render :text => config.to_json  
15 - end  
16 -  
17 - def add  
18 - self.cart = { :enterprise_id => profile.id, :items => {} } if self.cart.nil?  
19 - if validate_same_enterprise && product = validate_enterprise_has_product(params[:id])  
20 - self.cart[:items][product.id] = 0 if self.cart[:items][product.id].nil?  
21 - self.cart[:items][product.id] += 1  
22 - render :text => {  
23 - :ok => true,  
24 - :error => {:code => 0},  
25 - :products => [{  
26 - :id => product.id,  
27 - :name => product.name,  
28 - :price => get_price(product, profile.environment),  
29 - :description => product.description,  
30 - :picture => product.default_image(:minor),  
31 - :quantity => self.cart[:items][product.id]  
32 - }]  
33 - }.to_json  
34 - end  
35 - end  
36 -  
37 - def remove  
38 - id = params[:id].to_i  
39 - if validate_cart_presence && validate_cart_has_product(id)  
40 - self.cart[:items].delete(id)  
41 - self.cart = nil if self.cart[:items].empty?  
42 - render :text => {  
43 - :ok => true,  
44 - :error => {:code => 0},  
45 - :product_id => id  
46 - }.to_json  
47 - end  
48 - end  
49 -  
50 - def list  
51 - if validate_cart_presence  
52 - products = self.cart[:items].collect do |id, quantity|  
53 - product = Product.find(id)  
54 - { :id => product.id,  
55 - :name => product.name,  
56 - :price => get_price(product, profile.environment),  
57 - :description => product.description,  
58 - :picture => product.default_image(:minor),  
59 - :quantity => quantity  
60 - }  
61 - end  
62 - render :text => {  
63 - :ok => true,  
64 - :error => {:code => 0},  
65 - :enterprise => Enterprise.find(self.cart[:enterprise_id]).identifier,  
66 - :products => products  
67 - }.to_json  
68 - end  
69 - end  
70 -  
71 - def update_quantity  
72 - quantity = params[:quantity].to_i  
73 - id = params[:id].to_i  
74 - if validate_cart_presence && validate_cart_has_product(id) && validate_item_quantity(quantity)  
75 - product = Product.find(id)  
76 - self.cart[:items][product.id] = quantity  
77 - render :text => {  
78 - :ok => true,  
79 - :error => {:code => 0},  
80 - :product_id => id,  
81 - :quantity => quantity  
82 - }.to_json  
83 - end  
84 - end  
85 -  
86 - def clean  
87 - self.cart = nil  
88 - render :text => {  
89 - :ok => true,  
90 - :error => {:code => 0}  
91 - }.to_json  
92 - end  
93 -  
94 - def buy  
95 - @environment = profile.environment  
96 - @cart = cart  
97 - render :layout => false  
98 - end  
99 -  
100 - def send_request  
101 - register_order(params[:customer], self.cart[:items])  
102 - begin  
103 - ShoppingCartPlugin::Mailer.deliver_customer_notification(params[:customer], profile, self.cart[:items])  
104 - ShoppingCartPlugin::Mailer.deliver_supplier_notification(params[:customer], profile, self.cart[:items])  
105 - render :text => {  
106 - :ok => true,  
107 - :message => _('Request sent successfully. Check your email.'),  
108 - :error => {:code => 0}  
109 - }.to_json  
110 - rescue Exception => exception  
111 - render :text => {  
112 - :ok => false,  
113 - :error => {  
114 - :code => 6,  
115 - :message => exception.message  
116 - }  
117 - }.to_json  
118 - end  
119 - end  
120 -  
121 - def visibility  
122 - render :text => self.cart.has_key?(:visibility) ? self.cart[:visibility].to_json : true.to_json  
123 - end  
124 -  
125 - def show  
126 - begin  
127 - self.cart[:visibility] = true  
128 - render :text => {  
129 - :ok => true,  
130 - :message => _('Basket displayed.'),  
131 - :error => {:code => 0}  
132 - }.to_json  
133 - rescue Exception => exception  
134 - render :text => {  
135 - :ok => false,  
136 - :error => {  
137 - :code => 7,  
138 - :message => exception.message  
139 - }  
140 - }.to_json  
141 - end  
142 - end  
143 -  
144 - def hide  
145 - begin  
146 - self.cart[:visibility] = false  
147 - render :text => {  
148 - :ok => true,  
149 - :message => _('Basket hidden.'),  
150 - :error => {:code => 0}  
151 - }.to_json  
152 - rescue Exception => exception  
153 - render :text => {  
154 - :ok => false,  
155 - :error => {  
156 - :code => 8,  
157 - :message => exception.message  
158 - }  
159 - }.to_json  
160 - end  
161 - end  
162 -  
163 - private  
164 -  
165 - def validate_same_enterprise  
166 - if profile.id != self.cart[:enterprise_id]  
167 - render :text => {  
168 - :ok => false,  
169 - :error => {  
170 - :code => 1,  
171 - :message => _("Can't join items from different enterprises.")  
172 - }  
173 - }.to_json  
174 - return false  
175 - end  
176 - true  
177 - end  
178 -  
179 - def validate_cart_presence  
180 - if self.cart.nil?  
181 - render :text => {  
182 - :ok => false,  
183 - :error => {  
184 - :code => 2,  
185 - :message => _("There is no basket.")  
186 - }  
187 - }.to_json  
188 - return false  
189 - end  
190 - true  
191 - end  
192 -  
193 - def validate_enterprise_has_product(id)  
194 - begin  
195 - product = profile.products.find(id)  
196 - rescue  
197 - render :text => {  
198 - :ok => false,  
199 - :error => {  
200 - :code => 3,  
201 - :message => _("This enterprise doesn't have this product.")  
202 - }  
203 - }.to_json  
204 - return nil  
205 - end  
206 - product  
207 - end  
208 -  
209 - def validate_cart_has_product(id)  
210 - if !self.cart[:items].has_key?(id)  
211 - render :text => {  
212 - :ok => false,  
213 - :error => {  
214 - :code => 4,  
215 - :message => _("The basket doesn't have this product.")  
216 - }  
217 - }.to_json  
218 - return false  
219 - end  
220 - true  
221 - end  
222 -  
223 - def validate_item_quantity(quantity)  
224 - if quantity.to_i < 1  
225 - render :text => {  
226 - :ok => false,  
227 - :error => {  
228 - :code => 5,  
229 - :message => _("Invalid quantity.")  
230 - }  
231 - }.to_json  
232 - return false  
233 - end  
234 - true  
235 - end  
236 -  
237 - def register_order(custumer, items)  
238 - new_items = {}  
239 - items.each do |id, quantity|  
240 - product = Product.find(id)  
241 - price = product.price || 0  
242 - new_items[id] = {:quantity => quantity, :price => price, :name => product.name}  
243 - end  
244 - ShoppingCartPlugin::PurchaseOrder.create!(  
245 - :seller => profile,  
246 - :customer => user,  
247 - :status => ShoppingCartPlugin::PurchaseOrder::Status::OPENED,  
248 - :products_list => new_items,  
249 - :customer_name => params[:customer][:name],  
250 - :customer_email => params[:customer][:email],  
251 - :customer_contact_phone => params[:customer][:contact_phone],  
252 - :customer_address => params[:customer][:address],  
253 - :customer_city => params[:customer][:city],  
254 - :customer_zip_code => params[:customer][:zip_code]  
255 - )  
256 - end  
257 -  
258 - protected  
259 -  
260 - def cart  
261 - @cart ||=  
262 - begin  
263 - cookies[cookie_key] && YAML.load(Base64.decode64(cookies[cookie_key])) || nil  
264 - end  
265 - @cart  
266 - end  
267 -  
268 - def cart=(data)  
269 - @cart = data  
270 - end  
271 -  
272 - after_filter :save_cookie  
273 - def save_cookie  
274 - if @cart.nil? && cookies[cookie_key]  
275 - cookies.delete(cookie_key)  
276 - else  
277 - cookies[cookie_key] = {  
278 - :value => Base64.encode64(@cart.to_yaml),  
279 - :path => "/profile/#{profile.identifier}/plugin/shopping_cart"  
280 - }  
281 - end  
282 - end  
283 -  
284 - def cookie_key  
285 - :_noosfero_session_shopping_cart  
286 - end  
287 -  
288 -end  
plugins/shopping_cart/test/functional/shopping_cart_plugin_controller_test.rb 0 → 100644
@@ -0,0 +1,213 @@ @@ -0,0 +1,213 @@
  1 +require File.dirname(__FILE__) + '/../../../../test/test_helper'
  2 +require File.dirname(__FILE__) + '/../../controllers/shopping_cart_plugin_profile_controller'
  3 +
  4 +# Re-raise errors caught by the controller.
  5 +class ShoppingCartPluginController; def rescue_action(e) raise e end; end
  6 +
  7 +class ShoppingCartPluginControllerTest < ActionController::TestCase
  8 +
  9 + def setup
  10 + @controller = ShoppingCartPluginController.new
  11 + @request = ActionController::TestRequest.new
  12 + @response = ActionController::TestResponse.new
  13 + @enterprise = fast_create(Enterprise)
  14 + @product = fast_create(Product, :enterprise_id => @enterprise.id)
  15 + end
  16 + attr_reader :enterprise
  17 + attr_reader :product
  18 +
  19 + should 'add a new product to cart' do
  20 + get :add, :profile => enterprise.identifier, :id => product.id
  21 +
  22 + assert product_in_cart?(product)
  23 + assert_equal 1, product_quantity(product)
  24 + end
  25 +
  26 + should 'grow quantity through add' do
  27 + get :add, :profile => enterprise.identifier, :id => product.id
  28 + assert_equal 1, product_quantity(product)
  29 +
  30 + get :add, :profile => enterprise.identifier, :id => product.id
  31 + assert_equal 2, product_quantity(product)
  32 + end
  33 +
  34 + should 'not add product to cart if it does not exists' do
  35 + assert_nothing_raised { get :add, :profile => enterprise.identifier, :id => 9999 }
  36 +
  37 + assert !product_in_cart?(product)
  38 + assert !response_ok?
  39 + assert 3, reponse_error_code
  40 + end
  41 +
  42 + should 'remove cart if the product being removed is the last one' do
  43 + get :add, :profile => enterprise.identifier, :id => product.id
  44 + assert cart?
  45 +
  46 + get :remove, :profile => enterprise.identifier, :id => product.id
  47 + assert !cart?
  48 + end
  49 +
  50 + should 'not try to remove a product if there is no cart' do
  51 + instantiate_cart
  52 + assert !cart?
  53 +
  54 + assert_nothing_raised { get :remove, :profile => enterprise.identifier, :id => 9999 }
  55 + assert !response_ok?
  56 + assert_equal 2, reponse_error_code
  57 + end
  58 +
  59 + should 'just remove product if there are other products on cart' do
  60 + another_product = fast_create(Product, :enterprise_id => enterprise.id)
  61 + get :add, :profile => enterprise.identifier, :id => product.id
  62 + get :add, :profile => enterprise.identifier, :id => another_product.id
  63 +
  64 + get :remove, :profile => enterprise.identifier, :id => product.id
  65 + assert cart?
  66 + assert !product_in_cart?(product)
  67 + end
  68 +
  69 + should 'not try to remove a product that is not in the cart' do
  70 + get :add, :profile => enterprise.identifier, :id => product.id
  71 + assert cart?
  72 + assert_nothing_raised { get :remove, :profile => enterprise.identifier, :id => 9999 }
  73 +
  74 + assert !response_ok?
  75 + assert_equal 4, reponse_error_code
  76 + end
  77 +
  78 + should 'not try to list the cart if there is no cart' do
  79 + instantiate_cart
  80 + assert !cart?
  81 +
  82 + assert_nothing_raised { get :list, :profile => enterprise.identifier }
  83 + assert !response_ok?
  84 + assert_equal 2, reponse_error_code
  85 + end
  86 +
  87 + should 'list products without errors' do
  88 + get :add, :profile => enterprise.identifier, :id => product.id
  89 +
  90 + assert_nothing_raised { get :list, :profile => enterprise.identifier }
  91 + assert response_ok?
  92 + end
  93 +
  94 + should 'update the quantity of a product' do
  95 + get :add, :profile => enterprise.identifier, :id => product.id
  96 + assert 1, product_quantity(product)
  97 +
  98 + get :update_quantity, :profile => enterprise.identifier, :id => product.id, :quantity => 3
  99 + assert 3, product_quantity(product)
  100 + end
  101 +
  102 + should 'not try to update quantity the quantity of a product if there is no cart' do
  103 + instantiate_cart
  104 + assert !cart?
  105 +
  106 + assert_nothing_raised { get :update_quantity, :profile => enterprise.identifier, :id => 9999, :quantity => 3 }
  107 + assert !response_ok?
  108 + assert_equal 2, reponse_error_code
  109 + end
  110 +
  111 + should 'not try to update the quantity of a product that is not in the cart' do
  112 + get :add, :profile => enterprise.identifier, :id => product.id
  113 + assert cart?
  114 + assert_nothing_raised { get :update_quantity, :profile => enterprise.identifier, :id => 9999, :quantity => 3 }
  115 +
  116 + assert !response_ok?
  117 + assert_equal 4, reponse_error_code
  118 + end
  119 +
  120 + should 'not update the quantity of a product with a invalid value' do
  121 + get :add, :profile => enterprise.identifier, :id => product.id
  122 +
  123 + assert_nothing_raised { get :update_quantity, :profile => enterprise.identifier, :id => product.id, :quantity => -1}
  124 + assert !response_ok?
  125 + assert_equal 5, reponse_error_code
  126 +
  127 + assert_nothing_raised { get :update_quantity, :profile => enterprise.identifier, :id => product.id, :quantity => 'asdf'}
  128 + assert !response_ok?
  129 + assert_equal 5, reponse_error_code
  130 + end
  131 +
  132 + should 'clean the cart' do
  133 + another_product = fast_create(Product, :enterprise_id => enterprise.id)
  134 + get :add, :profile => enterprise.identifier, :id => product.id
  135 + get :add, :profile => enterprise.identifier, :id => another_product.id
  136 +
  137 + assert_nothing_raised { get :clean, :profile => enterprise.identifier }
  138 + assert !cart?
  139 + end
  140 +
  141 + should 'not crash if there is no cart' do
  142 + instantiate_cart
  143 + assert !cart?
  144 + assert_nothing_raised { get :clean, :profile => enterprise.identifier }
  145 + end
  146 +
  147 + should 'register order on send request' do
  148 + product1 = fast_create(Product, :enterprise_id => enterprise.id, :price => 1.99)
  149 + product2 = fast_create(Product, :enterprise_id => enterprise.id, :price => 2.23)
  150 + @controller.stubs(:cart).returns({:items => {product1.id => 1, product2.id => 2}})
  151 + assert_difference ShoppingCartPlugin::PurchaseOrder, :count, 1 do
  152 + post :send_request,
  153 + :customer => {:name => "Manuel", :email => "manuel@ceu.com"},
  154 + :profile => enterprise.identifier
  155 + end
  156 +
  157 + order = ShoppingCartPlugin::PurchaseOrder.last
  158 +
  159 + assert_equal 1.99, order.products_list[product1.id][:price]
  160 + assert_equal 1, order.products_list[product1.id][:quantity]
  161 + assert_equal 2.23, order.products_list[product2.id][:price]
  162 + assert_equal 2, order.products_list[product2.id][:quantity]
  163 + assert_equal ShoppingCartPlugin::PurchaseOrder::Status::OPENED, order.status
  164 + end
  165 +
  166 + should 'register order on send request and not crash if product is not defined' do
  167 + product1 = fast_create(Product, :enterprise_id => enterprise.id)
  168 + @controller.stubs(:cart).returns({:items => {product1.id => 1}})
  169 + assert_difference ShoppingCartPlugin::PurchaseOrder, :count, 1 do
  170 + post :send_request,
  171 + :customer => {:name => "Manuel", :email => "manuel@ceu.com"},
  172 + :profile => enterprise.identifier
  173 + end
  174 +
  175 + order = ShoppingCartPlugin::PurchaseOrder.last
  176 +
  177 + assert_equal 0, order.products_list[product1.id][:price]
  178 + end
  179 +
  180 + private
  181 +
  182 + def json_response
  183 + ActiveSupport::JSON.decode @response.body
  184 + end
  185 +
  186 + def cart?
  187 + @controller.send(:cart).nil?
  188 + end
  189 +
  190 + def product_in_cart?(product)
  191 + @controller.send(:cart)[:items].has_key?(product.id)
  192 + end
  193 +
  194 + def product_quantity(product)
  195 + @controller.send(:cart)[:items][product.id]
  196 + end
  197 +
  198 + def response_ok?
  199 + json_response['ok']
  200 + end
  201 +
  202 + def reponse_error_code
  203 + json_response['error']['code']
  204 + end
  205 +
  206 + # temporary hack...if I don't do this the session stays as an Array instead
  207 + # of a TestSession
  208 + def instantiate_cart
  209 + get :add, :profile => enterprise.identifier, :id => product.id
  210 + get :remove, :profile => enterprise.identifier, :id => product.id
  211 + end
  212 +
  213 +end
plugins/shopping_cart/test/functional/shopping_cart_plugin_profile_controller_test.rb
@@ -1,213 +0,0 @@ @@ -1,213 +0,0 @@
1 -require File.dirname(__FILE__) + '/../../../../test/test_helper'  
2 -require File.dirname(__FILE__) + '/../../controllers/shopping_cart_plugin_profile_controller'  
3 -  
4 -# Re-raise errors caught by the controller.  
5 -class ShoppingCartPluginProfileController; def rescue_action(e) raise e end; end  
6 -  
7 -class ShoppingCartPluginProfileControllerTest < ActionController::TestCase  
8 -  
9 - def setup  
10 - @controller = ShoppingCartPluginProfileController.new  
11 - @request = ActionController::TestRequest.new  
12 - @response = ActionController::TestResponse.new  
13 - @enterprise = fast_create(Enterprise)  
14 - @product = fast_create(Product, :enterprise_id => @enterprise.id)  
15 - end  
16 - attr_reader :enterprise  
17 - attr_reader :product  
18 -  
19 - should 'add a new product to cart' do  
20 - get :add, :profile => enterprise.identifier, :id => product.id  
21 -  
22 - assert product_in_cart?(product)  
23 - assert_equal 1, product_quantity(product)  
24 - end  
25 -  
26 - should 'grow quantity through add' do  
27 - get :add, :profile => enterprise.identifier, :id => product.id  
28 - assert_equal 1, product_quantity(product)  
29 -  
30 - get :add, :profile => enterprise.identifier, :id => product.id  
31 - assert_equal 2, product_quantity(product)  
32 - end  
33 -  
34 - should 'not add product to cart if it does not exists' do  
35 - assert_nothing_raised { get :add, :profile => enterprise.identifier, :id => 9999 }  
36 -  
37 - assert !product_in_cart?(product)  
38 - assert !response_ok?  
39 - assert 3, reponse_error_code  
40 - end  
41 -  
42 - should 'remove cart if the product being removed is the last one' do  
43 - get :add, :profile => enterprise.identifier, :id => product.id  
44 - assert cart?  
45 -  
46 - get :remove, :profile => enterprise.identifier, :id => product.id  
47 - assert !cart?  
48 - end  
49 -  
50 - should 'not try to remove a product if there is no cart' do  
51 - instantiate_cart  
52 - assert !cart?  
53 -  
54 - assert_nothing_raised { get :remove, :profile => enterprise.identifier, :id => 9999 }  
55 - assert !response_ok?  
56 - assert_equal 2, reponse_error_code  
57 - end  
58 -  
59 - should 'just remove product if there are other products on cart' do  
60 - another_product = fast_create(Product, :enterprise_id => enterprise.id)  
61 - get :add, :profile => enterprise.identifier, :id => product.id  
62 - get :add, :profile => enterprise.identifier, :id => another_product.id  
63 -  
64 - get :remove, :profile => enterprise.identifier, :id => product.id  
65 - assert cart?  
66 - assert !product_in_cart?(product)  
67 - end  
68 -  
69 - should 'not try to remove a product that is not in the cart' do  
70 - get :add, :profile => enterprise.identifier, :id => product.id  
71 - assert cart?  
72 - assert_nothing_raised { get :remove, :profile => enterprise.identifier, :id => 9999 }  
73 -  
74 - assert !response_ok?  
75 - assert_equal 4, reponse_error_code  
76 - end  
77 -  
78 - should 'not try to list the cart if there is no cart' do  
79 - instantiate_cart  
80 - assert !cart?  
81 -  
82 - assert_nothing_raised { get :list, :profile => enterprise.identifier }  
83 - assert !response_ok?  
84 - assert_equal 2, reponse_error_code  
85 - end  
86 -  
87 - should 'list products without errors' do  
88 - get :add, :profile => enterprise.identifier, :id => product.id  
89 -  
90 - assert_nothing_raised { get :list, :profile => enterprise.identifier }  
91 - assert response_ok?  
92 - end  
93 -  
94 - should 'update the quantity of a product' do  
95 - get :add, :profile => enterprise.identifier, :id => product.id  
96 - assert 1, product_quantity(product)  
97 -  
98 - get :update_quantity, :profile => enterprise.identifier, :id => product.id, :quantity => 3  
99 - assert 3, product_quantity(product)  
100 - end  
101 -  
102 - should 'not try to update quantity the quantity of a product if there is no cart' do  
103 - instantiate_cart  
104 - assert !cart?  
105 -  
106 - assert_nothing_raised { get :update_quantity, :profile => enterprise.identifier, :id => 9999, :quantity => 3 }  
107 - assert !response_ok?  
108 - assert_equal 2, reponse_error_code  
109 - end  
110 -  
111 - should 'not try to update the quantity of a product that is not in the cart' do  
112 - get :add, :profile => enterprise.identifier, :id => product.id  
113 - assert cart?  
114 - assert_nothing_raised { get :update_quantity, :profile => enterprise.identifier, :id => 9999, :quantity => 3 }  
115 -  
116 - assert !response_ok?  
117 - assert_equal 4, reponse_error_code  
118 - end  
119 -  
120 - should 'not update the quantity of a product with a invalid value' do  
121 - get :add, :profile => enterprise.identifier, :id => product.id  
122 -  
123 - assert_nothing_raised { get :update_quantity, :profile => enterprise.identifier, :id => product.id, :quantity => -1}  
124 - assert !response_ok?  
125 - assert_equal 5, reponse_error_code  
126 -  
127 - assert_nothing_raised { get :update_quantity, :profile => enterprise.identifier, :id => product.id, :quantity => 'asdf'}  
128 - assert !response_ok?  
129 - assert_equal 5, reponse_error_code  
130 - end  
131 -  
132 - should 'clean the cart' do  
133 - another_product = fast_create(Product, :enterprise_id => enterprise.id)  
134 - get :add, :profile => enterprise.identifier, :id => product.id  
135 - get :add, :profile => enterprise.identifier, :id => another_product.id  
136 -  
137 - assert_nothing_raised { get :clean, :profile => enterprise.identifier }  
138 - assert !cart?  
139 - end  
140 -  
141 - should 'not crash if there is no cart' do  
142 - instantiate_cart  
143 - assert !cart?  
144 - assert_nothing_raised { get :clean, :profile => enterprise.identifier }  
145 - end  
146 -  
147 - should 'register order on send request' do  
148 - product1 = fast_create(Product, :enterprise_id => enterprise.id, :price => 1.99)  
149 - product2 = fast_create(Product, :enterprise_id => enterprise.id, :price => 2.23)  
150 - @controller.stubs(:cart).returns({:items => {product1.id => 1, product2.id => 2}})  
151 - assert_difference ShoppingCartPlugin::PurchaseOrder, :count, 1 do  
152 - post :send_request,  
153 - :customer => {:name => "Manuel", :email => "manuel@ceu.com"},  
154 - :profile => enterprise.identifier  
155 - end  
156 -  
157 - order = ShoppingCartPlugin::PurchaseOrder.last  
158 -  
159 - assert_equal 1.99, order.products_list[product1.id][:price]  
160 - assert_equal 1, order.products_list[product1.id][:quantity]  
161 - assert_equal 2.23, order.products_list[product2.id][:price]  
162 - assert_equal 2, order.products_list[product2.id][:quantity]  
163 - assert_equal ShoppingCartPlugin::PurchaseOrder::Status::OPENED, order.status  
164 - end  
165 -  
166 - should 'register order on send request and not crash if product is not defined' do  
167 - product1 = fast_create(Product, :enterprise_id => enterprise.id)  
168 - @controller.stubs(:cart).returns({:items => {product1.id => 1}})  
169 - assert_difference ShoppingCartPlugin::PurchaseOrder, :count, 1 do  
170 - post :send_request,  
171 - :customer => {:name => "Manuel", :email => "manuel@ceu.com"},  
172 - :profile => enterprise.identifier  
173 - end  
174 -  
175 - order = ShoppingCartPlugin::PurchaseOrder.last  
176 -  
177 - assert_equal 0, order.products_list[product1.id][:price]  
178 - end  
179 -  
180 - private  
181 -  
182 - def json_response  
183 - ActiveSupport::JSON.decode @response.body  
184 - end  
185 -  
186 - def cart?  
187 - @controller.send(:cart).nil?  
188 - end  
189 -  
190 - def product_in_cart?(product)  
191 - @controller.send(:cart)[:items].has_key?(product.id)  
192 - end  
193 -  
194 - def product_quantity(product)  
195 - @controller.send(:cart)[:items][product.id]  
196 - end  
197 -  
198 - def response_ok?  
199 - json_response['ok']  
200 - end  
201 -  
202 - def reponse_error_code  
203 - json_response['error']['code']  
204 - end  
205 -  
206 - # temporary hack...if I don't do this the session stays as an Array instead  
207 - # of a TestSession  
208 - def instantiate_cart  
209 - get :add, :profile => enterprise.identifier, :id => product.id  
210 - get :remove, :profile => enterprise.identifier, :id => product.id  
211 - end  
212 -  
213 -end