import pytest from apollo_playlists_messages.constants import EventCode from tests.data.base import parsed_device from tests.data.events import create_parsed_full_event from tests.data.favorites import favorite_playlists_accounts from tests.data.messages import update_message from tests.data.utils import set_os_event def parsed_update_events(): return [ create_parsed_full_event( 1, EventCode.UPDATE, playlist_seed=1, country_code=["us", "gb"], top_country_code=["us"], with_date=True ), create_parsed_full_event( 2, EventCode.UPDATE, playlist_seed=2, country_code=["us"], top_country_code=["us", "global", "au"], with_date=True ), create_parsed_full_event( 3, EventCode.UPDATE, playlist_seed=3, country_code=["fr", "ge"], top_country_code=None, with_date=True ), create_parsed_full_event( 4, EventCode.UPDATE, playlist_seed=4, country_code=["mx"], top_country_code=None, with_date=True ), create_parsed_full_event( 6, EventCode.UPDATE, playlist_seed=6, country_code=[""], top_country_code=[], with_date=True ), ] @pytest.mark.parametrize( "input_events, ignored_ids, expected_result_len, expected_result", ( (parsed_update_events(), (), 7, [ update_message( 1, dsp="apple", country_code="us", account_id=1, devices=[parsed_device(11), parsed_device(12)] ), update_message( 1, dsp="apple", country_code="gb", account_id=3, devices=[parsed_device(31)] ), update_message( 1, dsp="apple", country_code="us", account_id=3, devices=[parsed_device(31)] ), update_message( 2, dsp="spotify", country_code="us", account_id=3, devices=[parsed_device(31)] ), update_message( 2, dsp="spotify", country_code="us", account_id=4, devices=[parsed_device(41)] ), update_message( 3, dsp="apple", country_code="fr", account_id=3, devices=[parsed_device(31)] ), update_message( 6, dsp="spotify", country_code="", account_id=3, devices=[parsed_device(31)] ), ]), (parsed_update_events(), ("1", "4", "6"), 3, [ update_message( 2, dsp="spotify", country_code="us", account_id=3, devices=[parsed_device(31)] ), update_message( 2, dsp="spotify", country_code="us", account_id=4, devices=[parsed_device(41)] ), update_message( 3, dsp="apple", country_code="fr", account_id=3, devices=[parsed_device(31)] ), ]), ([], (), 0, None), ), ) def test_update_handler(mocker, test_logger, input_events, ignored_ids, expected_result_len, expected_result): from apollo_playlists_messages.handlers.update import handler gate_api_mock = mocker.MagicMock() gate_api_mock.get_favorites_with_accounts.return_value = favorite_playlists_accounts() result = handler(input_events, set(ignored_ids), gate_api_mock, test_logger) assert len(result) == expected_result_len result.sort(key=lambda i: (i["event_id"], i["account_id"], i["meta"]["country_code"])) if expected_result is not None: for i, item in enumerate(expected_result): result_item = result[i] result_item["data"]["recipient"]["devices"].sort(key=lambda i: i["id"]) assert result[i] == item gate_api_mock.get_favorites_with_accounts.assert_called_once() @pytest.mark.parametrize( "event, input_events, ignored_ids, expected_result_len, expected_result", ( (set_os_event("playlists_tracklist_update"), parsed_update_events(), (), 7, [ update_message( 1, dsp="apple", country_code="us", account_id=1, devices=[parsed_device(11), parsed_device(12)] ), update_message( 1, dsp="apple", country_code="gb", account_id=3, devices=[parsed_device(31)] ), update_message( 1, dsp="apple", country_code="us", account_id=3, devices=[parsed_device(31)] ), update_message( 2, dsp="spotify", country_code="us", account_id=3, devices=[parsed_device(31)] ), update_message( 2, dsp="spotify", country_code="us", account_id=4, devices=[parsed_device(41)] ), update_message( 3, dsp="apple", country_code="fr", account_id=3, devices=[parsed_device(31)] ), update_message( 6, dsp="spotify", country_code="", account_id=3, devices=[parsed_device(31)] ), ]), (set_os_event("playlists_tracklist_update"), parsed_update_events(), ("1", "4", "6"), 3, [ update_message( 2, dsp="spotify", country_code="us", account_id=3, devices=[parsed_device(31)] ), update_message( 2, dsp="spotify", country_code="us", account_id=4, devices=[parsed_device(41)] ), update_message( 3, dsp="apple", country_code="fr", account_id=3, devices=[parsed_device(31)] ), ]), (set_os_event("playlists_tracklist_update"), [], (), 0, None), ), ) def test_update_handler_settings_v2( event, mocker, test_logger_playlists_tracklist_update, input_events, ignored_ids, expected_result_len, expected_result ): from apollo_playlists_messages.handlers.update import handler gate_api_mock = mocker.MagicMock() gate_api_mock.get_favorites_with_accounts.return_value = favorite_playlists_accounts(settings_version="2") result = handler(input_events, set(ignored_ids), gate_api_mock, test_logger_playlists_tracklist_update) assert len(result) == expected_result_len result.sort(key=lambda i: (i["event_id"], i["account_id"], i["meta"]["country_code"])) if expected_result is not None: for i, item in enumerate(expected_result): result_item = result[i] result_item["data"]["recipient"]["devices"].sort(key=lambda i: i["id"]) assert result[i] == item gate_api_mock.get_favorites_with_accounts.assert_called_once()