diff --git a/pfbudget/db/client.py b/pfbudget/db/client.py new file mode 100644 index 0000000..4f4f0e0 --- /dev/null +++ b/pfbudget/db/client.py @@ -0,0 +1,11 @@ +from typing import Sequence + +from pfbudget.db.model import Transaction + + +class Client: + def __init__(self, url: str) -> None: + self.url = url + + def insert(self, transactions: Sequence[Transaction]) -> None: + raise NotImplementedError diff --git a/pfbudget/load/__init__.py b/pfbudget/load/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pfbudget/load/database.py b/pfbudget/load/database.py new file mode 100644 index 0000000..c168681 --- /dev/null +++ b/pfbudget/load/database.py @@ -0,0 +1,14 @@ +from typing import Sequence + +from pfbudget.db.client import Client +from pfbudget.db.model import Transaction + +from .load import Loader + + +class DatabaseLoader(Loader): + def __init__(self, client: Client) -> None: + self.client = client + + def load(self, transactions: Sequence[Transaction]) -> None: + self.client.insert(transactions) diff --git a/pfbudget/load/load.py b/pfbudget/load/load.py new file mode 100644 index 0000000..940e1ab --- /dev/null +++ b/pfbudget/load/load.py @@ -0,0 +1,10 @@ +from abc import ABC, abstractmethod +from typing import Sequence + +from pfbudget.db.model import Transaction + + +class Loader(ABC): + @abstractmethod + def load(self, transactions: Sequence[Transaction]) -> None: + raise NotImplementedError diff --git a/tests/test_load.py b/tests/test_load.py new file mode 100644 index 0000000..e4ec3af --- /dev/null +++ b/tests/test_load.py @@ -0,0 +1,37 @@ +from datetime import date +from decimal import Decimal +from typing import Sequence +import pytest + +from pfbudget.db.client import Client +from pfbudget.db.model import BankTransaction, Transaction +from pfbudget.load.database import DatabaseLoader +from pfbudget.load.load import Loader + + +class FakeDatabaseClient(Client): + def __init__(self, url: str) -> None: + super().__init__(url) + + def insert(self, transactions: Sequence[Transaction]) -> None: + pass + + +@pytest.fixture +def loader() -> Loader: + url = "postgresql://user:pass@127.0.0.1:5432/db" + client = FakeDatabaseClient(url) + return DatabaseLoader(client) + + +class TestDatabaseLoad: + def test_empty_url(self): + _ = FakeDatabaseClient("") + + def test_insert(self, loader: Loader): + transactions = [ + BankTransaction(date(2023, 1, 1), "", Decimal("-500"), "Bank#1"), + BankTransaction(date(2023, 1, 2), "", Decimal("500"), "Bank#2"), + ] + + loader.load(transactions)