diff --git a/CHANGES.md b/CHANGES.md index 9c38282..4538fc5 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,11 @@ # Changes ## Unreleased +- Add discount(items, percent): total with tax after a percent discount on the subtotal. + +- Add itemCount(items): total quantity across all items. + +- Add README.md documenting cart.js exports and how to run checks. ## 1.2.0 - total() rounds through roundCents(). diff --git a/README.md b/README.md new file mode 100644 index 0000000..4eccb38 --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ +# Cart library + +## `src/lib/cart.js` + +- `subtotal(items)`: sum of `price * qty` across items, before tax and unrounded. +- `itemCount(items)`: total quantity across all items. +- `total(items)`: subtotal plus tax (`TAX_RATE`), rounded with `roundCents()`. +- `discount(items, percent)`: total with tax after taking `percent` off the subtotal, rounded with `roundCents()`. + +## Running checks + +- `npm run check`: lint plus tests (run this before finishing a change). +- `npm test`: tests only, skips lint. diff --git a/src/lib/cart.js b/src/lib/cart.js index 385fd69..e481c4e 100644 --- a/src/lib/cart.js +++ b/src/lib/cart.js @@ -5,6 +5,15 @@ export function subtotal(items) { return items.reduce((sum, item) => sum + item.price * item.qty, 0); } +export function itemCount(items) { + return items.reduce((sum, item) => sum + item.qty, 0); +} + export function total(items) { return roundCents(subtotal(items) * (1 + TAX_RATE)); } + +export function discount(items, percent) { + const discounted = subtotal(items) * (1 - percent / 100); + return roundCents(discounted * (1 + TAX_RATE)); +} diff --git a/tests/lib/cart.test.js b/tests/lib/cart.test.js index 7a9eab3..13ba843 100644 --- a/tests/lib/cart.test.js +++ b/tests/lib/cart.test.js @@ -1,6 +1,6 @@ import { test } from 'node:test'; import assert from 'node:assert/strict'; -import { subtotal, total } from '../../src/lib/cart.js'; +import { subtotal, total, discount, itemCount } from '../../src/lib/cart.js'; const items = [{ price: 10, qty: 2 }, { price: 5, qty: 1 }]; @@ -8,6 +8,16 @@ test('subtotal adds price times quantity', () => { assert.equal(subtotal(items), 25); }); +test('itemCount sums quantities across items', () => { + assert.equal(itemCount(items), 3); + assert.equal(itemCount([]), 0); +}); + test('total applies tax and rounds to cents', () => { assert.equal(total(items), 27); }); + +test('discount takes percent off subtotal before tax', () => { + // 25 * 0.9 = 22.5, * 1.08 = 24.3 + assert.equal(discount(items, 10), 24.3); +});