from datetime import date, datetime import pytest from marshmallow import ValidationError from playlist.queries.fetch_queries import fetch_placement, fetch_placements, format_row def test_format_row(): assert format_row({"key1": "value"}) == {"key1": "value"} assert format_row( {"key1": "value", "key2": 2, "key3": datetime(2020, 1, 1, 0, 0)} ) == {"key1": "value", "key2": 2, "key3": "2020-01-01T00:00:00+00:00"} assert format_row({"key1": "value", "key2": 2, "key3": date(2020, 1, 1)}) == { "key1": "value", "key2": 2, "key3": "2020-01-01", } # fmt: off assert format_row( {"key1": "value", "key2": 2, "array": '[\n "edm",\n "pop"\n]'}, array_fields=['array'] ) == {"key1": "value", "key2": 2, "array": ['edm', 'pop']} # fmt: on # invalid or empty array from snowflake assert format_row({"array": "[]"}, array_fields=["array"]) == {"array": []} assert format_row({"array": ""}, array_fields=["array"]) == {"array": []} assert format_row({"array": "blah..."}, array_fields=["array"]) == {"array": []} assert format_row({"array": None}, array_fields=["array"]) == {"array": []} # store_id should be converted to int assert format_row({"store_id": "123"}) == {"store_id": 123} assert format_row({"store_id": 456}) == {"store_id": 456} assert format_row({"store_id": None}) == {"store_id": None} def test_minimal(mock_execute): query_params = { "isrc": "QMFME2004132", "limit": 50, "offset": 0, "sort_key": "streams_all_time", "sort_direction": "DESC", } permissions = { "permission_label_ids": ["1", "2", "3"], } fetch_placements(query_params, permissions) assert mock_execute.call_count == 1 def test_with_unknown_key(mock_execute): query_params = { "isrc": "QMFME2004132", "limit": 50, "offset": 0, "sort_key": "streams_all_time", "sort_direction": "DESC", "a": 5, } fetch_placements(query_params, {}) assert mock_execute.call_count == 1 def test_with_incorrect_data_type(mock_execute): query_params = { "isrc": "QMFME2004132", "limit": 50, "offset": "abcdef", "sort_key": "streams_all_time", "sort_direction": "DESC", } with pytest.raises(ValidationError): fetch_placements(query_params, {}) assert mock_execute.call_count == 0 def test_with_incorrect_sort_direction(mock_execute): query_params = { "isrc": "QMFME2004132", "limit": 50, "offset": 100, "sort_key": "streams_all_time", "sort_direction": "asdsad", } with pytest.raises(ValidationError): fetch_placements(query_params, {}) assert mock_execute.call_count == 0 def test_with_permission_label_ids(mock_execute): query_params = { "isrc": "QMFME2004132", "limit": 50, "offset": 100, "sort_key": "streams_all_time", "sort_direction": "ASC", } permissions = { "permission_label_ids": ["1", "2", "3", "4"], } fetch_placements(query_params, permissions) assert mock_execute.call_count == 1 def test_with_permission_subaccount_ids(mock_execute): query_params = { "isrc": "QMFME2004132", "limit": 50, "offset": 100, "sort_key": "streams_all_time", "sort_direction": "ASC", } permissions = { "permission_subaccount_ids": ["5", "6", "7", "8"], } fetch_placements(query_params, permissions) assert mock_execute.call_count == 1 def test_with_permission_label_participant_ids(mock_execute): query_params = { "isrc": "QMFME2004132", "limit": 50, "offset": 100, "sort_key": "streams_all_time", "sort_direction": "ASC", } permissions = { "permission_label_participant_ids": ["5", "6", "7", "8"], } fetch_placements(query_params, permissions) assert mock_execute.call_count == 1 def test_with_label_and_permission_subaccount_ids(mock_execute): query_params = { "isrc": "QMFME2004132", "limit": 50, "offset": 100, "sort_key": "streams_all_time", "sort_direction": "ASC", } permissions = { "permission_label_ids": ["1", "2", "3", "4"], "permission_subaccount_ids": ["5", "6", "7", "8"], } fetch_placements(query_params, permissions) assert mock_execute.call_count == 1 def test_with_subaccount_and_permission_label_participant_ids(mock_execute): query_params = { "isrc": "QMFME2004132", "limit": 50, "offset": 100, "sort_key": "streams_all_time", "sort_direction": "ASC", } permissions = { "permission_label_participant_ids": ["1", "2", "3", "4"], "permission_subaccount_ids": ["5", "6", "7", "8"], } fetch_placements(query_params, permissions) assert mock_execute.call_count == 1 def test_with_label_and_permission_label_participant_ids(mock_execute): query_params = { "isrc": "QMFME2004132", "limit": 50, "offset": 100, "sort_key": "streams_all_time", "sort_direction": "ASC", } permissions = { "permission_label_ids": ["1", "2", "3", "4"], "permission_label_participant_ids": ["5", "6", "7", "8"], } fetch_placements(query_params, permissions) assert mock_execute.call_count == 1 def test_with_stream_countries(mock_execute): query_params = { "isrc": "QMFME2004132", "limit": 50, "offset": 100, "sort_key": "streams_all_time", "sort_direction": "ASC", "stream_countries": ["US", "MX"], } fetch_placements(query_params, {}) assert mock_execute.call_count == 1 def test_with_curator_countries(mock_execute): query_params = { "isrc": "QMFME2004132", "limit": 50, "offset": 100, "sort_key": "streams_all_time", "sort_direction": "ASC", "curator_countries": ["US", "MX"], } fetch_placements(query_params, {}) assert mock_execute.call_count == 1 def test_fetch_placement(mock_execute): query_params = { "isrc": "QMFME2004132", "store_id": "1", "store_playlist_id": "abc", } permissions = { "permission_label_ids": ["1", "2", "3"], } fetch_placement(query_params, permissions) assert mock_execute.call_count == 1 @pytest.mark.disable_mock_execute def test_min_follower_count(mock_execute_orm, mock_template_engine): query_params = { "isrc": "QZK6F2031075", "min_followers": 999, } fetch_placements(query_params, {}) db_call_args = mock_template_engine.prepare_query.call_args[0][1] assert db_call_args["min_followers"] == 999