import datetime import json import pytest from apollo_save_push_receipts.config import Config as config from apollo_save_push_receipts.handler import handler from apollo_save_push_receipts.logger import get_logger from apollo_save_push_receipts.constants import PushMessageStatus from apollo_save_push_receipts.user_data_client import UserDataClient from marshmallow import ValidationError from unittest.mock import Mock @pytest.mark.parametrize( "event,failed,update_call_count,deactivate_call_count", ( ( { "Records": [ { "body": json.dumps({ "id": 1, "status": PushMessageStatus.DELIVERED, "receipt_id": "push_id_1", "device_id": 1, "expo_token": f"ExponentPushToken 1" }), } ] }, False, 1, 0 ), ( { "Records": [ { "body": json.dumps({ "id": 1, "status": PushMessageStatus.DELIVERED, "receipt_id": "push_id_2", "device_id": 2, "expo_token": f"ExponentPushToken 2" }), }, { "body": json.dumps({ "id": 2, "status": PushMessageStatus.FAILED, "details": "some error message", "receipt_id": "push_id_3", "device_id": 3, "expo_token": f"ExponentPushToken 3" }), }, ] }, False, 1, 0 ), ( { "Records": [ { "body": json.dumps({ "id": 1, "status": PushMessageStatus.FAILED }), }, ] }, True, 1, 0 ) , ( { "Records": [ { "body": json.dumps({ "id": 1, "status": PushMessageStatus.FAILED, "details": "DeviceNotRegistered", "receipt_id": "push_id_3", "device_id": 5, "created_at": datetime.datetime.utcnow().isoformat(), "expo_token": f"ExponentPushToken 4" }) }, { "body": json.dumps({ "id": 1, "status": PushMessageStatus.DELIVERED, "receipt_id": "push_id_2", "device_id": 4, "expo_token": f"ExponentPushToken 4" }), }, { "body": json.dumps({ "id": 2, "status": PushMessageStatus.FAILED, "details": "some error message", "receipt_id": "push_id_3", "device_id": 6, "expo_token": f"ExponentPushToken 6" }) } ] }, False, 1, 1 ), ( { "Records": [ { "body": json.dumps({ "id": 1, "status": PushMessageStatus.FAILED, "details": "DeviceNotRegistered", "receipt_id": "push_id_3", "device_id": 5, "created_at": datetime.datetime.utcnow().isoformat(), "expo_token": f"ExponentPushToken 7" }) }, { "body": json.dumps({ "id": 2, "status": PushMessageStatus.FAILED, "details": "is not a registered push", "receipt_id": "push_id_4", "device_id": 6, "created_at": datetime.datetime.utcnow().isoformat(), "expo_token": f"ExponentPushToken 7" }) } ] }, False, 0, 1 ), ( { "Records": [ { "body": json.dumps({ "id": 1, "status": PushMessageStatus.FAILED, "details": "DeviceNotRegistered", "receipt_id": "push_id_3", "device_id": 5, "created_at": datetime.datetime.utcnow().isoformat(), "expo_token": f"ExponentPushToken 8" }) }, { "body": json.dumps({ "id": 1, "status": PushMessageStatus.FAILED, "details": "DeviceNotRegistered", "receipt_id": "push_id_3", "device_id": 5, "created_at": ( datetime.datetime.utcnow() - datetime.timedelta(seconds=config.DEACTIVATE_RECEIPT_TTL+1) ).isoformat(), "expo_token": f"ExponentPushToken 10" }, ) }, ] }, False, 0, 1 ), ) ) def test_handler(mocker, event, failed, update_call_count, deactivate_call_count): logger = get_logger('test') mock = Mock() update_mock = mocker.patch.object(UserDataClient, "update_bulk", side_effect=mock) deactivate_mock = mocker.patch.object(UserDataClient, "deactivate_bulk", side_effect=mock) if failed: with pytest.raises(ValidationError) as excinfo: handler(logger, event) assert excinfo.value.messages == { "_schema": [f"Details are required when status is {PushMessageStatus.FAILED}"] } else: handler(logger, event) assert update_mock.call_count == update_call_count assert deactivate_mock.call_count == deactivate_call_count