<repo_name>Rizki-SS/Unit-Testing-Simple-Cart-App<file_sep>/src/helpers.js
const kupon = [{
        kode: 'diskon20',
        tipe: 'persen',
        jumlah: '20',
    },
    {
        kode: 'diskon2000',
        tipe: 'fix',
        jumlah: '2000',
    },
    {
        kode: 'diskon1000',
        tipe: 'fix',
        jumlah: '1000',
    },
]

const incrementQty = (qty) => parseInt(qty) + 1;
const decrementQty = (qty) => (qty > 1) ? qty - 1 : qty;
const sum = (price, qty) => price * qty;

//get diskon code
const diskon = (kode) => {
    const coupon = kupon.filter(kupon => kupon.kode === kode)
    if (coupon.length === 0) {
        throw ('kode tidak valid');
    }
    return coupon[0];
}

//cacluculate payOff
const payOff = (sum, coupon) => {
    if (coupon.tipe === "persen") {
        return sum * coupon.jumlah / 100;
    } else {
        return (coupon.jumlah > sum) ? sum : parseInt(coupon.jumlah);
    }
}

//caclulate total with payoff
const sumDiskon = (sum, diskon) => sum - diskon;

module.exports = {
    incrementQty,
    decrementQty,
    sum,
    diskon,
    sumDiskon,
    payOff
};<file_sep>/src/app.js
import {
    incrementQty,
    decrementQty,
    sum,
    diskon,
    sumDiskon,
    payOff
} from './helpers.js';

const incrButton = document.querySelector('#incr');
const decrButton = document.querySelector('#decr');
const qtyInput = document.querySelector('#qty');
const price = document.querySelector('#price');
const subTotal = document.querySelector('#subtotal');
const comfirmBtn = document.querySelector('#confirmButton');
const codeInput = document.querySelector('#code');
const diskonTxt = document.querySelector('#diskon');

let Coupon;
const getDiskon = () => {
    try {
        Coupon = diskon(codeInput.value);
        alert('success use code');
    } catch (error) {
        Coupon = null;
        alert(error);
    }
};

const hitung = () => {
    if (Coupon != null) {
        const total = sum(price.value, qtyInput.value);
        const off = payOff(total, Coupon);
        diskonTxt.textContent = `Rp. ${off}`;
        subTotal.textContent = `Rp. ${sumDiskon(total,off)}`;
    } else {
        diskonTxt.textContent = `Rp. 0`;
        subTotal.textContent = `Rp. ${sum(price.value, qtyInput.value)}`
    }
}

price.addEventListener('change', () => {
    if (price.value < 0) { price.value = 0 };
    hitung();
});

qtyInput.addEventListener('change', () => {
    if (qtyInput.value <= 0) { qtyInput.value = 1 };
    hitung();
})

incrButton.addEventListener('click', () => {
    qtyInput.value = incrementQty(qtyInput.value);
    hitung();
});

decrButton.addEventListener('click', () => {
    qtyInput.value = decrementQty(qtyInput.value);
    hitung();
});

comfirmBtn.addEventListener('click', () => {
    getDiskon();
    hitung();
})<file_sep>/src/const.js
export const kupon = [{
        kode: 'diskon60',
        tipe: 'persen',
        jumlah: '20',
    },
    {
        kode: 'diskon2000',
        tipe: 'fix',
        jumlah: '2000',
    },
]<file_sep>/README.md
# Simple Cart App
Aplikasi cart sederhana. Disadur dan dimodifikasi dari [https://github.com/kodeid-resources/simple-cart-app](https://github.com/kodeid-resources/simple-cart-app)

# Acknowledgment
[<NAME>](https://github.com/rizafahmi)

#error Handling yang saya tambahkan
- Harga tidak dapat bernilai minus, apabila minus nilai otomatis di set 0;
- Quantity terkecil bernilai 1
- input type qty dan harga berupa number agar tidak menerima inputan carakter atau yang lain
- Harga akhir/sub Totaol tidak dapat bernilai minus setelah mendapat diskon
- Apablia input kode kupon berhasil / gagal akan mendapat alert pemberitahuan

#test case
- [x] pembelian 2 bauh @500 (3ms)
- [x] mengurangi qty 1
- [x] mengurangi qty 3 (1ms)
- [x] menambah qty 2
- [x] cek kode diskon20 seharusnya ada (1ms)
- [x] cek kode "tidakada" seharusnya kode tidak valid (1ms)
- [x] payoff kupon off 20% dari 100 =  20
- [x] payoff kupon off 2000 dari 1000 =  1000 (1ms)
- [x] payoff kupon off 2000 dari 3000 =  2000
- [x] total dari pembelian 2000 dengan diskon 1000 maka = 1000