[Refactor] Creates Transform interface
Moves categorizer into transform module. Puts the categorizer under unit tests.
This commit is contained in:
parent
9582d570b4
commit
b9b38db99a
@ -4,7 +4,6 @@ import pickle
|
|||||||
import webbrowser
|
import webbrowser
|
||||||
|
|
||||||
from pfbudget.common.types import Operation
|
from pfbudget.common.types import Operation
|
||||||
from pfbudget.core.categorizer import Categorizer
|
|
||||||
from pfbudget.db.client import DbClient
|
from pfbudget.db.client import DbClient
|
||||||
from pfbudget.db.model import (
|
from pfbudget.db.model import (
|
||||||
Bank,
|
Bank,
|
||||||
@ -28,6 +27,7 @@ from pfbudget.db.model import (
|
|||||||
from pfbudget.extract.nordigen import NordigenClient, NordigenCredentialsManager
|
from pfbudget.extract.nordigen import NordigenClient, NordigenCredentialsManager
|
||||||
from pfbudget.extract.parsers import parse_data
|
from pfbudget.extract.parsers import parse_data
|
||||||
from pfbudget.extract.psd2 import PSD2Extractor
|
from pfbudget.extract.psd2 import PSD2Extractor
|
||||||
|
from pfbudget.transform.categorizer import Categorizer
|
||||||
|
|
||||||
|
|
||||||
class Manager:
|
class Manager:
|
||||||
|
|||||||
10
pfbudget/transform/transform.py
Normal file
10
pfbudget/transform/transform.py
Normal 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
11
tests/mocks/categories.py
Normal 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
52
tests/test_transform.py
Normal 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)
|
||||||
|
)
|
||||||
Loading…
x
Reference in New Issue
Block a user