Skip to content

Commit 4477bcf

Browse files
committed
feat: add helpdesk cases api services with unit and e2e tests
1 parent c59571f commit 4477bcf

File tree

8 files changed

+406
-0
lines changed

8 files changed

+406
-0
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
from mpt_api_client.http import AsyncService, Service
2+
from mpt_api_client.http.mixins import (
3+
AsyncCollectionMixin,
4+
AsyncCreateMixin,
5+
AsyncGetMixin,
6+
AsyncUpdateMixin,
7+
CollectionMixin,
8+
CreateMixin,
9+
GetMixin,
10+
UpdateMixin,
11+
)
12+
from mpt_api_client.models import Model, ResourceData
13+
14+
15+
class Case(Model):
16+
"""Helpdesk Case resource."""
17+
18+
19+
class CasesServiceConfig:
20+
"""Helpdesk Cases service configuration."""
21+
22+
_endpoint = "/public/v1/helpdesk/cases"
23+
_model_class = Case
24+
_collection_key = "data"
25+
26+
27+
class CasesService(
28+
CreateMixin[Case],
29+
UpdateMixin[Case],
30+
GetMixin[Case],
31+
CollectionMixin[Case],
32+
Service[Case],
33+
CasesServiceConfig,
34+
):
35+
"""Helpdesk Cases service."""
36+
37+
def query(self, resource_id: str, resource_data: ResourceData | None = None) -> Case:
38+
"""Switch case to query state."""
39+
return self._resource_action(resource_id, "POST", "query", json=resource_data)
40+
41+
def process(self, resource_id: str, resource_data: ResourceData | None = None) -> Case:
42+
"""Switch case to process state."""
43+
return self._resource_action(resource_id, "POST", "process", json=resource_data)
44+
45+
def complete(self, resource_id: str, resource_data: ResourceData | None = None) -> Case:
46+
"""Switch case to complete state."""
47+
return self._resource_action(resource_id, "POST", "complete", json=resource_data)
48+
49+
50+
class AsyncCasesService(
51+
AsyncCreateMixin[Case],
52+
AsyncUpdateMixin[Case],
53+
AsyncGetMixin[Case],
54+
AsyncCollectionMixin[Case],
55+
AsyncService[Case],
56+
CasesServiceConfig,
57+
):
58+
"""Async Helpdesk Cases service."""
59+
60+
async def query(self, resource_id: str, resource_data: ResourceData | None = None) -> Case:
61+
"""Switch case to query state."""
62+
return await self._resource_action(resource_id, "POST", "query", json=resource_data)
63+
64+
async def process(self, resource_id: str, resource_data: ResourceData | None = None) -> Case:
65+
"""Switch case to process state."""
66+
return await self._resource_action(resource_id, "POST", "process", json=resource_data)
67+
68+
async def complete(self, resource_id: str, resource_data: ResourceData | None = None) -> Case:
69+
"""Switch case to complete state."""
70+
return await self._resource_action(resource_id, "POST", "complete", json=resource_data)

mpt_api_client/resources/helpdesk/helpdesk.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from mpt_api_client.http import AsyncHTTPClient, HTTPClient
2+
from mpt_api_client.resources.helpdesk.cases import AsyncCasesService, CasesService
23
from mpt_api_client.resources.helpdesk.chats import AsyncChatsService, ChatsService
34

45

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

17+
@property
18+
def cases(self) -> CasesService:
19+
"""Cases service."""
20+
return CasesService(http_client=self.http_client)
21+
1622

1723
class AsyncHelpdesk:
1824
"""Async Helpdesk MPT API Module."""
@@ -24,3 +30,8 @@ def __init__(self, http_client: AsyncHTTPClient):
2430
def chats(self) -> AsyncChatsService:
2531
"""Async Chats service."""
2632
return AsyncChatsService(http_client=self.http_client)
33+
34+
@property
35+
def cases(self) -> AsyncCasesService:
36+
"""Async Cases service."""
37+
return AsyncCasesService(http_client=self.http_client)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import pytest
2+
3+
4+
@pytest.fixture
5+
def invalid_case_id():
6+
return "CAS-0000-0000"
7+
8+
9+
@pytest.fixture
10+
def case_factory(short_uuid):
11+
def factory(
12+
title: str = "E2E Created Helpdesk Case",
13+
description: str = "E2E Created Helpdesk Case Description",
14+
):
15+
return {
16+
"title": f"{title} {short_uuid}",
17+
"description": description,
18+
"priority": "Low",
19+
"type": "General",
20+
}
21+
22+
return factory
23+
24+
25+
@pytest.fixture
26+
def created_case(mpt_ops, case_factory):
27+
return mpt_ops.helpdesk.cases.create(case_factory())
28+
29+
30+
@pytest.fixture
31+
async def async_created_case(async_mpt_ops, case_factory):
32+
return await async_mpt_ops.helpdesk.cases.create(case_factory())
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import pytest
2+
3+
from mpt_api_client.exceptions import MPTAPIError
4+
5+
pytestmark = [pytest.mark.flaky]
6+
7+
8+
async def test_get_case(async_mpt_ops, async_created_case):
9+
result = await async_mpt_ops.helpdesk.cases.get(async_created_case.id)
10+
11+
assert result.id == async_created_case.id
12+
13+
14+
async def test_list_cases(async_mpt_ops):
15+
limit = 1
16+
17+
result = await async_mpt_ops.helpdesk.cases.fetch_page(limit=limit)
18+
19+
assert len(result) > 0
20+
21+
22+
def test_create_case(async_created_case):
23+
result = async_created_case
24+
25+
assert result is not None
26+
27+
28+
async def test_update_case(async_mpt_ops, async_created_case, short_uuid):
29+
update_data = {"description": f"e2e update {short_uuid}"}
30+
31+
result = await async_mpt_ops.helpdesk.cases.update(async_created_case.id, update_data)
32+
33+
assert result.id == async_created_case.id
34+
assert result.to_dict().get("description") == update_data["description"]
35+
36+
37+
async def test_process_case(async_mpt_ops, async_created_case):
38+
result = await async_mpt_ops.helpdesk.cases.process(async_created_case.id)
39+
40+
assert result is not None
41+
42+
43+
async def test_query_case(async_mpt_ops, async_created_case):
44+
processed_case = await async_mpt_ops.helpdesk.cases.process(async_created_case.id)
45+
46+
result = await async_mpt_ops.helpdesk.cases.query(
47+
processed_case.id, {"queryPrompt": "Could you provide more details?"}
48+
)
49+
50+
assert result is not None
51+
52+
53+
async def test_complete_case(async_mpt_ops, async_created_case):
54+
processed_case = await async_mpt_ops.helpdesk.cases.process(async_created_case.id)
55+
56+
result = await async_mpt_ops.helpdesk.cases.complete(processed_case.id)
57+
58+
assert result is not None
59+
60+
61+
async def test_not_found(async_mpt_ops, invalid_case_id):
62+
with pytest.raises(MPTAPIError):
63+
await async_mpt_ops.helpdesk.cases.get(invalid_case_id)
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import pytest
2+
3+
from mpt_api_client.exceptions import MPTAPIError
4+
5+
pytestmark = [pytest.mark.flaky]
6+
7+
8+
def test_get_case(mpt_ops, created_case):
9+
result = mpt_ops.helpdesk.cases.get(created_case.id)
10+
11+
assert result.id == created_case.id
12+
13+
14+
def test_list_cases(mpt_ops):
15+
limit = 1
16+
17+
result = mpt_ops.helpdesk.cases.fetch_page(limit=limit)
18+
19+
assert len(result) > 0
20+
21+
22+
def test_create_case(created_case):
23+
result = created_case
24+
25+
assert result is not None
26+
27+
28+
def test_update_case(mpt_ops, created_case, short_uuid):
29+
update_data = {"description": f"e2e update {short_uuid}"}
30+
31+
result = mpt_ops.helpdesk.cases.update(created_case.id, update_data)
32+
33+
assert result.id == created_case.id
34+
assert result.to_dict().get("description") == update_data["description"]
35+
36+
37+
def test_process_case(mpt_ops, created_case):
38+
result = mpt_ops.helpdesk.cases.process(created_case.id)
39+
40+
assert result is not None
41+
42+
43+
def test_query_case(mpt_ops, created_case):
44+
processed_case = mpt_ops.helpdesk.cases.process(created_case.id)
45+
46+
result = mpt_ops.helpdesk.cases.query(
47+
processed_case.id, {"queryPrompt": "Could you provide more details?"}
48+
)
49+
50+
assert result is not None
51+
52+
53+
def test_complete_case(mpt_ops, created_case):
54+
processed_case = mpt_ops.helpdesk.cases.process(created_case.id)
55+
56+
result = mpt_ops.helpdesk.cases.complete(processed_case.id)
57+
58+
assert result is not None
59+
60+
61+
def test_not_found(mpt_ops, invalid_case_id):
62+
with pytest.raises(MPTAPIError):
63+
mpt_ops.helpdesk.cases.get(invalid_case_id)

0 commit comments

Comments
 (0)