Commit cad828e0 by vulehuan

rspec: product - add product to card

parent d17f3bf9
...@@ -7,78 +7,81 @@ class CardsController < ApplicationController ...@@ -7,78 +7,81 @@ class CardsController < ApplicationController
@card_infos = session[:SHOPPING_CARD_SESSION_NAME] @card_infos = session[:SHOPPING_CARD_SESSION_NAME]
end end
if !params[:product_id].nil? if !params[:product_id].nil?
# if remove a product from card if Product.exists?(params[:product_id])
if !params[:card_action].nil? && params[:card_action] == 'remove' # if remove a product from card
# Nothing to delete if !params[:card_action].nil? && params[:card_action] == 'remove'
if @card_infos.empty? # Nothing to delete
redirect_to cards_path if @card_infos.empty?
else
card_items = @card_infos[:card_items]
card_items.each do |card_item|
# if a product exist in card
if card_item[:product_id] == params[:product_id]
card_items.delete(card_item)
@card_infos = { card_items: card_items, customer_info: @card_infos[:customer_info] }
session[:SHOPPING_CARD_SESSION_NAME] = @card_infos
redirect_to cards_path
end
end
end
elsif !params[:card_action].nil? && params[:card_action] == 'update'
# Nothing to update
if @card_infos.empty?
redirect_to cards_path
else
quantity = params[:quantity]
# Invalid request
if quantity.nil? || quantity.to_i <= 0
redirect_to cards_path redirect_to cards_path
else else
card_items = @card_infos[:card_items] card_items = @card_infos[:card_items]
card_items.each_with_index do |card_item, key| card_items.each do |card_item|
# if a product exist in card # if a product exist in card
if card_item[:product_id] == params[:product_id] if card_item[:product_id] == params[:product_id]
card_item[:quantity] = quantity.to_i card_items.delete(card_item)
card_items[key] = card_item
@card_infos = { card_items: card_items, customer_info: @card_infos[:customer_info] } @card_infos = { card_items: card_items, customer_info: @card_infos[:customer_info] }
session[:SHOPPING_CARD_SESSION_NAME] = @card_infos session[:SHOPPING_CARD_SESSION_NAME] = @card_infos
redirect_to cards_path
end end
end end
end
elsif !params[:card_action].nil? && params[:card_action] == 'update'
# Nothing to update
if @card_infos.empty?
redirect_to cards_path redirect_to cards_path
else
quantity = params[:quantity]
# Invalid request
if quantity.nil? || quantity.to_i <= 0
redirect_to cards_path
else
card_items = @card_infos[:card_items]
card_items.each_with_index do |card_item, key|
# if a product exist in card
if card_item[:product_id] == params[:product_id]
card_item[:quantity] = quantity.to_i
card_items[key] = card_item
@card_infos = { card_items: card_items, customer_info: @card_infos[:customer_info] }
session[:SHOPPING_CARD_SESSION_NAME] = @card_infos
end
end
redirect_to cards_path
end
end end
end else
else # if add a product to card
# if add a product to card # first time add to card
# first time add to card if @card_infos.empty?
if @card_infos.empty?
if Product.exists?(params[:product_id])
product = Product.find(params[:product_id]) product = Product.find(params[:product_id])
card_items = Array.new card_items = Array.new
card_items.push({ product_id: params[:product_id], quantity: 1 }) card_items.push({ product_id: params[:product_id], quantity: 1 })
customer_info = Hash.new customer_info = Hash.new
@card_infos = { card_items: card_items, customer_info: customer_info } @card_infos = { card_items: card_items, customer_info: customer_info }
session[:SHOPPING_CARD_SESSION_NAME] = @card_infos session[:SHOPPING_CARD_SESSION_NAME] = @card_infos
end redirect_to cards_path
redirect_to cards_path else
else card_items = @card_infos[:card_items]
card_items = @card_infos[:card_items] found = false
found = false card_items.each do |card_item|
card_items.each do |card_item| # if a product exist in card
# if a product exist in card if card_item[:product_id] == params[:product_id]
if card_item[:product_id] == params[:product_id] found = true
found = true break
break end
end end
end # if a product not exist in card
# if a product not exist in card
if !found if !found
card_items.push({ product_id: params[:product_id], quantity: 1 }) card_items.push({ product_id: params[:product_id], quantity: 1 })
customer_info = @card_infos[:customer_info] customer_info = @card_infos[:customer_info]
@card_infos = { card_items: card_items, customer_info: customer_info } @card_infos = { card_items: card_items, customer_info: customer_info }
session[:SHOPPING_CARD_SESSION_NAME] = @card_infos session[:SHOPPING_CARD_SESSION_NAME] = @card_infos
end
redirect_to cards_path
end end
redirect_to cards_path
end end
else
flash[:error] = "Invalid product"
redirect_to products_path
end end
end end
end end
......
...@@ -101,4 +101,37 @@ describe "Products Page" do ...@@ -101,4 +101,37 @@ describe "Products Page" do
end end
end end
end end
describe "when add product to card" do
describe "when product is invalid" do
describe "when product id is not a number" do
before { visit cards_path(product_id: "abc") }
it { should have_selector('.alert.alert-error', text: 'Invalid') }
end
describe "when product id is not exist" do
before { visit cards_path(product_id: 0) }
it { should have_selector('.alert.alert-error', text: 'Invalid') }
end
end
describe "when product is valid" do
before do
@product_category = FactoryGirl.create(:product_category)
@user = FactoryGirl.create(:user)
@product = FactoryGirl.create(:product, product_category_id: @product_category.id, user_id: @user.id)
visit product_path(@product)
page.find('.product-detail').click_link('Order')
end
it { should have_selector('table a', text: @product.name) }
it { should have_selector('.btn-update-card-quantity') }
it { should have_selector('a.btn', text: 'Remove') }
end
end
end end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment