Rails 4 testing bug?
- by Jamato
Situation: if we add two identic line items into a cart, we update line item quantity instead of adding a duplicate.In browser everything works fine but in unit testing section something fails because of an empty cycle in code. Which I wanted to use to update all prices. Why? Is that a unit test engine bug?
LineItem.all and cart.line_items in process of testing produce two DIFFERENT structures.
#<LineItem id: 980190964, product_id: 1, cart_id: 999, created_at: "2014-06-01 00:21:28", updated_at: "2014-06-01 00:21:28", quantity: 2, price: #<BigDecimal:ba0fb544,'0.4E1',9(27)>>
#<LineItem id: 980190964, product_id: 1, cart_id: 999, created_at: "2014-06-01 00:21:28", updated_at: "2014-06-01 00:21:28", quantity: 1, price: #<BigDecimal:ba0d1b04,'0.4E1',9(27)>>
cart.line_items guy did not update quantity
Code itself (produces LineItem which is then saved in line_item_controller which calls this method)
class Cart < ActiveRecord::Base
has_many :line_items, dependent: :destroy
def add_product(product_id)
# LOOK THIS CYCLE BREAKS UNIT TEST, SRSLY, I MEAN IT
line_items.each do |item|
end
current_item = line_items.find_by(product_id: product_id)
fresh_price = Product.find_by(id: product_id).price
if current_item
current_item.quantity += 1
else
current_item = line_items.build(product_id: product_id, price: fresh_price)
end
return current_item
end
...
Unit test code
test "non-unique item added" do
cart = Cart.new(:id => 999)
line_item0 = cart.add_product(2)
line_item0.save
line_item1 = cart.add_product(1)
line_item1.save
assert_equal 2, cart.line_items.size #success
line_item2 = cart.add_product(1)
line_item2.save
assert_equal 2, cart.line_items.size, "what?"
assert cart.total_price > 15 #fail, prices are not enough, quantity of product1 = 1
#we get total price from quantity, it's a simple method in model
end
And once again: IT DOES WORK in browser as it should. Even with cycle. I feel so dumb right now...