diff --git a/meldingen_core/actions/attachment.py b/meldingen_core/actions/attachment.py index 550cd1e..ecf2919 100644 --- a/meldingen_core/actions/attachment.py +++ b/meldingen_core/actions/attachment.py @@ -1,4 +1,4 @@ -from collections.abc import Collection +from collections.abc import Sequence from enum import StrEnum from typing import AsyncIterator, Generic, TypeVar @@ -14,16 +14,14 @@ from meldingen_core.validators import BaseMediaTypeIntegrityValidator, BaseMediaTypeValidator A = TypeVar("A", bound=Attachment) -A_co = TypeVar("A_co", bound=Attachment, covariant=True) M = TypeVar("M", bound=Melding) -M_co = TypeVar("M_co", bound=Melding, covariant=True) -class UploadAttachmentAction(Generic[A, A_co, M, M_co]): +class UploadAttachmentAction(Generic[A, M]): _create_attachment: BaseAttachmentFactory[A, M] - _attachment_repository: BaseAttachmentRepository[A, A_co] + _attachment_repository: BaseAttachmentRepository[A] _filesystem: Filesystem - _verify_token: TokenVerifier[M, M_co] + _verify_token: TokenVerifier[M] _base_directory: str _validate_media_type: BaseMediaTypeValidator _validate_media_type_integrity: BaseMediaTypeIntegrityValidator @@ -32,8 +30,8 @@ class UploadAttachmentAction(Generic[A, A_co, M, M_co]): def __init__( self, attachment_factory: BaseAttachmentFactory[A, M], - attachment_repository: BaseAttachmentRepository[A, A_co], - token_verifier: TokenVerifier[M, M_co], + attachment_repository: BaseAttachmentRepository[A], + token_verifier: TokenVerifier[M], media_type_validator: BaseMediaTypeValidator, media_type_integrity_validator: BaseMediaTypeIntegrityValidator, ingestor: BaseIngestor[A], @@ -74,15 +72,15 @@ class AttachmentTypes(StrEnum): THUMBNAIL = "thumbnail" -class DownloadAttachmentAction(Generic[A, A_co, M, M_co]): - _verify_token: TokenVerifier[M, M_co] - _attachment_repository: BaseAttachmentRepository[A, A_co] +class DownloadAttachmentAction(Generic[A, M]): + _verify_token: TokenVerifier[M] + _attachment_repository: BaseAttachmentRepository[A] _filesystem: Filesystem def __init__( self, - token_verifier: TokenVerifier[M, M_co], - attachment_repository: BaseAttachmentRepository[A, A_co], + token_verifier: TokenVerifier[M], + attachment_repository: BaseAttachmentRepository[A], filesystem: Filesystem, ): self._verify_token = token_verifier @@ -118,31 +116,29 @@ async def __call__( raise NotFoundException("File not found") from exception -class ListAttachmentsAction(Generic[A, A_co, M, M_co]): - _verify_token: TokenVerifier[M, M_co] - _attachment_repository: BaseAttachmentRepository[A, A_co] +class ListAttachmentsAction(Generic[A, M]): + _verify_token: TokenVerifier[M] + _attachment_repository: BaseAttachmentRepository[A] - def __init__( - self, token_verifier: TokenVerifier[M, M_co], attachment_repository: BaseAttachmentRepository[A, A_co] - ): + def __init__(self, token_verifier: TokenVerifier[M], attachment_repository: BaseAttachmentRepository[A]): self._verify_token = token_verifier self._attachment_repository = attachment_repository - async def __call__(self, melding_id: int, token: str) -> Collection[A_co]: + async def __call__(self, melding_id: int, token: str) -> Sequence[A]: await self._verify_token(melding_id, token) return await self._attachment_repository.find_by_melding(melding_id) -class DeleteAttachmentAction(Generic[A, A_co, M, M_co]): - _verify_token: TokenVerifier[M, M_co] - _attachment_repository: BaseAttachmentRepository[A, A_co] +class DeleteAttachmentAction(Generic[A, M]): + _verify_token: TokenVerifier[M] + _attachment_repository: BaseAttachmentRepository[A] _filesystem: Filesystem def __init__( self, - token_verifier: TokenVerifier[M, M_co], - attachment_repository: BaseAttachmentRepository[A, A_co], + token_verifier: TokenVerifier[M], + attachment_repository: BaseAttachmentRepository[A], filesystem: Filesystem, ): self._verify_token = token_verifier diff --git a/meldingen_core/actions/base.py b/meldingen_core/actions/base.py index 2cd74d1..51bca31 100644 --- a/meldingen_core/actions/base.py +++ b/meldingen_core/actions/base.py @@ -1,4 +1,4 @@ -from collections.abc import Collection +from collections.abc import Sequence from typing import Any, Generic, TypeVar from meldingen_core import SortingDirection @@ -6,27 +6,26 @@ from meldingen_core.repositories import BaseRepository T = TypeVar("T") -T_co = TypeVar("T_co", covariant=True) -class BaseCRUDAction(Generic[T, T_co]): - _repository: BaseRepository[T, T_co] +class BaseCRUDAction(Generic[T]): + _repository: BaseRepository[T] - def __init__(self, repository: BaseRepository[T, T_co]) -> None: + def __init__(self, repository: BaseRepository[T]) -> None: self._repository = repository -class BaseCreateAction(BaseCRUDAction[T, T_co]): +class BaseCreateAction(BaseCRUDAction[T]): async def __call__(self, obj: T) -> None: await self._repository.save(obj) -class BaseRetrieveAction(BaseCRUDAction[T, T_co]): +class BaseRetrieveAction(BaseCRUDAction[T]): async def __call__(self, pk: int) -> T | None: return await self._repository.retrieve(pk=pk) -class BaseListAction(BaseCRUDAction[T, T_co]): +class BaseListAction(BaseCRUDAction[T]): async def __call__( self, *, @@ -34,13 +33,13 @@ async def __call__( offset: int | None = None, sort_attribute_name: str | None = None, sort_direction: SortingDirection | None = None, - ) -> Collection[T_co]: + ) -> Sequence[T]: return await self._repository.list( limit=limit, offset=offset, sort_attribute_name=sort_attribute_name, sort_direction=sort_direction ) -class BaseUpdateAction(BaseCRUDAction[T, T_co]): +class BaseUpdateAction(BaseCRUDAction[T]): async def __call__(self, pk: int, values: dict[str, Any]) -> T: obj = await self._repository.retrieve(pk=pk) if obj is None: @@ -54,6 +53,6 @@ async def __call__(self, pk: int, values: dict[str, Any]) -> T: return obj -class BaseDeleteAction(BaseCRUDAction[T, T_co]): +class BaseDeleteAction(BaseCRUDAction[T]): async def __call__(self, pk: int) -> None: await self._repository.delete(pk=pk) diff --git a/meldingen_core/actions/classification.py b/meldingen_core/actions/classification.py index 4567af4..a012bfc 100644 --- a/meldingen_core/actions/classification.py +++ b/meldingen_core/actions/classification.py @@ -10,19 +10,18 @@ from meldingen_core.models import Classification T = TypeVar("T", bound=Classification) -T_co = TypeVar("T_co", covariant=True, bound=Classification) -class ClassificationCreateAction(BaseCreateAction[T, T_co]): ... +class ClassificationCreateAction(BaseCreateAction[T]): ... -class ClassificationListAction(BaseListAction[T, T_co]): ... +class ClassificationListAction(BaseListAction[T]): ... -class ClassificationRetrieveAction(BaseRetrieveAction[T, T_co]): ... +class ClassificationRetrieveAction(BaseRetrieveAction[T]): ... -class ClassificationUpdateAction(BaseUpdateAction[T, T_co]): ... +class ClassificationUpdateAction(BaseUpdateAction[T]): ... -class ClassificationDeleteAction(BaseDeleteAction[T, T_co]): ... +class ClassificationDeleteAction(BaseDeleteAction[T]): ... diff --git a/meldingen_core/actions/melding.py b/meldingen_core/actions/melding.py index 435637e..26d2296 100644 --- a/meldingen_core/actions/melding.py +++ b/meldingen_core/actions/melding.py @@ -14,10 +14,9 @@ log = logging.getLogger(__name__) T = TypeVar("T", bound=Melding) -T_co = TypeVar("T_co", covariant=True, bound=Melding) -class MeldingCreateAction(BaseCreateAction[T, T_co]): +class MeldingCreateAction(BaseCreateAction[T]): """Action that stores a melding.""" _classify: Classifier @@ -27,7 +26,7 @@ class MeldingCreateAction(BaseCreateAction[T, T_co]): def __init__( self, - repository: BaseRepository[T, T_co], + repository: BaseRepository[T], classifier: Classifier, state_machine: BaseMeldingStateMachine[T], token_generator: BaseTokenGenerator, @@ -56,25 +55,25 @@ async def __call__(self, obj: T) -> None: await self._repository.save(obj) -class MeldingListAction(BaseListAction[T, T_co]): +class MeldingListAction(BaseListAction[T]): """Action that retrieves a list of meldingen.""" -class MeldingRetrieveAction(BaseRetrieveAction[T, T_co]): +class MeldingRetrieveAction(BaseRetrieveAction[T]): """Action that retrieves a melding.""" -class MeldingUpdateAction(BaseCRUDAction[T, T_co]): +class MeldingUpdateAction(BaseCRUDAction[T]): """Action that updates the melding and reclassifies it""" - _verify_token: TokenVerifier[T, T_co] + _verify_token: TokenVerifier[T] _classify: Classifier _state_machine: BaseMeldingStateMachine[T] def __init__( self, - repository: BaseRepository[T, T_co], - token_verifier: TokenVerifier[T, T_co], + repository: BaseRepository[T], + token_verifier: TokenVerifier[T], classifier: Classifier, state_machine: BaseMeldingStateMachine[T], ) -> None: @@ -98,15 +97,15 @@ async def __call__(self, pk: int, values: dict[str, Any], token: str) -> T: return melding -class MeldingAddContactInfoAction(BaseCRUDAction[T, T_co]): +class MeldingAddContactInfoAction(BaseCRUDAction[T]): """Action that adds contact information to a melding.""" - _verify_token: TokenVerifier[T, T_co] + _verify_token: TokenVerifier[T] def __init__( self, - repository: BaseMeldingRepository[T, T_co], - token_verifier: TokenVerifier[T, T_co], + repository: BaseMeldingRepository[T], + token_verifier: TokenVerifier[T], ) -> None: super().__init__(repository) self._verify_token = token_verifier @@ -122,19 +121,19 @@ async def __call__(self, pk: int, phone: str | None, email: str | None, token: s return melding -class BaseStateTransitionAction(Generic[T, T_co], metaclass=ABCMeta): +class BaseStateTransitionAction(Generic[T], metaclass=ABCMeta): """ This action covers transitions that do not require the melding's token to be verified. Typically these actions are performed by authenticated users. """ _state_machine: BaseMeldingStateMachine[T] - _repository: BaseMeldingRepository[T, T_co] + _repository: BaseMeldingRepository[T] def __init__( self, state_machine: BaseMeldingStateMachine[T], - repository: BaseMeldingRepository[T, T_co], + repository: BaseMeldingRepository[T], ): self._state_machine = state_machine self._repository = repository @@ -154,21 +153,21 @@ async def __call__(self, melding_id: int) -> T: return melding -class BaseMeldingFormStateTransitionAction(Generic[T, T_co], metaclass=ABCMeta): +class BaseMeldingFormStateTransitionAction(Generic[T], metaclass=ABCMeta): """ This action covers transitions that require the melding's token to be verified. This is the case for unauthenticated state transitions where a user submits a melding. """ _state_machine: BaseMeldingStateMachine[T] - _repository: BaseMeldingRepository[T, T_co] - _verify_token: TokenVerifier[T, T_co] + _repository: BaseMeldingRepository[T] + _verify_token: TokenVerifier[T] def __init__( self, state_machine: BaseMeldingStateMachine[T], - repository: BaseMeldingRepository[T, T_co], - token_verifier: TokenVerifier[T, T_co], + repository: BaseMeldingRepository[T], + token_verifier: TokenVerifier[T], ): self._state_machine = state_machine self._repository = repository @@ -187,37 +186,37 @@ async def __call__(self, melding_id: int, token: str) -> T: return melding -class MeldingAnswerQuestionsAction(BaseMeldingFormStateTransitionAction[T, T_co]): +class MeldingAnswerQuestionsAction(BaseMeldingFormStateTransitionAction[T]): @property def transition_name(self) -> str: return MeldingTransitions.ANSWER_QUESTIONS -class MeldingAddAttachmentsAction(BaseMeldingFormStateTransitionAction[T, T_co]): +class MeldingAddAttachmentsAction(BaseMeldingFormStateTransitionAction[T]): @property def transition_name(self) -> str: return MeldingTransitions.ADD_ATTACHMENTS -class MeldingSubmitLocationAction(BaseMeldingFormStateTransitionAction[T, T_co]): +class MeldingSubmitLocationAction(BaseMeldingFormStateTransitionAction[T]): @property def transition_name(self) -> str: return MeldingTransitions.SUBMIT_LOCATION -class MeldingContactInfoAddedAction(BaseMeldingFormStateTransitionAction[T, T_co]): +class MeldingContactInfoAddedAction(BaseMeldingFormStateTransitionAction[T]): @property def transition_name(self) -> str: return MeldingTransitions.ADD_CONTACT_INFO -class MeldingProcessAction(BaseStateTransitionAction[T, T_co]): +class MeldingProcessAction(BaseStateTransitionAction[T]): @property def transition_name(self) -> str: return MeldingTransitions.PROCESS -class MeldingCompleteAction(BaseStateTransitionAction[T, T_co]): +class MeldingCompleteAction(BaseStateTransitionAction[T]): @property def transition_name(self) -> str: return MeldingTransitions.COMPLETE diff --git a/meldingen_core/actions/user.py b/meldingen_core/actions/user.py index 72fc5fa..2f75494 100644 --- a/meldingen_core/actions/user.py +++ b/meldingen_core/actions/user.py @@ -10,24 +10,23 @@ from meldingen_core.models import User T = TypeVar("T", bound=User) -T_co = TypeVar("T_co", covariant=True, bound=User) -class UserCreateAction(BaseCreateAction[T, T_co]): +class UserCreateAction(BaseCreateAction[T]): """Action that add a user.""" -class UserUpdateAction(BaseUpdateAction[T, T_co]): +class UserUpdateAction(BaseUpdateAction[T]): """Action that updates a user.""" -class UserListAction(BaseListAction[T, T_co]): +class UserListAction(BaseListAction[T]): """Action that retrieves a list of users.""" -class UserRetrieveAction(BaseRetrieveAction[T, T_co]): +class UserRetrieveAction(BaseRetrieveAction[T]): """Action that retrieves a user.""" -class UserDeleteAction(BaseDeleteAction[T, T_co]): +class UserDeleteAction(BaseDeleteAction[T]): """Action that deletes a user.""" diff --git a/meldingen_core/repositories.py b/meldingen_core/repositories.py index 14264c8..d9f41e5 100644 --- a/meldingen_core/repositories.py +++ b/meldingen_core/repositories.py @@ -1,15 +1,14 @@ from abc import ABCMeta, abstractmethod -from collections.abc import Collection +from collections.abc import Sequence from typing import Generic, TypeVar from meldingen_core import SortingDirection from meldingen_core.models import Answer, Attachment, Classification, Form, Melding, Question, User T = TypeVar("T") -T_co = TypeVar("T_co", covariant=True) -class BaseRepository(Generic[T, T_co], metaclass=ABCMeta): +class BaseRepository(Generic[T], metaclass=ABCMeta): @abstractmethod async def save(self, obj: T) -> None: ... @@ -21,7 +20,7 @@ async def list( offset: int | None = None, sort_attribute_name: str | None = None, sort_direction: SortingDirection | None = None, - ) -> Collection[T_co]: ... + ) -> Sequence[T]: ... @abstractmethod async def retrieve(self, pk: int) -> T | None: ... @@ -31,18 +30,17 @@ async def delete(self, pk: int) -> None: ... M = TypeVar("M", bound=Melding) -M_co = TypeVar("M_co", covariant=True, bound=Melding) -class BaseMeldingRepository(BaseRepository[M, M_co], metaclass=ABCMeta): +class BaseMeldingRepository(BaseRepository[M], metaclass=ABCMeta): """Repository for Melding.""" -class BaseUserRepository(BaseRepository[User, User], metaclass=ABCMeta): +class BaseUserRepository(BaseRepository[User], metaclass=ABCMeta): """Repository for User.""" -class BaseClassificationRepository(BaseRepository[Classification, Classification], metaclass=ABCMeta): +class BaseClassificationRepository(BaseRepository[Classification], metaclass=ABCMeta): """Repository for Classification.""" @abstractmethod @@ -50,19 +48,18 @@ async def find_by_name(self, name: str) -> Classification: """Find a classification by name or raise NotFoundException if not found.""" -class BaseFormRepository(BaseRepository[Form, Form], metaclass=ABCMeta): ... +class BaseFormRepository(BaseRepository[Form], metaclass=ABCMeta): ... -class BaseQuestionRepository(BaseRepository[Question, Question], metaclass=ABCMeta): ... +class BaseQuestionRepository(BaseRepository[Question], metaclass=ABCMeta): ... -class BaseAnswerRepository(BaseRepository[Answer, Answer], metaclass=ABCMeta): ... +class BaseAnswerRepository(BaseRepository[Answer], metaclass=ABCMeta): ... A = TypeVar("A", bound=Attachment) -A_co = TypeVar("A_co", covariant=True, bound=Attachment) -class BaseAttachmentRepository(BaseRepository[A, A_co], metaclass=ABCMeta): +class BaseAttachmentRepository(BaseRepository[A], metaclass=ABCMeta): @abstractmethod - async def find_by_melding(self, melding_id: int) -> Collection[A_co]: ... + async def find_by_melding(self, melding_id: int) -> Sequence[A]: ... diff --git a/meldingen_core/token.py b/meldingen_core/token.py index 325f5da..6045df7 100644 --- a/meldingen_core/token.py +++ b/meldingen_core/token.py @@ -7,7 +7,6 @@ from meldingen_core.repositories import BaseMeldingRepository T = TypeVar("T", bound=Melding) -T_co = TypeVar("T_co", bound=Melding, covariant=True) class BaseTokenGenerator(metaclass=ABCMeta): @@ -25,10 +24,10 @@ class InvalidTokenException(TokenException): ... class TokenExpiredException(TokenException): ... -class TokenVerifier(Generic[T, T_co]): - _repository: BaseMeldingRepository[T, T_co] +class TokenVerifier(Generic[T]): + _repository: BaseMeldingRepository[T] - def __init__(self, repository: BaseMeldingRepository[T, T_co]): + def __init__(self, repository: BaseMeldingRepository[T]): self._repository = repository async def __call__(self, melding_id: int, token: str) -> T: diff --git a/tests/test_actions/test_attachment.py b/tests/test_actions/test_attachment.py index 3687b5b..df04866 100644 --- a/tests/test_actions/test_attachment.py +++ b/tests/test_actions/test_attachment.py @@ -33,9 +33,9 @@ async def test_can_handle_attachment(self) -> None: token_verifier = AsyncMock(TokenVerifier) token_verifier.return_value = melding - attachment_repository = Mock(BaseAttachmentRepository[Attachment, Attachment]) + attachment_repository = Mock(BaseAttachmentRepository[Attachment]) - action: UploadAttachmentAction[Attachment, Attachment, Melding, Melding] = UploadAttachmentAction( + action: UploadAttachmentAction[Attachment, Melding] = UploadAttachmentAction( Mock(BaseAttachmentFactory), attachment_repository, token_verifier, @@ -57,7 +57,7 @@ async def test_attachment_not_found(self) -> None: attachment_repository = Mock(BaseAttachmentRepository) attachment_repository.retrieve.return_value = None - action: DownloadAttachmentAction[Attachment, Attachment, Melding, Melding] = DownloadAttachmentAction( + action: DownloadAttachmentAction[Attachment, Melding] = DownloadAttachmentAction( AsyncMock(TokenVerifier), attachment_repository, Mock(Filesystem), @@ -75,7 +75,7 @@ async def test_attachment_does_not_belong_to_melding(self) -> None: attachment_repository = Mock(BaseAttachmentRepository) attachment_repository.retrieve.return_value = attachment - action: DownloadAttachmentAction[Attachment, Attachment, Melding, Melding] = DownloadAttachmentAction( + action: DownloadAttachmentAction[Attachment, Melding] = DownloadAttachmentAction( AsyncMock(TokenVerifier), attachment_repository, Mock(Filesystem), @@ -101,7 +101,7 @@ async def test_can_handle_attachment_download(self, _type: AttachmentTypes) -> N attachment_repository = Mock(BaseAttachmentRepository) attachment_repository.retrieve.return_value = attachment - action: DownloadAttachmentAction[Attachment, Attachment, Melding, Melding] = DownloadAttachmentAction( + action: DownloadAttachmentAction[Attachment, Melding] = DownloadAttachmentAction( token_verifier, attachment_repository, Mock(Filesystem), @@ -121,7 +121,7 @@ async def test_optimized_path_none(self) -> None: attachment_repository = Mock(BaseAttachmentRepository) attachment_repository.retrieve.return_value = attachment - action: DownloadAttachmentAction[Attachment, Attachment, Melding, Melding] = DownloadAttachmentAction( + action: DownloadAttachmentAction[Attachment, Melding] = DownloadAttachmentAction( token_verifier, attachment_repository, Mock(Filesystem), @@ -144,7 +144,7 @@ async def test_thumbnail_path_none(self) -> None: attachment_repository = Mock(BaseAttachmentRepository) attachment_repository.retrieve.return_value = attachment - action: DownloadAttachmentAction[Attachment, Attachment, Melding, Melding] = DownloadAttachmentAction( + action: DownloadAttachmentAction[Attachment, Melding] = DownloadAttachmentAction( token_verifier, attachment_repository, Mock(Filesystem), @@ -173,7 +173,7 @@ async def test_file_not_found(self) -> None: filesystem_mock = Mock(Filesystem) filesystem_mock.get_file.return_value = file - action: DownloadAttachmentAction[Attachment, Attachment, Melding, Melding] = DownloadAttachmentAction( + action: DownloadAttachmentAction[Attachment, Melding] = DownloadAttachmentAction( token_verifier, attachment_repository, filesystem_mock, @@ -195,9 +195,7 @@ async def test_can_list_attachments(self) -> None: repository = Mock(BaseAttachmentRepository) repository.find_by_melding.return_value = repo_attachments - action: ListAttachmentsAction[Attachment, Attachment, Melding, Melding] = ListAttachmentsAction( - token_verifier, repository - ) + action: ListAttachmentsAction[Attachment, Melding] = ListAttachmentsAction(token_verifier, repository) attachments = await action(melding_id, token) assert repo_attachments == attachments @@ -211,7 +209,7 @@ async def test_attachment_not_found(self) -> None: attachment_repository = Mock(BaseAttachmentRepository) attachment_repository.retrieve.return_value = None - action: DeleteAttachmentAction[Attachment, Attachment, Melding, Melding] = DeleteAttachmentAction( + action: DeleteAttachmentAction[Attachment, Melding] = DeleteAttachmentAction( AsyncMock(TokenVerifier), attachment_repository, Mock(Filesystem), @@ -229,7 +227,7 @@ async def test_attachment_does_not_belong_to_melding(self) -> None: attachment_repository = Mock(BaseAttachmentRepository) attachment_repository.retrieve.return_value = attachment - action: DeleteAttachmentAction[Attachment, Attachment, Melding, Melding] = DeleteAttachmentAction( + action: DeleteAttachmentAction[Attachment, Melding] = DeleteAttachmentAction( AsyncMock(TokenVerifier), attachment_repository, Mock(Filesystem), @@ -255,7 +253,7 @@ async def test_file_not_found(self) -> None: filesystem_mock = Mock(Filesystem) filesystem_mock.delete.side_effect = filesystem.NotFoundException - action: DeleteAttachmentAction[Attachment, Attachment, Melding, Melding] = DeleteAttachmentAction( + action: DeleteAttachmentAction[Attachment, Melding] = DeleteAttachmentAction( token_verifier, attachment_repository, filesystem_mock, @@ -280,7 +278,7 @@ async def test_delete_attachment(self) -> None: filesystem_mock = Mock(Filesystem) - action: DeleteAttachmentAction[Attachment, Attachment, Melding, Melding] = DeleteAttachmentAction( + action: DeleteAttachmentAction[Attachment, Melding] = DeleteAttachmentAction( token_verifier, attachment_repository, filesystem_mock, diff --git a/tests/test_actions/test_base_actions.py b/tests/test_actions/test_base_actions.py index d586b24..f0b6bbe 100644 --- a/tests/test_actions/test_base_actions.py +++ b/tests/test_actions/test_base_actions.py @@ -20,13 +20,13 @@ class DummyModel: @pytest.fixture -def base_list_action() -> BaseListAction[DummyModel, DummyModel]: +def base_list_action() -> BaseListAction[DummyModel]: return BaseListAction(Mock(BaseRepository)) @pytest.mark.anyio async def test_base_create_action(mocker: MockerFixture) -> None: - action: BaseCreateAction[DummyModel, DummyModel] = BaseCreateAction(Mock(BaseRepository)) + action: BaseCreateAction[DummyModel] = BaseCreateAction(Mock(BaseRepository)) spy = mocker.spy(action._repository, "save") @@ -39,7 +39,7 @@ async def test_base_create_action(mocker: MockerFixture) -> None: @pytest.mark.anyio async def test_base_list_action( - base_list_action: BaseListAction[DummyModel, DummyModel], + base_list_action: BaseListAction[DummyModel], mocker: MockerFixture, ) -> None: spy = mocker.spy(base_list_action._repository, "list") @@ -55,7 +55,7 @@ async def test_base_list_action( ) @pytest.mark.anyio async def test_base_list_action_limit( - base_list_action: BaseListAction[DummyModel, DummyModel], limit: int, mocker: MockerFixture + base_list_action: BaseListAction[DummyModel], limit: int, mocker: MockerFixture ) -> None: spy = mocker.spy(base_list_action._repository, "list") @@ -67,7 +67,7 @@ async def test_base_list_action_limit( @pytest.mark.parametrize("offset", [1, 5, 10, 20]) @pytest.mark.anyio async def test_base_list_action_offset( - base_list_action: BaseListAction[DummyModel, DummyModel], + base_list_action: BaseListAction[DummyModel], offset: int, mocker: MockerFixture, ) -> None: @@ -80,7 +80,7 @@ async def test_base_list_action_offset( @pytest.mark.anyio async def test_base_list_action_sort_attribute_name( - base_list_action: BaseListAction[DummyModel, DummyModel], + base_list_action: BaseListAction[DummyModel], mocker: MockerFixture, ) -> None: spy = mocker.spy(base_list_action._repository, "list") @@ -93,7 +93,7 @@ async def test_base_list_action_sort_attribute_name( @pytest.mark.parametrize("direction", [SortingDirection.ASC, SortingDirection.DESC]) @pytest.mark.anyio async def test_base_list_action_sort_direction( - base_list_action: BaseListAction[DummyModel, DummyModel], + base_list_action: BaseListAction[DummyModel], direction: SortingDirection, mocker: MockerFixture, ) -> None: @@ -110,7 +110,7 @@ async def test_base_list_action_sort_direction( ) @pytest.mark.anyio async def test_base_list_action_limit_offset( - base_list_action: BaseListAction[DummyModel, DummyModel], + base_list_action: BaseListAction[DummyModel], limit: int, offset: int, mocker: MockerFixture, @@ -128,7 +128,7 @@ async def test_base_list_action_limit_offset( ) @pytest.mark.anyio async def test_base_list_action_limit_offset_sort_attribute_name( - base_list_action: BaseListAction[DummyModel, DummyModel], + base_list_action: BaseListAction[DummyModel], limit: int, offset: int, name: str, @@ -152,7 +152,7 @@ async def test_base_list_action_limit_offset_sort_attribute_name( ) @pytest.mark.anyio async def test_base_list_action_limit_offset_sort_attribute_name_sort_direction( - base_list_action: BaseListAction[DummyModel, DummyModel], + base_list_action: BaseListAction[DummyModel], limit: int, offset: int, name: str, @@ -169,7 +169,7 @@ async def test_base_list_action_limit_offset_sort_attribute_name_sort_direction( @pytest.mark.parametrize("pk", [1, 2, 3, 4, 5]) @pytest.mark.anyio async def test_base_retrieve_action(pk: int, mocker: MockerFixture) -> None: - action: BaseRetrieveAction[DummyModel, DummyModel] = BaseRetrieveAction(Mock(BaseRepository)) + action: BaseRetrieveAction[DummyModel] = BaseRetrieveAction(Mock(BaseRepository)) spy = mocker.spy(action._repository, "retrieve") @@ -181,7 +181,7 @@ async def test_base_retrieve_action(pk: int, mocker: MockerFixture) -> None: @pytest.mark.parametrize("pk", [1, 2, 3, 4, 5]) @pytest.mark.anyio async def test_base_delete_action(pk: int, mocker: MockerFixture) -> None: - action: BaseDeleteAction[DummyModel, DummyModel] = BaseDeleteAction(Mock(BaseRepository)) + action: BaseDeleteAction[DummyModel] = BaseDeleteAction(Mock(BaseRepository)) spy = mocker.spy(action._repository, "delete") @@ -192,7 +192,7 @@ async def test_base_delete_action(pk: int, mocker: MockerFixture) -> None: @pytest.mark.anyio async def test_base_update_action(mocker: MockerFixture) -> None: - action: BaseUpdateAction[DummyModel, DummyModel] = BaseUpdateAction(Mock(BaseRepository)) + action: BaseUpdateAction[DummyModel] = BaseUpdateAction(Mock(BaseRepository)) spy = mocker.spy(action._repository, "save") @@ -208,7 +208,7 @@ async def test_base_update_action(mocker: MockerFixture) -> None: @pytest.mark.anyio async def test_base_delete_action_not_found(mocker: MockerFixture) -> None: - action: BaseUpdateAction[DummyModel, DummyModel] = BaseUpdateAction(Mock(BaseRepository)) + action: BaseUpdateAction[DummyModel] = BaseUpdateAction(Mock(BaseRepository)) mocker.patch.object(action._repository, "retrieve", return_value=None) with pytest.raises(NotFoundException) as exc_info: diff --git a/tests/test_actions/test_classification_actions.py b/tests/test_actions/test_classification_actions.py index 7e442ce..4841a74 100644 --- a/tests/test_actions/test_classification_actions.py +++ b/tests/test_actions/test_classification_actions.py @@ -12,35 +12,27 @@ def test_can_instantiate_create_action() -> None: - action: ClassificationCreateAction[Classification, Classification] = ClassificationCreateAction( - Mock(BaseClassificationRepository) - ) + action: ClassificationCreateAction[Classification] = ClassificationCreateAction(Mock(BaseClassificationRepository)) assert isinstance(action, ClassificationCreateAction) def test_can_instantiate_retrieve_action() -> None: - action: ClassificationRetrieveAction[Classification, Classification] = ClassificationRetrieveAction( + action: ClassificationRetrieveAction[Classification] = ClassificationRetrieveAction( Mock(BaseClassificationRepository) ) assert isinstance(action, ClassificationRetrieveAction) def test_can_instantiate_list_action() -> None: - action: ClassificationListAction[Classification, Classification] = ClassificationListAction( - Mock(BaseClassificationRepository) - ) + action: ClassificationListAction[Classification] = ClassificationListAction(Mock(BaseClassificationRepository)) assert isinstance(action, ClassificationListAction) def test_can_instantiate_update_action() -> None: - action: ClassificationUpdateAction[Classification, Classification] = ClassificationUpdateAction( - Mock(BaseClassificationRepository) - ) + action: ClassificationUpdateAction[Classification] = ClassificationUpdateAction(Mock(BaseClassificationRepository)) assert isinstance(action, ClassificationUpdateAction) def test_can_instantiate_delete_action() -> None: - action: ClassificationDeleteAction[Classification, Classification] = ClassificationDeleteAction( - Mock(BaseClassificationRepository) - ) + action: ClassificationDeleteAction[Classification] = ClassificationDeleteAction(Mock(BaseClassificationRepository)) assert isinstance(action, ClassificationDeleteAction) diff --git a/tests/test_actions/test_melding_actions.py b/tests/test_actions/test_melding_actions.py index 3813a35..d73b880 100644 --- a/tests/test_actions/test_melding_actions.py +++ b/tests/test_actions/test_melding_actions.py @@ -32,7 +32,7 @@ async def test_melding_create_action() -> None: classifier = AsyncMock(Classifier, return_value=classification) state_machine = Mock(BaseMeldingStateMachine) repository = Mock(BaseMeldingRepository) - action: MeldingCreateAction[Melding, Melding] = MeldingCreateAction( + action: MeldingCreateAction[Melding] = MeldingCreateAction( repository, classifier, state_machine, AsyncMock(BaseTokenGenerator), timedelta(days=3) ) melding = Melding("text") @@ -50,7 +50,7 @@ async def test_melding_create_action_with_classification_not_found(caplog: LogCa classifier = AsyncMock(Classifier, side_effect=ClassificationNotFoundException) state_machine = Mock(BaseMeldingStateMachine) repository = Mock(BaseMeldingRepository) - action: MeldingCreateAction[Melding, Melding] = MeldingCreateAction( + action: MeldingCreateAction[Melding] = MeldingCreateAction( repository, classifier, state_machine, AsyncMock(BaseTokenGenerator), timedelta(days=3) ) melding = Melding("text") @@ -66,12 +66,12 @@ async def test_melding_create_action_with_classification_not_found(caplog: LogCa def test_can_instantiate_melding_list_action() -> None: - action: MeldingListAction[Melding, Melding] = MeldingListAction(Mock(BaseMeldingRepository)) + action: MeldingListAction[Melding] = MeldingListAction(Mock(BaseMeldingRepository)) assert isinstance(action, MeldingListAction) def test_can_instantiate_melding_retrieve_action() -> None: - action: MeldingRetrieveAction[Melding, Melding] = MeldingRetrieveAction(Mock(BaseMeldingRepository)) + action: MeldingRetrieveAction[Melding] = MeldingRetrieveAction(Mock(BaseMeldingRepository)) assert isinstance(action, MeldingRetrieveAction) @@ -83,7 +83,7 @@ async def test_melding_update_action() -> None: token_verifier = AsyncMock(TokenVerifier) classification = Classification(name="test") classifier = AsyncMock(Classifier, return_value=classification) - action: MeldingUpdateAction[Melding, Melding] = MeldingUpdateAction( + action: MeldingUpdateAction[Melding] = MeldingUpdateAction( repository, token_verifier, classifier, Mock(BaseMeldingStateMachine) ) @@ -101,7 +101,7 @@ async def test_melding_add_contact_action() -> None: repository.retrieve.return_value = Melding("text", token=token, token_expires=datetime.now() + timedelta(days=1)) token_verifier = AsyncMock(TokenVerifier) - action: MeldingAddContactInfoAction[Melding, Melding] = MeldingAddContactInfoAction(repository, token_verifier) + action: MeldingAddContactInfoAction[Melding] = MeldingAddContactInfoAction(repository, token_verifier) phone = "1234567" email = "user@test.com" @@ -115,9 +115,9 @@ async def test_melding_add_contact_action() -> None: async def test_melding_add_contact_action_not_found() -> None: repository = Mock(BaseMeldingRepository) repository.retrieve.return_value = None - token_verifier: TokenVerifier[Melding, Melding] = TokenVerifier(repository) + token_verifier: TokenVerifier[Melding] = TokenVerifier(repository) - action: MeldingAddContactInfoAction[Melding, Melding] = MeldingAddContactInfoAction(repository, token_verifier) + action: MeldingAddContactInfoAction[Melding] = MeldingAddContactInfoAction(repository, token_verifier) with pytest.raises(NotFoundException): await action(123, "1234567", "user@test.com", "token") @@ -132,7 +132,7 @@ async def test_melding_answer_questions_action() -> None: token_verifier = AsyncMock(TokenVerifier) token_verifier.return_value = repo_melding - answer_questions: MeldingAnswerQuestionsAction[Melding, Melding] = MeldingAnswerQuestionsAction( + answer_questions: MeldingAnswerQuestionsAction[Melding] = MeldingAnswerQuestionsAction( state_machine, repository, token_verifier ) @@ -150,7 +150,7 @@ async def test_process_action() -> None: repo_melding = Melding("melding text") repository = Mock(BaseMeldingRepository) repository.retrieve.return_value = repo_melding - process: MeldingProcessAction[Melding, Melding] = MeldingProcessAction(state_machine, repository) + process: MeldingProcessAction[Melding] = MeldingProcessAction(state_machine, repository) melding = await process(1) @@ -164,7 +164,7 @@ async def test_process_action_not_found() -> None: repository = Mock(BaseMeldingRepository) repository.retrieve.return_value = None - process: MeldingProcessAction[Melding, Melding] = MeldingProcessAction(Mock(BaseMeldingStateMachine), repository) + process: MeldingProcessAction[Melding] = MeldingProcessAction(Mock(BaseMeldingStateMachine), repository) with pytest.raises(NotFoundException): await process(1) @@ -179,7 +179,7 @@ async def test_add_attachments_action() -> None: token_verifier = AsyncMock(TokenVerifier) token_verifier.return_value = repo_melding - add_attachments: MeldingAddAttachmentsAction[Melding, Melding] = MeldingAddAttachmentsAction( + add_attachments: MeldingAddAttachmentsAction[Melding] = MeldingAddAttachmentsAction( state_machine, repository, token_verifier ) @@ -194,9 +194,9 @@ async def test_add_attachments_action() -> None: async def test_add_attachments_action_not_found() -> None: repository = Mock(BaseMeldingRepository) repository.retrieve.return_value = None - token_verifier: TokenVerifier[Melding, Melding] = TokenVerifier(repository) + token_verifier: TokenVerifier[Melding] = TokenVerifier(repository) - process: MeldingAddAttachmentsAction[Melding, Melding] = MeldingAddAttachmentsAction( + process: MeldingAddAttachmentsAction[Melding] = MeldingAddAttachmentsAction( Mock(BaseMeldingStateMachine), Mock(BaseMeldingRepository), token_verifier ) @@ -210,7 +210,7 @@ async def test_complete_action() -> None: repo_melding = Melding("melding text") repository = Mock(BaseMeldingRepository) repository.retrieve.return_value = repo_melding - process: MeldingCompleteAction[Melding, Melding] = MeldingCompleteAction(state_machine, repository) + process: MeldingCompleteAction[Melding] = MeldingCompleteAction(state_machine, repository) melding = await process(1) @@ -224,7 +224,7 @@ async def test_complete_action_not_found() -> None: repository = Mock(BaseMeldingRepository) repository.retrieve.return_value = None - process: MeldingCompleteAction[Melding, Melding] = MeldingCompleteAction(Mock(BaseMeldingStateMachine), repository) + process: MeldingCompleteAction[Melding] = MeldingCompleteAction(Mock(BaseMeldingStateMachine), repository) with pytest.raises(NotFoundException): await process(1) @@ -239,7 +239,7 @@ async def test_submit_location_action() -> None: token_verifier = AsyncMock(TokenVerifier) token_verifier.return_value = repo_melding - submit_location: MeldingSubmitLocationAction[Melding, Melding] = MeldingSubmitLocationAction( + submit_location: MeldingSubmitLocationAction[Melding] = MeldingSubmitLocationAction( state_machine, repository, token_verifier ) @@ -254,9 +254,9 @@ async def test_submit_location_action() -> None: async def test_submit_location_action_not_found() -> None: repository = Mock(BaseMeldingRepository) repository.retrieve.return_value = None - token_verifier: TokenVerifier[Melding, Melding] = TokenVerifier(repository) + token_verifier: TokenVerifier[Melding] = TokenVerifier(repository) - process: MeldingSubmitLocationAction[Melding, Melding] = MeldingSubmitLocationAction( + process: MeldingSubmitLocationAction[Melding] = MeldingSubmitLocationAction( Mock(BaseMeldingStateMachine), Mock(BaseMeldingRepository), token_verifier ) @@ -273,7 +273,7 @@ async def test_contact_info_added_action() -> None: token_verifier = AsyncMock(TokenVerifier) token_verifier.return_value = repo_melding - add_contact_info: MeldingContactInfoAddedAction[Melding, Melding] = MeldingContactInfoAddedAction( + add_contact_info: MeldingContactInfoAddedAction[Melding] = MeldingContactInfoAddedAction( state_machine, repository, token_verifier ) @@ -289,9 +289,9 @@ async def test_contact_info_added_action_not_found() -> None: repository = Mock(BaseMeldingRepository) repository.retrieve.return_value = None state_machine = Mock(BaseMeldingStateMachine) - token_verifier: TokenVerifier[Melding, Melding] = TokenVerifier(repository) + token_verifier: TokenVerifier[Melding] = TokenVerifier(repository) - add_contact_info: MeldingContactInfoAddedAction[Melding, Melding] = MeldingContactInfoAddedAction( + add_contact_info: MeldingContactInfoAddedAction[Melding] = MeldingContactInfoAddedAction( state_machine, repository, token_verifier ) diff --git a/tests/test_actions/test_user_actions.py b/tests/test_actions/test_user_actions.py index d3a0897..18c7ddf 100644 --- a/tests/test_actions/test_user_actions.py +++ b/tests/test_actions/test_user_actions.py @@ -12,25 +12,25 @@ def test_can_instantiate_user_create_action() -> None: - action: UserCreateAction[User, User] = UserCreateAction(Mock(BaseUserRepository)) + action: UserCreateAction[User] = UserCreateAction(Mock(BaseUserRepository)) assert isinstance(action, UserCreateAction) def test_can_instantiate_user_list_action() -> None: - action: UserListAction[User, User] = UserListAction(Mock(BaseUserRepository)) + action: UserListAction[User] = UserListAction(Mock(BaseUserRepository)) assert isinstance(action, UserListAction) def test_can_instantiate_user_retrieve_action() -> None: - action: UserRetrieveAction[User, User] = UserRetrieveAction(Mock(BaseUserRepository)) + action: UserRetrieveAction[User] = UserRetrieveAction(Mock(BaseUserRepository)) assert isinstance(action, UserRetrieveAction) def test_can_instantiate_user_update_action() -> None: - action: UserUpdateAction[User, User] = UserUpdateAction(Mock(BaseUserRepository)) + action: UserUpdateAction[User] = UserUpdateAction(Mock(BaseUserRepository)) assert isinstance(action, UserUpdateAction) def test_can_instantiate_user_delete_action() -> None: - action: UserDeleteAction[User, User] = UserDeleteAction(Mock(BaseUserRepository)) + action: UserDeleteAction[User] = UserDeleteAction(Mock(BaseUserRepository)) assert isinstance(action, UserDeleteAction) diff --git a/tests/test_token.py b/tests/test_token.py index d3bc00c..e914d86 100644 --- a/tests/test_token.py +++ b/tests/test_token.py @@ -14,7 +14,7 @@ async def test_melding_not_found() -> None: repository = Mock(BaseMeldingRepository) repository.retrieve.return_value = None - verify_token: TokenVerifier[Melding, Melding] = TokenVerifier(repository) + verify_token: TokenVerifier[Melding] = TokenVerifier(repository) with pytest.raises(NotFoundException): await verify_token(123, "") @@ -26,7 +26,7 @@ async def test_token_invalid() -> None: repository = Mock(BaseMeldingRepository) repository.retrieve.return_value = melding - verify_token: TokenVerifier[Melding, Melding] = TokenVerifier(repository) + verify_token: TokenVerifier[Melding] = TokenVerifier(repository) with pytest.raises(InvalidTokenException): await verify_token(123, "12345") @@ -39,7 +39,7 @@ async def test_token_expired() -> None: repository = Mock(BaseMeldingRepository) repository.retrieve.return_value = melding - verify_token: TokenVerifier[Melding, Melding] = TokenVerifier(repository) + verify_token: TokenVerifier[Melding] = TokenVerifier(repository) with pytest.raises(TokenExpiredException): await verify_token(123, token) @@ -53,7 +53,7 @@ async def test_token_valid() -> None: repository = Mock(BaseMeldingRepository) repository.retrieve.return_value = repo_melding - verify_token: TokenVerifier[Melding, Melding] = TokenVerifier(repository) + verify_token: TokenVerifier[Melding] = TokenVerifier(repository) melding = await verify_token(123, token) assert melding == repo_melding