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