Skip to content

Commit

Permalink
Update linting
Browse files Browse the repository at this point in the history
  • Loading branch information
fatimarahman committed Nov 7, 2024
1 parent e9a3fea commit 747f3c2
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 46 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ This package contains common Python utility classes and functions.
* Connecting to and querying a PostgreSQL database using a connection pool
* Connecting to and querying Redshift
* Making requests to the Oauth2 authenticated APIs such as NYPL Platform API and Sierra
* Interacting with vendor APIs such as cloudLibrary

## Functions
* Reading a YAML config file and putting the contents in os.environ -- see `config/sample.yaml` for an example of how the config file should be formatted
Expand Down
28 changes: 17 additions & 11 deletions src/nypl_py_utils/classes/cloudlibrary_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,10 @@ def setup_session(self):
self.session.mount("https://",
HTTPAdapter(max_retries=retry_policy))

def get_library_events(self, start_date=None, end_date=None) -> requests.Response:
def get_library_events(self, start_date=None,
end_date=None) -> requests.Response:
"""
Retrieves all the events related to library-owned items within the
Retrieves all the events related to library-owned items within the
optional timeframe. Pulls yesterday's events by default.
start_date and end_date are optional parameters, and must be
Expand All @@ -47,32 +48,36 @@ def get_library_events(self, start_date=None, end_date=None) -> requests.Respons
today, date_format) if end_date is None else end_date

if start_date > end_date:
error_message = f"Start date {start_date} is greater than end date {end_date}, cannot retrieve library events"
error_message = (f"Start date {start_date} greater than end date "
f"{end_date}, cannot retrieve library events")
self.logger.error(error_message)
raise CloudLibraryClientError(error_message)

self.logger.info(
f"Fetching all library events in time frame {start_date} to {end_date}...")
(f"Fetching all library events in "
f"time frame {start_date} to {end_date}..."))

path = f"data/cloudevents?startdate={start_date}&enddate={end_date}"
response = self.request(path=path, method_type="GET")
return response

def create_request_body(self, request_type, item_id, patron_id) -> str:
def create_request_body(self, request_type,
item_id, patron_id) -> str:
"""
Helper function to generate request body when performing item
and/or patron-specific functions (ex. checking out a title).
Helper function to generate request body when performing item
and/or patron-specific functions (ex. checking out a title).
"""
request_template = "<%(request_type)s><ItemId>%(item_id)s</ItemId><PatronId>%(patron_id)s</PatronId></%(request_type)s>"
request_template = "<%(request_type)s><ItemId>%(item_id)s</ItemId><PatronId>%(patron_id)s</PatronId></%(request_type)s>" # noqa
return request_template % {
"request_type": request_type,
"item_id": item_id,
"patron_id": patron_id,
}

def request(self, path, method_type="POST", body=None) -> requests.Response:
def request(self, path, method_type="POST",
body=None) -> requests.Response:
"""
Use this method to call specific paths in the cloudLibrary API.
Use this method to call specific paths in the cloudLibrary API.
This method is necessary for building headers/authorization.
Example usage of this method is in the get_library_events function.
"""
Expand Down Expand Up @@ -121,7 +126,8 @@ def _build_headers(self, method_type, path) -> dict:

return headers

def _build_authorization(self, method_type, path) -> tuple[str, str]:
def _build_authorization(self, method_type,
path) -> tuple[str, str]:
now = datetime.now(timezone.utc).strftime(
"%a, %d %b %Y %H:%M:%S GMT")
message = "\n".join([now, method_type, path])
Expand Down
79 changes: 44 additions & 35 deletions tests/test_cloudlibrary_client.py
Original file line number Diff line number Diff line change
@@ -1,34 +1,33 @@
import pytest

from freezegun import freeze_time
from unittest import mock

from requests import ConnectTimeout
from nypl_py_utils.classes.cloudlibrary_client import CloudLibraryClient, CloudLibraryClientError
from nypl_py_utils.classes.cloudlibrary_client import (
CloudLibraryClient, CloudLibraryClientError)

_API_URL = "https://partner.yourcloudlibrary.com/cirrus/library/"

# catch-all API response since we're not testing actual data
_TEST_LIBRARY_EVENTS_RESPONSE = """<LibraryEventBatch
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<PublishId>4302fcca-ef99-49bf-bd29-d673e990f765</PublishId>
<PublishDateTimeInUTC>2024-11-10T17:35:18</PublishDateTimeInUTC>
<LastEventDateTimeInUTC>2012-11-11T13:58:52.055</LastEventDateTimeInUTC>
<Events>
<CloudLibraryEvent>
<EventId>4302fcca-ef99-49bf-bd29-d673e990f4a7</EventId>
<EventType>CHECKIN</EventType>
<EventStartDateTimeInUTC>2024-11-10T05:07:56</EventStartDateTimeInUTC>
<EventEndDateTimeInUTC>2024-11-10T07:50:59</EventEndDateTimeInUTC>
<ItemId>edbz9</ItemId>
<ItemLibraryId>1234</ItemLibraryId>
<ISBN>9780307238405</ISBN>
<PatronId>TestUser1</PatronId>
<PatronLibraryId>1234</PatronLibraryId>
<EventPublishDateTimeInUTC>2024-11-10T17:35:18</EventPublishDateTimeInUTC>
</CloudLibraryEvent>
</Events>
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<PublishId>4302fcca-ef99-49bf-bd29-d673e990f765</PublishId>
<PublishDateTimeInUTC>2024-11-10T17:35:18</PublishDateTimeInUTC>
<LastEventDateTimeInUTC>2012-11-11T13:58:52.055</LastEventDateTimeInUTC>
<Events>
<CloudLibraryEvent>
<EventId>4302fcca-ef99-49bf-bd29-d673e990f4a7</EventId>
<EventType>CHECKIN</EventType>
<EventStartDateTimeInUTC>2024-11-10T05:07:56</EventStartDateTimeInUTC>
<EventEndDateTimeInUTC>2024-11-10T07:50:59</EventEndDateTimeInUTC>
<ItemId>edbz9</ItemId>
<ItemLibraryId>1234</ItemLibraryId>
<ISBN>9780307238405</ISBN>
<PatronId>TestUser1</PatronId>
<PatronLibraryId>1234</PatronLibraryId>
<EventPublishDateTimeInUTC>2024-11-10T17:35:18</EventPublishDateTimeInUTC>
</CloudLibraryEvent>
</Events>
</LibraryEventBatch>
"""

Expand All @@ -40,52 +39,60 @@ def test_instance(self):
return CloudLibraryClient(
"library_id", "account_id", "account_key")

def test_get_library_events_success_no_args(self, test_instance, requests_mock, caplog):
def test_get_library_events_success_no_args(
self, test_instance, requests_mock, caplog):
start = "2024-11-10T10:00:00"
end = "2024-11-11T10:00:00"
requests_mock.get(
f"{_API_URL}{test_instance.library_id}/data/cloudevents?startdate={start}&enddate={end}",
f"{_API_URL}{test_instance.library_id}/data/cloudevents?startdate={start}&enddate={end}", # noqa
text=_TEST_LIBRARY_EVENTS_RESPONSE)
response = test_instance.get_library_events()

assert response.text == _TEST_LIBRARY_EVENTS_RESPONSE
assert f"Fetching all library events in time frame {start} to {end}..." in caplog.text
assert (f"Fetching all library events in time frame "
f"{start} to {end}...") in caplog.text

def test_get_library_events_success_with_start_and_end_date(self, test_instance, requests_mock, caplog):
def test_get_library_events_success_with_start_and_end_date(
self, test_instance, requests_mock, caplog):
start = "2024-11-01T10:00:00"
end = "2024-11-05T10:00:00"
requests_mock.get(
f"{_API_URL}{test_instance.library_id}/data/cloudevents?startdate={start}&enddate={end}",
f"{_API_URL}{test_instance.library_id}/data/cloudevents?startdate={start}&enddate={end}", # noqa
text=_TEST_LIBRARY_EVENTS_RESPONSE)
response = test_instance.get_library_events(start, end)

assert response.text == _TEST_LIBRARY_EVENTS_RESPONSE
assert f"Fetching all library events in time frame {start} to {end}..." in caplog.text
assert (f"Fetching all library events in time frame "
f"{start} to {end}...") in caplog.text

def test_get_library_events_success_with_no_end_date(self, test_instance, requests_mock, caplog):
def test_get_library_events_success_with_no_end_date(
self, test_instance, requests_mock, caplog):
start = "2024-11-01T09:00:00"
end = "2024-11-11T10:00:00"
requests_mock.get(
f"{_API_URL}{test_instance.library_id}/data/cloudevents?startdate={start}&enddate={end}",
f"{_API_URL}{test_instance.library_id}/data/cloudevents?startdate={start}&enddate={end}", # noqa
text=_TEST_LIBRARY_EVENTS_RESPONSE)
response = test_instance.get_library_events(start)

assert response.text == _TEST_LIBRARY_EVENTS_RESPONSE
assert f"Fetching all library events in time frame {start} to {end}..." in caplog.text
assert (f"Fetching all library events in time frame "
f"{start} to {end}...") in caplog.text

def test_get_library_events_exception_when_start_date_greater_than_end(self, test_instance, caplog):
def test_get_library_events_exception_when_start_date_greater_than_end(
self, test_instance, caplog):
start = "2024-11-11T09:00:00"
end = "2024-11-01T10:00:00"

with pytest.raises(CloudLibraryClientError):
test_instance.get_library_events(start, end)
assert f"Start date {start} is greater than end date {end}, cannot retrieve library events" in caplog.text
assert (f"Start date {start} greater than end date "
f"{end}, cannot retrieve library events") in caplog.text

def test_get_library_events_failure(self, test_instance, requests_mock):
start = "2024-11-10T10:00:00"
end = "2024-11-11T10:00:00"
requests_mock.get(
f"{_API_URL}{test_instance.library_id}/data/cloudevents?startdate={start}&enddate={end}",
f"{_API_URL}{test_instance.library_id}/data/cloudevents?startdate={start}&enddate={end}", # noqa
exc=ConnectTimeout)

with pytest.raises(CloudLibraryClientError):
Expand All @@ -95,7 +102,9 @@ def test_create_request_body_success(self, test_instance):
request_type = "CheckoutRequest"
item_id = "df45qw"
patron_id = "215555602845"
EXPECTED_REQUEST_BODY = f"<{request_type}><ItemId>{item_id}</ItemId><PatronId>{patron_id}</PatronId></{request_type}>"
EXPECTED_REQUEST_BODY = (f"<{request_type}><ItemId>{item_id}</ItemId>"
f"<PatronId>{patron_id}</PatronId>"
f"</{request_type}>")
request_body = test_instance.create_request_body(
request_type, item_id, patron_id)

Expand Down

0 comments on commit 747f3c2

Please sign in to comment.