finance-watcher / test / api / endpoints / test_transaction.py
test_transaction.py
Raw
from api.app import app
from unittest.mock import patch
from test.test_objects import create_mock_transaction
from .test_helpers import response_data_to_dict, BASE_URL
from datetime import datetime, timedelta
from typing import Optional


class TestTransactionAPI:
    @patch('database.finance_database.FinanceDatabase.get_transactions')
    def test_get(self, mock_get_transactions):

        def get_url(
            user_id: int = 1,
            business_type_id: int = 1,
            start_date: Optional[str] = None,
            end_date: Optional[str] = None
        ) -> str:
            url = f"{BASE_URL}/transaction?user_id={user_id}&business_type_id={business_type_id}"
            if start_date:
                url = f"{url}&start_date={start_date}"
            if end_date:
                url = f"{url}&end_date={end_date}"

            return url

        client = app.test_client()

        # get, start > end
        response = client.get(
            get_url(
                start_date=datetime.now().date(),
                end_date=(datetime.now() - timedelta(days=2)).date()
            )
        )
        assert response.status_code == 500

        # get, start but no end
        response = client.get(get_url(start_date=datetime.now().date()))
        assert response.status_code == 500

        # get, end but no start
        response = client.get(get_url(end_date=datetime.now().date()))
        assert response.status_code == 500
        
        # get, no results
        mock_get_transactions.return_value = []
        response = client.get(get_url())
        assert response.status_code == 200
        response_data = response_data_to_dict(response)
        assert response_data == {
            'status': 'SUCCESS',
            'status_code': 200,
            'data': []
        }

        # get, successful results
        mock_get_transactions.return_value = [
            create_mock_transaction(
                amount=5000, 
                created_date=datetime(year=1970, month=11, day=4)
            ),
            create_mock_transaction(
                id=2, 
                amount=3000,
                created_date=datetime(year=2000, month=10, day=25)
            )
        ]
        response = client.get(get_url())

        assert response.status_code == 200
        response_data = response_data_to_dict(response)
        assert response_data == {
            'status': 'SUCCESS',
            'status_code': 200,
            'data':[
                {
                    'amount': 5000,
                    'business_id': 1,
                    'is_expense': 'True',
                    'created_date': '1970-11-4'
                },
                {
                    'amount': 3000,
                    'business_id': 1,
                    'is_expense': 'True',
                    'created_date': '2000-10-25'
                },
            ]
        }

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

         # test if failed to insert transactions
        payload = {
            'user_id': 1,
            'transactions': [{
                'amount': 0,
                'business_id': 1,
                'is_expense': True,
                'created_date': datetime.now().date()
            }]
        }
        mock_insert_transactions.return_value = False
        response = client.post(f'{BASE_URL}/transaction',json=payload)
        assert response.status_code == 500

        # test if insert sucessful
        mock_insert_transactions.return_value = True

        response = client.post(f'{BASE_URL}/transaction',json=payload)

        assert response.status_code == 200