import pytest from unittest.mock import patch from charts.logic import sql_loader from charts.logic.dataloaders.charts.dates.placements import utils from charts.logic.permissions import AdminPermissionsType from charts.logic.permissions import NonAdminPermissionsType from charts.logic.permissions import NonePermissionsType def chart_placement_is_part_of_catalog_existential_subquery_mock_loader(sql: str) -> str: if sql == 'chart_placement/is_part_of_catalog_cte/v1': return 'SQL v2: {{ filter }}' if sql == 'chart_placement/is_part_of_catalog_cte/filters/vendor_ids': return 'vendor_ids filter' if sql == 'chart_placement/is_part_of_catalog_cte/filters/subaccount_ids': return 'subaccount_ids filter' if sql == 'chart_placement/is_part_of_catalog_cte/filters/label_participant_ids': return 'label_participant_ids filter' raise Exception(f'Unknown SQL {sql}') def test_chart_placement_is_part_of_catalog_subquery_admin( mock_admin_permissions: AdminPermissionsType, ) -> None: """Test chart_placement_is_part_of_catalog_subquery for an admin.""" with patch.object(utils, 'get_sme_data_nfd_filter') as mock_get_sme_data_nfd_filter,\ patch.object(sql_loader, 'load_query') as mock_sql_loader: mock_get_sme_data_nfd_filter.return_value = ['TestNFD1', 'TestNFD2'] mock_sql_loader.side_effect = chart_placement_is_part_of_catalog_existential_subquery_mock_loader response = utils.chart_placement_is_part_of_catalog_cte( permissions=mock_admin_permissions, show_sme_data=False, ) assert response == ( 'SQL v2: true', { 'nfd_filter': [["'TestNFD1', 'TestNFD2'"]], }, ) def test_chart_placement_is_part_of_catalog_subquery_user_with_no_permissions_no_ff( mock_none_permissions: NonePermissionsType, ) -> None: """Test chart_placement_is_part_of_catalog_subquery for a user with no access without v2 ff.""" with patch.object(utils, 'get_sme_data_nfd_filter') as mock_get_sme_data_nfd_filter,\ patch.object(sql_loader, 'load_query') as mock_sql_loader: mock_get_sme_data_nfd_filter.return_value = ['TestNFD1', 'TestNFD2'] mock_sql_loader.side_effect = chart_placement_is_part_of_catalog_existential_subquery_mock_loader response = utils.chart_placement_is_part_of_catalog_cte( permissions=mock_none_permissions, show_sme_data=False, ) assert response == ( 'SQL v2: false', { 'nfd_filter': [["'TestNFD1', 'TestNFD2'"]], }, ) def test_chart_placement_is_part_of_catalog_subquery_user_with_vendor_permissions() -> None: """Test chart_placement_is_part_of_catalog_subquery for a user with access to a vendor.""" with patch.object(utils, 'get_sme_data_nfd_filter') as mock_get_sme_data_nfd_filter,\ patch.object(sql_loader, 'load_query') as mock_sql_loader: permissions: NonAdminPermissionsType = { 'artist_ids': [], 'vendor_ids': [123], 'subaccount_ids': [], 'label_participant_ids': [], } mock_get_sme_data_nfd_filter.return_value = ['TestNFD1', 'TestNFD2'] mock_sql_loader.side_effect = chart_placement_is_part_of_catalog_existential_subquery_mock_loader response = utils.chart_placement_is_part_of_catalog_cte( permissions=permissions, show_sme_data=False, ) assert response == ( 'SQL v2: ((vendor_ids filter))', { 'nfd_filter': [["'TestNFD1', 'TestNFD2'"]], 'vendor_ids': [123], }, ) def test_chart_placement_is_part_of_catalog_subquery_user_with_subaccount_permissions() -> None: """Test chart_placement_is_part_of_catalog_subquery for a user with access to a subaccount.""" with patch.object(utils, 'get_sme_data_nfd_filter') as mock_get_sme_data_nfd_filter,\ patch.object(sql_loader, 'load_query') as mock_sql_loader: permissions: NonAdminPermissionsType = { 'artist_ids': [], 'vendor_ids': [], 'subaccount_ids': [456], 'label_participant_ids': [], } mock_get_sme_data_nfd_filter.return_value = ['TestNFD1', 'TestNFD2'] mock_sql_loader.side_effect = chart_placement_is_part_of_catalog_existential_subquery_mock_loader response = utils.chart_placement_is_part_of_catalog_cte( permissions=permissions, show_sme_data=False, ) assert response == ( 'SQL v2: ((subaccount_ids filter))', { 'nfd_filter': [["'TestNFD1', 'TestNFD2'"]], 'subaccount_ids': [456], }, ) def test_chart_placement_is_part_of_catalog_subquery_user_with_label_participant_permissions() -> None: """Test chart_placement_is_part_of_catalog_subquery for a user with access to a label_participant.""" with patch.object(utils, 'get_sme_data_nfd_filter') as mock_get_sme_data_nfd_filter,\ patch.object(sql_loader, 'load_query') as mock_sql_loader: permissions: NonAdminPermissionsType = { 'artist_ids': [], 'vendor_ids': [], 'subaccount_ids': [], 'label_participant_ids': [789], } mock_get_sme_data_nfd_filter.return_value = ['TestNFD1', 'TestNFD2'] mock_sql_loader.side_effect = chart_placement_is_part_of_catalog_existential_subquery_mock_loader response = utils.chart_placement_is_part_of_catalog_cte( permissions=permissions, show_sme_data=False, ) assert response == ( 'SQL v2: ((label_participant_ids filter))', { 'nfd_filter': [["'TestNFD1', 'TestNFD2'"]], 'label_participant_ids': [789], }, ) def test_chart_placement_is_part_of_catalog_subquery_user_with_mixed_permissions() -> None: """Test chart_placement_is_part_of_catalog_subquery for a user with access to multiple things.""" with patch.object(utils, 'get_sme_data_nfd_filter') as mock_get_sme_data_nfd_filter,\ patch.object(sql_loader, 'load_query') as mock_sql_loader: permissions: NonAdminPermissionsType = { 'artist_ids': [], 'vendor_ids': [123], 'subaccount_ids': [456], 'label_participant_ids': [789], } mock_get_sme_data_nfd_filter.return_value = ['TestNFD1', 'TestNFD2'] mock_sql_loader.side_effect = chart_placement_is_part_of_catalog_existential_subquery_mock_loader response = utils.chart_placement_is_part_of_catalog_cte( permissions=permissions, show_sme_data=False, ) assert response == ( 'SQL v2: ((vendor_ids filter) OR (subaccount_ids filter) OR (label_participant_ids filter))', { 'nfd_filter': [["'TestNFD1', 'TestNFD2'"]], 'vendor_ids': [123], 'subaccount_ids': [456], 'label_participant_ids': [789], }, )