Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 46 additions & 22 deletions erclient/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -742,6 +742,29 @@ def get_objects_multithreaded(self, **kwargs):
logging.warning(
f"Attempt {tries} of {max_retries}: Error occurred loading events: {e}.")

def get_event(self, *, event_id, include_details=True, include_updates=False,
include_notes=False, include_related_events=False,
include_files=False):
"""
Get a single event by its ID.

:param event_id: UUID of the event to retrieve
:param include_details: Include event_details in response. Default True.
:param include_updates: Include update history. Default False.
:param include_notes: Include notes. Default False.
:param include_related_events: Include related events. Default False.
:param include_files: Include attached files. Default False.
:return: Event data dict
"""
params = {
'include_details': include_details,
'include_updates': include_updates,
'include_notes': include_notes,
'include_related_events': include_related_events,
'include_files': include_files,
}
return self._get(f'activity/event/{event_id}', params=params)

def get_events(self, **kwargs):
params = dict((k, v) for k, v in kwargs.items() if k in
('state', 'page_size', 'page', 'event_type', 'filter', 'include_notes',
Expand All @@ -768,17 +791,6 @@ def get_events(self, **kwargs):
else:
break

def get_event(self, *, event_id=None, include_details=True, include_updates=False, include_notes=False, include_related_events=False, include_files=False):
params = {
'include_details': include_details,
'include_updates': include_updates,
'include_notes': include_notes,
'include_related_events': include_related_events,
'include_files': include_files,
}
event = self._get(f'activity/event/{event_id}', params=params)
return event

def get_patrols(self, **kwargs):
params = dict((k, v) for k, v in kwargs.items() if k in
('state', 'page_size', 'page', 'event_type', 'filter'))
Expand Down Expand Up @@ -1173,6 +1185,29 @@ async def patch_report(self, event_id, data):
self.logger.debug('Result of event patch is: %s', result)
return result

async def get_event(self, *, event_id, include_details=True, include_updates=False,
include_notes=False, include_related_events=False,
include_files=False):
"""
Get a single event by its ID.

:param event_id: UUID of the event to retrieve
:param include_details: Include event_details in response. Default True.
:param include_updates: Include update history. Default False.
:param include_notes: Include notes. Default False.
:param include_related_events: Include related events. Default False.
:param include_files: Include attached files. Default False.
:return: Event data dict
"""
params = {
'include_details': include_details,
'include_updates': include_updates,
'include_notes': include_notes,
'include_related_events': include_related_events,
'include_files': include_files,
}
return await self._get(f'activity/event/{event_id}', params=params)

async def post_event(self, event):
"""Post a new event (alias for post_report)."""
return await self.post_report(event)
Expand Down Expand Up @@ -1250,17 +1285,6 @@ async def get_events(self, **kwargs):
async for event in self._get_data(endpoint='activity/events', params=params, batch_size=batch_size):
yield event

async def get_event(self, *, event_id=None, include_details=True, include_updates=False, include_notes=False, include_related_events=False, include_files=False):
params = {
'include_details': include_details,
'include_updates': include_updates,
'include_notes': include_notes,
'include_related_events': include_related_events,
'include_files': include_files,
}
event = await self._get(f'activity/event/{event_id}', params=params)
return event

async def get_observations(self, **kwargs):
"""
Returns an async generator to iterate over observations.
Expand Down
176 changes: 176 additions & 0 deletions tests/async_client/test_get_event.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,176 @@
import httpx
import pytest
import respx


@pytest.mark.asyncio
async def test_get_event_basic(er_client, report_created_response):
"""get_event returns event data for a valid event_id."""
event_id = "9d55bb9f-9fb5-4f43-b1c1-c0ba5164651f"

async with respx.mock(
base_url=er_client.service_root, assert_all_called=False
) as respx_mock:
route = respx_mock.get(f'activity/event/{event_id}')
route.return_value = httpx.Response(
httpx.codes.OK,
Comment on lines +11 to +16
json=report_created_response
)

result = await er_client.get_event(event_id=event_id)

assert result is not None
assert result["id"] == event_id
assert result["event_type"] == "rainfall_rep"
assert route.called
await er_client.close()


@pytest.mark.asyncio
async def test_get_event_with_all_includes(er_client, report_created_response):
"""get_event passes all include flags as query params."""
event_id = "9d55bb9f-9fb5-4f43-b1c1-c0ba5164651f"

async with respx.mock(
base_url=er_client.service_root, assert_all_called=False
) as respx_mock:
Comment on lines +34 to +36
route = respx_mock.get(f'activity/event/{event_id}')
route.return_value = httpx.Response(
httpx.codes.OK,
json=report_created_response
)

result = await er_client.get_event(
event_id=event_id,
include_details=True,
include_updates=True,
include_notes=True,
include_related_events=True,
include_files=True,
)

assert result is not None
# Verify the request was made with query params
request = route.calls[0].request
assert "include_details" in str(request.url)
assert "include_updates" in str(request.url)
assert "include_notes" in str(request.url)
assert "include_related_events" in str(request.url)
assert "include_files" in str(request.url)
assert route.called
await er_client.close()


@pytest.mark.asyncio
async def test_get_event_default_params(er_client, report_created_response):
"""get_event sends correct default query parameters."""
event_id = "9d55bb9f-9fb5-4f43-b1c1-c0ba5164651f"

async with respx.mock(
base_url=er_client.service_root, assert_all_called=False
) as respx_mock:
Comment on lines +69 to +71
route = respx_mock.get(f'activity/event/{event_id}')
route.return_value = httpx.Response(
httpx.codes.OK,
json=report_created_response
)

await er_client.get_event(event_id=event_id)

request = route.calls[0].request
url_str = str(request.url)
# include_details defaults to True
assert "include_details=True" in url_str or "include_details=true" in url_str
assert route.called
await er_client.close()


@pytest.mark.asyncio
async def test_get_event_not_found(er_client, not_found_response):
"""get_event raises ERClientNotFound for 404 responses."""
from erclient.er_errors import ERClientNotFound

event_id = "00000000-0000-0000-0000-000000000000"

async with respx.mock(
base_url=er_client.service_root, assert_all_called=False
) as respx_mock:
Comment on lines +95 to +97
route = respx_mock.get(f'activity/event/{event_id}')
route.return_value = httpx.Response(
httpx.codes.NOT_FOUND,
json=not_found_response
)

with pytest.raises(ERClientNotFound):
await er_client.get_event(event_id=event_id)

assert route.called
await er_client.close()


@pytest.mark.asyncio
async def test_get_event_unauthorized(er_client, bad_credentials_response):
"""get_event raises ERClientBadCredentials for 401 responses."""
from erclient.er_errors import ERClientBadCredentials

event_id = "9d55bb9f-9fb5-4f43-b1c1-c0ba5164651f"

async with respx.mock(
base_url=er_client.service_root, assert_all_called=False
) as respx_mock:
Comment on lines +118 to +120
route = respx_mock.get(f'activity/event/{event_id}')
route.return_value = httpx.Response(
httpx.codes.UNAUTHORIZED,
json=bad_credentials_response
)

with pytest.raises(ERClientBadCredentials):
await er_client.get_event(event_id=event_id)

assert route.called
await er_client.close()


@pytest.mark.asyncio
async def test_get_event_forbidden(er_client, forbidden_response):
"""get_event raises ERClientPermissionDenied for 403 responses."""
from erclient.er_errors import ERClientPermissionDenied

event_id = "9d55bb9f-9fb5-4f43-b1c1-c0ba5164651f"

async with respx.mock(
base_url=er_client.service_root, assert_all_called=False
) as respx_mock:
Comment on lines +141 to +143
route = respx_mock.get(f'activity/event/{event_id}')
route.return_value = httpx.Response(
httpx.codes.FORBIDDEN,
json=forbidden_response
)

with pytest.raises(ERClientPermissionDenied):
await er_client.get_event(event_id=event_id)

assert route.called
await er_client.close()


@pytest.mark.asyncio
async def test_get_event_includes_event_details(er_client, report_created_response):
"""get_event response includes event_details."""
event_id = "9d55bb9f-9fb5-4f43-b1c1-c0ba5164651f"

async with respx.mock(
base_url=er_client.service_root, assert_all_called=False
) as respx_mock:
Comment on lines +162 to +164
route = respx_mock.get(f'activity/event/{event_id}')
route.return_value = httpx.Response(
httpx.codes.OK,
json=report_created_response
)

result = await er_client.get_event(event_id=event_id, include_details=True)

assert "event_details" in result
assert result["event_details"]["height_m"] == 5
assert route.called
await er_client.close()
Loading
Loading