finance-watcher / test / api / endpoints / test_budget.py
test_budget.py
Raw
from api.app import app
from unittest.mock import patch
from test.test_objects import create_mock_budget
from .test_helpers import response_data_to_dict, BASE_URL
from helpers.helper_functions import get_string_from_date


class TestBudgetAPI:

    @patch('database.finance_database.FinanceDatabase.get_budgets')
    def test_get(self, mock_get_budget):
        client = app.test_client()

        mock_get_budget.return_value = None
        response = client.get(f'{BASE_URL}/budget?dashboard_user_id=1')
        assert response.status_code == 500


        mock_budget = create_mock_budget()

        mock_get_budget.return_value = []
        response = client.get(f'{BASE_URL}/budget?dashboard_user_id=1')
        assert response.status_code == 200
        
        mock_get_budget.return_value = [mock_budget]
        response = client.get(f'{BASE_URL}/budget?dashboard_user_id=1')
        assert response.status_code == 200
        response_data = response_data_to_dict(response)
        assert response_data == {
            'status': 'SUCCESS',
            'status_code': 200,
            'data': [{
                'id': mock_budget.id,
                'name': mock_budget.name,
                'business_type_id': mock_budget.business_type_id,
                'created_date': get_string_from_date(mock_budget.created_date),
                'updated_date': 'null'
            }]
        }

    
    @patch('database.finance_database.FinanceDatabase.create_budget')
    def test_post(self, mock_create_budget):
        client = app.test_client()

        payload = {
            "dashboard_user_id": 1,
            "name": 'UpdatedBudget',
            "amount": 349,
            "business_type_id": 100,
        }
        
        mock_create_budget.return_value = None
        response = client.post(f'{BASE_URL}/budget', json=payload)
        assert response.status_code == 500


        mock_budget = create_mock_budget(
            dashboard_user_id=payload['dashboard_user_id'],
            name=payload['name'],
            amount=payload['amount'],
            business_type_id=payload['business_type_id']
        )

        mock_create_budget.return_value = mock_budget
        response = client.post(f'{BASE_URL}/budget', json=payload)
        assert response.status_code == 200
        response_data = response_data_to_dict(response)
        assert response_data == {
            'status': 'SUCCESS',
            'status_code': 200,
            'data': {
                'id': mock_budget.id,
                'name': mock_budget.name,
                'business_type_id': mock_budget.business_type_id,
                'created_date': get_string_from_date(mock_budget.created_date),
                'updated_date': 'null'
            }
        }
    
    @patch('database.finance_database.FinanceDatabase.update_budget')
    def test_patch(self, mock_update_budget):
        client = app.test_client()
        payload = {
            'budget_id': 1
        }

        response = client.patch(f'{BASE_URL}/budget', json=payload)
        assert response.status_code == 500

        payload = {
            'budget_id': 1,
            'name': 'TestBudget',
            'amount': 200
        }

        mock_update_budget.return_value = False
        response = client.patch(f'{BASE_URL}/budget', json=payload)
        assert response.status_code == 500

        mock_update_budget.return_value = True
        response = client.patch(f'{BASE_URL}/budget', json=payload)
        assert response.status_code == 200
    
    @patch('database.finance_database.FinanceDatabase.delete_budget')
    def test_delete(self, mock_delete_budget):
        client = app.test_client()
        payload = {
            'dashboard_user_id': 5,
            'name': 'TestBudget'
        }

        mock_delete_budget.return_value = False
        response = client.delete(f'{BASE_URL}/budget', json=payload)
        assert response.status_code == 500

        mock_delete_budget.return_value = True
        response = client.delete(f'{BASE_URL}/budget', json=payload)
        assert response.status_code == 200