Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ## cart.rb
- class Cart < ActiveRecord::Base
- include Shipping
- has_many :cart_items
- has_many :skus, :through => :cart_items
- has_one :order
- # validates_associated :skus
- # validates_associated :cart_items
- def validate
- logger.info "Validating cart..."
- sold_out = find_out_of_stock_items
- if sold_out.size > 0
- errors.add_to_base("Cart contains sold out items.")
- end
- sold_out.each {|i| errors.add i.sku.sku, "is sold out."}
- end
- def allocate_inventory
- logger.info "Allocating inventory..."
- begin
- CartItem.transaction do
- cart_items.each do |i|
- # new_stock_on_hand = i.sku.stock_on_hand >= i.quantity ? (i.sku.stock_on_hand - i.quantity) : 0
- new_stock_on_hand = i.sku.stock_on_hand - i.quantity
- logger.info "Updating stock item #{i.sku.sku} to #{new_stock_on_hand}"
- i.sku.stock_on_hand = new_stock_on_hand
- i.sku.save!
- end
- end
- rescue ActiveRecord::StaleObjectError
- retry
- end
- end
- end
- ## order_test.rb (order model calls cart#allocate_inventory)
- require 'test_helper'
- class OrderTest < ActiveSupport::TestCase
- self.use_transactional_fixtures = false
- fixtures :products
- def setup
- @good_order = Order.new(order_hash)
- @good_order.customer_ip = "10.1.1.1"
- @cart = Cart.create
- @cart.add(skus(:burton_supermodel_151).id, 3)
- @good_order.cart = @cart
- end
- ...
- test "order save should fail if one cart item out of stock" do
- @cart = Cart.create
- @cart.add(skus(:lib_tech_skate_banana_149).id, 2)
- @cart.add(skus(:burton_supermodel_151).id, 3)
- assert_equal 2, @cart.cart_items.size
- assert_equal 2, @cart.cart_items[0].quantity
- assert_equal 10, @cart.cart_items[0].sku.stock_on_hand
- assert_equal 3, @cart.cart_items[1].quantity
- @good_order.cart = @cart
- @good_order.cart.save!
- assert_equal skus(:burton_supermodel_151).id, @cart.cart_items[1].sku_id
- assert_not_nil @good_order.cart.cart_items[1].sku
- sku = @good_order.cart.cart_items[1].sku
- sku.stock_on_hand = 2
- sku.save!
- assert @good_order.save
- assert_equal 10, @cart.cart_items[0].sku.stock_on_hand
- assert_equal 2, @cart.cart_items[1].sku.stock_on_hand
- end
- ...
- end
- ## log output from running above test
- Validating cart...
- CartItem Load Including Associations (0.5ms) SELECT "cart_items"."id" AS t0_r0, "cart_items"."cart_id" AS t0_r1, "cart_items"."price" AS t0_r2, "cart_items"."quantity" AS t0_r3, "cart_items"."created_at" AS t0_r4, "cart_items"."updated_at" AS t0_r5, "cart_items"."sku_id" AS t0_r6, "skus"."id" AS t1_r0, "skus"."product_id" AS t1_r1, "skus"."sku" AS t1_r2, "skus"."created_at" AS t1_r3, "skus"."updated_at" AS t1_r4, "skus"."size" AS t1_r5, "skus"."color" AS t1_r6, "skus"."stock_on_hand" AS t1_r7, "skus"."lock_version" AS t1_r8 FROM "cart_items" LEFT OUTER JOIN "skus" ON "skus".id = "cart_items".sku_id WHERE ("cart_items".cart_id = NULL AND (skus.stock_on_hand < 1))
- Cart Create (0.5ms) INSERT INTO "carts" ("updated_at", "purchased_at", "created_at") VALUES('2009-08-31 21:05:35', NULL, '2009-08-31 21:05:35')
- CartItem Load (0.1ms) SELECT * FROM "cart_items" WHERE ("cart_items".cart_id = NULL)
- Sku Load (0.4ms) SELECT * FROM "skus" WHERE ("skus"."id" = 20741745)
- Cart#add
- CartItem Load (0.2ms) SELECT * FROM "cart_items" WHERE ("cart_items"."sku_id" = 20741745) AND ("cart_items".cart_id = 3)
- Sku Load (0.3ms) SELECT * FROM "skus" WHERE ("skus"."id" = 20741745)
- Product Load (0.4ms) SELECT * FROM "products" WHERE ("products"."id" = 160147030)
- Sku Load (0.5ms) SELECT * FROM "skus" WHERE ("skus".product_id = 160147030)
- CartItem Load (0.2ms) SELECT * FROM "cart_items" WHERE ("cart_items".cart_id = 3 AND ("cart_items"."sku_id" IN (20741740,20741745)))
- 0 quantity for this product in the cart...
- Sku Load (0.5ms) SELECT * FROM "skus" WHERE ("skus"."id" = 20741745)
- Validating CartItem
- CartItem Create (0.5ms) INSERT INTO "cart_items" ("sku_id", "updated_at", "price", "quantity", "cart_id", "created_at") VALUES(20741745, '2009-08-31 21:05:35', 149.0, 3, 3, '2009-08-31 21:05:35')
- Validating cart...
- CartItem Load Including Associations (0.3ms) SELECT "cart_items"."id" AS t0_r0, "cart_items"."cart_id" AS t0_r1, "cart_items"."price" AS t0_r2, "cart_items"."quantity" AS t0_r3, "cart_items"."created_at" AS t0_r4, "cart_items"."updated_at" AS t0_r5, "cart_items"."sku_id" AS t0_r6, "skus"."id" AS t1_r0, "skus"."product_id" AS t1_r1, "skus"."sku" AS t1_r2, "skus"."created_at" AS t1_r3, "skus"."updated_at" AS t1_r4, "skus"."size" AS t1_r5, "skus"."color" AS t1_r6, "skus"."stock_on_hand" AS t1_r7, "skus"."lock_version" AS t1_r8 FROM "cart_items" LEFT OUTER JOIN "skus" ON "skus".id = "cart_items".sku_id WHERE ("cart_items".cart_id = NULL AND (skus.stock_on_hand < 1))
- Cart Create (0.3ms) INSERT INTO "carts" ("updated_at", "purchased_at", "created_at") VALUES('2009-08-31 21:05:35', NULL, '2009-08-31 21:05:35')
- CartItem Load (0.1ms) SELECT * FROM "cart_items" WHERE ("cart_items".cart_id = NULL)
- Sku Load (0.8ms) SELECT * FROM "skus" WHERE ("skus"."id" = 143629153)
- Cart#add
- CartItem Load (0.3ms) SELECT * FROM "cart_items" WHERE ("cart_items"."sku_id" = 143629153) AND ("cart_items".cart_id = 4)
- Sku Load (0.5ms) SELECT * FROM "skus" WHERE ("skus"."id" = 143629153)
- Product Load (0.5ms) SELECT * FROM "products" WHERE ("products"."id" = 873410035)
- Sku Load (0.3ms) SELECT * FROM "skus" WHERE ("skus".product_id = 873410035)
- CartItem Load (0.2ms) SELECT * FROM "cart_items" WHERE ("cart_items".cart_id = 4 AND ("cart_items"."sku_id" IN (143629153)))
- 0 quantity for this product in the cart...
- Sku Load (0.3ms) SELECT * FROM "skus" WHERE ("skus"."id" = 143629153)
- Validating CartItem
- CartItem Create (0.5ms) INSERT INTO "cart_items" ("sku_id", "updated_at", "price", "quantity", "cart_id", "created_at") VALUES(143629153, '2009-08-31 21:05:35', 200.0, 2, 4, '2009-08-31 21:05:35')
- Cart#add
- CartItem Load (0.3ms) SELECT * FROM "cart_items" WHERE ("cart_items"."sku_id" = 20741745) AND ("cart_items".cart_id = 4)
- Sku Load (0.4ms) SELECT * FROM "skus" WHERE ("skus"."id" = 20741745)
- Product Load (0.5ms) SELECT * FROM "products" WHERE ("products"."id" = 160147030)
- Sku Load (0.5ms) SELECT * FROM "skus" WHERE ("skus".product_id = 160147030)
- CartItem Load (1.1ms) SELECT * FROM "cart_items" WHERE ("cart_items".cart_id = 4 AND ("cart_items"."sku_id" IN (20741740,20741745)))
- 0 quantity for this product in the cart...
- Sku Load (1.0ms) SELECT * FROM "skus" WHERE ("skus"."id" = 20741745)
- Validating CartItem
- CartItem Create (0.5ms) INSERT INTO "cart_items" ("sku_id", "updated_at", "price", "quantity", "cart_id", "created_at") VALUES(20741745, '2009-08-31 21:05:35', 149.0, 3, 4, '2009-08-31 21:05:35')
- Validating cart...
- CartItem Load Including Associations (0.3ms) SELECT "cart_items"."id" AS t0_r0, "cart_items"."cart_id" AS t0_r1, "cart_items"."price" AS t0_r2, "cart_items"."quantity" AS t0_r3, "cart_items"."created_at" AS t0_r4, "cart_items"."updated_at" AS t0_r5, "cart_items"."sku_id" AS t0_r6, "skus"."id" AS t1_r0, "skus"."product_id" AS t1_r1, "skus"."sku" AS t1_r2, "skus"."created_at" AS t1_r3, "skus"."updated_at" AS t1_r4, "skus"."size" AS t1_r5, "skus"."color" AS t1_r6, "skus"."stock_on_hand" AS t1_r7, "skus"."lock_version" AS t1_r8 FROM "cart_items" LEFT OUTER JOIN "skus" ON "skus".id = "cart_items".sku_id WHERE ("cart_items".cart_id = 4 AND (skus.stock_on_hand < 1))
- Sku Update with optimistic locking (0.6ms) UPDATE "skus"
- SET "stock_on_hand" = 2, "updated_at" = '2009-08-31 21:05:35', "lock_version" = 1
- WHERE id = 20741745
- AND "lock_version" = 0
- Allocating inventory...
- Updating stock item lt-skb-149 to 8
- Sku Update with optimistic locking (0.9ms) UPDATE "skus"
- SET "stock_on_hand" = 8, "updated_at" = '2009-08-31 21:05:35', "lock_version" = 1
- WHERE id = 143629153
- AND "lock_version" = 0
- Updating stock item brt-sprm-151 to -1
- Invalid Record found, adding errors to order... <----------------------- THAT'S THE EXCEPTION from i.sku.save! on line 30 of cart.rb
- Validating cart...
- CartItem Load Including Associations (0.2ms) SELECT "cart_items"."id" AS t0_r0, "cart_items"."cart_id" AS t0_r1, "cart_items"."price" AS t0_r2, "cart_items"."quantity" AS t0_r3, "cart_items"."created_at" AS t0_r4, "cart_items"."updated_at" AS t0_r5, "cart_items"."sku_id" AS t0_r6, "skus"."id" AS t1_r0, "skus"."product_id" AS t1_r1, "skus"."sku" AS t1_r2, "skus"."created_at" AS t1_r3, "skus"."updated_at" AS t1_r4, "skus"."size" AS t1_r5, "skus"."color" AS t1_r6, "skus"."stock_on_hand" AS t1_r7, "skus"."lock_version" AS t1_r8 FROM "cart_items" LEFT OUTER JOIN "skus" ON "skus".id = "cart_items".sku_id WHERE ("cart_items".cart_id = 4 AND (skus.stock_on_hand < 1))
- Order Create (0.3ms) INSERT INTO "orders" ("ship_to_street_address_1", "ship_to_postal_code", "bill_to_street_address_1", "status", "ship_to_last_name", "ship_to_street_address_2", "ship_to_city", "bill_to_street_address_2", "updated_at", "number", "ship_to_country", "bill_to_postal_code", "bill_to_country", "phone_number", "bill_to_city", "error_message", "tracking_number", "shipping_provider", "shipping_method", "bill_to_last_name", "customer_ip", "cart_id", "ship_to_first_name", "ship_to_state", "bill_to_state", "email", "bill_to_first_name", "created_at", "state") VALUES('1234 Any Street', '12345', '1234 Any Street', NULL, 'Doe', 'Apt #30', 'Anytown', 'Apt #30', '2009-08-31 21:05:35', 'GS5506874dfe', 'United States', '12345', 'United States', '4085551212', 'Anytown', NULL, NULL, NULL, NULL, 'Doe', '10.1.1.1', 4, 'John', 'OR', 'OR', 'prez@whitehouse.gov', 'John', '2009-08-31 21:05:35', 'failed')
Add Comment
Please, Sign In to add comment