From 1c549cac8ac6d9db241babf6e9d9ea0026807de0 Mon Sep 17 00:00:00 2001 From: CaptainOfHacks Date: Tue, 15 Mar 2022 11:02:04 +0200 Subject: [PATCH] Create notice selector by status --- ted_sws/data_manager/adapters/notice_repository.py | 13 +++++++++++-- ted_sws/domain/adapters/repository_abc.py | 10 +++++++++- tests/fakes/fake_repository.py | 10 +++++++++- tests/unit/data_manager/test_notice_repository.py | 14 +++++++++++++- 4 files changed, 42 insertions(+), 5 deletions(-) diff --git a/ted_sws/data_manager/adapters/notice_repository.py b/ted_sws/data_manager/adapters/notice_repository.py index 3afde610b..2e548ec89 100644 --- a/ted_sws/data_manager/adapters/notice_repository.py +++ b/ted_sws/data_manager/adapters/notice_repository.py @@ -1,7 +1,7 @@ from typing import Iterator from pymongo import MongoClient from ted_sws.domain.adapters.repository_abc import NoticeRepositoryABC -from ted_sws.domain.model.notice import Notice +from ted_sws.domain.model.notice import Notice, NoticeStatus class NoticeRepository(NoticeRepositoryABC): @@ -35,7 +35,7 @@ def update(self, notice: Notice): """ notice_dict = notice.dict() notice_dict["_id"] = notice_dict["ted_id"] - self.collection.update_one({'_id':notice_dict["_id"]}, {"$set": notice_dict}) + self.collection.update_one({'_id': notice_dict["_id"]}, {"$set": notice_dict}) def get(self, reference) -> Notice: """ @@ -46,6 +46,15 @@ def get(self, reference) -> Notice: result_dict = self.collection.find_one({"ted_id": reference}) return Notice(**result_dict) if result_dict else None + def get_notice_by_status(self, notice_status: NoticeStatus) -> Iterator[Notice]: + """ + This method provides all notices based on its status. + :param notice_status: + :return: + """ + for result_dict in self.collection.find({"status": notice_status}): + yield Notice(**result_dict) + def list(self) -> Iterator[Notice]: """ This method allows all records to be retrieved from the repository. diff --git a/ted_sws/domain/adapters/repository_abc.py b/ted_sws/domain/adapters/repository_abc.py index 163052666..3a5d3a973 100644 --- a/ted_sws/domain/adapters/repository_abc.py +++ b/ted_sws/domain/adapters/repository_abc.py @@ -1,7 +1,7 @@ import abc from typing import Iterator -from ted_sws.domain.model.notice import Notice +from ted_sws.domain.model.notice import Notice, NoticeStatus class RepositoryABC(abc.ABC): @@ -39,6 +39,14 @@ def get(self, reference) -> Notice: :return: Notice """ + @abc.abstractmethod + def get_notice_by_status(self, notice_status: NoticeStatus) -> Iterator[Notice]: + """ + This method provides all notices based on its status. + :param notice_status: + :return: + """ + @abc.abstractmethod def list(self) -> Iterator[Notice]: """ diff --git a/tests/fakes/fake_repository.py b/tests/fakes/fake_repository.py index 347562d8d..f84a4d0d0 100644 --- a/tests/fakes/fake_repository.py +++ b/tests/fakes/fake_repository.py @@ -1,7 +1,7 @@ from typing import Iterator from ted_sws.domain.adapters.repository_abc import NoticeRepositoryABC -from ted_sws.domain.model.notice import Notice +from ted_sws.domain.model.notice import Notice, NoticeStatus class FakeNoticeRepository(NoticeRepositoryABC): @@ -42,6 +42,14 @@ def get(self, reference) -> Notice: return None + def get_notice_by_status(self, notice_status: NoticeStatus) -> Iterator[Notice]: + """ + This method provides all notices based on its status. + :param notice_status: + :return: + """ + return [value for value in self.repository.values() if value.status == notice_status] + def list(self) -> Iterator[Notice]: """ This method allows all records to be retrieved from the repository. diff --git a/tests/unit/data_manager/test_notice_repository.py b/tests/unit/data_manager/test_notice_repository.py index 86cb1d28e..c6dc32c12 100644 --- a/tests/unit/data_manager/test_notice_repository.py +++ b/tests/unit/data_manager/test_notice_repository.py @@ -3,7 +3,7 @@ from ted_sws.data_manager.adapters.notice_repository import NoticeRepository from ted_sws.domain.model.manifestation import XMLManifestation from ted_sws.domain.model.metadata import TEDMetadata -from ted_sws.domain.model.notice import Notice +from ted_sws.domain.model.notice import Notice, NoticeStatus NOTICE_TED_ID = "123456" TEST_DB_NAME = 'test_db' @@ -31,3 +31,15 @@ def test_notice_repository_create(mongodb_client): assert result_notice.ted_id == NOTICE_TED_ID assert result_notice.original_metadata.AA == "Updated metadata" mongodb_client.drop_database(TEST_DB_NAME) + + +def test_notice_repository_get_notice_by_status(mongodb_client): + mongodb_client.drop_database(TEST_DB_NAME) + notice_repository = NoticeRepository(mongodb_client=mongodb_client, database_name=TEST_DB_NAME) + notice = Notice(ted_id=NOTICE_TED_ID, original_metadata=TEDMetadata(**{"AA": "Metadata"}), + xml_manifestation=XMLManifestation(object_data="HELLO")) + notice_repository.add(notice) + result_notices = notice_repository.get_notice_by_status(notice_status=NoticeStatus.RAW) + for result_notice in result_notices: + assert result_notice.status == NoticeStatus.RAW +