from api.app import app from unittest.mock import patch from test.test_objects import ( create_mock_account_type, create_mock_account, create_mock_user ) from .test_helpers import response_data_to_dict, BASE_URL from datetime import datetime class TestAccountAPI: @patch('database.finance_database.FinanceDatabase.get_dashboard_user') @patch('database.finance_database.FinanceDatabase.insert_account') def test_get(self, mock_insert_account, mock_get_user): client = app.test_client() payload = { 'name': 'AccountName', 'account_type_id': 12, 'user_id': 1 } # test when user not in database mock_get_user.return_value = None response = client.post(f'{BASE_URL}/account', json=payload) assert response.status_code == 500 mock_get_user.return_value = create_mock_user() mock_insert_account.return_value = None response = client.post(f'{BASE_URL}/account', json=payload) assert response.status_code == 500 mock_insert_account.return_value = create_mock_account( name=payload['name'], account_type_id=payload['account_type_id'], dashboard_user_id=payload['user_id'], created_date=datetime(year=1900, month=3, day=1) ) response = client.post(f'{BASE_URL}/account', json=payload) assert response.status_code == 200 resposne_data = response_data_to_dict(response) assert resposne_data == { 'status': 'SUCCESS', 'status_code': 200, 'data':{ 'id': 1, 'user_id': 1, 'name': 'AccountName', 'account_type_id': 12, 'created_date': '1900-3-1', 'updated_date': 'null' } } class TestAccountTypeAPI: @patch('database.finance_database.FinanceDatabase.get_account_type') def test_get(self, mock_get_account_type): client = app.test_client() fake_account_type = 'BadAccountType' response = client.get(f'{BASE_URL}/account/type/{fake_account_type}') assert response.status_code == 500 real_account_type = 'BALANCE' mock_get_account_type.return_value = None response = client.get(f'{BASE_URL}/account/type/{real_account_type}') assert response.status_code == 500 mock_get_account_type.return_value = create_mock_account_type(name=real_account_type) response = client.get(f'{BASE_URL}/account/type/{real_account_type}') assert response.status_code == 200 resposne_data = response_data_to_dict(response) assert resposne_data == { 'status': 'SUCCESS', 'status_code': 200, 'data':{ 'id': 1, 'name': 'BALANCE', 'is_income': 'True', 'is_expense': 'False', } } class TestAccountTotalsAPI: @patch('database.finance_database.FinanceDatabase.get_dashboard_user') @patch('database.finance_database.FinanceDatabase.get_all_accounts_and_latest_totals') def test_get(self, mock_get_totals, mock_get_user): client = app.test_client() mock_get_totals.return_value = { 1 : ('SomeAccount', 0), 2 : ('SomeAccount2', 400) } # test when user not in database mock_get_user.return_value = None response = client.get(f'{BASE_URL}/account/totals?user_id=1') assert response.status_code == 500 mock_get_user.return_value = create_mock_user() response = client.get(f'{BASE_URL}/account/totals?user_id=1') assert response.status_code == 200 resposne_data = response_data_to_dict(response) assert resposne_data == { 'status': 'SUCCESS', 'status_code': 200, 'data': [ { 'account_id': 1, 'account_name': 'SomeAccount', 'total': 0 }, { 'account_id': 2, 'account_name': 'SomeAccount2', 'total': 400 } ] } class TestAccountPercentagesAPI: @patch('database.finance_database.FinanceDatabase.get_dashboard_user') @patch('database.finance_database.FinanceDatabase.get_latest_account_percentages') def test_get(self, mock_percentages, mock_get_user): client = app.test_client() # test when user not in database mock_get_user.return_value = None mock_percentages.return_value = None response = client.get(f'{BASE_URL}/account/latest_percentages?user_id=1') assert response.status_code == 500 mock_get_user.return_value = create_mock_user() mock_percentages.return_value = { 'Account1': 0.45, 'Account2': 0.30, 'Account3': 0.25 } response = client.get(f'{BASE_URL}/account/latest_percentages?user_id=1') assert response.status_code == 200 resposne_data = response_data_to_dict(response) assert resposne_data == { 'status': 'SUCCESS', 'status_code': 200, 'data':[ { 'account_name': 'Account1', 'percentage': 0.45 }, { 'account_name': 'Account2', 'percentage': 0.30 }, { 'account_name': 'Account3', 'percentage': 0.25 } ] }