import pytest from http import HTTPStatus as http_status from server.constants.messages import PushMessageStatus from server.db.models import PushMessage from server.db.session import db_session as session_scope from tests.api.test_messages import create_message_data, check_bulk_create_response from tests.utils import check_object, create_devices def create_push_message_data(i, **kwargs): data = create_message_data(i, **kwargs) data.update({ "device_id": None, "to": f"token_{i}", "body": f"message_{i}", "title": f"title_{i}", "sound": "default", "expiration": 11.1 * i, "priority": "normal", "badge": i, "category": f"category_{i}", "channel_id": f"channel_{i}", "display_in_foreground": bool(i % 2) }) for k, v in kwargs.items(): data[k] = v return data @pytest.mark.parametrize( "data,ok_indexes,failed_indexes,headers,post_status,get_status", ( ({}, None, None, {}, http_status.BAD_REQUEST, http_status.BAD_REQUEST), ( { "public": False, "data": [ create_push_message_data(1) ], }, None, None, {"X-App-Slug": "app7"}, http_status.NOT_FOUND, http_status.OK ), ( { "public": False, "data": [create_push_message_data(i, ttl=-100) for i in range(1, 3)] }, None, list(range(2)), {"X-App-Slug": "app1"}, http_status.OK, http_status.OK ), ( { "public": False, "data": [create_push_message_data(i) for i in range(1, 3)] + [create_push_message_data( 3, device_id=1)] }, list(range(3)), None, {"X-App-Slug": "app1"}, http_status.OK, http_status.OK ), ( { "public": False, "data": [ create_push_message_data(1, account_id=2, data=None), create_push_message_data(2, ttl=-100) ] }, (0,), (1,), {"X-App-Slug": "app1"}, http_status.OK, http_status.OK ), ) ) async def test_push_messages( data, ok_indexes, failed_indexes, headers, post_status, get_status, db_session, client, auth): async with session_scope() as session: await create_devices(session, 4) headers.update(auth) app_slug = headers.get("X-App-Slug") ok_input_items = [item for i, item in enumerate(data.get("data", [])) if ok_indexes and i in ok_indexes] default = { "public": data.get("public", True), "data": None, "meta": None, "event_id": None, "account_id": None, "message_id": None, "device_id": None, "receipt": None, } id_list = [] post_response = await client.post( "/api/service/messages/push/", headers=headers, json=data) assert post_response.status == post_status if post_status == http_status.OK: result = await post_response.json() check_bulk_create_response(result, ok_indexes=ok_indexes, failed_indexes=failed_indexes) async with session_scope(): messages, _ = await PushMessage.list(order_by=PushMessage.id.asc()) assert len(messages) == len(ok_indexes or []) for i, message in enumerate(messages): input_item = ok_input_items[i] unset = {k: default[k] for k in (default.keys() - input_item.keys())} unset.update(app_slug=app_slug, status=PushMessageStatus.PROCESSING) check_object(message, input_item, **unset) id_list.append(message.id) list_data = { "id": id_list or [1, 2], "include": "all" } get_response = await client.post( "/api/service/messages/push/list/", headers=headers, json=list_data) assert get_response.status == get_status if get_status == http_status.OK: result = await get_response.json() list_response_items = result.get("data", []) assert len(list_response_items) == len(id_list) for i, response_item in enumerate(list_response_items): input_data = ok_input_items[i] input_item = {k: default[k] for k in (default.keys() - input_data.keys())} input_item.update(input_data) input_item.update({"id": id_list[i], "context": None, "status": "processing"}) assert response_item.pop("created_at") assert response_item.pop("updated_at") assert response_item == input_item