finance-watcher / test / api / endpoints / test_business.py
test_business.py
Raw
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
                }
            ]
        }