1
1

seperate subjects/transaction on a user basis

This commit is contained in:
2021-01-18 23:35:10 +01:00
parent 49ef36fbce
commit 0447f9f6ef
7 changed files with 107 additions and 97 deletions

View File

@@ -1,32 +1,37 @@
from datetime import date
from django.contrib.auth import get_user_model
from django.test import TestCase
from core.models import Subject, Transaction
from core.prediction import predict_transactions
User = get_user_model()
class PredictionTestCase(TestCase):
def setUp(self):
self.user = User.objects.create(username="dummy")
self.subject = Subject.objects.create(user=self.user, name="rent")
def test_not_enough_data(self):
subject = Subject.objects.create(name="rent")
predicted_transactions, prediction_info = predict_transactions(subject)
predicted_transactions, prediction_info = predict_transactions(self.subject)
self.assertEqual(predicted_transactions, [])
self.assertIsNone(prediction_info)
Transaction.objects.create(amount=-333, booking_date=date(2020, 6, 2), subject=subject)
predicted_transactions, prediction_info = predict_transactions(subject)
Transaction.objects.create(amount=-333, booking_date=date(2020, 6, 2), subject=self.subject)
predicted_transactions, prediction_info = predict_transactions(self.subject)
self.assertEqual(predicted_transactions, [])
self.assertIsNone(prediction_info)
Transaction.objects.create(amount=-333, booking_date=date(2020, 7, 2), subject=subject)
predicted_transactions, prediction_info = predict_transactions(subject)
Transaction.objects.create(amount=-333, booking_date=date(2020, 7, 2), subject=self.subject)
predicted_transactions, prediction_info = predict_transactions(self.subject)
self.assertNotEqual(predicted_transactions, [])
self.assertIsNotNone(prediction_info)
def test_every_month(self):
subject = Subject.objects.create(name="rent")
Transaction.objects.create(amount=-333, booking_date=date(2020, 6, 2), subject=subject)
Transaction.objects.create(amount=-333, booking_date=date(2020, 7, 2), subject=subject)
predicted_transactions, prediction_info = predict_transactions(subject)
Transaction.objects.create(amount=-333, booking_date=date(2020, 6, 2), subject=self.subject)
Transaction.objects.create(amount=-333, booking_date=date(2020, 7, 2), subject=self.subject)
predicted_transactions, prediction_info = predict_transactions(self.subject)
first, second, last = predicted_transactions[0], predicted_transactions[1], predicted_transactions[-1]
self.assertEqual(first.booking_date, date(2020, 8, 2))
self.assertEqual(second.booking_date, date(2020, 9, 2))
@@ -39,10 +44,9 @@ class PredictionTestCase(TestCase):
)
def test_every_3_months(self):
subject = Subject.objects.create(name="rent")
Transaction.objects.create(amount=-333, booking_date=date(2020, 6, 2), subject=subject)
Transaction.objects.create(amount=-333, booking_date=date(2020, 9, 2), subject=subject)
predicted_transactions, prediction_info = predict_transactions(subject)
Transaction.objects.create(amount=-333, booking_date=date(2020, 6, 2), subject=self.subject)
Transaction.objects.create(amount=-333, booking_date=date(2020, 9, 2), subject=self.subject)
predicted_transactions, prediction_info = predict_transactions(self.subject)
first, second, last = predicted_transactions[0], predicted_transactions[1], predicted_transactions[-1]
self.assertEqual(first.booking_date, date(2020, 12, 2))
self.assertEqual(second.booking_date, date(2021, 3, 2))
@@ -55,10 +59,9 @@ class PredictionTestCase(TestCase):
)
def test_every_year(self):
subject = Subject.objects.create(name="rent")
Transaction.objects.create(amount=-333, booking_date=date(2019, 6, 2), subject=subject)
Transaction.objects.create(amount=-333, booking_date=date(2020, 6, 2), subject=subject)
predicted_transactions, prediction_info = predict_transactions(subject)
Transaction.objects.create(amount=-333, booking_date=date(2019, 6, 2), subject=self.subject)
Transaction.objects.create(amount=-333, booking_date=date(2020, 6, 2), subject=self.subject)
predicted_transactions, prediction_info = predict_transactions(self.subject)
self.assertEqual(len(predicted_transactions), 1)
trans = predicted_transactions[0]
self.assertEqual(trans.booking_date, date(2021, 6, 2))
@@ -69,12 +72,11 @@ class PredictionTestCase(TestCase):
)
def test_monthly_varying_begin_end(self):
subject = Subject.objects.create(name="rent")
Transaction.objects.create(amount=-333, booking_date=date(2020, 1, 31), subject=subject)
Transaction.objects.create(amount=-333, booking_date=date(2020, 3, 1), subject=subject)
Transaction.objects.create(amount=-333, booking_date=date(2020, 4, 1), subject=subject)
Transaction.objects.create(amount=-333, booking_date=date(2020, 4, 30), subject=subject)
predicted_transactions, prediction_info = predict_transactions(subject)
Transaction.objects.create(amount=-333, booking_date=date(2020, 1, 31), subject=self.subject)
Transaction.objects.create(amount=-333, booking_date=date(2020, 3, 1), subject=self.subject)
Transaction.objects.create(amount=-333, booking_date=date(2020, 4, 1), subject=self.subject)
Transaction.objects.create(amount=-333, booking_date=date(2020, 4, 30), subject=self.subject)
predicted_transactions, prediction_info = predict_transactions(self.subject)
first, second, last = predicted_transactions[0], predicted_transactions[1], predicted_transactions[-1]
self.assertEqual(first.booking_date, date(2020, 5, 30))
self.assertEqual(second.booking_date, date(2020, 6, 30))
@@ -87,12 +89,11 @@ class PredictionTestCase(TestCase):
)
def test_no_monthly_pattern(self):
subject = Subject.objects.create(name="rent")
Transaction.objects.create(amount=-333, booking_date=date(2020, 1, 15), subject=subject)
Transaction.objects.create(amount=-333, booking_date=date(2020, 2, 10), subject=subject)
Transaction.objects.create(amount=-333, booking_date=date(2020, 4, 25), subject=subject)
Transaction.objects.create(amount=-333, booking_date=date(2020, 5, 5), subject=subject)
predicted_transactions, prediction_info = predict_transactions(subject)
Transaction.objects.create(amount=-333, booking_date=date(2020, 1, 15), subject=self.subject)
Transaction.objects.create(amount=-333, booking_date=date(2020, 2, 10), subject=self.subject)
Transaction.objects.create(amount=-333, booking_date=date(2020, 4, 25), subject=self.subject)
Transaction.objects.create(amount=-333, booking_date=date(2020, 5, 5), subject=self.subject)
predicted_transactions, prediction_info = predict_transactions(self.subject)
first, second, last = predicted_transactions[0], predicted_transactions[1], predicted_transactions[-1]
self.assertEqual(first.booking_date, date(2020, 6, 11))
self.assertEqual(second.booking_date, date(2020, 7, 18))
@@ -105,10 +106,9 @@ class PredictionTestCase(TestCase):
)
def test_amount_change(self):
subject = Subject.objects.create(name="rent")
Transaction.objects.create(amount=1337, booking_date=date(2020, 6, 2), subject=subject)
Transaction.objects.create(amount=1312, booking_date=date(2020, 7, 2), subject=subject)
Transaction.objects.create(amount=404, booking_date=date(2020, 8, 2), subject=subject)
predicted_transactions, prediction_info = predict_transactions(subject)
Transaction.objects.create(amount=1337, booking_date=date(2020, 6, 2), subject=self.subject)
Transaction.objects.create(amount=1312, booking_date=date(2020, 7, 2), subject=self.subject)
Transaction.objects.create(amount=404, booking_date=date(2020, 8, 2), subject=self.subject)
predicted_transactions, prediction_info = predict_transactions(self.subject)
for tr in predicted_transactions:
self.assertEqual(tr.amount, 404)

View File

@@ -1,47 +0,0 @@
from decimal import Decimal, InvalidOperation
from django.test import TestCase
from django.utils import timezone
from core.models import Balance
def _create_and_reload_balance(amount):
bal = Balance.objects.create(amount=amount, date=timezone.now().date())
bal.refresh_from_db()
return bal
class PriceFieldTestCase(TestCase):
def test_normal_decimal(self):
bal = _create_and_reload_balance(Decimal("13.37"))
self.assertEqual(bal.amount, Decimal("13.37"))
def test_too_big_decimal(self):
with self.assertRaises(InvalidOperation):
_create_and_reload_balance(Decimal("13371337.00"))
def test_rounding_decimal(self):
bal = _create_and_reload_balance(Decimal("1.337"))
self.assertEqual(bal.amount, Decimal("1.34"))
def test_normal_int(self):
bal = _create_and_reload_balance(1337)
self.assertEqual(bal.amount, Decimal("1337.00"))
def test_too_big_int(self):
with self.assertRaises(InvalidOperation):
_create_and_reload_balance(13371337)
def test_normal_float(self):
bal = _create_and_reload_balance(13.37)
self.assertEqual(bal.amount, Decimal("13.37"))
def test_too_big_float(self):
with self.assertRaises(InvalidOperation):
_create_and_reload_balance(13371337.00)
def test_rounding_float(self):
bal = _create_and_reload_balance(1.337)
self.assertEqual(bal.amount, Decimal("1.34"))