Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Prev Previous commit
Next Next commit
fix: TT-402 refactor azure update endpoint
  • Loading branch information
Jobzi committed Nov 24, 2021
commit a9ebe955836439032a58d22f53273b560d1c095d
20 changes: 18 additions & 2 deletions V2/tests/api/azure/time_entry_azure_endpoints_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ def test__update_time_entry_azure_endpoint__returns_an_time_entry__when_found_an
assert activitiy_json_data == json.dumps(inserted_time_entries)


def test__update_time_entries_azure_endpoint__returns_a_status_code_404__when_time_entry_recive_invalid_id():
def test__update_time_entries_azure_endpoint__returns_a_status_code_400__when_time_entry_recive_invalid_format_id():
time_entry_body = {"description": Faker().sentence()}

req = func.HttpRequest(
Expand All @@ -115,10 +115,26 @@ def test__update_time_entries_azure_endpoint__returns_a_status_code_404__when_ti

response = azure_time_entries._update_time_entry.update_time_entry(req)

assert response.status_code == 404
assert response.status_code == 400
assert response.get_body() == b'Invalid Format ID'


def test__update_time_entries_azure_endpoint__returns_a_status_code_404__when_time_entry_recive_invalid_id():
time_entry_body = {"description": Faker().sentence()}

req = func.HttpRequest(
method="PUT",
body=json.dumps(time_entry_body).encode("utf-8"),
url=TIME_ENTRY_URL,
route_params={"id": Faker().pyint()},
)

response = azure_time_entries._update_time_entry.update_time_entry(req)

assert response.status_code == 404
assert response.get_body() == b'Not found'


def test__update_time_entries_azure_endpoint__returns_a_status_code_400__when_time_entry_recive_invalid_body():

time_entry_body = Faker().pydict(5, True, str)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,47 +1,46 @@
import dataclasses
import json
import logging

import azure.functions as func

from time_tracker.time_entries._infrastructure import TimeEntriesSQLDao
from time_tracker.time_entries._domain import TimeEntryService, TimeEntry, _use_cases
from ... import _domain
from ... import _infrastructure
from time_tracker._infrastructure import DB


def update_time_entry(req: func.HttpRequest) -> func.HttpResponse:
logging.info(
'Python HTTP trigger function processed a request to update an time entry.'
)
time_entry_id = req.route_params.get('id')
time_entry_data = req.get_json() if req.get_body() else {}
time_entry_keys = [field.name for field in dataclasses.fields(TimeEntry)]

if all(key in time_entry_keys for key in time_entry_data.keys()):
try:
response = _update(int(time_entry_id), time_entry_data)
status_code = 200
except ValueError:
response = b'Invalid Format ID'
status_code = 404
else:
response = b'Incorrect time entry body'
status_code = 400

return func.HttpResponse(
body=response, status_code=status_code, mimetype="application/json"
)


def _update(time_entry_id: int, time_entry_data: dict) -> str:
database = DB()
time_entry_use_case = _use_cases.UpdateTimeEntryUseCase(
_create_time_entry_service(database)
)
time_entry = time_entry_use_case.update_time_entry(time_entry_id, time_entry_data)
return json.dumps(time_entry.__dict__) if time_entry else b'Not Found'


def _create_time_entry_service(db: DB):
time_entry_dao = TimeEntriesSQLDao(db)
return TimeEntryService(time_entry_dao)
time_entry_dao = _infrastructure.TimeEntriesSQLDao(database)
time_entry_service = _domain.TimeEntryService(time_entry_dao)
use_case = _domain._use_cases.UpdateTimeEntryUseCase(time_entry_service)

try:
time_entry_id = int(req.route_params.get("id"))
time_entry_data = req.get_json()

if not _validate_time_entry(time_entry_data):
status_code = 400
response = b"Incorrect time entry body"
else:
updated_time_entry = use_case.update_time_entry(time_entry_id, time_entry_data)
status_code, response = [
404, b"Not found"
] if not updated_time_entry else [200, json.dumps(updated_time_entry.__dict__)]

return func.HttpResponse(
body=response,
status_code=status_code,
mimetype="application/json",
)

except ValueError:
return func.HttpResponse(
body=b"Invalid Format ID",
status_code=400,
mimetype="application/json"
)


def _validate_time_entry(time_entry_data: dict) -> bool:
time_entry_keys = [field.name for field in dataclasses.fields(_domain.TimeEntry)]
return all(key in time_entry_keys for key in time_entry_data.keys())
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,18 @@ def create(self, time_entry_data: domain.TimeEntry) -> domain.TimeEntry:
return None

def update(self, time_entry_id: int, time_entry_data: dict) -> domain.TimeEntry:
try:
query = self.time_entry.update().where(self.time_entry.c.id == time_entry_id).values(time_entry_data)
self.db.get_session().execute(query)
query_updated_time_entry = (
sqlalchemy.sql.select(self.time_entry)
.where(self.time_entry.c.id == time_entry_id)
)
time_entry = self.db.get_session().execute(query_updated_time_entry).one_or_none()

query = self.time_entry.update().where(self.time_entry.c.id == time_entry_id).values(time_entry_data)
self.db.get_session().execute(query)
query_updated_time_entry = sqlalchemy.sql.select(self.time_entry).where(self.time_entry.c.id == time_entry_id)
time_entry = self.db.get_session().execute(query_updated_time_entry).one_or_none()

return self.__create_time_entry_dto(dict(time_entry)) if time_entry else None
return self.__create_time_entry_dto(dict(time_entry)) if time_entry else None
except sqlalchemy.exc.SQLAlchemyError:
return None

def delete(self, time_entry_id: int) -> domain.TimeEntry:
query = (
Expand Down