From d3c36e30d5183195fbb506f6436f12dc7f58ea37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Murta?= Date: Mon, 17 Apr 2023 19:52:52 +0100 Subject: [PATCH] [Refactor] Creates Transform interface Moves categorizer into transform module. Puts the categorizer under unit tests. --- pfbudget/core/manager.py | 2 +- pfbudget/{core => transform}/categorizer.py | 0 pfbudget/transform/transform.py | 10 ++++ tests/mocks/categories.py | 11 +++++ tests/test_transform.py | 52 +++++++++++++++++++++ 5 files changed, 74 insertions(+), 1 deletion(-) rename pfbudget/{core => transform}/categorizer.py (100%) create mode 100644 pfbudget/transform/transform.py create mode 100644 tests/mocks/categories.py create mode 100644 tests/test_transform.py diff --git a/pfbudget/core/manager.py b/pfbudget/core/manager.py index 2dcf45c..779212b 100644 --- a/pfbudget/core/manager.py +++ b/pfbudget/core/manager.py @@ -4,7 +4,6 @@ import pickle import webbrowser from pfbudget.common.types import Operation -from pfbudget.core.categorizer import Categorizer from pfbudget.db.client import DbClient from pfbudget.db.model import ( Bank, @@ -28,6 +27,7 @@ from pfbudget.db.model import ( from pfbudget.extract.nordigen import NordigenClient, NordigenCredentialsManager from pfbudget.extract.parsers import parse_data from pfbudget.extract.psd2 import PSD2Extractor +from pfbudget.transform.categorizer import Categorizer class Manager: diff --git a/pfbudget/core/categorizer.py b/pfbudget/transform/categorizer.py similarity index 100% rename from pfbudget/core/categorizer.py rename to pfbudget/transform/categorizer.py diff --git a/pfbudget/transform/transform.py b/pfbudget/transform/transform.py new file mode 100644 index 0000000..7dbb0a2 --- /dev/null +++ b/pfbudget/transform/transform.py @@ -0,0 +1,10 @@ +from abc import ABC, abstractmethod +from typing import Sequence + +from pfbudget.db.model import Transaction + + +class Transformer(ABC): + @abstractmethod + def transform(self, _: Sequence[Transaction]) -> Sequence[Transaction]: + raise NotImplementedError diff --git a/tests/mocks/categories.py b/tests/mocks/categories.py new file mode 100644 index 0000000..f111ea3 --- /dev/null +++ b/tests/mocks/categories.py @@ -0,0 +1,11 @@ +from decimal import Decimal + +from pfbudget.db.model import Category, CategoryRule + +category_null = Category("null", None, set()) + +category_cat1 = Category( + "cat#1", + None, + {CategoryRule(None, None, "desc#1", None, None, None, Decimal(0), "cat#1")}, +) diff --git a/tests/test_transform.py b/tests/test_transform.py new file mode 100644 index 0000000..ead5ed1 --- /dev/null +++ b/tests/test_transform.py @@ -0,0 +1,52 @@ +from datetime import date +from decimal import Decimal + +import mocks.categories as mock + +from pfbudget.db.model import ( + Bank, + BankTransaction, + CategorySelector, + Selector_T, + TransactionCategory, +) +from pfbudget.transform.categorizer import Categorizer + + +class TestTransform: + def test_nullify(self): + transactions = [ + BankTransaction( + date(2023, 1, 1), "", Decimal("-500"), Bank("Bank#1", "", "") + ), + BankTransaction( + date(2023, 1, 2), "", Decimal("500"), Bank("Bank#2", "", "") + ), + ] + + for t in transactions: + assert not t.category + + categorizer = Categorizer() + categorizer.rules(transactions, [mock.category_null], []) + + for t in transactions: + assert t.category == TransactionCategory( + "null", CategorySelector(Selector_T.nullifier) + ) + + def test_categorize(self): + transactions = [ + BankTransaction(date(2023, 1, 1), "desc#1", Decimal("-10"), "Bank#1") + ] + + for t in transactions: + assert not t.category + + categorizer = Categorizer() + categorizer.rules(transactions, [mock.category_cat1], []) + + for t in transactions: + assert t.category == TransactionCategory( + "cat#1", CategorySelector(Selector_T.rules) + )