diff --git a/notificationapi_python_server_sdk/__init__.py b/notificationapi_python_server_sdk/__init__.py index 3b1b1f8..64befc5 100644 --- a/notificationapi_python_server_sdk/__init__.py +++ b/notificationapi_python_server_sdk/__init__.py @@ -2,4 +2,4 @@ __author__ = """Sahand Seifi""" __email__ = "sahand.seifi@gmail.com" -__version__ = "1.0.1" +__version__ = "1.1.0" diff --git a/notificationapi_python_server_sdk/notificationapi.py b/notificationapi_python_server_sdk/notificationapi.py index 260aa53..50dd73c 100644 --- a/notificationapi_python_server_sdk/notificationapi.py +++ b/notificationapi_python_server_sdk/notificationapi.py @@ -72,6 +72,23 @@ async def delete_sub_notification(params): ) +async def update_schedule(params): + await request( + "PATCH", + "schedule/%s" + % (params["tracking_id"]), + params["send_request"], + ) + + +async def delete_schedule(params): + await request( + "DELETE", + "schedule/%s" + % (params["tracking_id"]), + ) + + async def set_user_preferences(params): await request( "POST", diff --git a/setup.cfg b/setup.cfg index 71dd4d5..0e89946 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.0.1 +current_version = 1.1.0 commit = True tag = True diff --git a/setup.py b/setup.py index e92f6dc..7a462c9 100644 --- a/setup.py +++ b/setup.py @@ -52,6 +52,6 @@ test_suite="tests", tests_require=test_requirements, url="https://github.com/notificationapi-com/notificationapi_python_server_sdk", - version="1.0.1", + version="1.1.0", zip_safe=False, ) diff --git a/tests/test_notificationapi_deleteSchedule.py b/tests/test_notificationapi_deleteSchedule.py new file mode 100644 index 0000000..a115584 --- /dev/null +++ b/tests/test_notificationapi_deleteSchedule.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python + +"""Tests for `notificationapi_python_server_sdk` package.""" + +import pytest +from httpx import Response +from notificationapi_python_server_sdk import notificationapi + +client_id = "client_id" +client_secret = "client_secret" +tracking_id = "tracking_id" +api_paths = { + "delete_schedule": f"https://api.notificationapi.com/{client_id}/schedule/{tracking_id}" +} + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "func,params", + [ + ( + "delete_schedule", + { + "tracking_id": tracking_id, + }, + ), + ], +) +async def test_makes_one_delete_api_call(respx_mock, func, params): + route = respx_mock.delete(api_paths[func]).mock(return_value=Response(200)) + notificationapi.init(client_id, client_secret) + await getattr(notificationapi, func)(params) + assert route.called + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "func,params", + [ + ( + "delete_schedule", + { + "tracking_id": tracking_id, + }, + ), + ], +) +async def test_uses_basic_authorization(respx_mock, func, params): + route = respx_mock.delete(api_paths[func]).mock(return_value=Response(200)) + notificationapi.init(client_id, client_secret) + await getattr(notificationapi, func)(params) + assert route.calls.last.request.headers["Authorization"] == "Basic Y2xpZW50X2lkOmNsaWVudF9zZWNyZXQ=" + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "func,params", + [ + ( + "delete_schedule", + { + "tracking_id": tracking_id, + }, + ), + ], +) +async def test_logs_and_throws_on_500(respx_mock, caplog, func, params): + respx_mock.delete(api_paths[func]).mock(return_value=Response(500, text="big oof 500")) + notificationapi.init(client_id, client_secret) + await getattr(notificationapi, func)(params) + assert "NotificationAPI request failed. Response: big oof 500" in caplog.text diff --git a/tests/test_notificationapi_updateSchedule.py b/tests/test_notificationapi_updateSchedule.py new file mode 100644 index 0000000..d854777 --- /dev/null +++ b/tests/test_notificationapi_updateSchedule.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python + +"""Tests for `notificationapi_python_server_sdk` package.""" + +import pytest +import json +from httpx import Response +from notificationapi_python_server_sdk import notificationapi + +client_id = "client_id" +client_secret = "client_secret" +tracking_id = "tracking_id" +send_request = { + 'notificationId': 'notification_id' +} +api_paths = { + "update_schedule": f"https://api.notificationapi.com/{client_id}/schedule/{tracking_id}", +} + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "func,params", + [ + ( + "update_schedule", + { + "tracking_id": tracking_id, + "send_request": send_request, + }, + ), + ], +) +async def test_makes_one_patch_api_call(respx_mock, func, params): + route = respx_mock.patch(api_paths[func]).mock(return_value=Response(200)) + notificationapi.init(client_id, client_secret) + await getattr(notificationapi, func)(params) + assert route.called + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "func,params", + [ + ( + "update_schedule", + { + "tracking_id": tracking_id, + "send_request": send_request, + }, + ), + ], +) +async def test_uses_basic_authorization(respx_mock, func, params): + route = respx_mock.patch(api_paths[func]).mock(return_value=Response(200)) + notificationapi.init(client_id, client_secret) + await getattr(notificationapi, func)(params) + assert route.calls.last.request.headers["Authorization"] == "Basic Y2xpZW50X2lkOmNsaWVudF9zZWNyZXQ=" + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "func,params", + [ + ( + "update_schedule", + { + "tracking_id": tracking_id, + "send_request": send_request, + }, + ), + ], +) +async def test_passes_send_request_as_json_body(respx_mock, func, params): + route = respx_mock.patch(api_paths[func]).mock(return_value=Response(200)) + notificationapi.init(client_id, client_secret) + await getattr(notificationapi, func)(params) + assert json.loads(route.calls.last.request.content) == params["send_request"] + + +@pytest.mark.asyncio +@pytest.mark.parametrize( + "func,params", + [ + ( + "update_schedule", + { + "tracking_id": tracking_id, + "send_request": send_request, + }, + ), + ], +) +async def test_logs_and_throws_on_500(respx_mock, caplog, func, params): + respx_mock.patch(api_paths[func]).mock(return_value=Response(500, text="big oof 500")) + notificationapi.init(client_id, client_secret) + await getattr(notificationapi, func)(params) + assert "NotificationAPI request failed. Response: big oof 500" in caplog.text