Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions mpt_api_client/resources/helpdesk/cases.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
from mpt_api_client.http import AsyncService, Service
from mpt_api_client.http.mixins import (
AsyncCollectionMixin,
AsyncCreateMixin,
AsyncGetMixin,
AsyncUpdateMixin,
CollectionMixin,
CreateMixin,
GetMixin,
UpdateMixin,
)
from mpt_api_client.models import Model, ResourceData


class Case(Model):
"""Helpdesk Case resource."""


class CasesServiceConfig:
"""Helpdesk Cases service configuration."""

_endpoint = "/public/v1/helpdesk/cases"
_model_class = Case
_collection_key = "data"


class CasesService(
CreateMixin[Case],
UpdateMixin[Case],
GetMixin[Case],
CollectionMixin[Case],
Service[Case],
CasesServiceConfig,
):
"""Helpdesk Cases service."""

def query(self, resource_id: str, resource_data: ResourceData | None = None) -> Case:
"""Switch case to query state."""
return self._resource_action(resource_id, "POST", "query", json=resource_data)

def process(self, resource_id: str, resource_data: ResourceData | None = None) -> Case:
"""Switch case to process state."""
return self._resource_action(resource_id, "POST", "process", json=resource_data)

def complete(self, resource_id: str, resource_data: ResourceData | None = None) -> Case:
"""Switch case to complete state."""
return self._resource_action(resource_id, "POST", "complete", json=resource_data)


class AsyncCasesService(
AsyncCreateMixin[Case],
AsyncUpdateMixin[Case],
AsyncGetMixin[Case],
AsyncCollectionMixin[Case],
AsyncService[Case],
CasesServiceConfig,
):
"""Async Helpdesk Cases service."""

async def query(self, resource_id: str, resource_data: ResourceData | None = None) -> Case:
"""Switch case to query state."""
return await self._resource_action(resource_id, "POST", "query", json=resource_data)

async def process(self, resource_id: str, resource_data: ResourceData | None = None) -> Case:
"""Switch case to process state."""
return await self._resource_action(resource_id, "POST", "process", json=resource_data)

async def complete(self, resource_id: str, resource_data: ResourceData | None = None) -> Case:
"""Switch case to complete state."""
return await self._resource_action(resource_id, "POST", "complete", json=resource_data)
11 changes: 11 additions & 0 deletions mpt_api_client/resources/helpdesk/helpdesk.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from mpt_api_client.http import AsyncHTTPClient, HTTPClient
from mpt_api_client.resources.helpdesk.cases import AsyncCasesService, CasesService
from mpt_api_client.resources.helpdesk.chats import AsyncChatsService, ChatsService


Expand All @@ -13,6 +14,11 @@ def chats(self) -> ChatsService:
"""Chats service."""
return ChatsService(http_client=self.http_client)

@property
def cases(self) -> CasesService:
"""Cases service."""
return CasesService(http_client=self.http_client)


class AsyncHelpdesk:
"""Async Helpdesk MPT API Module."""
Expand All @@ -24,3 +30,8 @@ def __init__(self, http_client: AsyncHTTPClient):
def chats(self) -> AsyncChatsService:
"""Async Chats service."""
return AsyncChatsService(http_client=self.http_client)

@property
def cases(self) -> AsyncCasesService:
"""Async Cases service."""
return AsyncCasesService(http_client=self.http_client)
1 change: 1 addition & 0 deletions tests/e2e/helpdesk/cases/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

32 changes: 32 additions & 0 deletions tests/e2e/helpdesk/cases/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import pytest


@pytest.fixture
def invalid_case_id():
return "CAS-0000-0000"


@pytest.fixture
def case_factory(short_uuid):
def factory(
title: str = "E2E Created Helpdesk Case",
description: str = "E2E Created Helpdesk Case Description",
):
return {
"title": f"{title} {short_uuid}",
"description": description,
"priority": "Low",
"type": "General",
}

return factory


@pytest.fixture
def created_case(mpt_ops, case_factory):
return mpt_ops.helpdesk.cases.create(case_factory())


@pytest.fixture
async def async_created_case(async_mpt_ops, case_factory):
return await async_mpt_ops.helpdesk.cases.create(case_factory())
71 changes: 71 additions & 0 deletions tests/e2e/helpdesk/cases/test_async_cases.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import pytest

from mpt_api_client.exceptions import MPTAPIError

pytestmark = [pytest.mark.flaky]


@pytest.mark.skip(reason="Unskip after MPT-19124 completed")
async def test_get_case(async_mpt_ops, async_created_case):
result = await async_mpt_ops.helpdesk.cases.get(async_created_case.id)

assert result.id == async_created_case.id


@pytest.mark.skip(reason="Unskip after MPT-19124 completed")
async def test_list_cases(async_mpt_ops):
limit = 1

result = await async_mpt_ops.helpdesk.cases.fetch_page(limit=limit)

assert len(result) > 0


@pytest.mark.skip(reason="Unskip after MPT-19124 completed")
def test_create_case(async_created_case):
result = async_created_case

assert result is not None


@pytest.mark.skip(reason="Unskip after MPT-19124 completed")
async def test_update_case(async_mpt_ops, async_created_case, short_uuid):
update_data = {"description": f"e2e update {short_uuid}"}

result = await async_mpt_ops.helpdesk.cases.update(async_created_case.id, update_data)

assert result.id == async_created_case.id
assert result.to_dict().get("description") == update_data["description"]


@pytest.mark.skip(reason="Unskip after MPT-19124 completed")
async def test_process_case(async_mpt_ops, async_created_case):
result = await async_mpt_ops.helpdesk.cases.process(async_created_case.id)

assert result is not None


@pytest.mark.skip(reason="Unskip after MPT-19124 completed")
async def test_query_case(async_mpt_ops, async_created_case):
processed_case = await async_mpt_ops.helpdesk.cases.process(async_created_case.id)

result = await async_mpt_ops.helpdesk.cases.query(
processed_case.id, {"queryPrompt": "Could you provide more details?"}
)

assert result is not None


@pytest.mark.skip(reason="Unskip after MPT-19124 completed")
async def test_complete_case(async_mpt_ops, async_created_case):
processed_case = await async_mpt_ops.helpdesk.cases.process(async_created_case.id)

result = await async_mpt_ops.helpdesk.cases.complete(processed_case.id)

assert result is not None


@pytest.mark.skip(reason="Unskip after MPT-19124 completed")
async def test_not_found(async_mpt_ops, invalid_case_id):
with pytest.raises(MPTAPIError):
await async_mpt_ops.helpdesk.cases.get(invalid_case_id)
71 changes: 71 additions & 0 deletions tests/e2e/helpdesk/cases/test_sync_cases.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import pytest

from mpt_api_client.exceptions import MPTAPIError

pytestmark = [pytest.mark.flaky]


@pytest.mark.skip(reason="Unskip after MPT-19124 completed")
def test_get_case(mpt_ops, created_case):
result = mpt_ops.helpdesk.cases.get(created_case.id)

assert result.id == created_case.id


@pytest.mark.skip(reason="Unskip after MPT-19124 completed")
def test_list_cases(mpt_ops):
limit = 1

result = mpt_ops.helpdesk.cases.fetch_page(limit=limit)

assert len(result) > 0


@pytest.mark.skip(reason="Unskip after MPT-19124 completed")
def test_create_case(created_case):
result = created_case

assert result is not None


@pytest.mark.skip(reason="Unskip after MPT-19124 completed")
def test_update_case(mpt_ops, created_case, short_uuid):
update_data = {"description": f"e2e update {short_uuid}"}

result = mpt_ops.helpdesk.cases.update(created_case.id, update_data)

assert result.id == created_case.id
assert result.to_dict().get("description") == update_data["description"]


@pytest.mark.skip(reason="Unskip after MPT-19124 completed")
def test_process_case(mpt_ops, created_case):
result = mpt_ops.helpdesk.cases.process(created_case.id)

assert result is not None


@pytest.mark.skip(reason="Unskip after MPT-19124 completed")
def test_query_case(mpt_ops, created_case):
processed_case = mpt_ops.helpdesk.cases.process(created_case.id)

result = mpt_ops.helpdesk.cases.query(
processed_case.id, {"queryPrompt": "Could you provide more details?"}
)

assert result is not None


@pytest.mark.skip(reason="Unskip after MPT-19124 completed")
def test_complete_case(mpt_ops, created_case):
processed_case = mpt_ops.helpdesk.cases.process(created_case.id)

result = mpt_ops.helpdesk.cases.complete(processed_case.id)

assert result is not None


@pytest.mark.skip(reason="Unskip after MPT-19124 completed")
def test_not_found(mpt_ops, invalid_case_id):
with pytest.raises(MPTAPIError):
mpt_ops.helpdesk.cases.get(invalid_case_id)
Loading
Loading