Skip to content

Commit 38d859c

Browse files
authored
Merge pull request #1 from kgchinthana/dev
Dev
2 parents 8a98262 + 18b4a7a commit 38d859c

File tree

3 files changed

+106
-0
lines changed

3 files changed

+106
-0
lines changed

.github/workflows/ci.yml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
name: Run Tests
2+
3+
on:
4+
pull_request: # Runs on pull requests
5+
branches:
6+
- dev
7+
8+
jobs:
9+
test:
10+
runs-on: ubuntu-latest
11+
12+
steps:
13+
- name: Checkout code
14+
uses: actions/checkout@v3
15+
16+
- name: Set up Python
17+
uses: actions/setup-python@v4
18+
with:
19+
python-version: '3.x'
20+
21+
- name: Install dependencies
22+
run: |
23+
python -m pip install --upgrade pip
24+
25+
- name: Run tests with unittest
26+
run: |
27+
python -m unittest discover -s tests -p "test_*.py" -v
28+
env:
29+
PYTHONPATH: src # Adds src/ to the module search path

src/main.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from collections import namedtuple
2+
3+
Order = namedtuple("Order", "id, items")
4+
Item = namedtuple("Item", "type, description, amount, quantity")
5+
6+
7+
def validorder(order: Order):
8+
net = 0
9+
10+
for item in order.items:
11+
if item.type == "payment":
12+
net += item.amount
13+
elif item.type == "product":
14+
net -= item.amount * item.quantity
15+
else:
16+
return "Invalid item type: %s" % item.type
17+
18+
if net != 0:
19+
return "Order ID: %s - Payment imbalance: $%0.2f" % (order.id, net)
20+
else:
21+
return "Order ID: %s - Full payment received!" % order.id

tests/test_main.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import unittest
2+
import main as c
3+
4+
5+
class TestOnlineStore(unittest.TestCase):
6+
# Example 1 - shows a valid and successful payment for a tv
7+
def test_1(self):
8+
tv_item = c.Item(type="product", description="tv", amount=1000.00, quantity=1)
9+
payment = c.Item(
10+
type="payment", description="invoice_1", amount=1000.00, quantity=1
11+
)
12+
order_1 = c.Order(id="1", items=[payment, tv_item])
13+
self.assertEqual(c.validorder(order_1), "Order ID: 1 - Full payment received!")
14+
15+
# Example 2 - successfully detects payment imbalance as tv was never paid
16+
def test_2(self):
17+
tv_item = c.Item(type="product", description="tv", amount=1000.00, quantity=1)
18+
order_2 = c.Order(id="2", items=[tv_item])
19+
self.assertEqual(
20+
c.validorder(order_2), "Order ID: 2 - Payment imbalance: $-1000.00"
21+
)
22+
23+
# Example 3 - successfully reimburses client for a return so payment imbalance exists
24+
def test_3(self):
25+
tv_item = c.Item(type="product", description="tv", amount=1000.00, quantity=1)
26+
payment = c.Item(
27+
type="payment", description="invoice_3", amount=1000.00, quantity=1
28+
)
29+
payback = c.Item(
30+
type="payment", description="payback_3", amount=-1000.00, quantity=1
31+
)
32+
order_3 = c.Order(id="3", items=[payment, tv_item, payback])
33+
self.assertEqual(
34+
c.validorder(order_3), "Order ID: 3 - Payment imbalance: $-1000.00"
35+
)
36+
37+
# Example 4 - handles invalid input such as placing an invalid order for 1.5 device
38+
def test_4(self):
39+
tv = c.Item(type="product", description="tv", amount=1000, quantity=1.5)
40+
order_1 = c.Order(id="1", items=[tv])
41+
try:
42+
c.validorder(order_1)
43+
except:
44+
self.fail("Invalid order detected")
45+
46+
# Example 5 - handles an invalid item type called 'service'
47+
def test_5(self):
48+
service = c.Item(
49+
type="service", description="order shipment", amount=100, quantity=1
50+
)
51+
order_1 = c.Order(id="1", items=[service])
52+
self.assertEqual(c.validorder(order_1), "Invalid item type: service")
53+
54+
55+
if __name__ == "__main__":
56+
unittest.main()

0 commit comments

Comments
 (0)