"""Tests for account handlers.""" from unittest.mock import patch import pytest from moneyhub.constants.constants import OrderDirection from moneyhub.constants.constants import StatementPeriodStatus from moneyhub.schemas.account_statement_period import AccountActivityPeriodSchema from moneyhub.schemas.account_statement_period import AccountArtistSchema from moneyhub.schemas.account_statement_period import AccountImprintSchema from moneyhub.schemas.account_statement_period import AccountProductSchema from moneyhub.schemas.account_statement_period import AccountProjectSchema from moneyhub.schemas.account_statement_period import AccountRecordingSchema from moneyhub.schemas.account_statement_period import AccountStatementPeriodVatDetailSchema from moneyhub.schemas.account_statement_period import AccountTrackSchema from moneyhub.schemas.revenue_analysis import TransactionTypeSchema from tests.utils.factories import AccountImprintFactory from tests.utils.factories import RevenueByActivityMonthFactory @patch('moneyhub.handlers.account.account_logic') def test_get_activity_periods_by_account(mock_logic, fixture_client): """Test getting activity periods by account.""" account_id = 24601 mock_logic.get_activity_periods_by_account.return_value = [ RevenueByActivityMonthFactory.build( activity_period_id=123, activity_month_name='March 2009' ), RevenueByActivityMonthFactory.build( activity_period_id=234, activity_month_name='June 2018' ), ] response = fixture_client.get(f'/account/{account_id}/activity-periods') assert response.status_code == 200 assert response.json() == [ {'activity_period_id': 123, 'activity_month_name': 'March 2009'}, {'activity_period_id': 234, 'activity_month_name': 'June 2018'}, ] mock_logic.get_activity_periods_by_account.assert_called_once_with( account_id, None, None) @patch('moneyhub.handlers.account.account_logic') def test_get_activity_periods_by_account_and_subaccount(mock_logic, fixture_client): """Test getting activity periods by account and subaccount.""" account_id = 24601 contract_id = 10001 mock_logic.get_activity_periods_by_account.return_value = [ RevenueByActivityMonthFactory.build( activity_period_id=123, activity_month_name='March 2009' ), ] response = fixture_client.get( f'/account/{account_id}/activity-periods?subaccount_id={contract_id}') assert response.status_code == 200 assert response.json() == [ {'activity_period_id': 123, 'activity_month_name': 'March 2009'}, ] mock_logic.get_activity_periods_by_account.assert_called_once_with( account_id, contract_id, None) @patch('moneyhub.handlers.account.account_statement_period_logic') def test_get_account_statement_periods_by_account_id( mock_logic, fixture_client, account_statement_periods_by_account_fixture, paginated_account_statement_periods_by_account_fixture ): """Test to get ledger info per statement period for a specified account.""" account_id = 77 mock_logic.get_account_statement_periods_by_account \ .return_value = paginated_account_statement_periods_by_account_fixture res = fixture_client.get(f'/account/{account_id}/statement-periods') assert res.status_code == 200 assert res.json() == account_statement_periods_by_account_fixture mock_logic.get_account_statement_periods_by_account.assert_called_once_with( account_id, None, None, None, OrderDirection.ASC) @patch('moneyhub.handlers.account.account_statement_period_logic') def test_get_account_statements_by_account_id( mock_logic, fixture_client, paginated_account_statement_periods_by_account_fixture ): """Test to get ledger info per statement period for a specified account.""" account_id = 77 mock_logic.get_account_statement_periods_by_account \ .return_value = paginated_account_statement_periods_by_account_fixture res = fixture_client.get(f'/account/{account_id}/statements') assert res.status_code == 200 assert res.json() == paginated_account_statement_periods_by_account_fixture mock_logic.get_account_statement_periods_by_account.assert_called_once_with( account_id=account_id, contract_id=None, limit=50, offset=0, order_dir=OrderDirection.ASC) @patch('moneyhub.handlers.account.account_statement_period_logic') def test_get_account_statements_by_account_id_and_contract_id( mock_logic, fixture_client, paginated_account_statement_periods_by_account_fixture ): """Test to get ledger info per statement period for a specified account/contract.""" account_id = 77 contract_id = 123 mock_logic.get_account_statement_periods_by_account \ .return_value = paginated_account_statement_periods_by_account_fixture res = fixture_client.get( f'/account/{account_id}/statements?contract_id={contract_id}') assert res.status_code == 200 assert res.json() == paginated_account_statement_periods_by_account_fixture mock_logic.get_account_statement_periods_by_account.assert_called_once_with( account_id=account_id, contract_id=contract_id, limit=50, offset=0, order_dir=OrderDirection.ASC ) @patch('moneyhub.handlers.account.account_statement_period_logic') def test_get_payments_for_account_and_statement_period( mock_logic, fixture_client): """Test to get payments for specified account and statement period.""" account_id = 10 statement_period_id = 20 expected_result = [ { 'ledger_account_id': 1, 'statement_period_id': 20, 'account_id': 10, 'contract_id': 1, 'action_status': 'complete', 'currency_code': 'USD', 'currency_amount': -5000.00, 'created_at': '2022-01-01', 'event_name': 'send_payments', 'withholding_tax_ledger_account_id': None, 'withholding_tax_currency_code': None, 'withholding_tax_currency_amount': None, 'withholding_tax_created_at': None } ] mock_logic.get_payments_by_account_and_statement_periods \ .return_value = expected_result res = fixture_client.get( f'/account/{account_id}/statement-period/{statement_period_id}/payments' ) assert res.status_code == 200 assert res.json() == expected_result mock_logic.get_payments_by_account_and_statement_periods.assert_called_once_with( account_id, None, [statement_period_id] ) @patch('moneyhub.handlers.account.account_statement_period_logic') def test_get_payments_for_account_and_contract_id( mock_logic, fixture_client): """Test to get payments for specified account and contract_id.""" account_id = 10 statement_period_id = 20 contract_id = 1 expected_result = [ { 'ledger_account_id': 1, 'statement_period_id': 20, 'action_status': 'complete', 'account_id': 10, 'contract_id': contract_id, 'currency_code': 'USD', 'currency_amount': -5000.00, 'created_at': '2022-01-01', 'event_name': 'send_payments', 'withholding_tax_ledger_account_id': None, 'withholding_tax_currency_code': None, 'withholding_tax_currency_amount': None, 'withholding_tax_created_at': None }, { 'ledger_account_id': 1, 'statement_period_id': 20, 'account_id': 10, 'contract_id': contract_id, 'action_status': None, 'currency_code': 'USD', 'currency_amount': -5000.00, 'created_at': '2022-01-01', 'event_name': 'payment_returned', 'withholding_tax_ledger_account_id': None, 'withholding_tax_currency_code': None, 'withholding_tax_currency_amount': None, 'withholding_tax_created_at': None } ] mock_logic.get_payments_by_account_and_statement_periods \ .return_value = expected_result res = fixture_client.get( '/account/{}/statement-period/{}/payments?contract_id={}'.format( account_id, statement_period_id, contract_id)) assert res.status_code == 200 assert res.json() == expected_result mock_logic.get_payments_by_account_and_statement_periods.assert_called_once_with( account_id, contract_id, [statement_period_id] ) @patch('moneyhub.handlers.account.account_statement_period_logic') def test_get_account_statement_period_vat(mock_logic, fixture_client): """Test to get VAT info for specified account and statement period.""" account_id = 24601 statement_period_id = 123 mock_logic.get_vat_by_account_and_statement_periods.return_value = [ AccountStatementPeriodVatDetailSchema( statement_period_id=statement_period_id, account_id=account_id, payee_currency_code='NOK', base_amount_payee_currency=100, net_amount_payee_currency=80, vat_amount_payee_currency=20, currency_code='NOK', gross_revenue=100, net_revenue=80, distribution_fee=20, gross_vat_rate=20, distribution_vat_rate=20, gross_vat=20, distribution_vat=4, adjusted_net_revenue=56, ) ] res = fixture_client.get( f'/account/{account_id}/statement-period/{statement_period_id}/vat') assert res.status_code == 200 assert res.json() == { 'statement_period_id': statement_period_id, 'account_id': account_id, 'payee_currency_code': 'NOK', 'base_amount_payee_currency': 100, 'net_amount_payee_currency': 80, 'vat_amount_payee_currency': 20, 'currency_code': 'NOK', 'gross_revenue': 100, 'net_revenue': 80, 'distribution_fee': 20, 'gross_vat_rate': 20, 'distribution_vat_rate': 20, 'gross_vat': 20, 'distribution_vat': 4, 'adjusted_net_revenue': 56, } mock_logic.get_vat_by_account_and_statement_periods.assert_called_once_with( account_id, None, [statement_period_id] ) @patch('moneyhub.handlers.account.account_statement_period_logic') def test_get_account_statement_period_vat_contract(mock_logic, fixture_client): """Test to get VAT info for specified account, contract, and statement period.""" account_id = 24601 contract_id = 1001 statement_period_id = 123 mock_logic.get_vat_by_account_and_statement_periods.return_value = [ AccountStatementPeriodVatDetailSchema( statement_period_id=statement_period_id, account_id=account_id, payee_currency_code='NOK', base_amount_payee_currency=100, net_amount_payee_currency=80, vat_amount_payee_currency=20, currency_code='NOK', gross_revenue=100, net_revenue=80, distribution_fee=20, gross_vat_rate=20, distribution_vat_rate=20, gross_vat=20, distribution_vat=4, adjusted_net_revenue=56, ) ] res = fixture_client.get( '/account/{}/statement-period/{}/vat?contract_id={}'.format( account_id, statement_period_id, contract_id)) assert res.status_code == 200 assert res.json() == { 'statement_period_id': statement_period_id, 'account_id': account_id, 'payee_currency_code': 'NOK', 'base_amount_payee_currency': 100, 'net_amount_payee_currency': 80, 'vat_amount_payee_currency': 20, 'currency_code': 'NOK', 'gross_revenue': 100, 'net_revenue': 80, 'distribution_fee': 20, 'gross_vat_rate': 20, 'distribution_vat_rate': 20, 'gross_vat': 20, 'distribution_vat': 4, 'adjusted_net_revenue': 56, } mock_logic.get_vat_by_account_and_statement_periods.assert_called_once_with( account_id, contract_id, [statement_period_id] ) @patch('moneyhub.handlers.account.account_statement_period_logic') def test_get_account_statement_period_vat_empty(mock_logic, fixture_client): """Test to get VAT info with an empty result.""" account_id = 24601 statement_period_id = 123 mock_logic.get_vat_by_account_and_statement_periods.return_value = [] res = fixture_client.get( f'/account/{account_id}/statement-period/{statement_period_id}/vat') assert res.status_code == 200 assert res.json() is None @patch('moneyhub.handlers.account.account_logic') def test_get_statement_periods_by_account_id(mock_logic, fixture_client): """Test to get statement periods for a specified account.""" account_id = 24601 expected_response = [ { 'statement_period_id': 1, 'statement_period_name': 'Test', 'statement_period_status': StatementPeriodStatus.CLOSED, 'currency_code': 'USD', 'statement_year': None, 'statement_month': None, }] mock_logic.get_statement_periods_by_account.return_value = expected_response res = fixture_client.get( f'/account/{account_id}/account-statement-periods') assert res.status_code == 200 assert res.json() == expected_response @patch('moneyhub.handlers.account.account_statement_period_logic') def test_get_account_statement_period_balance(mock_logic, fixture_client): """Test to get balance info for specified account, contract, and statement period.""" account_id = 24601 contract_id = 1001 statement_period_id = 123 expected_result = { 'currency_code': 'USD', 'opening_balance': 3305.44, 'payable_balance': 3320.00, 'ledger_amount': 1133.11, 'closing_balance': 4438.55, 'statement_period_id': statement_period_id } mock_logic.get_balance_by_account_statement_periods.return_value = [expected_result] res = fixture_client.get( '/account/{}/statement-period/{}/balance?contract_id={}'.format( account_id, statement_period_id, contract_id)) assert res.status_code == 200 assert res.json() == expected_result mock_logic.get_balance_by_account_statement_periods.assert_called_once_with( account_id, [statement_period_id], contract_id ) @patch('moneyhub.handlers.account.account_logic') def test_get_account_activity(mock_logic, fixture_client): """Test to check account activity.""" account_id = 24601 expected_response = { 'adjustments': True, 'advances': True, 'expenses': False, 'mechanicals': True, 'physical_reserves': False, 'publishing_revenue': False, 'revenue': True, 'taxes': True } mock_logic.get_account_activity.return_value = expected_response res = fixture_client.get( f'/account/{account_id}/activity') assert res.status_code == 200 assert res.json() == expected_response mock_logic.get_account_activity.assert_called_once_with(account_id, None, False) @patch('moneyhub.handlers.account.account_logic') def test_get_account_activity_with_subaccount(mock_logic, fixture_client): """Test to check account activity.""" account_id = 24601 subaccount_id = 1 is_subaccount = True expected_response = { 'adjustments': True, 'advances': True, 'expenses': False, 'mechanicals': False, 'physical_reserves': False, 'publishing_revenue': False, 'revenue': True, 'taxes': False } mock_logic.get_account_activity.return_value = expected_response res = fixture_client.get( f'/account/{account_id}/activity?subaccount_id={subaccount_id}&is_subaccount={is_subaccount}') # noqa: E501 assert res.status_code == 200 assert res.json() == expected_response mock_logic.get_account_activity.assert_called_once_with( account_id, subaccount_id, is_subaccount) @patch('moneyhub.handlers.account.account_logic') def test_load_account_contracts(mock_logic, fixture_client): """Test to check account activity.""" account_id = 57608 expected_response = [ { 'account_id': 57608, 'contract_id': 531211, 'contract_name': 'Contract 1' } ] payload = { 'contract_ids': [531211] } mock_logic.get_contracts_info.return_value = expected_response res = fixture_client.post( f'account/{account_id}/dataloader/contracts', json=payload) assert res.status_code == 200 assert res.json() == expected_response mock_logic.get_contracts_info.assert_called_once_with(account_id, [531211]) @patch('moneyhub.handlers.account.account_logic.get_stores_by_account_id') def test_get_stores_by_account_id(mock_logic, fixture_client): """Test getting stores by account id.""" account_id = 57608 payload = [ { 'store_id': 123, 'store_name': 'Spotify', }, { 'store_id': 456, 'store_name': 'Apple Music', }, ] mock_logic.return_value = payload actual = fixture_client.get(f'/account/{account_id}/stores') assert actual.status_code == 200 assert actual.json() == [ { 'store_id': 123, 'store_name': 'Spotify', }, { 'store_id': 456, 'store_name': 'Apple Music', }, ] mock_logic.assert_called_with(account_id, None) @patch('moneyhub.handlers.account.account_logic.get_transaction_types_by_account_id') def test_get_transaction_types_by_account(mock_logic, fixture_client): """Test getting transaction types by account.""" account_id = 24601 payload = [ TransactionTypeSchema( transaction_type_id=1, transaction_type_desc='Downloaded Ringtones', transaction_type_group_name='Ringtone Group', ) ] mock_logic.return_value = payload result = fixture_client.get(f'/account/{account_id}/transaction-types') assert result.status_code == 200 assert result.json() == [payload[0].model_dump()] @patch('moneyhub.handlers.account.account_logic.get_imprints_by_account_id') def test_get_imprints_by_account_id(mock_logic, fixture_client): """Test getting imprints by account id.""" account_id = 57608 payload = [ AccountImprintSchema( imprintid=123, imprint='Universal Music Group', account_id=57608, ), AccountImprintSchema( imprintid=456, imprint='Sony Music Entertainment', account_id=57608, ), ] mock_logic.return_value = payload actual = fixture_client.get(f'/account/{account_id}/imprints') assert actual.status_code == 200 assert actual.json() == [ { 'imprintid': 123, 'imprint': 'Universal Music Group', 'account_id': 57608, }, { 'imprintid': 456, 'imprint': 'Sony Music Entertainment', 'account_id': 57608, }, ] mock_logic.assert_called_with(account_id, 50, None, None, None) @patch('moneyhub.handlers.account.account_logic.get_artists_by_account_id') def test_get_artists_by_account_id(mock_logic, fixture_client): """Test getting artists by account id.""" account_id = 57608 payload = [ AccountArtistSchema( artist_id=123, artist_name='Taylor Swift' ), AccountArtistSchema( artist_id=456, artist_name='Ed Sheeran' ), ] mock_logic.return_value = payload actual = fixture_client.get(f'/account/{account_id}/artists') assert actual.status_code == 200 assert actual.json() == [ { 'artist_id': 123, 'artist_name': 'Taylor Swift' }, { 'artist_id': 456, 'artist_name': 'Ed Sheeran' }, ] mock_logic.assert_called_with(account_id, 50, None, None) @patch('moneyhub.handlers.account.account_logic.get_projects_by_account_id') def test_get_projects_by_account_id(mock_logic, fixture_client): """Test getting projects by account id.""" account_id = 57608 payload = [ AccountProjectSchema( project_id=501 ), AccountProjectSchema( project_id=502 ), ] mock_logic.return_value = payload actual = fixture_client.get(f'/account/{account_id}/projects') assert actual.status_code == 200 assert actual.json() == [ { 'project_id': 501 }, { 'project_id': 502 }, ] mock_logic.assert_called_with(account_id, 50, None, None) @patch('moneyhub.handlers.account.account_logic.get_products_by_account_id') def test_get_products_by_account_id(mock_logic, fixture_client): """Test getting products by account id.""" account_id = 57608 payload = [ AccountProductSchema( product_id=1234, product_name='Hey', display_upc='1111111111111', ), AccountProductSchema( product_id=1235, product_name='Push Sky', display_upc='1111111111112', ), ] mock_logic.return_value = payload actual = fixture_client.get(f'/account/{account_id}/products') assert actual.status_code == 200 assert actual.json() == [ {'product_id': 1234, 'product_name': 'Hey', 'display_upc': '1111111111111'}, {'product_id': 1235, 'product_name': 'Push Sky', 'display_upc': '1111111111112'}, ] mock_logic.assert_called_with(account_id, 50, None, None) @patch('moneyhub.handlers.account.account_logic') def test_load_account_recordings(mock_logic, fixture_client): """Test loading recording names via dataloader endpoint.""" account_id = 57608 expected_response = [ { 'recording_id': '41497259', 'recording_title': 'Some Track', 'isrc': 'JPYE70900611' }, { 'recording_id': '99999999', 'recording_title': 'Another Track', 'isrc': 'fake99999999' } ] payload = { 'recording_ids': ['41497259', '99999999'] } mock_logic.get_recording_names.return_value = expected_response res = fixture_client.post( f'account/{account_id}/dataloader/recordings', json=payload) assert res.status_code == 200 assert res.json() == expected_response mock_logic.get_recording_names.assert_called_once_with( account_id, ['41497259', '99999999'] ) @patch('moneyhub.handlers.account.account_logic') def test_load_account_recordings_empty_ids(mock_logic, fixture_client): """Test loading recording names with empty list returns early.""" account_id = 57608 payload = { 'recording_ids': [] } res = fixture_client.post( f'account/{account_id}/dataloader/recordings', json=payload) assert res.status_code == 200 assert res.json() == [] mock_logic.get_recording_names.assert_not_called() @patch('moneyhub.handlers.account.account_logic') def test_load_activity_periods_by_account_with_subaccount(mock_logic, fixture_client): """Test loading activity periods by account with subaccount filter.""" account_id = 24601 subaccount_id = 10001 payload = { 'activity_period_ids': [123, 124], } activity_periods = [ AccountActivityPeriodSchema(activity_period_id=123, activity_month_name='March 2009'), AccountActivityPeriodSchema(activity_period_id=124, activity_month_name='April 2009'), ] mock_logic.get_activity_periods_by_account.return_value = activity_periods result = fixture_client.post( f'account/{account_id}/dataloader/activity-periods' f'?subaccount_id={subaccount_id}&is_subaccount=1', json=payload ) assert result.status_code == 200 assert result.json() == [item.model_dump() for item in activity_periods] mock_logic.get_activity_periods_by_account.assert_called_once_with( account_id, subaccount_id, payload['activity_period_ids'] ) @patch('moneyhub.handlers.account.account_logic') def test_load_activity_periods_by_account_no_period_ids(mock_logic, fixture_client): """Test loading activity periods by account with no period IDs provided.""" account_id = 24601 payload = { 'activity_period_ids': [], } expected = [] result = fixture_client.post( f'account/{account_id}/dataloader/activity-periods', json=payload) assert result.status_code == 200 assert result.json() == expected mock_logic.get_activity_periods_by_account.assert_not_called() @patch('moneyhub.handlers.account.account_logic') def test_load_imprints_by_account(mock_logic, fixture_client): """Test loading imprints by account.""" account_id = 24601 subaccount_id = 10001 payload = { 'imprint_ids': [1, 2] } imprints = [ AccountImprintFactory.build( imprintid=1, imprint='Testing', account_id=account_id), AccountImprintFactory.build( imprintid=2, imprint='Also Test', account_id=account_id), ] mock_logic.get_imprints_by_account_id.return_value = imprints result = fixture_client.post( f'account/{account_id}/dataloader/imprints' f'?subaccount_id={subaccount_id}&is_subaccount=1', json=payload) assert result.status_code == 200 assert result.json() == [vars(item) for item in imprints] mock_logic.get_imprints_by_account_id.assert_called_once_with( account_id, None, None, subaccount_id, payload['imprint_ids']) @patch('moneyhub.handlers.account.account_logic') def test_load_imprints_by_account_no_ids(mock_logic, fixture_client): """Test loading imprints by account with no imprint IDs in the body.""" account_id = 24601 payload = { 'imprint_ids': [] } res = fixture_client.post( f'account/{account_id}/dataloader/imprints', json=payload) assert res.status_code == 200 assert res.json() == [] mock_logic.get_imprints_by_account_id.assert_not_called() @pytest.mark.parametrize('artist_ids, expected', [ ([], []), ([123, 456], [ { 'artist_id': 123, 'artist_name': 'Taylor Swift' }, { 'artist_id': 456, 'artist_name': 'Ed Sheeran' } ]) ]) @patch('moneyhub.handlers.account.account_logic') def test_load_artist(mock_logic, artist_ids, expected, fixture_client): """Test loading artist names via dataloader endpoint.""" account_id = 57608 payload = { 'artist_ids': artist_ids } mock_logic.get_artists_by_ids.return_value = expected res = fixture_client.post( f'account/{account_id}/dataloader/artists', json=payload) assert res.status_code == 200 assert res.json() == expected if artist_ids: mock_logic.get_artists_by_ids.assert_called_once_with( artist_ids ) @patch('moneyhub.handlers.account.account_logic.get_recordings_by_account_id') def test_get_recordings_by_account_id(mock_logic, fixture_client): """Test getting recordings by account id.""" account_id = 57608 payload = [ AccountRecordingSchema( recording_id='1234', recording_title='Title', isrc='JPYE70900611' ), AccountRecordingSchema( recording_id='5678', recording_title='If I Ruled the World', isrc=None ), ] mock_logic.return_value = payload actual = fixture_client.get(f'/account/{account_id}/recordings') assert actual.status_code == 200 assert actual.json() == [ {'recording_id': '1234', 'recording_title': 'Title', 'isrc': 'JPYE70900611'}, {'recording_id': '5678', 'recording_title': 'If I Ruled the World', 'isrc': None}, ] mock_logic.assert_called_with(account_id, 50, None, None) @patch('moneyhub.handlers.account.account_logic.get_recordings_by_account_id') def test_get_recordings_by_account_id_with_search(mock_logic, fixture_client): """Test getting recordings by account id with search term.""" account_id = 57608 search_term = 'Title' payload = [ AccountRecordingSchema( recording_id='1234', recording_title='Title', isrc='JPYE70900611' ), ] mock_logic.return_value = payload actual = fixture_client.get(f'/account/{account_id}/recordings?search_term={search_term}') assert actual.status_code == 200 assert actual.json() == [ {'recording_id': '1234', 'recording_title': 'Title', 'isrc': 'JPYE70900611'}, ] mock_logic.assert_called_with(account_id, 50, search_term, None) @patch('moneyhub.handlers.account.account_logic.get_recordings_by_account_id') def test_get_recordings_by_account_id_with_contract_id(mock_logic, fixture_client): """Test getting recordings by account id filtered by contract id.""" account_id = 57608 contract_id = 535866 payload = [ AccountRecordingSchema( recording_id='1234', recording_title='Title', isrc='JPYE70900611' ), ] mock_logic.return_value = payload actual = fixture_client.get(f'/account/{account_id}/recordings?contract_id={contract_id}') assert actual.status_code == 200 assert actual.json() == [ {'recording_id': '1234', 'recording_title': 'Title', 'isrc': 'JPYE70900611'}, ] mock_logic.assert_called_with(account_id, 50, None, contract_id) @patch('moneyhub.handlers.account.account_logic.get_tracks_by_account_id') def test_get_tracks_by_account(mock_logic, fixture_client): """Test getting tracks by account id.""" account_id = 57608 payload = [ AccountTrackSchema( track_unique_id=1001, track_name='Bohemian Rhapsody', isrc='GBUM71029604' ), AccountTrackSchema( track_unique_id=1002, track_name='Hotel California', isrc=None ), ] mock_logic.return_value = payload actual = fixture_client.get(f'/account/{account_id}/tracks') assert actual.status_code == 200 assert actual.json() == [ {'track_unique_id': 1001, 'track_name': 'Bohemian Rhapsody', 'isrc': 'GBUM71029604'}, {'track_unique_id': 1002, 'track_name': 'Hotel California', 'isrc': None}, ] mock_logic.assert_called_with(account_id, 50, None, None) @patch('moneyhub.handlers.account.account_logic.get_tracks_by_account_id') def test_get_tracks_by_account_with_search(mock_logic, fixture_client): """Test getting tracks by account id with a search term.""" account_id = 57608 search_term = 'Bohemian' payload = [ AccountTrackSchema( track_unique_id=1001, track_name='Bohemian Rhapsody', isrc='GBUM71029604' ), ] mock_logic.return_value = payload actual = fixture_client.get(f'/account/{account_id}/tracks?search_term={search_term}') assert actual.status_code == 200 assert actual.json() == [ {'track_unique_id': 1001, 'track_name': 'Bohemian Rhapsody', 'isrc': 'GBUM71029604'}, ] mock_logic.assert_called_with(account_id, 50, search_term, None) @patch('moneyhub.handlers.account.account_logic.get_tracks_by_account_id') def test_get_tracks_by_account_with_subaccount(mock_logic, fixture_client): """Test getting tracks by account id with subaccount filter.""" account_id = 57608 subaccount_id = 9999 payload = [ AccountTrackSchema( track_unique_id=1001, track_name='Bohemian Rhapsody', isrc='GBUM71029604' ), ] mock_logic.return_value = payload actual = fixture_client.get(f'/account/{account_id}/tracks?subaccount_id={subaccount_id}') assert actual.status_code == 200 mock_logic.assert_called_with(account_id, 50, None, subaccount_id)