Almost finish basic functionalities
All checks were successful
Backend CI / unit-test (push) Successful in 36s

This commit is contained in:
2025-09-24 17:33:27 +02:00
parent cf6c826468
commit 80fc405bf6
9 changed files with 455 additions and 35 deletions

View File

@@ -172,6 +172,51 @@ def test_create_trade_success_with_cycle(session: Session) -> None:
assert actual_trade.trade_type == trade_data["trade_type"]
assert actual_trade.trade_strategy == trade_data["trade_strategy"]
assert actual_trade.quantity == trade_data["quantity"]
assert actual_trade.quantity_multiplier == 1
assert actual_trade.price_cents == trade_data["price_cents"]
assert actual_trade.gross_cash_flow_cents == trade_data["gross_cash_flow_cents"]
assert actual_trade.commission_cents == trade_data["commission_cents"]
assert actual_trade.net_cash_flow_cents == trade_data["net_cash_flow_cents"]
assert actual_trade.cycle_id == trade_data["cycle_id"]
def test_create_trade_with_custom_multipler(session: Session) -> None:
user_id = make_user(session)
exchange_id = make_exchange(session, user_id)
cycle_id = make_cycle(session, user_id, exchange_id)
trade_data = {
"user_id": user_id,
"friendly_name": "Test Trade with Multiplier",
"symbol": "AAPL",
"underlying_currency": models.UnderlyingCurrency.USD,
"trade_type": models.TradeType.LONG_SPOT,
"trade_strategy": models.TradeStrategy.SPOT,
"trade_time_utc": datetime.now(timezone.utc),
"quantity": 10,
"quantity_multiplier": 100,
"price_cents": 15000,
"gross_cash_flow_cents": -1500000,
"commission_cents": 50000,
"net_cash_flow_cents": -1550000,
"cycle_id": cycle_id,
}
trade = crud.create_trade(session, trade_data)
assert trade.id is not None
assert trade.user_id == user_id
assert trade.cycle_id == cycle_id
session.refresh(trade)
actual_trade = session.get(models.Trades, trade.id)
assert actual_trade is not None
assert actual_trade.friendly_name == trade_data["friendly_name"]
assert actual_trade.symbol == trade_data["symbol"]
assert actual_trade.underlying_currency == trade_data["underlying_currency"]
assert actual_trade.trade_type == trade_data["trade_type"]
assert actual_trade.trade_strategy == trade_data["trade_strategy"]
assert actual_trade.quantity == trade_data["quantity"]
assert actual_trade.quantity_multiplier == trade_data["quantity_multiplier"]
assert actual_trade.price_cents == trade_data["price_cents"]
assert actual_trade.gross_cash_flow_cents == trade_data["gross_cash_flow_cents"]
assert actual_trade.commission_cents == trade_data["commission_cents"]
@@ -194,6 +239,9 @@ def test_create_trade_with_auto_created_cycle(session: Session) -> None:
"trade_time_utc": datetime.now(timezone.utc),
"quantity": 5,
"price_cents": 15500,
"gross_cash_flow_cents": -77500,
"commission_cents": 300,
"net_cash_flow_cents": -77800,
}
trade = crud.create_trade(session, trade_data)
@@ -405,6 +453,24 @@ def test_get_trades_by_user_id(session: Session) -> None:
assert friendly_names == {"Trade One", "Trade Two"}
def test_update_trade_friendly_name(session: Session) -> None:
user_id = make_user(session)
exchange_id = make_exchange(session, user_id)
cycle_id = make_cycle(session, user_id, exchange_id)
trade_id = make_trade(session, user_id, cycle_id)
new_friendly_name = "Updated Trade Name"
updated_trade = crud.update_trade_friendly_name(session, trade_id, new_friendly_name)
assert updated_trade is not None
assert updated_trade.id == trade_id
assert updated_trade.friendly_name == new_friendly_name
session.refresh(updated_trade)
actual_trade = session.get(models.Trades, trade_id)
assert actual_trade is not None
assert actual_trade.friendly_name == new_friendly_name
def test_update_trade_note(session: Session) -> None:
user_id = make_user(session)
exchange_id = make_exchange(session, user_id)
@@ -457,6 +523,9 @@ def test_replace_trade(session: Session) -> None:
"trade_time_utc": datetime.now(timezone.utc),
"quantity": 20,
"price_cents": 25000,
"gross_cash_flow_cents": -500000,
"commission_cents": 1000,
"net_cash_flow_cents": -501000,
}
new_trade = crud.replace_trade(session, old_trade_id, new_trade_data)
@@ -516,6 +585,31 @@ def test_create_cycle(session: Session) -> None:
assert actual_cycle.start_date == cycle_data["start_date"]
def test_get_cycle_by_id(session: Session) -> None:
user_id = make_user(session)
exchange_id = make_exchange(session, user_id)
cycle_id = make_cycle(session, user_id, exchange_id, friendly_name="Cycle to Get")
cycle = crud.get_cycle_by_id(session, cycle_id)
assert cycle is not None
assert cycle.id == cycle_id
assert cycle.friendly_name == "Cycle to Get"
assert cycle.user_id == user_id
def test_get_cycles_by_user_id(session: Session) -> None:
user_id = make_user(session)
exchange_id = make_exchange(session, user_id)
cycle_names = ["Cycle One", "Cycle Two", "Cycle Three"]
for name in cycle_names:
make_cycle(session, user_id, exchange_id, friendly_name=name)
cycles = crud.get_cycles_by_user_id(session, user_id)
assert len(cycles) == len(cycle_names)
fetched_names = {cycle.friendly_name for cycle in cycles}
for name in cycle_names:
assert name in fetched_names
def test_update_cycle(session: Session) -> None:
user_id = make_user(session)
exchange_id = make_exchange(session, user_id)

View File

@@ -42,7 +42,7 @@ def test_run_migrations_0_to_1(monkeypatch: pytest.MonkeyPatch) -> None:
"funding_source": ("TEXT", 0, 0),
"capital_exposure_cents": ("INTEGER", 0, 0),
"loan_amount_cents": ("INTEGER", 0, 0),
"loan_interest_rate_bps": ("INTEGER", 0, 0),
"loan_interest_rate_tenth_bps": ("INTEGER", 0, 0),
"start_date": ("DATE", 1, 0),
"end_date": ("DATE", 0, 0),
},
@@ -60,6 +60,7 @@ def test_run_migrations_0_to_1(monkeypatch: pytest.MonkeyPatch) -> None:
"expiry_date": ("DATE", 0, 0),
"strike_price_cents": ("INTEGER", 0, 0),
"quantity": ("INTEGER", 1, 0),
"quantity_multiplier": ("INTEGER", 1, 0),
"price_cents": ("INTEGER", 1, 0),
"gross_cash_flow_cents": ("INTEGER", 1, 0),
"commission_cents": ("INTEGER", 1, 0),