/** * QUnit Tests for Cart Functions * Tests core cart functionality (add, remove, update, calculate) */ odoo.define("website_sale_aplicoop.test_cart_functions", function (require) { "use strict"; var QUnit = window.QUnit; QUnit.module( "website_sale_aplicoop", { beforeEach: function () { // Setup: Initialize groupOrderShop object window.groupOrderShop = { orderId: "1", cart: {}, labels: { save_cart: "Save Cart", reload_cart: "Reload Cart", checkout: "Checkout", confirm_order: "Confirm Order", back_to_cart: "Back to Cart", }, }; // Clear localStorage localStorage.clear(); }, afterEach: function () { // Cleanup localStorage.clear(); delete window.groupOrderShop; }, }, function () { QUnit.test("groupOrderShop object initializes correctly", function (assert) { assert.expect(3); assert.ok(window.groupOrderShop, "groupOrderShop object exists"); assert.equal(window.groupOrderShop.orderId, "1", "orderId is set"); assert.ok(typeof window.groupOrderShop.cart === "object", "cart is an object"); }); QUnit.test("cart starts empty", function (assert) { assert.expect(1); var cartKeys = Object.keys(window.groupOrderShop.cart); assert.equal(cartKeys.length, 0, "cart has no items initially"); }); QUnit.test("can add item to cart", function (assert) { assert.expect(4); // Add a product to cart var productId = "123"; var productData = { name: "Test Product", price: 10.5, quantity: 2, }; window.groupOrderShop.cart[productId] = productData; assert.equal(Object.keys(window.groupOrderShop.cart).length, 1, "cart has 1 item"); assert.ok(window.groupOrderShop.cart[productId], "product exists in cart"); assert.equal( window.groupOrderShop.cart[productId].name, "Test Product", "product name is correct" ); assert.equal( window.groupOrderShop.cart[productId].quantity, 2, "product quantity is correct" ); }); QUnit.test("can remove item from cart", function (assert) { assert.expect(2); // Add then remove var productId = "123"; window.groupOrderShop.cart[productId] = { name: "Test Product", price: 10.5, quantity: 2, }; assert.equal( Object.keys(window.groupOrderShop.cart).length, 1, "cart has 1 item after add" ); delete window.groupOrderShop.cart[productId]; assert.equal( Object.keys(window.groupOrderShop.cart).length, 0, "cart is empty after remove" ); }); QUnit.test("can update item quantity", function (assert) { assert.expect(3); var productId = "123"; window.groupOrderShop.cart[productId] = { name: "Test Product", price: 10.5, quantity: 2, }; assert.equal( window.groupOrderShop.cart[productId].quantity, 2, "initial quantity is 2" ); // Update quantity window.groupOrderShop.cart[productId].quantity = 5; assert.equal( window.groupOrderShop.cart[productId].quantity, 5, "quantity updated to 5" ); assert.equal( Object.keys(window.groupOrderShop.cart).length, 1, "still only 1 item in cart" ); }); QUnit.test("cart total calculates correctly", function (assert) { assert.expect(1); // Add multiple products window.groupOrderShop.cart["123"] = { name: "Product 1", price: 10.0, quantity: 2, }; window.groupOrderShop.cart["456"] = { name: "Product 2", price: 5.5, quantity: 3, }; // Calculate total manually var total = 0; Object.keys(window.groupOrderShop.cart).forEach(function (productId) { var item = window.groupOrderShop.cart[productId]; total += item.price * item.quantity; }); // Expected: (10.00 * 2) + (5.50 * 3) = 20.00 + 16.50 = 36.50 assert.equal(total.toFixed(2), "36.50", "cart total is correct"); }); QUnit.test("localStorage saves cart correctly", function (assert) { assert.expect(2); var cartKey = "eskaera_1_cart"; var testCart = { 123: { name: "Test Product", price: 10.5, quantity: 2, }, }; // Save to localStorage localStorage.setItem(cartKey, JSON.stringify(testCart)); // Retrieve and verify var savedCart = JSON.parse(localStorage.getItem(cartKey)); assert.ok(savedCart, "cart was saved to localStorage"); assert.equal(savedCart["123"].name, "Test Product", "cart data is correct"); }); QUnit.test("labels object is initialized", function (assert) { assert.expect(5); assert.ok(window.groupOrderShop.labels, "labels object exists"); assert.equal( window.groupOrderShop.labels["save_cart"], "Save Cart", "save_cart label exists" ); assert.equal( window.groupOrderShop.labels["reload_cart"], "Reload Cart", "reload_cart label exists" ); assert.equal( window.groupOrderShop.labels["checkout"], "Checkout", "checkout label exists" ); assert.equal( window.groupOrderShop.labels["confirm_order"], "Confirm Order", "confirm_order label exists" ); }); QUnit.test("cart handles decimal quantities correctly", function (assert) { assert.expect(2); window.groupOrderShop.cart["123"] = { name: "Weight Product", price: 8.99, quantity: 1.5, }; var item = window.groupOrderShop.cart["123"]; var subtotal = item.price * item.quantity; assert.equal(item.quantity, 1.5, "decimal quantity stored correctly"); assert.equal( subtotal.toFixed(2), "13.49", "subtotal with decimal quantity is correct" ); }); QUnit.test("cart handles zero quantity", function (assert) { assert.expect(1); window.groupOrderShop.cart["123"] = { name: "Test Product", price: 10.0, quantity: 0, }; var item = window.groupOrderShop.cart["123"]; var subtotal = item.price * item.quantity; assert.equal(subtotal, 0, "zero quantity results in zero subtotal"); }); QUnit.test("cart handles multiple items with same price", function (assert) { assert.expect(2); window.groupOrderShop.cart["123"] = { name: "Product A", price: 10.0, quantity: 2, }; window.groupOrderShop.cart["456"] = { name: "Product B", price: 10.0, quantity: 3, }; var total = 0; Object.keys(window.groupOrderShop.cart).forEach(function (productId) { var item = window.groupOrderShop.cart[productId]; total += item.price * item.quantity; }); assert.equal(Object.keys(window.groupOrderShop.cart).length, 2, "cart has 2 items"); assert.equal(total.toFixed(2), "50.00", "total is correct with same prices"); }); } ); return {}; });