"""Functional tests for recording dataloader endpoint.""" from contextlib import contextmanager from moneyhub.connectors.snowflake import db from moneyhub.constants.constants import ContractType from moneyhub.models.dim_track import DimTrack from moneyhub.models.performance_nr_sound_recording import PerformanceNrSoundRecording from moneyhub.models.revenue_by_activity_month import RevenueByActivityMonth from moneyhub.models.revenue_by_artist import RevenueByArtist from moneyhub.models.revenue_by_product_distro import RevenueByProductDistro from moneyhub.models.revenue_by_recording_distro import RevenueByRecordingDistro from moneyhub.models.revenue_by_recording_nr import RevenueByRecordingNr from moneyhub.models.revenue_by_track import RevenueByTrack from tests.functional.conftest import insert_mock_data def _mysql_mock_data(account_id, contract_type): """Build MySQL mock data for contract type lookup. Args: account_id (int): Account ID contract_type (ContractType): Contract type Returns: dict: MySQL mock data """ return { 'reference_payment_entity': {'reference_payment_entity_id': 1}, 'reference_sap_profit_center': { 'reference_sap_profit_center_id': 1, 'profit_center': 'UK1234', 'company_code': '1234', 'business_group': 'ORC', }, 'reference_signing_entity': { 'reference_signing_entity_id': 1, 'reference_payment_entity_id': 1, 'reference_sap_profit_center_id': 1, 'company_code': '1234', 'tax_entity_company_code': '1234', 'legal_name': 'Company', 'vat_number': '12341234', 'company_registration_number': '12341234', 'address': None, }, 'contract': { 'contract_id': 1, 'reference_signing_entity_id': 1, 'contract_type': contract_type, }, 'abacus_event': {'abacus_event_id': 1}, 'ledger_account_contract': { 'abacus_event_id': 1, 'account_id': account_id, 'contract_id': 1, }, } @contextmanager def _using_mock_data(mock_data: dict): """Create the necessary mock tables and fills them with the data. Args: mock_data (dict): Data to enter. """ DimTrack.__table__.drop(db.engine, checkfirst=True) PerformanceNrSoundRecording.__table__.drop(db.engine, checkfirst=True) RevenueByActivityMonth.__table__.drop(db.engine, checkfirst=True) RevenueByArtist.__table__.drop(db.engine, checkfirst=True) db.session.commit() DimTrack.__table__.create(db.engine) PerformanceNrSoundRecording.__table__.create(db.engine) RevenueByArtist.__table__.create(db.engine) RevenueByActivityMonth.__table__.create(db.engine) insert_mock_data(mock_data, database='snowflake') yield db.session.commit() DimTrack.__table__.drop(db.engine) PerformanceNrSoundRecording.__table__.drop(db.engine) RevenueByArtist.__table__.drop(db.engine) RevenueByActivityMonth.__table__.drop(db.engine) db.session.close() def test_load_recordings_distro_ids(fixture_client): """Test loading recording names for distro (numeric) IDs.""" account_id = 10 insert_mock_data(_mysql_mock_data(account_id, ContractType.DISTRIBUTION)) mock_data = { 'dim_track': [ { 'trackid': 1, 'track_unique_id': 100, 'trackname': 'Song Alpha', 'isrc': 'ISRC100', }, { 'trackid': 2, 'track_unique_id': 200, 'trackname': 'Song Beta', 'isrc': 'ISRC200', }, { 'trackid': 3, 'track_unique_id': 300, 'trackname': 'Song Gamma', 'isrc': 'ISRC300', }, ], } with _using_mock_data(mock_data): res = fixture_client.post( f'account/{account_id}/dataloader/recordings', json={'recording_ids': ['100', '200']}, ) assert res.status_code == 200 result = res.json() assert len(result) == 2 result_sorted = sorted(result, key=lambda r: r['recording_id']) assert result_sorted == [ {'recording_id': '100', 'recording_title': 'Song Alpha', 'isrc': 'ISRC100'}, {'recording_id': '200', 'recording_title': 'Song Beta', 'isrc': 'ISRC200'}, ] def test_load_recordings_nr_ids(fixture_client): """Test loading recording names for NR (UUID) IDs.""" account_id = 10 insert_mock_data(_mysql_mock_data(account_id, ContractType.NEIGHBOURING_RIGHTS)) mock_data = { 'performance_nr_sound_recording': [ { 'id': 'aaa-bbb-ccc-001', 'recording_title': 'NR Track One', 'isrc': 'ISRC001', }, { 'id': 'aaa-bbb-ccc-002', 'recording_title': 'NR Track Two', 'isrc': 'ISRC002', }, { 'id': 'aaa-bbb-ccc-003', 'recording_title': 'NR Track Three', 'isrc': 'ISRC003', }, ], } with _using_mock_data(mock_data): res = fixture_client.post( f'account/{account_id}/dataloader/recordings', json={'recording_ids': ['aaa-bbb-ccc-001', 'aaa-bbb-ccc-003']}, ) assert res.status_code == 200 result = res.json() assert len(result) == 2 result_sorted = sorted(result, key=lambda r: r['recording_id']) assert result_sorted == [ {'recording_id': 'aaa-bbb-ccc-001', 'recording_title': 'NR Track One', 'isrc': 'ISRC001'}, {'recording_id': 'aaa-bbb-ccc-003', 'recording_title': 'NR Track Three', 'isrc': 'ISRC003'}, ] def test_load_recordings_empty_ids(fixture_client): """Test loading recording names with an empty list of IDs.""" account_id = 10 with _using_mock_data({}): res = fixture_client.post( f'account/{account_id}/dataloader/recordings', json={'recording_ids': []}, ) assert res.status_code == 200 assert res.json() == [] def test_load_recordings_no_matches(fixture_client): """Test loading recording names when no IDs match.""" account_id = 10 insert_mock_data(_mysql_mock_data(account_id, ContractType.DISTRIBUTION)) mock_data = { 'dim_track': [ { 'trackid': 1, 'track_unique_id': 100, 'trackname': 'Song Alpha', }, ], } with _using_mock_data(mock_data): res = fixture_client.post( f'account/{account_id}/dataloader/recordings', json={'recording_ids': ['999', '888']}, ) assert res.status_code == 200 assert res.json() == [] def test_load_recordings_single_distro_id(fixture_client): """Test loading a single distro recording name.""" account_id = 10 insert_mock_data(_mysql_mock_data(account_id, ContractType.DISTRIBUTION)) mock_data = { 'dim_track': [ { 'trackid': 1, 'track_unique_id': 42, 'trackname': 'Solo Track', 'isrc': 'ISRC042', }, ], } with _using_mock_data(mock_data): res = fixture_client.post( f'account/{account_id}/dataloader/recordings', json={'recording_ids': ['42']}, ) assert res.status_code == 200 assert res.json() == [ {'recording_id': '42', 'recording_title': 'Solo Track', 'isrc': 'ISRC042'}, ] def test_load_activity_periods_by_account(fixture_client): """Test loading activity periods by account.""" account_id = 24601 insert_mock_data(_mysql_mock_data(account_id, ContractType.DISTRIBUTION)) mock_data = { 'revenue_by_activity_month_dbt': [ { 'account_id': 24601, 'activity_period_id': 123, 'activity_month_name': 'March 2009', 'artist_id': 10, 'contract_id': 10001, 'statement_period_id': 123, }, { 'account_id': 24601, 'activity_period_id': 124, 'activity_month_name': 'April 2009', 'artist_id': 10, 'contract_id': 10001, 'statement_period_id': 124, }, { 'account_id': 24601, 'activity_period_id': 125, 'activity_month_name': 'May 2009', 'artist_id': 10, 'contract_id': 10001, 'statement_period_id': 125, }, ], } with _using_mock_data(mock_data): res = fixture_client.post( f'account/{account_id}/dataloader/activity-periods', json={'activity_period_ids': [123, 124]}, ) assert res.status_code == 200 assert res.json() == [ {'activity_period_id': 123, 'activity_month_name': 'March 2009'}, {'activity_period_id': 124, 'activity_month_name': 'April 2009'}, ] def test_load_artists(fixture_client): """Test loading a.""" account_id = 10 mock_data = { 'revenue_by_artist_dbt': [ { 'artist_id': 1, 'artist_name': 'Future', }, { 'artist_id': 2, 'artist_name': 'Young Thug', }, ], } with _using_mock_data(mock_data): res = fixture_client.post( f'account/{account_id}/dataloader/artists', json={'artist_ids': [1, 2]}, ) assert res.status_code == 200 assert res.json() == [ {'artist_id': 1, 'artist_name': 'Future'}, {'artist_id': 2, 'artist_name': 'Young Thug'}, ] @contextmanager def _using_recording_mock_data(mock_data: dict): """Create recording tables and fill them with data.""" RevenueByRecordingDistro.__table__.drop(db.engine, checkfirst=True) RevenueByRecordingNr.__table__.drop(db.engine, checkfirst=True) db.session.commit() RevenueByRecordingDistro.__table__.create(db.engine) RevenueByRecordingNr.__table__.create(db.engine) insert_mock_data(mock_data, database='snowflake') yield db.session.commit() RevenueByRecordingDistro.__table__.drop(db.engine) RevenueByRecordingNr.__table__.drop(db.engine) db.session.close() def test_get_recordings_by_account_distro(fixture_client): """Test getting recordings for a distro account.""" account_id = 10 insert_mock_data(_mysql_mock_data(account_id, ContractType.DISTRIBUTION)) mock_data = { 'revenue_by_recording_distro_dbt': [ { 'recording_id': 37736998, 'recording_title': 'Thrift Shop', 'artist': 'Macklemore', 'version': None, 'isrc': 'JPYE70900611', 'account_id': account_id, 'contract_id': 1, 'statement_period_id': 123, 'account_payee_currency': 'USD', 'net_share_payee_currency': '8.00', 'gross_revenue_payee_currency': '10.00', 'store_id': 101, 'country_code': 'US', 'imprint_id': 201, 'transaction_type_id': 301, 'activity_period_id': 100, }, { 'recording_id': 37736999, 'recording_title': "Can't Hold Us", 'artist': 'Macklemore', 'version': None, 'isrc': 'JPYE70900612', 'account_id': account_id, 'contract_id': 1, 'statement_period_id': 123, 'account_payee_currency': 'USD', 'net_share_payee_currency': '12.00', 'gross_revenue_payee_currency': '15.00', 'store_id': 102, 'country_code': 'GB', 'imprint_id': 202, 'transaction_type_id': 302, 'activity_period_id': 101, }, ], } with _using_recording_mock_data(mock_data): res = fixture_client.get(f'account/{account_id}/recordings') assert res.status_code == 200 result = res.json() assert len(result) == 2 assert result == [ {'recording_id': '37736999', 'recording_title': "Can't Hold Us", 'isrc': 'JPYE70900612'}, {'recording_id': '37736998', 'recording_title': 'Thrift Shop', 'isrc': 'JPYE70900611'}, ] def test_get_recordings_by_account_nr(fixture_client): """Test getting recordings for an NR account.""" account_id = 10 insert_mock_data(_mysql_mock_data(account_id, ContractType.NEIGHBOURING_RIGHTS)) mock_data = { 'revenue_by_recording_nr_dbt': [ { 'recording_id': 'aaa-bbb-001', 'recording_title': 'NR Track One', 'artist': 'Artist A', 'version': None, 'isrc': 'ISRC001', 'account_id': account_id, 'contract_id': 1, 'statement_period_id': 123, 'account_payee_currency': 'USD', 'net_share_payee_currency': '5.00', 'gross_revenue_payee_currency': '8.00', }, { 'recording_id': 'aaa-bbb-002', 'recording_title': 'NR Track Two', 'artist': 'Artist B', 'version': None, 'isrc': 'ISRC002', 'account_id': account_id, 'contract_id': 1, 'statement_period_id': 123, 'account_payee_currency': 'USD', 'net_share_payee_currency': '7.00', 'gross_revenue_payee_currency': '9.00', }, ], } with _using_recording_mock_data(mock_data): res = fixture_client.get(f'account/{account_id}/recordings') assert res.status_code == 200 result = res.json() assert len(result) == 2 assert result == [ {'recording_id': 'aaa-bbb-001', 'recording_title': 'NR Track One', 'isrc': 'ISRC001'}, {'recording_id': 'aaa-bbb-002', 'recording_title': 'NR Track Two', 'isrc': 'ISRC002'}, ] def test_get_recordings_by_account_with_search(fixture_client): """Test getting recordings filtered by search term.""" account_id = 10 insert_mock_data(_mysql_mock_data(account_id, ContractType.NEIGHBOURING_RIGHTS)) mock_data = { 'revenue_by_recording_nr_dbt': [ { 'recording_id': 'aaa-bbb-001', 'recording_title': 'NR Track One', 'artist': 'Artist A', 'version': None, 'isrc': 'ISRC001', 'account_id': account_id, 'contract_id': 1, 'statement_period_id': 123, 'account_payee_currency': 'USD', 'net_share_payee_currency': '5.00', 'gross_revenue_payee_currency': '8.00', }, { 'recording_id': 'aaa-bbb-002', 'recording_title': 'Something Else', 'artist': 'Artist B', 'version': None, 'isrc': 'ISRC002', 'account_id': account_id, 'contract_id': 1, 'statement_period_id': 123, 'account_payee_currency': 'USD', 'net_share_payee_currency': '7.00', 'gross_revenue_payee_currency': '9.00', }, ], } with _using_recording_mock_data(mock_data): res = fixture_client.get(f'account/{account_id}/recordings?search_term=NR+Track') assert res.status_code == 200 result = res.json() assert len(result) == 1 assert result == [ {'recording_id': 'aaa-bbb-001', 'recording_title': 'NR Track One', 'isrc': 'ISRC001'} ] def test_get_recordings_by_account_with_contract_id(fixture_client): """Test getting recordings filtered by contract id.""" account_id = 10 contract_id = 2 insert_mock_data(_mysql_mock_data(account_id, ContractType.DISTRIBUTION)) mock_data = { 'revenue_by_recording_distro_dbt': [ { 'recording_id': 37736998, 'recording_title': 'Thrift Shop', 'artist': 'Macklemore', 'version': None, 'isrc': 'JPYE70900611', 'account_id': account_id, 'contract_id': 1, 'statement_period_id': 123, 'account_payee_currency': 'USD', 'net_share_payee_currency': '8.00', 'gross_revenue_payee_currency': '10.00', 'store_id': 101, 'country_code': 'US', 'imprint_id': 201, 'transaction_type_id': 301, 'activity_period_id': 100, }, { 'recording_id': 37736999, 'recording_title': "Can't Hold Us", 'artist': 'Macklemore', 'version': None, 'isrc': 'JPYE70900612', 'account_id': account_id, 'contract_id': contract_id, 'statement_period_id': 123, 'account_payee_currency': 'USD', 'net_share_payee_currency': '12.00', 'gross_revenue_payee_currency': '15.00', 'store_id': 102, 'country_code': 'GB', 'imprint_id': 202, 'transaction_type_id': 302, 'activity_period_id': 101, }, ], } with _using_recording_mock_data(mock_data): res = fixture_client.get(f'account/{account_id}/recordings?contract_id={contract_id}') assert res.status_code == 200 result = res.json() assert len(result) == 1 assert result == [ {'recording_id': '37736999', 'recording_title': "Can't Hold Us", 'isrc': 'JPYE70900612'}, ] @contextmanager def _using_track_mock_data(mock_data: dict): """Create the RevenueByTrack table and fill it with data.""" RevenueByTrack.__table__.drop(db.engine, checkfirst=True) db.session.commit() RevenueByTrack.__table__.create(db.engine) insert_mock_data(mock_data, database='snowflake') yield db.session.commit() RevenueByTrack.__table__.drop(db.engine) db.session.close() def test_get_tracks_by_account(fixture_client): """Test getting tracks for an account.""" account_id = 57608 mock_data = { 'revenue_by_track_dbt': [ { 'track_unique_id': 1001, 'track_name': 'Bohemian Rhapsody', 'isrc': 'GBUM71029604', 'account_id': account_id, 'subaccount_id': None, 'product_id': 1, 'statement_period_id': 10, 'account_payee_currency': 'USD', 'mechanical_deduction_amount_payee_currency': '0.00', 'publisher_admin_fee_payee_currency': '0.00', 'net_revenue_payee_currency': '8.00', 'gross_revenue_payee_currency': '10.00', 'store_id': 101, 'country_code': 'US', 'imprint_id': 201, 'transaction_type_id': 301, }, { 'track_unique_id': 1002, 'track_name': 'Hotel California', 'isrc': 'USEE17301350', 'account_id': account_id, 'subaccount_id': None, 'product_id': 2, 'statement_period_id': 10, 'account_payee_currency': 'USD', 'mechanical_deduction_amount_payee_currency': '0.00', 'publisher_admin_fee_payee_currency': '0.00', 'net_revenue_payee_currency': '5.00', 'gross_revenue_payee_currency': '7.00', 'store_id': 102, 'country_code': 'GB', 'imprint_id': 202, 'transaction_type_id': 302, }, ], } with _using_track_mock_data(mock_data): res = fixture_client.get(f'account/{account_id}/tracks') assert res.status_code == 200 result = res.json() assert len(result) == 2 result_sorted = sorted(result, key=lambda r: r['track_unique_id']) assert result_sorted == [ {'track_unique_id': 1001, 'track_name': 'Bohemian Rhapsody', 'isrc': 'GBUM71029604'}, {'track_unique_id': 1002, 'track_name': 'Hotel California', 'isrc': 'USEE17301350'}, ] def test_get_tracks_by_account_with_search(fixture_client): """Test getting tracks filtered by search term.""" account_id = 57608 mock_data = { 'revenue_by_track_dbt': [ { 'track_unique_id': 1001, 'track_name': 'Bohemian Rhapsody', 'isrc': 'GBUM71029604', 'account_id': account_id, 'subaccount_id': None, 'product_id': 1, 'statement_period_id': 10, 'account_payee_currency': 'USD', 'mechanical_deduction_amount_payee_currency': '0.00', 'publisher_admin_fee_payee_currency': '0.00', 'net_revenue_payee_currency': '8.00', 'gross_revenue_payee_currency': '10.00', 'store_id': 101, 'country_code': 'US', 'imprint_id': 201, 'transaction_type_id': 301, }, { 'track_unique_id': 1002, 'track_name': 'Hotel California', 'isrc': 'USEE17301350', 'account_id': account_id, 'subaccount_id': None, 'product_id': 2, 'statement_period_id': 10, 'account_payee_currency': 'USD', 'mechanical_deduction_amount_payee_currency': '0.00', 'publisher_admin_fee_payee_currency': '0.00', 'net_revenue_payee_currency': '5.00', 'gross_revenue_payee_currency': '7.00', 'store_id': 102, 'country_code': 'GB', 'imprint_id': 202, 'transaction_type_id': 302, }, ], } with _using_track_mock_data(mock_data): res = fixture_client.get(f'account/{account_id}/tracks?search_term=Bohemian') assert res.status_code == 200 result = res.json() assert len(result) == 1 assert result == [ {'track_unique_id': 1001, 'track_name': 'Bohemian Rhapsody', 'isrc': 'GBUM71029604'}, ] def test_get_tracks_by_account_with_subaccount(fixture_client): """Test getting tracks filtered by subaccount.""" account_id = 57608 subaccount_id = 999 mock_data = { 'revenue_by_track_dbt': [ { 'track_unique_id': 1001, 'track_name': 'Bohemian Rhapsody', 'isrc': 'GBUM71029604', 'account_id': account_id, 'subaccount_id': subaccount_id, 'product_id': 1, 'statement_period_id': 10, 'account_payee_currency': 'USD', 'mechanical_deduction_amount_payee_currency': '0.00', 'publisher_admin_fee_payee_currency': '0.00', 'net_revenue_payee_currency': '8.00', 'gross_revenue_payee_currency': '10.00', 'store_id': 101, 'country_code': 'US', 'imprint_id': 201, 'transaction_type_id': 301, }, { 'track_unique_id': 1002, 'track_name': 'Hotel California', 'isrc': 'USEE17301350', 'account_id': account_id, 'subaccount_id': None, 'product_id': 2, 'statement_period_id': 10, 'account_payee_currency': 'USD', 'mechanical_deduction_amount_payee_currency': '0.00', 'publisher_admin_fee_payee_currency': '0.00', 'net_revenue_payee_currency': '5.00', 'gross_revenue_payee_currency': '7.00', 'store_id': 102, 'country_code': 'GB', 'imprint_id': 202, 'transaction_type_id': 302, }, ], } with _using_track_mock_data(mock_data): res = fixture_client.get(f'account/{account_id}/tracks?subaccount_id={subaccount_id}') assert res.status_code == 200 result = res.json() assert len(result) == 1 assert result == [ {'track_unique_id': 1001, 'track_name': 'Bohemian Rhapsody', 'isrc': 'GBUM71029604'}, ] @contextmanager def _using_product_mock_data(mock_data: dict): """Create the RevenueByProductDistro table and fill it with data.""" RevenueByProductDistro.__table__.drop(db.engine, checkfirst=True) db.session.commit() RevenueByProductDistro.__table__.create(db.engine) insert_mock_data(mock_data, database='snowflake') yield db.session.commit() RevenueByProductDistro.__table__.drop(db.engine) db.session.close() def _product_distro_row(account_id, product_id, product_name, display_upc, subaccount_id=None): """Build a minimal revenue_by_product_distro_dbt row.""" return { 'product_id': product_id, 'product_name': product_name, 'display_upc': display_upc, 'release_date': '2010-01-01 00:00:00', 'account_id': account_id, 'contract_id': 10001, 'statement_period_id': 10, 'artist_name': 'Test Artist', 'subaccount_id': subaccount_id, 'account_payee_currency': 'USD', 'mechanical_deduction_amount_payee_currency': '0.00', 'publisher_admin_fee_payee_currency': '0.00', 'net_share_payee_currency': '8.00', 'gross_revenue_payee_currency': '10.00', 'project_id': 501, } def test_get_products_by_account(fixture_client): """Test getting products for an account.""" account_id = 57608 mock_data = { 'revenue_by_product_distro_dbt': [ _product_distro_row(account_id, 1234, 'Hey', '1111111111111'), _product_distro_row(account_id, 1235, 'Push Sky', '1111111111112'), ], } with _using_product_mock_data(mock_data): res = fixture_client.get(f'account/{account_id}/products') result = res.json() result_sorted = sorted(result, key=lambda r: r['product_id']) assert res.status_code == 200 assert len(result) == 2 assert result_sorted == [ {'product_id': 1234, 'product_name': 'Hey', 'display_upc': '1111111111111'}, {'product_id': 1235, 'product_name': 'Push Sky', 'display_upc': '1111111111112'}, ] def test_get_products_by_account_with_name_search(fixture_client): """Test getting products filtered by product name search term.""" account_id = 57608 mock_data = { 'revenue_by_product_distro_dbt': [ _product_distro_row(account_id, 1234, 'Hey', '1111111111111'), _product_distro_row(account_id, 1235, 'Push Sky', '1111111111112'), _product_distro_row(account_id, 1236, 'Push Me', '1111111111113'), ], } with _using_product_mock_data(mock_data): res = fixture_client.get(f'account/{account_id}/products?search_term=Push') result = res.json() product_ids = {r['product_id'] for r in result} assert res.status_code == 200 assert len(result) == 2 assert product_ids == {1235, 1236} def test_get_products_by_account_with_upc_search(fixture_client): """Test getting products filtered by UPC search term.""" account_id = 57608 mock_data = { 'revenue_by_product_distro_dbt': [ _product_distro_row(account_id, 1234, 'Hey', '1111111111111'), _product_distro_row(account_id, 1235, 'Push Sky', '1111111111112'), ], } with _using_product_mock_data(mock_data): res = fixture_client.get(f'account/{account_id}/products?search_term=1111111111112') result = res.json() assert res.status_code == 200 assert len(result) == 1 assert result == [ {'product_id': 1235, 'product_name': 'Push Sky', 'display_upc': '1111111111112'}, ] def test_get_products_by_account_with_exact_id_search(fixture_client): """Test getting products filtered by exact numeric product_id search.""" account_id = 57608 mock_data = { 'revenue_by_product_distro_dbt': [ _product_distro_row(account_id, 1234, 'Hey', '1111111111111'), _product_distro_row(account_id, 1235, 'Push Sky', '1111111111112'), ], } with _using_product_mock_data(mock_data): res = fixture_client.get(f'account/{account_id}/products?search_term=1234') result = res.json() assert res.status_code == 200 assert len(result) == 1 assert result[0]['product_id'] == 1234 def test_get_products_by_account_with_subaccount(fixture_client): """Test getting products filtered by subaccount_id.""" account_id = 57608 subaccount_id = 999 mock_data = { 'revenue_by_product_distro_dbt': [ _product_distro_row( account_id, 1234, 'Hey', '1111111111111', subaccount_id=subaccount_id ), _product_distro_row( account_id, 1235, 'Push Sky', '1111111111112', subaccount_id=None ), ], } with _using_product_mock_data(mock_data): res = fixture_client.get(f'account/{account_id}/products?subaccount_id={subaccount_id}') result = res.json() assert res.status_code == 200 assert len(result) == 1 assert result == [ {'product_id': 1234, 'product_name': 'Hey', 'display_upc': '1111111111111'}, ]