Skip to content

Commit 46fd65e

Browse files
committed
🛠 [fix][backend] Account create API
1 parent 102174a commit 46fd65e

4 files changed

Lines changed: 73 additions & 18 deletions

File tree

backend/kayman/crud/account.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,18 @@
99
from kayman.schemas.transaction import Transaction
1010

1111

12-
def create_account(session: Session, account: AccountCreate) -> AccountBase:
13-
session.add(account)
14-
session.commit()
15-
session.refresh(account)
16-
return account
12+
def create_accounts(
13+
session: Session, accounts: Sequence[AccountCreate], commit: bool = True
14+
) -> Sequence[AccountBase]:
15+
db_accounts = [Account.model_validate(account) for account in accounts]
16+
session.add_all(db_accounts)
17+
if commit:
18+
session.commit()
19+
for db_account in db_accounts:
20+
session.refresh(db_account)
21+
else:
22+
session.flush()
23+
return db_accounts
1724

1825

1926
def read_account(session: Session, account_id: int) -> Account | None:

backend/kayman/routers/account.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from kayman.auth import get_client
1010
from kayman.core.db import get_session
1111
from kayman.crud.account import (
12-
create_account,
12+
create_accounts,
1313
read_account,
1414
read_accounts,
1515
update_accounts,
@@ -42,7 +42,7 @@ def create(
4242
*, session: Session = Depends(get_session), account: AccountCreate
4343
) -> AccountBase:
4444
try:
45-
return create_account(session, account)
45+
return create_accounts(session, [account])[0]
4646
except IntegrityError as err:
4747
raise PydanticCustomError(
4848
"currency_not_found",

backend/kayman/schemas/account.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class AccountBase(SQLModel):
2020

2121
class Account(AccountBase, table=True):
2222
id: int | None = Field(primary_key=True, default=None)
23-
balance: Decimal
23+
balance: Decimal = Field(default=0)
2424
timezone: TimeZoneName = Field(sa_column=Column(SATimezone(), nullable=False))
2525
currency: "Currency" = Relationship(back_populates="accounts")
2626
statements: list["Statement"] = Relationship(back_populates="account")

backend/kayman/tests/crud/test_account.py

Lines changed: 58 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,74 @@
99

1010
from kayman.crud.account import (
1111
_verify_account_ids,
12-
create_account,
12+
create_accounts,
1313
read_account,
1414
read_account_balance,
1515
read_accounts,
1616
update_account_balances,
1717
update_accounts,
1818
)
19-
from kayman.schemas.account import Account
19+
from kayman.schemas.account import Account, AccountCreate
2020
from kayman.tests.factories import AccountFactory, TransactionFactory
2121

2222

23-
def test_create_account(session: Session):
24-
account = AccountFactory.build(balance=0)
25-
db_account = create_account(session, account)
23+
def test_create_accounts_1_account(session: Session, session_2: Session):
24+
account = AccountCreate.model_validate(AccountFactory.build())
25+
db_account = create_accounts(session, [account])[0]
26+
db_read_account = read_account(session_2, db_account.id)
2627

27-
assert db_account.id is not None
28-
assert db_account.name == account.name
29-
assert db_account.currency_code == account.currency_code
30-
assert db_account.timezone == account.timezone
31-
assert db_account.balance == 0
28+
assert db_read_account.id is not None
29+
assert db_read_account.name == account.name
30+
assert db_read_account.currency_code == account.currency_code
31+
assert db_read_account.timezone == account.timezone
32+
assert db_read_account.balance == 0
33+
34+
35+
def test_create_accounts_n_accounts(session: Session):
36+
accounts = [
37+
AccountCreate.model_validate(account)
38+
for account in AccountFactory.build_batch(10)
39+
]
40+
db_accounts = create_accounts(session, accounts)
41+
42+
assert len(db_accounts) == 10
43+
for db_account, account in zip(db_accounts, accounts, strict=True):
44+
assert db_account.id is not None
45+
assert db_account.name == account.name
46+
assert db_account.currency_code == account.currency_code
47+
assert db_account.timezone == account.timezone
48+
assert db_account.balance == 0
49+
50+
51+
def test_create_accounts_empty(session: Session):
52+
assert create_accounts(session, []) == []
53+
54+
55+
def test_create_accounts_no_commit(session: Session, session_2: Session):
56+
account = AccountCreate.model_validate(AccountFactory.build())
57+
58+
# The account should be created in the session
59+
session_account = create_accounts(session, [account], commit=False)[0]
60+
assert session_account.id is not None # Auto int should be set
61+
assert session_account.name == account.name
62+
assert session_account.currency_code == account.currency_code
63+
assert session_account.timezone == account.timezone
64+
assert session_account.balance == 0
65+
66+
# The account should not be visible to other sessions (yet)
67+
assert read_account(session_2, session_account.id) is None
68+
69+
# Commit the account from main session
70+
session.commit()
71+
72+
# The account should now be visible to other sessions
73+
session_2_account = read_account(session_2, session_account.id)
74+
assert session_2_account is not None
75+
assert session_2_account.id == session_account.id
76+
assert session_2_account.name == session_account.name
77+
assert session_2_account.currency_code == session_account.currency_code
78+
assert session_2_account.timezone == session_account.timezone
79+
assert session_2_account.balance == 0
3280

3381

3482
def test_read_account(session: Session):

0 commit comments

Comments
 (0)