Tests and helpers

This commit is contained in:
2026-06-02 15:25:32 +02:00
parent faf5d440f3
commit d249c6a013
9 changed files with 372 additions and 121 deletions
+37
View File
@@ -0,0 +1,37 @@
import unittest
from utils.helpers import format_currency, format_date, validate_pin, parse_price
class TestHelpers(unittest.TestCase):
def test_format_currency_german(self):
self.assertEqual(format_currency(2.50), "2,50 €")
self.assertEqual(format_currency(1234.567), "1234,57 €")
self.assertEqual(format_currency(0.0), "0,00 €")
def test_format_currency_non_german(self):
self.assertEqual(format_currency(2.50, symbol="$", is_german=False), "$2.50")
self.assertEqual(format_currency(0.99, symbol="£", is_german=False), "£0.99")
def test_format_date(self):
self.assertEqual(format_date("2026-06-02T15:00:00.000000"), "02.06.2026")
self.assertEqual(format_date("2026-12-25T18:30:00"), "25.12.2026")
self.assertEqual(format_date("invalid-date-format"), "invalid-da")
def test_validate_pin(self):
self.assertTrue(validate_pin("1234"))
self.assertTrue(validate_pin("4242"))
self.assertTrue(validate_pin("123456"))
self.assertFalse(validate_pin("123")) # too short
self.assertFalse(validate_pin("123a")) # non-numeric
self.assertFalse(validate_pin("")) # empty
def test_parse_price(self):
self.assertEqual(parse_price("2.50"), 2.50)
self.assertEqual(parse_price("2,50"), 2.50)
self.assertEqual(parse_price(" 0,99 "), 0.99)
with self.assertRaises(ValueError):
parse_price("-2.50") # negative
with self.assertRaises(ValueError):
parse_price("abc") # non-numeric
if __name__ == "__main__":
unittest.main()
+37
View File
@@ -0,0 +1,37 @@
import unittest
from core.item import Item
class TestItem(unittest.TestCase):
def test_item_initialization(self):
item = Item("coffee", "Coffee", 2.50)
self.assertEqual(item.id, "coffee")
self.assertEqual(item.name, "Coffee")
self.assertEqual(item.price, 2.50)
def test_item_price_conversion(self):
item = Item("tea", "Tea", "1.80")
self.assertEqual(item.price, 1.80)
self.assertIsInstance(item.price, float)
def test_to_json(self):
item = Item("sandwich", "Sandwich", 5.00)
expected = {
"id": "sandwich",
"name": "Sandwich",
"price": 5.00
}
self.assertEqual(item.to_json(), expected)
def test_from_json(self):
data = {
"id": "sandwich",
"name": "Sandwich",
"price": 5.00
}
item = Item.from_json(data)
self.assertEqual(item.id, "sandwich")
self.assertEqual(item.name, "Sandwich")
self.assertEqual(item.price, 5.00)
if __name__ == "__main__":
unittest.main()
+19 -7
View File
@@ -6,7 +6,6 @@ from core.item import Item
import shutil
import os
class TestTracker(unittest.TestCase):
def setUp(self):
self.test_dir = "test_data"
@@ -24,7 +23,6 @@ class TestTracker(unittest.TestCase):
shutil.rmtree(self.test_dir)
def test_adjust_debt_new_user(self):
# Verify adjust_debt does not raise KeyError on uninitialized user debt
res = self.tracker.adjust_debt("test_user", 2.0, "admin123")
self.assertEqual(res["status"], "success")
self.assertEqual(self.tracker.get_user_debt("test_user"), -2.0)
@@ -35,15 +33,12 @@ class TestTracker(unittest.TestCase):
self.assertEqual(self.tracker.get_user_debt("test_user"), 2.50)
self.assertEqual(len(self.tracker.transactions), 1)
def test_default_pin(self):
user = User("new_user", "New User")
self.assertEqual(user.pin, "4242")
def test_add_user(self):
res = self.tracker.add_user("test_user_2", "Test Bob")
self.assertEqual(res["status"], "success")
self.assertEqual(self.tracker.users["test_user_2"].name, "Test Bob")
self.assertEqual(self.tracker.users["test_user_2"].pin, "4242")
def test_remove_user(self):
res = self.tracker.remove_user("test_user")
self.assertEqual(res["status"], "success")
@@ -56,12 +51,26 @@ class TestTracker(unittest.TestCase):
self.assertEqual(self.tracker.users["test_user"].name, "Updated Name")
self.assertEqual(self.tracker.users["test_user"].pin, "9999")
def test_set_user_pin_validation(self):
res = self.tracker.set_user_pin("test_user", "invalid_pin")
self.assertEqual(res["status"], "error")
self.assertEqual(self.tracker.users["test_user"].pin, "4242") # Unchanged
res2 = self.tracker.set_user_pin("test_user", "1234")
self.assertEqual(res2["status"], "success")
self.assertEqual(self.tracker.users["test_user"].pin, "1234")
def test_add_item(self):
res = self.tracker.add_item("new_item", "Donut", 1.80)
self.assertEqual(res["status"], "success")
self.assertEqual(self.tracker.items["new_item"].name, "Donut")
self.assertEqual(self.tracker.items["new_item"].price, 1.80)
def test_add_item_invalid_price(self):
res = self.tracker.add_item("invalid_item", "Cake", "-2.50")
self.assertEqual(res["status"], "error")
self.assertNotIn("invalid_item", self.tracker.items)
def test_remove_item(self):
res = self.tracker.remove_item("test_item")
self.assertEqual(res["status"], "success")
@@ -73,7 +82,10 @@ class TestTracker(unittest.TestCase):
self.assertEqual(self.tracker.items["test_item"].name, "Premium Coffee")
self.assertEqual(self.tracker.items["test_item"].price, 3.20)
def test_edit_item_invalid_price(self):
res = self.tracker.edit_item("test_item", "Premium Coffee", "not_a_number")
self.assertEqual(res["status"], "error")
self.assertEqual(self.tracker.items["test_item"].price, 2.50) # Unchanged
if __name__ == "__main__":
unittest.main()
+51
View File
@@ -0,0 +1,51 @@
import unittest
from core.transaction import Transaction
class TestTransaction(unittest.TestCase):
def test_transaction_initialization_with_timestamp(self):
timestamp = "2026-06-02T15:00:00.000000"
t = Transaction("tx_1", "user_1", "item_1", 2.50, timestamp)
self.assertEqual(t.id, "tx_1")
self.assertEqual(t.user_id, "user_1")
self.assertEqual(t.item_id, "item_1")
self.assertEqual(t.amount, 2.50)
self.assertEqual(t.timestamp, timestamp)
def test_transaction_auto_timestamp(self):
t = Transaction("tx_2", "user_2", "item_2", 1.50)
self.assertIsNotNone(t.timestamp)
# Check if timestamp format is valid ISO string (at least parses or contains dates)
self.assertIn("-", t.timestamp)
self.assertIn("T", t.timestamp)
def test_to_json(self):
timestamp = "2026-06-02T15:00:00"
t = Transaction("tx_1", "user_1", "item_1", 2.50, timestamp)
expected = {
"id": "tx_1",
"user_id": "user_1",
"item_id": "item_1",
"amount": 2.50,
"timestamp": timestamp,
}
self.assertEqual(t.to_json(), expected)
def test_from_json(self):
data = {
"id": "tx_1",
"user_id": "user_1",
"item_id": "item_1",
"amount": 2.50,
"timestamp": "2026-06-02T15:00:00",
}
t = Transaction.from_json(data)
self.assertEqual(t.id, "tx_1")
self.assertEqual(t.user_id, "user_1")
self.assertEqual(t.item_id, "item_1")
self.assertEqual(t.amount, 2.50)
self.assertEqual(t.timestamp, "2026-06-02T15:00:00")
if __name__ == "__main__":
unittest.main()
+50
View File
@@ -0,0 +1,50 @@
import unittest
from core.user import User
class TestUser(unittest.TestCase):
def test_default_values(self):
user = User("alice", "Alice")
self.assertEqual(user.id, "alice")
self.assertEqual(user.name, "Alice")
self.assertEqual(user.pin, "4242")
self.assertEqual(user.debt, 0.0)
def test_custom_pin(self):
user = User("bob", "Bob", "1234")
self.assertEqual(user.pin, "1234")
def test_to_json(self):
user = User("charlie", "Charlie", "9999")
user.debt = 12.50
expected = {
"id": "charlie",
"name": "Charlie",
"debt": 12.50,
"pin": "9999"
}
self.assertEqual(user.to_json(), expected)
def test_from_json(self):
data = {
"id": "charlie",
"name": "Charlie",
"debt": 12.50,
"pin": "9999"
}
user = User.from_json(data)
self.assertEqual(user.id, "charlie")
self.assertEqual(user.name, "Charlie")
self.assertEqual(user.debt, 12.50)
self.assertEqual(user.pin, "9999")
def test_from_json_missing_pin(self):
data = {
"id": "charlie",
"name": "Charlie",
"debt": 12.50
}
user = User.from_json(data)
self.assertEqual(user.pin, "4242")
if __name__ == "__main__":
unittest.main()