From b3db1144cae94ac1d17f444603b0c7bfc2ade641 Mon Sep 17 00:00:00 2001 From: pmoharana-cmd Date: Sun, 20 Oct 2024 14:16:35 -0400 Subject: [PATCH] Update tag service for resourceTag attachemnt and added tests --- backend/models/__init__.py | 7 +++ backend/services/tag.py | 72 ++++++++++++-------------- backend/test/services/tag_test.py | 42 ++++++++++++--- backend/test/services/tag_test_data.py | 4 +- 4 files changed, 78 insertions(+), 47 deletions(-) diff --git a/backend/models/__init__.py b/backend/models/__init__.py index e69de29..30846ad 100644 --- a/backend/models/__init__.py +++ b/backend/models/__init__.py @@ -0,0 +1,7 @@ +from .user_model import User +from .resource_model import Resource +from .service_model import Service +from .tag_model import Tag +from .enum_for_models import ProgramTypeEnum, UserTypeEnum +from .resource_tag_model import ResourceTag +from .service_tag_model import ServiceTag diff --git a/backend/services/tag.py b/backend/services/tag.py index 2a7cb5a..061fa27 100644 --- a/backend/services/tag.py +++ b/backend/services/tag.py @@ -1,15 +1,10 @@ from fastapi import Depends from ..database import db_session from sqlalchemy.orm import Session -from ..models.tag_model import Tag -from ..entities.tag_entity import TagEntity -from ..entities.resource_tag_entity import ResourceTagEntity -from ..entities.service_tag_entity import ServiceTagEntity -from .exceptions import ResourceNotFoundException -from ..models.user_model import User -from ..models.resource_model import Resource -from ..models.service_model import Service from sqlalchemy import select +from ..entities import TagEntity, ResourceTagEntity, ServiceTagEntity +from ..models import User, Resource, Service, Tag, ResourceTag +from .exceptions import ResourceNotFoundException class TagService: @@ -20,12 +15,12 @@ class TagService: def all(self) -> list[Tag]: """Returns a list of all Tags""" - query = select(TagEntity) + query = select(TagEntity) entities = self._session.scalars(query).all() return [entity.to_model() for entity in entities] - - def get_tag_by_id(self, id:int) -> Tag: + + def get_tag_by_id(self, id: int) -> Tag: """Returns tag based on it's id.""" tag = self._session.query(TagEntity).filter(TagEntity.id == id).one_or_none() @@ -38,21 +33,15 @@ class TagService: tag_entity = TagEntity.from_model(tag) self._session.add(tag_entity) - self._session.commit + self._session.commit() return tag_entity.to_model() - def delete(self, user: User, id:int) -> None: + def delete(self, user: User, id: int) -> None: """Method to delete a tag from the database, along with all connections.""" - tag = ( - self._session.query(TagEntity) - .filter( - TagEntity.id == id - ) - .one_or_none() - ) - + tag = self._session.query(TagEntity).filter(TagEntity.id == id).one_or_none() + if tag is None: raise ResourceNotFoundException(f"No tag found with matching id: {id}") @@ -60,20 +49,16 @@ class TagService: resource_tags = ( self._session.query(ResourceTagEntity) - .filter( - ResourceTagEntity.tagId == id - ) + .filter(ResourceTagEntity.tagId == id) .all() ) for tag in resource_tags: self._session.delete(tag) - + service_tags = ( self._session.query(ServiceTagEntity) - .filter( - ServiceTagEntity.tagId == id - ) + .filter(ServiceTagEntity.tagId == id) .all() ) @@ -81,42 +66,49 @@ class TagService: self._session.delete(tag) self._session.commit() - + def get_tags_for_resource(self, user: User, resource: Resource) -> list[Tag]: """Get tags based on a resource.""" tags: list[Tag] resource_tags = ( self._session.query(ResourceTagEntity) - .filter( - ResourceTagEntity.tagId == resource.id - ) + .filter(ResourceTagEntity.tagId == resource.id) .all() ) if resource_tags is None: - raise ResourceNotFoundException(f"No tags found for resource with id: {resource.id}") + raise ResourceNotFoundException( + f"No tags found for resource with id: {resource.id}" + ) for tag in resource_tags: tags.append(self.get_tag_by_id(tag.id)) - + return tags - + def get_tags_for_service(self, user: User, service: Service) -> list[Tag]: """Get tags based on a resource.""" tags: list[Tag] service_tags = ( self._session.query(ServiceTagEntity) - .filter( - ServiceTagEntity.tagId == service.id - ) + .filter(ServiceTagEntity.tagId == service.id) .all() ) if service_tags is None: - raise ResourceNotFoundException(f"No tags found for service with id: {service.id}") + raise ResourceNotFoundException( + f"No tags found for service with id: {service.id}" + ) for tag in service_tags: tags.append(self.get_tag_by_id(tag.id)) - + return tags + def add_tag_resource(self, user: User, tag: Tag, resource: Resource) -> None: + """Adds a tag to a resource""" + resource_tag_entity = ResourceTagEntity.from_model( + ResourceTag(tag_id=tag.id, resource_id=resource.id) + ) + self._session.add(resource_tag_entity) + self._session.commit() diff --git a/backend/test/services/tag_test.py b/backend/test/services/tag_test.py index fe7597c..33b7a2c 100644 --- a/backend/test/services/tag_test.py +++ b/backend/test/services/tag_test.py @@ -2,13 +2,43 @@ # PyTest import pytest -from ...services.tag import TagService -from .fixtures import tag_svc -from .tag_test_data import tag1, tag2, tag3 -from . import tag_test_data +from ...services import TagService, ResourceService +from .fixtures import tag_svc, resource_svc +from .tag_test_data import tag_to_create, tag_to_create_no_id, tags +from .user_test_data import admin def test_get_all(tag_svc: TagService): """Test that all tags can be retrieved.""" - tags = tag_svc.all() - assert len(tags) == 3 \ No newline at end of file + all_tags = tag_svc.all() + assert len(all_tags) == len(tags) + + +def test_create_tag(tag_svc: TagService): + """Test creation of tag""" + created_tag = tag_svc.create(admin, tag_to_create) + + assert created_tag.content == tag_to_create.content + assert len(tag_svc.all()) == len(tags) + 1 + + +def test_create_tag_no_id(tag_svc: TagService): + """Test creation of tag""" + created_tag = tag_svc.create(admin, tag_to_create_no_id) + queried_tag = tag_svc.get_tag_by_id(4) + + assert created_tag.content == tag_to_create_no_id.content + assert len(tag_svc.all()) == len(tags) + 1 + assert queried_tag.content == created_tag.content + + +def test_resource_tag_creation(tag_svc: TagService, resource_svc: ResourceService): + """Test creation and attachment of resource tag""" + + resource = resource_svc.get_resource_by_user(admin)[0] + tag_svc.add_tag_resource(admin, tags[0], resource) + updated_resource = resource_svc.get_by_id(admin, resource.id) + + assert len(resource.tags) == 0 + assert len(updated_resource.tags) == 1 + assert resource.id == updated_resource.id diff --git a/backend/test/services/tag_test_data.py b/backend/test/services/tag_test_data.py index cb16e5c..046bc1e 100644 --- a/backend/test/services/tag_test_data.py +++ b/backend/test/services/tag_test_data.py @@ -11,7 +11,9 @@ tag2 = Tag(id=2, content="Tag 2", created_at=datetime.now()) tag3 = Tag(id=3, content="Tag 3", created_at=datetime.now()) -tagToCreate = Tag(id=4, content="Tag 4", created_at=datetime.now()) +tag_to_create = Tag(id=4, content="Tag 4", created_at=datetime.now()) + +tag_to_create_no_id = Tag(content="Tag 5", created_at=datetime.now()) tags = [tag1, tag2, tag3]