[Refactor] Creates Transform interface

Moves categorizer into transform module.
Puts the categorizer under unit tests.
This commit is contained in:
Luís Murta 2023-04-17 19:52:52 +01:00
parent 9582d570b4
commit b9b38db99a
Signed by: satprog
GPG Key ID: 169EF1BBD7049F94
5 changed files with 74 additions and 1 deletions

View File

@ -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:

View File

@ -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

11
tests/mocks/categories.py Normal file
View File

@ -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")},
)

52
tests/test_transform.py Normal file
View File

@ -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)
)