Samy Co is starting a computer store. You have been engaged to build the checkout system. We will start with the following products in our catalogue
SKU | Name | Price |
---|---|---|
ipd | Super iPad | $549.99 |
mbp | MacBook Pro | $1399.99 |
atv | Apple TV | $109.50 |
vga | VGA adapter | $30.00 |
As we're launching our new computer store, we would like to have a few opening day specials.
- we're going to have a 3 for 2 deal on Apple TVs. For example, if you buy 3 Apple TVs, you will pay the price of 2 only
- the brand new Super iPad will have a bulk discounted applied, where the price will drop to $499.99 each, if someone buys more than 4
As our Sales manager is quite indecisive, we want the pricing rules to be as flexible as possible as they can change in the future with little notice.
Our checkout system can scan items in any order.
The interface to our checkout looks like this (shown in typescript):
const co = new Checkout(pricingRules);
co.scan(item1);
co.scan(item2);
co.total();
Your task is to implement a checkout system that fulfils the requirements described above.
SKUs Scanned: atv, atv, atv, vga Total expected: $249.00
SKUs Scanned: atv, ipd, ipd, atv, ipd, ipd, ipd Total expected: $2718.95
- Nodejs version 14.16.0 as a minimum
- Optional docker desktop to run the app using docker
# if you have nvm on your system
nvm use
# install dependencies
npm i
# testing the app
npm test
# lint
npm run lint
Note, the entry point to docker is npm. So you can run any command using the container that you would normally using npm. Just the commands don't need to start with npm. See examples below.
# Build the docker image
docker build -t samyco-store .
# run tests
docker run -it samyco-store test
# run lint
docker run -it samyco-store run lint