import assert from "node:assert/strict"; import test from "node:test"; function addProduct(input, role, products) { if (role !== "employee" && role !== "manager") { return { ok: false, code: "FORBIDDEN" }; } const code = typeof input?.code === "string" ? input.code.trim().toUpperCase() : ""; const name = typeof input?.name === "string" ? input.name.trim() : ""; const price = input?.price; if (!/^[A-Z0-9-]{3,16}$/.test(code)) { return { ok: false, code: "INVALID_CODE", field: "code" }; } if (!name || name.length > 100) { return { ok: false, code: "INVALID_NAME", field: "name" }; } if (!Number.isSafeInteger(price) || price < 0) { return { ok: false, code: "INVALID_PRICE", field: "price" }; } if (products.has(code)) { return { ok: false, code: "DUPLICATE_CODE", field: "code" }; } const product = Object.freeze({ code, name, price }); products.set(code, product); return { ok: true, product }; } test("lưu và xác nhận với mã đã chuẩn hóa", () => { const products = new Map(); const result = addProduct({ code: " sp01 ", name: " Bút bi ", price: 5000 }, "employee", products); assert.deepEqual(result, { ok: true, product: { code: "SP01", name: "Bút bi", price: 5000 } }); assert.equal(products.size, 1); assert.deepEqual(products.get("SP01"), result.product); }); test("mã trùng không ghi đè sản phẩm đang có", () => { const existing = { code: "SP01", name: "Bút bi", price: 5000 }; const products = new Map([["SP01", existing]]); const result = addProduct({ code: "sp01", name: "Bút mới", price: 9000 }, "manager", products); assert.deepEqual(result, { ok: false, code: "DUPLICATE_CODE", field: "code" }); assert.equal(products.size, 1); assert.deepEqual(products.get("SP01"), existing); }); test("giá sai và vai trò sai đều không thay đổi dữ liệu", () => { const products = new Map(); assert.equal(addProduct({ code: "SP02", name: "Vở", price: -1 }, "employee", products).code, "INVALID_PRICE"); assert.equal(addProduct({ code: "SP02", name: "Vở", price: 8000 }, "viewer", products).code, "FORBIDDEN"); assert.equal(products.size, 0); });