chore: hygiene sweep — dead code, role race, user lookup, stale files
One pass over the LOW-tier review items plus two folded issues: - Delete validate_journal_entry (dead since the Fava migration; it validated the pre-string-amount model) with its exports, unused crud imports, and tests. Beancount validates entries now. - Migration m006: UNIQUE index on user_roles(user_id, role_id) after deduping; assign_user_role inserts with ON CONFLICT DO NOTHING and returns the existing assignment — closes the auto-assign check-then-act race on concurrent logins. - Extract _get_username_from_user_id (110 lines in views_api, fresh LNbits Database per call inside per-row hot paths) into user_lookup.py with one shared core-DB handle, a 60s TTL cache and a batch get_usernames API (review #18). - Receivable-entry responses report CLEARED, matching the flag the formatter actually writes; PENDING misled the UI (libra-#35). - Replace the remaining print() calls in tasks.py with logger. - get_all_accounts derives valid roots from account_utils.ACCOUNT_TYPE_ROOTS instead of a hardcoded tuple, and the no-op per-test rate-limit reset is gone (libra-#54). - Delete migrations_old.py.bak, MIGRATION_SQUASH_SUMMARY.md, docs/PHASE*_COMPLETE.md and the rendered .html; .gitignore data/ (it holds the runtime .lnbits_auth_key secret). - Track docs/CODE-REVIEW-2026-06.md with finding statuses updated for the PR #55-#59 + chore/hygiene series. - CLAUDE.md notes LNbits pins Pydantic v1: keep .dict(), don't "modernize" to .model_dump(). Note: format_payment_entry's is_payable docstring (flagged in review follow-up) turned out to be consistent with the body — no change. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
c0d371036b
commit
ec6cac51f0
19 changed files with 454 additions and 2942 deletions
|
|
@ -394,66 +394,6 @@ def test_migrate_account_name_expense_with_ampersand():
|
|||
)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# core.validation — validate_journal_entry
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
def test_validate_journal_entry_balanced_passes():
|
||||
val.validate_journal_entry(
|
||||
{"id": "x"},
|
||||
[
|
||||
{"account_id": "a", "amount": 100},
|
||||
{"account_id": "b", "amount": -100},
|
||||
],
|
||||
)
|
||||
|
||||
|
||||
def test_validate_journal_entry_unbalanced_raises():
|
||||
with pytest.raises(val.ValidationError) as exc:
|
||||
val.validate_journal_entry(
|
||||
{"id": "x"},
|
||||
[
|
||||
{"account_id": "a", "amount": 100},
|
||||
{"account_id": "b", "amount": -50},
|
||||
],
|
||||
)
|
||||
assert "not balanced" in str(exc.value)
|
||||
|
||||
|
||||
def test_validate_journal_entry_single_line_raises():
|
||||
with pytest.raises(val.ValidationError) as exc:
|
||||
val.validate_journal_entry(
|
||||
{"id": "x"},
|
||||
[{"account_id": "a", "amount": 100}],
|
||||
)
|
||||
assert "at least 2 lines" in str(exc.value)
|
||||
|
||||
|
||||
def test_validate_journal_entry_zero_amount_raises():
|
||||
with pytest.raises(val.ValidationError) as exc:
|
||||
val.validate_journal_entry(
|
||||
{"id": "x"},
|
||||
[
|
||||
{"account_id": "a", "amount": 0},
|
||||
{"account_id": "b", "amount": 0},
|
||||
],
|
||||
)
|
||||
assert "amount = 0" in str(exc.value)
|
||||
|
||||
|
||||
def test_validate_journal_entry_missing_account_id_raises():
|
||||
with pytest.raises(val.ValidationError) as exc:
|
||||
val.validate_journal_entry(
|
||||
{"id": "x"},
|
||||
[
|
||||
{"amount": 100},
|
||||
{"account_id": "b", "amount": -100},
|
||||
],
|
||||
)
|
||||
assert "missing account_id" in str(exc.value)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# core.validation — validate_balance
|
||||
# ---------------------------------------------------------------------------
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue