mirror of
https://github.com/elisiariocouto/leggen.git
synced 2025-12-13 11:22:21 +00:00
refactor: Remove API response wrapper pattern.
Replace wrapped responses {success, data, message} with direct data returns
following REST best practices. Simplifies 41 endpoints across 7 route files
and updates all 109 tests. Also fixes test config setup to not require
user home directory config file.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -66,8 +66,7 @@ class TestAnalyticsFix:
|
||||
)
|
||||
|
||||
# Verify that the response contains stats for all 600 transactions
|
||||
assert data["success"] is True
|
||||
stats = data["data"]
|
||||
stats = data
|
||||
assert stats["total_transactions"] == 600, (
|
||||
"Should process all 600 transactions, not just 100"
|
||||
)
|
||||
@@ -132,8 +131,7 @@ class TestAnalyticsFix:
|
||||
)
|
||||
|
||||
# Verify that all 600 transactions are returned
|
||||
assert data["success"] is True
|
||||
transactions_data = data["data"]
|
||||
transactions_data = data
|
||||
assert len(transactions_data) == 600, (
|
||||
"Analytics endpoint should return all 600 transactions"
|
||||
)
|
||||
|
||||
@@ -60,9 +60,8 @@ class TestAccountsAPI:
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["success"] is True
|
||||
assert len(data["data"]) == 1
|
||||
account = data["data"][0]
|
||||
assert len(data) == 1
|
||||
account = data[0]
|
||||
assert account["id"] == "test-account-123"
|
||||
assert account["institution_id"] == "REVOLUT_REVOLT21"
|
||||
assert len(account["balances"]) == 1
|
||||
@@ -117,11 +116,9 @@ class TestAccountsAPI:
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["success"] is True
|
||||
account = data["data"]
|
||||
assert account["id"] == "test-account-123"
|
||||
assert account["iban"] == "LT313250081177977789"
|
||||
assert len(account["balances"]) == 1
|
||||
assert data["id"] == "test-account-123"
|
||||
assert data["iban"] == "LT313250081177977789"
|
||||
assert len(data["balances"]) == 1
|
||||
|
||||
def test_get_account_balances_success(
|
||||
self, api_client, mock_config, mock_auth_token, mock_db_path
|
||||
@@ -163,11 +160,10 @@ class TestAccountsAPI:
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["success"] is True
|
||||
assert len(data["data"]) == 2
|
||||
assert data["data"][0]["amount"] == 1000.00
|
||||
assert data["data"][0]["currency"] == "EUR"
|
||||
assert data["data"][0]["balance_type"] == "interimAvailable"
|
||||
assert len(data) == 2
|
||||
assert data[0]["amount"] == 1000.00
|
||||
assert data[0]["currency"] == "EUR"
|
||||
assert data[0]["balance_type"] == "interimAvailable"
|
||||
|
||||
def test_get_account_transactions_success(
|
||||
self,
|
||||
@@ -212,10 +208,9 @@ class TestAccountsAPI:
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["success"] is True
|
||||
assert len(data["data"]) == 1
|
||||
assert len(data) == 1
|
||||
|
||||
transaction = data["data"][0]
|
||||
transaction = data[0]
|
||||
assert transaction["internal_transaction_id"] == "txn-123"
|
||||
assert transaction["amount"] == -10.50
|
||||
assert transaction["currency"] == "EUR"
|
||||
@@ -264,10 +259,9 @@ class TestAccountsAPI:
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["success"] is True
|
||||
assert len(data["data"]) == 1
|
||||
assert len(data) == 1
|
||||
|
||||
transaction = data["data"][0]
|
||||
transaction = data[0]
|
||||
assert transaction["internal_transaction_id"] == "txn-123"
|
||||
assert transaction["institution_id"] == "REVOLUT_REVOLT21"
|
||||
assert transaction["iban"] == "LT313250081177977789"
|
||||
@@ -321,9 +315,8 @@ class TestAccountsAPI:
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["success"] is True
|
||||
assert data["data"]["id"] == "test-account-123"
|
||||
assert data["data"]["display_name"] == "My Custom Account Name"
|
||||
assert data["id"] == "test-account-123"
|
||||
assert data["display_name"] == "My Custom Account Name"
|
||||
|
||||
def test_update_account_not_found(
|
||||
self, api_client, mock_config, mock_auth_token, mock_db_path
|
||||
|
||||
@@ -19,8 +19,7 @@ class TestBackupAPI:
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["success"] is True
|
||||
assert data["data"]["s3"] is None
|
||||
assert data["s3"] is None
|
||||
|
||||
def test_get_backup_settings_with_s3_config(self, api_client, mock_config):
|
||||
"""Test getting backup settings with S3 configuration."""
|
||||
@@ -42,10 +41,9 @@ class TestBackupAPI:
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["success"] is True
|
||||
assert data["data"]["s3"] is not None
|
||||
assert data["s3"] is not None
|
||||
|
||||
s3_config = data["data"]["s3"]
|
||||
s3_config = data["s3"]
|
||||
assert s3_config["access_key_id"] == "***" # Masked
|
||||
assert s3_config["secret_access_key"] == "***" # Masked
|
||||
assert s3_config["bucket_name"] == "test-bucket"
|
||||
@@ -77,8 +75,7 @@ class TestBackupAPI:
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["success"] is True
|
||||
assert data["data"]["updated"] is True
|
||||
assert data["updated"] is True
|
||||
|
||||
# Verify connection test was called
|
||||
mock_test_connection.assert_called_once()
|
||||
@@ -132,8 +129,7 @@ class TestBackupAPI:
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["success"] is True
|
||||
assert data["data"]["connected"] is True
|
||||
assert data["connected"] is True
|
||||
|
||||
# Verify connection test was called
|
||||
mock_test_connection.assert_called_once()
|
||||
@@ -158,9 +154,9 @@ class TestBackupAPI:
|
||||
|
||||
response = api_client.post("/api/v1/backup/test", json=request_data)
|
||||
|
||||
assert response.status_code == 200
|
||||
assert response.status_code == 400
|
||||
data = response.json()
|
||||
assert data["success"] is False
|
||||
assert "S3 connection test failed" in data["detail"]
|
||||
|
||||
def test_test_backup_connection_invalid_service(self, api_client):
|
||||
"""Test backup connection test with invalid service."""
|
||||
@@ -214,10 +210,9 @@ class TestBackupAPI:
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["success"] is True
|
||||
assert len(data["data"]) == 2
|
||||
assert len(data) == 2
|
||||
assert (
|
||||
data["data"][0]["key"]
|
||||
data[0]["key"]
|
||||
== "leggen_backups/database_backup_20250101_120000.db"
|
||||
)
|
||||
|
||||
@@ -230,8 +225,7 @@ class TestBackupAPI:
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["success"] is True
|
||||
assert data["data"] == []
|
||||
assert data == []
|
||||
|
||||
@patch("leggen.services.backup_service.BackupService.backup_database")
|
||||
@patch("leggen.utils.paths.path_manager.get_database_path")
|
||||
@@ -261,9 +255,8 @@ class TestBackupAPI:
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["success"] is True
|
||||
assert data["data"]["operation"] == "backup"
|
||||
assert data["data"]["completed"] is True
|
||||
assert data["operation"] == "backup"
|
||||
assert data["completed"] is True
|
||||
|
||||
# Verify backup was called
|
||||
mock_backup_db.assert_called_once()
|
||||
|
||||
@@ -33,10 +33,9 @@ class TestBanksAPI:
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["success"] is True
|
||||
assert len(data["data"]) == 2
|
||||
assert data["data"][0]["id"] == "REVOLUT_REVOLT21"
|
||||
assert data["data"][1]["id"] == "BANCOBPI_BBPIPTPL"
|
||||
assert len(data) == 2
|
||||
assert data[0]["id"] == "REVOLUT_REVOLT21"
|
||||
assert data[1]["id"] == "BANCOBPI_BBPIPTPL"
|
||||
|
||||
@respx.mock
|
||||
def test_get_institutions_invalid_country(self, api_client, mock_config):
|
||||
@@ -92,9 +91,8 @@ class TestBanksAPI:
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["success"] is True
|
||||
assert data["data"]["id"] == "req-123"
|
||||
assert data["data"]["institution_id"] == "REVOLUT_REVOLT21"
|
||||
assert data["id"] == "req-123"
|
||||
assert data["institution_id"] == "REVOLUT_REVOLT21"
|
||||
|
||||
@respx.mock
|
||||
def test_get_bank_status_success(self, api_client, mock_config, mock_auth_token):
|
||||
@@ -128,10 +126,9 @@ class TestBanksAPI:
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["success"] is True
|
||||
assert len(data["data"]) == 1
|
||||
assert data["data"][0]["bank_id"] == "REVOLUT_REVOLT21"
|
||||
assert data["data"][0]["status_display"] == "LINKED"
|
||||
assert len(data) == 1
|
||||
assert data[0]["bank_id"] == "REVOLUT_REVOLT21"
|
||||
assert data[0]["status_display"] == "LINKED"
|
||||
|
||||
def test_get_supported_countries(self, api_client):
|
||||
"""Test supported countries endpoint."""
|
||||
@@ -139,11 +136,10 @@ class TestBanksAPI:
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["success"] is True
|
||||
assert len(data["data"]) > 0
|
||||
assert len(data) > 0
|
||||
|
||||
# Check some expected countries
|
||||
country_codes = [country["code"] for country in data["data"]]
|
||||
country_codes = [country["code"] for country in data]
|
||||
assert "PT" in country_codes
|
||||
assert "GB" in country_codes
|
||||
assert "DE" in country_codes
|
||||
|
||||
@@ -58,7 +58,6 @@ class TestTransactionsAPI:
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["success"] is True
|
||||
assert len(data["data"]) == 2
|
||||
|
||||
# Check first transaction summary
|
||||
@@ -105,7 +104,6 @@ class TestTransactionsAPI:
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["success"] is True
|
||||
assert len(data["data"]) == 1
|
||||
|
||||
transaction = data["data"][0]
|
||||
@@ -160,7 +158,6 @@ class TestTransactionsAPI:
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["success"] is True
|
||||
|
||||
# Verify the database service was called with correct filters
|
||||
mock_get_transactions.assert_called_once_with(
|
||||
@@ -193,11 +190,10 @@ class TestTransactionsAPI:
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["success"] is True
|
||||
assert len(data["data"]) == 0
|
||||
assert data["pagination"]["total"] == 0
|
||||
assert data["pagination"]["page"] == 1
|
||||
assert data["pagination"]["total_pages"] == 0
|
||||
assert data["total"] == 0
|
||||
assert data["page"] == 1
|
||||
assert data["total_pages"] == 0
|
||||
|
||||
def test_get_transactions_database_error(
|
||||
self, api_client, mock_config, mock_auth_token
|
||||
@@ -254,21 +250,19 @@ class TestTransactionsAPI:
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["success"] is True
|
||||
|
||||
stats = data["data"]
|
||||
assert stats["period_days"] == 30
|
||||
assert stats["total_transactions"] == 3
|
||||
assert stats["booked_transactions"] == 2
|
||||
assert stats["pending_transactions"] == 1
|
||||
assert stats["total_income"] == 100.00
|
||||
assert stats["total_expenses"] == 35.80 # abs(-10.50) + abs(-25.30)
|
||||
assert stats["net_change"] == 64.20 # 100.00 - 35.80
|
||||
assert stats["accounts_included"] == 2 # Two unique account IDs
|
||||
assert data["period_days"] == 30
|
||||
assert data["total_transactions"] == 3
|
||||
assert data["booked_transactions"] == 2
|
||||
assert data["pending_transactions"] == 1
|
||||
assert data["total_income"] == 100.00
|
||||
assert data["total_expenses"] == 35.80 # abs(-10.50) + abs(-25.30)
|
||||
assert data["net_change"] == 64.20 # 100.00 - 35.80
|
||||
assert data["accounts_included"] == 2 # Two unique account IDs
|
||||
|
||||
# Average transaction: ((-10.50) + 100.00 + (-25.30)) / 3 = 64.20 / 3 = 21.4
|
||||
expected_avg = round(64.20 / 3, 2)
|
||||
assert stats["average_transaction"] == expected_avg
|
||||
assert data["average_transaction"] == expected_avg
|
||||
|
||||
def test_get_transaction_stats_with_account_filter(
|
||||
self, api_client, mock_config, mock_auth_token
|
||||
@@ -317,15 +311,13 @@ class TestTransactionsAPI:
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["success"] is True
|
||||
|
||||
stats = data["data"]
|
||||
assert stats["total_transactions"] == 0
|
||||
assert stats["total_income"] == 0.0
|
||||
assert stats["total_expenses"] == 0.0
|
||||
assert stats["net_change"] == 0.0
|
||||
assert stats["average_transaction"] == 0 # Division by zero handled
|
||||
assert stats["accounts_included"] == 0
|
||||
assert data["total_transactions"] == 0
|
||||
assert data["total_income"] == 0.0
|
||||
assert data["total_expenses"] == 0.0
|
||||
assert data["net_change"] == 0.0
|
||||
assert data["average_transaction"] == 0 # Division by zero handled
|
||||
assert data["accounts_included"] == 0
|
||||
|
||||
def test_get_transaction_stats_database_error(
|
||||
self, api_client, mock_config, mock_auth_token
|
||||
@@ -368,7 +360,7 @@ class TestTransactionsAPI:
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["data"]["period_days"] == 7
|
||||
assert data["period_days"] == 7
|
||||
|
||||
# Verify the date range was calculated correctly for 7 days
|
||||
mock_get_transactions.assert_called_once()
|
||||
|
||||
Reference in New Issue
Block a user