import pytest from flask import url_for from http import HTTPStatus from typing import List from src.constants.order import SortOrder from src.constants.users.search import UsersSearchInclude as Include from src.constants.users.search import UsersSearchSortBy from src.legacy.spotify.constants import SPOTIFY_USER_IMAGE_PREFIX from tests.legacy.apollo_api import factories as apollo_factories def get_user_list( *index_list, count: int = 10, include_list: List[Include] = None, as_result: bool = True ) -> List[dict]: if include_list: include_list = [i.value for i in include_list] if not index_list: index_list = list(range(1, count + 1)) result = [] for index in index_list: result_item = { "user_name": f"un{index}", "display_name": f"User{index}" if index % 4 else None, "country_code": f"cc{index}" if index % 3 else None, "category_id": index if index % 3 == 0 else None, "service_type": index % 3 if index % 4 else None, "music_service": (1 if index % 2 else 6) if index % 5 else index, "subscribers": 100 + index if index % 3 else None, "playlist_subscribers": 22 + index if index % 2 else None, "image": ((SPOTIFY_USER_IMAGE_PREFIX if as_result else "") + f"img{index}") if index % 4 else None, } if as_result: result_item.update( {"name": f"User{index}" if index % 4 else f"un{index}", "uri": f"spotify:user:un{index}"} ) if include_list: result_item = {k: v for k, v in result_item.items() if k in include_list} result.append(result_item) return result @pytest.mark.parametrize( "params,expected_status,expected_result", ( ({}, HTTPStatus.OK, get_user_list(1, 10, 2, 3, 4, 5, 6, 7, 8, 9)), ({"term": "un1"}, HTTPStatus.OK, get_user_list(1)), ( { "dsp": "spotify", "include": "name,uri,subscribers", "sort_by": UsersSearchSortBy.SUBSCRIBERS.value, "sort_order": SortOrder.DESC.value, "limit": 2, }, HTTPStatus.OK, get_user_list(7, 1, include_list=[Include.NAME, Include.URI, Include.SUBSCRIBERS]), ), ), ) def test_users_search(params, expected_status, expected_result, client, patch_auth_user, user_id, db_session): patch_auth_user(user_id) if "term" in params: db_session.execute("ALTER TABLE BuzzUser ADD FULLTEXT KEY `fulltextIndex` (`Username`,`DisplayName`)") user_list = get_user_list(as_result=False) for data in user_list: apollo_factories.BuzzUserFactory(**data) response = client.get(url_for("users_search.get_users_search", **params)) assert response.status_code == expected_status if expected_status == HTTPStatus.OK: assert response.json["items"] == expected_result