Skip to content

Commit d71904e

Browse files
committed
Implement buy_product and get_balance
1 parent ff0a268 commit d71904e

File tree

3 files changed

+69
-3
lines changed

3 files changed

+69
-3
lines changed

.pylintrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
[pylintrc]
22
# R0903: too few many public methods
3-
disable=R0903,missing-docstring
3+
disable=R0903,missing-docstring,E1101,E1133

tests/test_vending_machine.py

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import coins
44
import products
5-
from vending_machine import VendingMachine
5+
from vending_machine import InsufficientFunds, VendingMachine
66

77

88
def test_insert_coin_rejects_integer():
@@ -42,16 +42,60 @@ def test_buy_product_rejects_strings():
4242
with pytest.raises(ValueError):
4343
machine.buy_product(str)
4444

45-
def test_buy_product_accepts_chips():
45+
46+
def test_buy_product_accepts_chips_with_sufficient_balance():
4647
machine = VendingMachine()
48+
machine.insert_coin(coins.Toonie())
49+
machine.insert_coin(coins.Quarter())
4750
machine.buy_product(products.Chips)
4851

4952

5053
def test_buy_product_accepts_drink():
5154
machine = VendingMachine()
55+
machine.insert_coin(coins.Toonie())
56+
machine.insert_coin(coins.Loonie())
5257
machine.buy_product(products.Drink)
5358

5459

5560
def test_buy_product_accepts_candy():
5661
machine = VendingMachine()
62+
machine.insert_coin(coins.Toonie())
63+
machine.insert_coin(coins.Toonie())
64+
machine.buy_product(products.Candy)
65+
66+
67+
def test_get_balance_returns_zero_when_no_coins():
68+
machine = VendingMachine()
69+
assert machine.get_balance() == 0
70+
71+
72+
def test_get_balance_returns_sum_value_of_coins():
73+
machine = VendingMachine()
74+
machine.insert_coin(coins.Quarter())
75+
machine.insert_coin(coins.Loonie())
76+
77+
assert machine.get_balance() == 125
78+
79+
80+
def test_buy_drink_with_insufficient_funds():
81+
machine = VendingMachine()
82+
with pytest.raises(InsufficientFunds):
83+
machine.buy_product(products.Drink)
84+
85+
86+
def test_buy_product_returns_instance_when_valid():
87+
machine = VendingMachine()
88+
machine.insert_coin(coins.Toonie())
89+
machine.insert_coin(coins.Toonie())
90+
result = machine.buy_product(products.Drink)
91+
92+
assert isinstance(result, products.Drink)
93+
94+
95+
def test_get_balance_returns_sum_of_coins_minus_purchases():
96+
machine = VendingMachine()
97+
machine.insert_coin(coins.Toonie())
98+
machine.insert_coin(coins.Toonie())
5799
machine.buy_product(products.Candy)
100+
101+
assert machine.get_balance() == 85

vending_machine.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,14 @@
44
import products
55

66

7+
class InsufficientFunds(Exception):
8+
pass
9+
10+
711
@dataclass
812
class VendingMachine:
913
inserted_coins: list = field(default_factory=list)
14+
purchases: list = field(default_factory=list)
1015

1116
def insert_coin(self, coin):
1217
if not isinstance(coin, coins.Coin):
@@ -17,3 +22,20 @@ def insert_coin(self, coin):
1722
def buy_product(self, product):
1823
if not issubclass(product, products.Product):
1924
raise ValueError
25+
balance = self.get_balance()
26+
if balance < product.price:
27+
raise InsufficientFunds
28+
29+
obj = product()
30+
self.purchases.append(obj)
31+
return obj
32+
33+
def get_balance(self):
34+
balance = 0
35+
for coin in self.inserted_coins:
36+
balance += coin.value
37+
38+
for product in self.purchases:
39+
balance -= product.price
40+
41+
return balance

0 commit comments

Comments
 (0)