Skip to content

Commit

Permalink
view manufacturer by ID #66
Browse files Browse the repository at this point in the history
  • Loading branch information
MatteoGuarnaccia5 committed Oct 2, 2023
1 parent 9d5ec35 commit af8d99f
Show file tree
Hide file tree
Showing 4 changed files with 121 additions and 7 deletions.
27 changes: 26 additions & 1 deletion inventory_management_system_api/routers/v1/manufacturer.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import logging
from typing import List
from fastapi import APIRouter, status, Depends, HTTPException
from inventory_management_system_api.core.exceptions import DuplicateRecordError
from inventory_management_system_api.core.exceptions import DuplicateRecordError, InvalidObjectIdError

from inventory_management_system_api.schemas.manufacturer import ManufacturerPostRequestSchema, ManufacturerSchema
from inventory_management_system_api.services.manufacturer import ManufacturerService
Expand Down Expand Up @@ -51,3 +51,28 @@ def get_all_manufacturers(manufacturer_service: ManufacturerService = Depends())

manufacturers = manufacturer_service.list()
return [ManufacturerSchema(**manufacturer.dict()) for manufacturer in manufacturers]


@router.get(
path="/{manufacturer_id}",
summary="Get a manufacturer by ID",
response_description="Single manufacturer",
)
def get_one_manufacturer(
manufacturer_id: str, manufacturer_service: ManufacturerService = Depends()
) -> ManufacturerSchema:
# pylint: disable=missing-function-docstring
logger.info("Getting manufacturer with ID %s", manufacturer_id)
try:
manufacturer = manufacturer_service.get(manufacturer_id)
if not manufacturer:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND, detail="The requested manufacturer was not found"
)
except InvalidObjectIdError as exc:
logger.exception("The ID is not a valid object value")
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND, detail="The requested manufacturer was not found"
) from exc

return ManufacturerSchema(**manufacturer.dict())
14 changes: 11 additions & 3 deletions inventory_management_system_api/services/manufacturer.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import logging
import re

from typing import List
from typing import List, Optional
from fastapi import Depends
from inventory_management_system_api.models.manufacturer import ManufacturerIn, ManufacturerOut

Expand Down Expand Up @@ -50,10 +50,18 @@ def _generate_code(self, name: str) -> str:
name = name.lower().strip()
return re.sub(r"\s", "-", name)

def get(self, manufacturer_id: str) -> Optional[ManufacturerOut]:
"""
Get manufacturer by its ID.
:param: manufacturer_id: The ID of the requested manufacturer
:return: The retrieved manufacturer, or None if not found
"""
return self._manufacturer_repository.get(manufacturer_id)

def list(self) -> List[ManufacturerOut]:
"""Get all manufactuers
:return: list of all manufacturers
"""
return self._manufacturer_repository.list()

34 changes: 34 additions & 0 deletions test/e2e/test_manufacturer.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
"""
End-to-End tests for the manufacturer router.
"""
from bson import ObjectId
import pytest


Expand Down Expand Up @@ -87,3 +88,36 @@ def test_get_manufacturers(test_client):
assert manufacturers[1]["name"] == "Manufacturer B"
assert manufacturers[1]["url"] == "http://2ndExample.com"
assert manufacturers[1]["address"] == "Street B"


def test_get_manufacturer_with_id(test_client):
"""Test getting a manufacturer by ID"""
manufacturer_post = {
"name": "Manufacturer A",
"url": "http://example.com",
"address": "Street A",
}
response = test_client.post("/v1/manufacturer", json=manufacturer_post)
response = test_client.get(f"/v1/manufacturer/{response.json()['id']}")
assert response.status_code == 200
manufacturer = response.json()

assert manufacturer["name"] == manufacturer_post["name"]
assert manufacturer["url"] == manufacturer_post["url"]
assert manufacturer["address"] == manufacturer_post["address"]


def test_get_manufacturer_with_invalid_id(test_client):
"""Test getting a manufacturer with an invalid id"""

response = test_client.get("/v1/manufacturer/invalid")
assert response.status_code == 404
assert response.json()["detail"] == "The requested manufacturer was not found"


def test_get_manufactuer_with_nonexistent_id(test_client):
"""Test getting a manufacturer with an nonexistent id"""
response = test_client.get(f"/v1/manufacturer/{str(ObjectId())}")

assert response.status_code == 404
assert response.json()["detail"] == "The requested manufacturer was not found"
53 changes: 50 additions & 3 deletions test/unit/repositories/test_manufacturer.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from bson import ObjectId

from inventory_management_system_api.core.custom_object_id import CustomObjectId
from inventory_management_system_api.core.exceptions import DuplicateRecordError
from inventory_management_system_api.core.exceptions import DuplicateRecordError, InvalidObjectIdError
from inventory_management_system_api.models.manufacturer import ManufacturerIn, ManufacturerOut


Expand All @@ -22,7 +22,7 @@ def test_create_manufacturer(test_helpers, database_mock, manufacturer_repositor
_id=str(ObjectId()),
name="Manufacturer A",
code="manufacturer-a",
url="testUrl.co.uk",
url="http://testUrl.co.uk",
address="1 Example street",
)
# Mock 'count documents' to return 0 (no duplicates found)
Expand Down Expand Up @@ -73,7 +73,7 @@ def test_create_manufacturer_duplicate(test_helpers, database_mock, manufacturer
name="Manufacturer B",
code="manufacturer-b",
url="http://duplicate.co.uk",
address="street B"
address="street B",
)

# Mock count_documents to return 1 (duplicat manufacturer found)
Expand Down Expand Up @@ -134,3 +134,50 @@ def test_get_all_manufacturers(test_helpers, database_mock, manufacturer_reposit

database_mock.manufacturer.find.assert_called_once_with()
assert retrieved_manufacturers == [manufacturer_1, manufacturer_2]


def test_get_manufacturer_by_id(test_helpers, database_mock, manufacturer_repository):
"""
Test getting a manufacturer by id
"""
manufacturer = ManufacturerOut(
_id=str(ObjectId()),
name="Manufacturer A",
code="manufacturer-a",
url="http://testUrl.co.uk",
address="1 Example street",
)
test_helpers.mock_find_one(
database_mock.manufacturer,
{
"_id": CustomObjectId(manufacturer.id),
"code": manufacturer.code,
"name": manufacturer.name,
"url": manufacturer.url,
"address": manufacturer.address,
},
)
retrieved_manufacturer = manufacturer_repository.get(manufacturer.id)
database_mock.manufacturer.find_one.assert_called_once_with({"_id": CustomObjectId(manufacturer.id)})
assert retrieved_manufacturer == manufacturer


def test_get_with_invalid_id(manufacturer_repository):
"""
Test getting a manufacturer with an Invalid ID
"""
with pytest.raises(InvalidObjectIdError) as exc:
manufacturer_repository.get("invalid")
assert str(exc.value) == "Invalid ObjectId value"


def test_get_with_nonexistent_id(test_helpers, database_mock, manufacturer_repository):
"""
Test getting a manufacturer with an ID that does not exist
"""
manufacturer_id = str(ObjectId())
test_helpers.mock_find_one(database_mock.manufacturer, None)
retrieved_manufacturer = manufacturer_repository.get(manufacturer_id)

assert retrieved_manufacturer is None
database_mock.manufacturer.find_one.assert_called_once_with({"_id": CustomObjectId(manufacturer_id)})

0 comments on commit af8d99f

Please sign in to comment.