From 820ca53a9674ffaac1a3b39d87232d0f6a68c338 Mon Sep 17 00:00:00 2001 From: Lukasz Lancucki Date: Tue, 7 Apr 2026 11:53:42 +0100 Subject: [PATCH 1/2] fix(helpdesk): remove chat answer parameters added due to an error in the documentation --- .../helpdesk/chat_answer_parameters.py | 31 --------- .../resources/helpdesk/chat_answers.py | 24 ------- .../chats/answers/parameters/__init__.py | 0 .../chats/answers/parameters/conftest.py | 16 ----- .../parameters/test_async_parameters.py | 33 --------- .../parameters/test_sync_parameters.py | 35 ---------- .../helpdesk/test_chat_answer_parameters.py | 68 ------------------- .../resources/helpdesk/test_chat_answers.py | 20 ------ 8 files changed, 227 deletions(-) delete mode 100644 mpt_api_client/resources/helpdesk/chat_answer_parameters.py delete mode 100644 tests/e2e/helpdesk/chats/answers/parameters/__init__.py delete mode 100644 tests/e2e/helpdesk/chats/answers/parameters/conftest.py delete mode 100644 tests/e2e/helpdesk/chats/answers/parameters/test_async_parameters.py delete mode 100644 tests/e2e/helpdesk/chats/answers/parameters/test_sync_parameters.py delete mode 100644 tests/unit/resources/helpdesk/test_chat_answer_parameters.py diff --git a/mpt_api_client/resources/helpdesk/chat_answer_parameters.py b/mpt_api_client/resources/helpdesk/chat_answer_parameters.py deleted file mode 100644 index 5d62fdcd..00000000 --- a/mpt_api_client/resources/helpdesk/chat_answer_parameters.py +++ /dev/null @@ -1,31 +0,0 @@ -from mpt_api_client.http import AsyncService, Service -from mpt_api_client.http.mixins import AsyncCollectionMixin, CollectionMixin -from mpt_api_client.models import Model - - -class ChatAnswerParameter(Model): - """Helpdesk chat answer parameter resource.""" - - -class ChatAnswerParametersServiceConfig: - """Helpdesk chat answer parameters service configuration.""" - - _endpoint = "/public/v1/helpdesk/chats/{chat_id}/answers/{answer_id}/parameters" - _model_class = ChatAnswerParameter - _collection_key = "data" - - -class ChatAnswerParametersService( - CollectionMixin[ChatAnswerParameter], - Service[ChatAnswerParameter], - ChatAnswerParametersServiceConfig, -): - """Helpdesk chat answer parameters service.""" - - -class AsyncChatAnswerParametersService( - AsyncCollectionMixin[ChatAnswerParameter], - AsyncService[ChatAnswerParameter], - ChatAnswerParametersServiceConfig, -): - """Async helpdesk chat answer parameters service.""" diff --git a/mpt_api_client/resources/helpdesk/chat_answers.py b/mpt_api_client/resources/helpdesk/chat_answers.py index eb187a6d..fb14cf76 100644 --- a/mpt_api_client/resources/helpdesk/chat_answers.py +++ b/mpt_api_client/resources/helpdesk/chat_answers.py @@ -1,9 +1,5 @@ from mpt_api_client.http import AsyncService, Service, mixins from mpt_api_client.models import Model, ResourceData -from mpt_api_client.resources.helpdesk.chat_answer_parameters import ( - AsyncChatAnswerParametersService, - ChatAnswerParametersService, -) class ChatAnswer(Model): @@ -45,16 +41,6 @@ def validate(self, resource_id: str, resource_data: ResourceData | None = None) """Validate answer.""" return self._resource(resource_id).post("validate", json=resource_data) - def parameters(self, answer_id: str) -> ChatAnswerParametersService: # noqa: WPS110 - """Return chat answer parameters service.""" - return ChatAnswerParametersService( - http_client=self.http_client, - endpoint_params={ - "chat_id": self.endpoint_params["chat_id"], - "answer_id": answer_id, - }, - ) - class AsyncChatAnswersService( mixins.AsyncCreateMixin[ChatAnswer], @@ -98,13 +84,3 @@ async def validate( ) -> ChatAnswer: """Validate answer.""" return await self._resource(resource_id).post("validate", json=resource_data) - - def parameters(self, answer_id: str) -> AsyncChatAnswerParametersService: # noqa: WPS110 - """Return async chat answer parameters service.""" - return AsyncChatAnswerParametersService( - http_client=self.http_client, - endpoint_params={ - "chat_id": self.endpoint_params["chat_id"], - "answer_id": answer_id, - }, - ) diff --git a/tests/e2e/helpdesk/chats/answers/parameters/__init__.py b/tests/e2e/helpdesk/chats/answers/parameters/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/tests/e2e/helpdesk/chats/answers/parameters/conftest.py b/tests/e2e/helpdesk/chats/answers/parameters/conftest.py deleted file mode 100644 index 8205bd8a..00000000 --- a/tests/e2e/helpdesk/chats/answers/parameters/conftest.py +++ /dev/null @@ -1,16 +0,0 @@ -import pytest - - -@pytest.fixture -def chat_answer_parameters_service(mpt_ops, chat_id, created_chat_answer): - return mpt_ops.helpdesk.chats.answers(chat_id).parameters(created_chat_answer.id) - - -@pytest.fixture -def async_chat_answer_parameters_service(async_mpt_ops, chat_id, async_created_chat_answer): - return async_mpt_ops.helpdesk.chats.answers(chat_id).parameters(async_created_chat_answer.id) - - -@pytest.fixture(scope="session") -def invalid_chat_answer_parameter_id(): - return "PAR-0000-0000" diff --git a/tests/e2e/helpdesk/chats/answers/parameters/test_async_parameters.py b/tests/e2e/helpdesk/chats/answers/parameters/test_async_parameters.py deleted file mode 100644 index 984e05be..00000000 --- a/tests/e2e/helpdesk/chats/answers/parameters/test_async_parameters.py +++ /dev/null @@ -1,33 +0,0 @@ -from http import HTTPStatus - -import pytest - -from mpt_api_client.exceptions import MPTAPIError -from mpt_api_client.resources.helpdesk.chat_answer_parameters import ChatAnswerParameter - -pytestmark = [ - pytest.mark.flaky, - pytest.mark.skip(reason="Unskip after MPT-19124 completed"), -] - - -async def test_list_chat_answer_parameters(async_chat_answer_parameters_service): - result = await async_chat_answer_parameters_service.fetch_page(limit=20) - - assert len(result) > 0 - assert all(isinstance(parameter, ChatAnswerParameter) for parameter in result) - - -async def test_iterate_chat_answer_parameters(async_chat_answer_parameters_service): - iterator = async_chat_answer_parameters_service.iterate(limit=20) - result = await anext(iterator, None) - - assert isinstance(result, ChatAnswerParameter) - - -async def test_not_found(async_mpt_ops, chat_id): - service = async_mpt_ops.helpdesk.chats.answers(chat_id).parameters("ANS-0000-0000") - - with pytest.raises(MPTAPIError) as error: - await service.fetch_page(limit=20) - assert error.value.status_code == HTTPStatus.NOT_FOUND diff --git a/tests/e2e/helpdesk/chats/answers/parameters/test_sync_parameters.py b/tests/e2e/helpdesk/chats/answers/parameters/test_sync_parameters.py deleted file mode 100644 index 2e26b0ee..00000000 --- a/tests/e2e/helpdesk/chats/answers/parameters/test_sync_parameters.py +++ /dev/null @@ -1,35 +0,0 @@ -from http import HTTPStatus - -import pytest - -from mpt_api_client.exceptions import MPTAPIError -from mpt_api_client.resources.helpdesk.chat_answer_parameters import ChatAnswerParameter - -pytestmark = [ - pytest.mark.flaky, - pytest.mark.skip(reason="Unskip after MPT-19124 completed"), -] - - -def test_list_chat_answer_parameters(chat_answer_parameters_service): - result = chat_answer_parameters_service.fetch_page(limit=20) - - assert len(result) > 0 - assert all(isinstance(parameter, ChatAnswerParameter) for parameter in result) - - -def test_iterate_chat_answer_parameters(chat_answer_parameters_service): - iterator = chat_answer_parameters_service.iterate(limit=20) - - result = next(iterator, None) - - assert isinstance(result, ChatAnswerParameter) - - -def test_not_found(mpt_ops, chat_id): - service = mpt_ops.helpdesk.chats.answers(chat_id).parameters("ANS-0000-0000") - - with pytest.raises(MPTAPIError) as error: - service.fetch_page(limit=20) - - assert error.value.status_code == HTTPStatus.NOT_FOUND diff --git a/tests/unit/resources/helpdesk/test_chat_answer_parameters.py b/tests/unit/resources/helpdesk/test_chat_answer_parameters.py deleted file mode 100644 index fc047d89..00000000 --- a/tests/unit/resources/helpdesk/test_chat_answer_parameters.py +++ /dev/null @@ -1,68 +0,0 @@ -import pytest - -from mpt_api_client.resources.helpdesk.chat_answer_parameters import ( - AsyncChatAnswerParametersService, - ChatAnswerParametersService, -) - - -@pytest.fixture -def chat_answer_parameters_service(http_client) -> ChatAnswerParametersService: - return ChatAnswerParametersService( - http_client=http_client, - endpoint_params={"chat_id": "CHT-0000-0000-0001", "answer_id": "ANS-0000-0000"}, - ) - - -@pytest.fixture -def async_chat_answer_parameters_service(async_http_client) -> AsyncChatAnswerParametersService: - return AsyncChatAnswerParametersService( - http_client=async_http_client, - endpoint_params={"chat_id": "CHT-0000-0000-0001", "answer_id": "ANS-0000-0000"}, - ) - - -def test_endpoint(chat_answer_parameters_service) -> None: - result = ( - chat_answer_parameters_service.path - == "/public/v1/helpdesk/chats/CHT-0000-0000-0001/answers/ANS-0000-0000/parameters" - ) - - assert result is True - - -def test_async_endpoint(async_chat_answer_parameters_service) -> None: - result = ( - async_chat_answer_parameters_service.path - == "/public/v1/helpdesk/chats/CHT-0000-0000-0001/answers/ANS-0000-0000/parameters" - ) - - assert result is True - - -@pytest.mark.parametrize("method", ["fetch_page", "iterate"]) -def test_methods_present(chat_answer_parameters_service, method: str) -> None: - result = hasattr(chat_answer_parameters_service, method) - - assert result is True - - -@pytest.mark.parametrize("method", ["get", "create", "update", "delete"]) -def test_methods_absent(chat_answer_parameters_service, method: str) -> None: - result = hasattr(chat_answer_parameters_service, method) - - assert result is False - - -@pytest.mark.parametrize("method", ["fetch_page", "iterate"]) -def test_async_methods_present(async_chat_answer_parameters_service, method: str) -> None: - result = hasattr(async_chat_answer_parameters_service, method) - - assert result is True - - -@pytest.mark.parametrize("method", ["get", "create", "update", "delete"]) -def test_async_methods_absent(async_chat_answer_parameters_service, method: str) -> None: - result = hasattr(async_chat_answer_parameters_service, method) - - assert result is False diff --git a/tests/unit/resources/helpdesk/test_chat_answers.py b/tests/unit/resources/helpdesk/test_chat_answers.py index b1fbd90f..f9e6bfc0 100644 --- a/tests/unit/resources/helpdesk/test_chat_answers.py +++ b/tests/unit/resources/helpdesk/test_chat_answers.py @@ -2,10 +2,6 @@ import pytest import respx -from mpt_api_client.resources.helpdesk.chat_answer_parameters import ( - AsyncChatAnswerParametersService, - ChatAnswerParametersService, -) from mpt_api_client.resources.helpdesk.chat_answers import ( AsyncChatAnswersService, ChatAnswer, @@ -55,7 +51,6 @@ def test_async_endpoint(async_chat_answers_service) -> None: "accept", "query", "validate", - "parameters", ], ) def test_methods_present(chat_answers_service, method: str) -> None: @@ -77,7 +72,6 @@ def test_methods_present(chat_answers_service, method: str) -> None: "accept", "query", "validate", - "parameters", ], ) def test_async_methods_present(async_chat_answers_service, method: str) -> None: @@ -86,20 +80,6 @@ def test_async_methods_present(async_chat_answers_service, method: str) -> None: assert result is True -def test_parameters_service(chat_answers_service) -> None: - result = chat_answers_service.parameters("ANS-1234-5678") - - assert isinstance(result, ChatAnswerParametersService) - assert result.endpoint_params == {"chat_id": "CHT-0000-0000-0001", "answer_id": "ANS-1234-5678"} - - -def test_async_parameters_service(async_chat_answers_service) -> None: - result = async_chat_answers_service.parameters("ANS-1234-5678") - - assert isinstance(result, AsyncChatAnswerParametersService) - assert result.endpoint_params == {"chat_id": "CHT-0000-0000-0001", "answer_id": "ANS-1234-5678"} - - @pytest.mark.parametrize("action", ["submit", "accept", "query", "validate"]) def test_custom_resource_actions(chat_answers_service, action): response_expected_data = {"id": "ANS-1234-5678", "status": "Updated"} From 0158a11cb1c27a02b6e620b19e4a0164209d6d2e Mon Sep 17 00:00:00 2001 From: Lukasz Lancucki Date: Tue, 7 Apr 2026 10:22:51 +0100 Subject: [PATCH 2/2] test(e2e): refactor fixtures and remove skip markers in chat answers --- tests/e2e/helpdesk/chats/answers/conftest.py | 33 +++++++++++--- .../chats/answers/test_async_answers.py | 10 ++--- .../chats/answers/test_sync_answers.py | 10 ++--- tests/e2e/helpdesk/conftest.py | 37 +++++++++++++++ tests/e2e/helpdesk/forms/conftest.py | 45 ------------------- 5 files changed, 71 insertions(+), 64 deletions(-) delete mode 100644 tests/e2e/helpdesk/forms/conftest.py diff --git a/tests/e2e/helpdesk/chats/answers/conftest.py b/tests/e2e/helpdesk/chats/answers/conftest.py index f8c10d90..72f41547 100644 --- a/tests/e2e/helpdesk/chats/answers/conftest.py +++ b/tests/e2e/helpdesk/chats/answers/conftest.py @@ -7,19 +7,28 @@ @pytest.fixture -def chat_answers_service(mpt_ops, chat_id): - return mpt_ops.helpdesk.chats.answers(chat_id) +def chat_answers_service(mpt_ops, created_chat): + return mpt_ops.helpdesk.chats.answers(created_chat.id) @pytest.fixture -def async_chat_answers_service(async_mpt_ops, chat_id): - return async_mpt_ops.helpdesk.chats.answers(chat_id) +def async_chat_answers_service(async_mpt_ops, created_chat): + return async_mpt_ops.helpdesk.chats.answers(created_chat.id) @pytest.fixture -def chat_answer_data(short_uuid): +def chat_answer_data(short_uuid, created_published_form): return { "name": f"e2e answer {short_uuid}", + "form": created_published_form.to_dict(), + } + + +@pytest.fixture +def async_chat_answer_data(short_uuid, async_created_published_form): + return { + "name": f"e2e answer {short_uuid}", + "form": async_created_published_form.to_dict(), } @@ -30,13 +39,23 @@ def created_chat_answer(chat_answers_service, chat_answer_data): @pytest.fixture -async def async_created_chat_answer(async_chat_answers_service, chat_answer_data): +def submitted_chat_answer(chat_answers_service, created_chat_answer): + return chat_answers_service.submit(created_chat_answer.id) + + +@pytest.fixture +async def async_created_chat_answer(async_chat_answers_service, async_chat_answer_data): async with async_create_fixture_resource_and_delete( - async_chat_answers_service, chat_answer_data + async_chat_answers_service, async_chat_answer_data ) as chat_answer: yield chat_answer +@pytest.fixture +async def async_submitted_chat_answer(async_chat_answers_service, async_created_chat_answer): + return await async_chat_answers_service.submit(async_created_chat_answer.id) + + @pytest.fixture(scope="session") def invalid_chat_answer_id(): return "ANS-0000-0000" diff --git a/tests/e2e/helpdesk/chats/answers/test_async_answers.py b/tests/e2e/helpdesk/chats/answers/test_async_answers.py index 0b623352..4badb24a 100644 --- a/tests/e2e/helpdesk/chats/answers/test_async_answers.py +++ b/tests/e2e/helpdesk/chats/answers/test_async_answers.py @@ -5,10 +5,7 @@ from mpt_api_client.exceptions import MPTAPIError from mpt_api_client.resources.helpdesk.chat_answers import ChatAnswer -pytestmark = [ - pytest.mark.flaky, - pytest.mark.skip(reason="Unskip after MPT-19124 completed"), -] +pytestmark = [pytest.mark.flaky] async def test_get_chat_answer(async_chat_answers_service, async_created_chat_answer): @@ -17,6 +14,7 @@ async def test_get_chat_answer(async_chat_answers_service, async_created_chat_an assert isinstance(result, ChatAnswer) +@pytest.mark.usefixtures("async_created_chat_answer") async def test_list_chat_answers(async_chat_answers_service): result = await async_chat_answers_service.fetch_page(limit=1) @@ -64,8 +62,8 @@ async def test_validate_chat_answer(async_chat_answers_service, async_created_ch assert isinstance(result, ChatAnswer) -async def test_accept_chat_answer(async_chat_answers_service, async_created_chat_answer): - result = await async_chat_answers_service.accept(async_created_chat_answer.id) +async def test_accept_chat_answer(async_chat_answers_service, async_submitted_chat_answer): + result = await async_chat_answers_service.accept(async_submitted_chat_answer.id) assert isinstance(result, ChatAnswer) diff --git a/tests/e2e/helpdesk/chats/answers/test_sync_answers.py b/tests/e2e/helpdesk/chats/answers/test_sync_answers.py index ae74c7a5..4a27dee1 100644 --- a/tests/e2e/helpdesk/chats/answers/test_sync_answers.py +++ b/tests/e2e/helpdesk/chats/answers/test_sync_answers.py @@ -5,10 +5,7 @@ from mpt_api_client.exceptions import MPTAPIError from mpt_api_client.resources.helpdesk.chat_answers import ChatAnswer -pytestmark = [ - pytest.mark.flaky, - pytest.mark.skip(reason="Unskip after MPT-19124 completed"), -] +pytestmark = [pytest.mark.flaky] def test_get_chat_answer(chat_answers_service, created_chat_answer): @@ -17,6 +14,7 @@ def test_get_chat_answer(chat_answers_service, created_chat_answer): assert result.id == created_chat_answer.id +@pytest.mark.usefixtures("created_chat_answer") def test_list_chat_answers(chat_answers_service): result = chat_answers_service.fetch_page(limit=1) @@ -59,8 +57,8 @@ def test_validate_chat_answer(chat_answers_service, created_chat_answer): assert isinstance(result, ChatAnswer) -def test_accept_chat_answer(chat_answers_service, created_chat_answer): - result = chat_answers_service.accept(created_chat_answer.id) +def test_accept_chat_answer(chat_answers_service, submitted_chat_answer): + result = chat_answers_service.accept(submitted_chat_answer.id) assert isinstance(result, ChatAnswer) diff --git a/tests/e2e/helpdesk/conftest.py b/tests/e2e/helpdesk/conftest.py index 24dc952d..53ea5ca3 100644 --- a/tests/e2e/helpdesk/conftest.py +++ b/tests/e2e/helpdesk/conftest.py @@ -98,3 +98,40 @@ async def async_queried_case(async_mpt_ops, async_created_case): @pytest.fixture async def async_processed_case(async_mpt_ops, async_queried_case): return await async_mpt_ops.helpdesk.cases.process(async_queried_case.id) + + +@pytest.fixture +def form_data(short_uuid): + return { + "name": f"E2E Helpdesk Form {short_uuid}", + "description": "E2E Created Helpdesk Form", + } + + +@pytest.fixture(scope="session") +def invalid_form_id(): + return "FRM-0000-0000" + + +@pytest.fixture +def created_form(mpt_ops, form_data): + with create_fixture_resource_and_delete(mpt_ops.helpdesk.forms, form_data) as form: + yield form + + +@pytest.fixture +def created_published_form(mpt_ops, created_form): + return mpt_ops.helpdesk.forms.publish(created_form.id) + + +@pytest.fixture +async def async_created_form(async_mpt_ops, form_data): + async with async_create_fixture_resource_and_delete( + async_mpt_ops.helpdesk.forms, form_data + ) as form: + yield form + + +@pytest.fixture +async def async_created_published_form(async_mpt_ops, async_created_form): + return await async_mpt_ops.helpdesk.forms.publish(async_created_form.id) diff --git a/tests/e2e/helpdesk/forms/conftest.py b/tests/e2e/helpdesk/forms/conftest.py deleted file mode 100644 index 0e019cd3..00000000 --- a/tests/e2e/helpdesk/forms/conftest.py +++ /dev/null @@ -1,45 +0,0 @@ -import pytest - -from tests.e2e.helper import ( - async_create_fixture_resource_and_delete, - create_fixture_resource_and_delete, -) - - -@pytest.fixture -def form_data(short_uuid): - return { - "name": f"E2E Helpdesk Form {short_uuid}", - "description": "E2E Created Helpdesk Form", - } - - -@pytest.fixture(scope="session") -def invalid_form_id(): - return "FRM-0000-0000" - - -@pytest.fixture -def created_form(mpt_ops, form_data): - with create_fixture_resource_and_delete(mpt_ops.helpdesk.forms, form_data) as form: - yield form - - -@pytest.fixture -def created_published_form(mpt_ops, created_form): - mpt_ops.helpdesk.forms.publish(created_form.id) - return created_form - - -@pytest.fixture -async def async_created_form(async_mpt_ops, form_data): - async with async_create_fixture_resource_and_delete( - async_mpt_ops.helpdesk.forms, form_data - ) as form: - yield form - - -@pytest.fixture -async def async_created_published_form(async_mpt_ops, async_created_form): - await async_mpt_ops.helpdesk.forms.publish(async_created_form.id) - return async_created_form