from datetime import timedelta from http import HTTPStatus from typing import List import pytest from server.client.clients.dsp_api import DspApiClient from server.client.utils import str_to_date from tests.api.charts.test_charts import get_chart_date @pytest.mark.parametrize( "params,status,expected_result,call_count,dates_diff", ( ({}, HTTPStatus.BAD_REQUEST, None, 0, None), ({"isrc": "AA11,BB22"}, HTTPStatus.BAD_REQUEST, None, 0, None), ( {"isrc": "BB22", "market": "us"}, HTTPStatus.OK, { "chart_available": True, "data": [ { "end_date": "2019-05-26", "is_entered": False, "isrc": "BB22", "market": "us", "positions": [ {"change": None, "date": "2019-05-21", "position": 1}, {"change": 3, "date": "2019-05-22", "position": 4}, {"change": 5, "date": "2019-05-23", "position": 9}, {"change": 7, "date": "2019-05-24", "position": 16}, {"change": 9, "date": "2019-05-25", "position": 25}, {"change": 11, "date": "2019-05-26", "position": 36}], "start_date": "2019-05-21", "trend": None, }, ], }, 3, [(870, 900)], ), ( {"isrc": "AA11", "market": "us", "start": "2021-11-01", "end": "2021-11-06"}, HTTPStatus.OK, { "chart_available": True, "data": [ { "end_date": "2021-11-06", "is_entered": False, "isrc": "AA11", "market": "us", "positions": [ {"change": 3, "date": "2021-11-01", "position": 4}, {"change": 5, "date": "2021-11-02", "position": 9}, {"change": 7, "date": "2021-11-03", "position": 16}, {"change": 9, "date": "2021-11-04", "position": 25}, {"change": 11, "date": "2021-11-05", "position": 36}, {"change": 13, "date": "2021-11-06", "position": 49}, ], "start_date": "2021-11-01", "trend": 13, }, ], }, 3, [(0, 0)], ), ( {"isrc": "AA11,BB22", "market": "us", "end": "2021-11-12", "date_shift": 6}, HTTPStatus.OK, { "chart_available": True, "data": [ { "end_date": "2021-11-09", "is_entered": False, "isrc": "AA11", "market": "us", "positions": [ {"change": 3, "date": "2021-11-06", "position": 4}, {"change": 5, "date": "2021-11-07", "position": 9}, {"change": 7, "date": "2021-11-08", "position": 16}, {"change": 9, "date": "2021-11-09", "position": 25}, ], "start_date": "2021-11-06", "trend": None, }, { "end_date": "2021-11-11", "is_entered": True, "isrc": "BB22", "market": "us", "positions": [{"change": None, "date": "2021-11-11", "position": 11}], "start_date": "2021-11-11", "trend": None, }, ], }, 3, [(0, 2), [6, 0]], ), ), ) async def test_get_charts( params: dict, status: int, expected_result: list, call_count: int, dates_diff: List[tuple], mocker, auth, client ): latest_date = "2021-11-11" isrc_list = params["isrc"].split(",") if "isrc" in params else [] async def dsp_send(url: str, *args, **kwargs): relative_url = url.replace("api/delphi/spotify/", "").replace("api/delphi/apple-music/", "").replace( "api/delphi/", "" ) if relative_url == "charts/data-health/status": return get_chart_date(market_list=[params["market"]], chart_date=latest_date) elif relative_url == "charts/analytics": start_date, end_date = ( str_to_date(kwargs["params"]["start_date"]), str_to_date(kwargs["params"]["end_date"]) ) days_count = (end_date - start_date).days + 1 return [ { "isrc": isrc, "min_date": (start_date + timedelta(days=dates_diff[i][0])).isoformat(), "max_date": (end_date - timedelta(days=dates_diff[i][1])).isoformat(), "metrics": {"positions": [10 * i + j * j for j in range(1, days_count + 1 - sum(dates_diff[i]))]}, } for i, isrc in enumerate(isrc_list) ] elif relative_url == "charts": return {"items": [{}]} dsp_send_mock = mocker.patch.object(DspApiClient, "_send_request", side_effect=dsp_send) response = await client.get(f"/api/gtp/charts/", headers=auth, params=params) assert response.status == status if status == HTTPStatus.OK: assert dsp_send_mock.call_count == call_count response = await response.json() response["data"] = sorted(response["data"], key=lambda i: i["isrc"]) assert response == expected_result