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
5 changes: 5 additions & 0 deletions e2e_config.test.json
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,11 @@
"integration.extension.id": "EXT-6587-4477",
"integration.term.id": "ETC-6587-4477-0062",
"program.document.file.id": "PDM-9643-3741-0001",
"program.enrollment.assignee.id": "USR-6337-1324",
"program.enrollment.id": "ENR-3965-5056-7966",
"program.enrollment.process.template.id": "PTM-9643-3741-0001",
"program.enrollment.query.template.id": "PTM-9643-3741-0002",
"program.enrollment.complete.template.id": "PTM-9643-3741-0003",
"program.media.id": "PMD-9643-3741-0001",
"program.parameter.group.id": "PPG-9643-3741-0002",
"program.parameter.id": "PPM-9643-3741-0001",
Expand Down
224 changes: 224 additions & 0 deletions mpt_api_client/resources/program/enrollments.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,224 @@
from mpt_api_client.http import AsyncService, Service
from mpt_api_client.http.mixins import (
AsyncCollectionMixin,
AsyncManagedResourceMixin,
CollectionMixin,
ManagedResourceMixin,
)
from mpt_api_client.models import Model
from mpt_api_client.models.model import BaseModel, ResourceData
from mpt_api_client.resources.program.mixins.render_mixin import AsyncRenderMixin, RenderMixin


class Enrollment(Model):
"""Program enrollment resource.

Attributes:
name: Enrollment name.
certificate: Reference to the certificate.
program: Reference to the program.
vendor: Reference to the vendor.
applicable_to: Applicable to which entities.
type: Enrollment type.
licensee: Reference to the licensee.
eligibility: Eligibility criteria.
status: Enrollment status.
parameters: Enrollment parameters.
template: Reference to the enrollment template.
audit: Audit information.
"""

name: str | None
certificate: BaseModel | None
program: BaseModel | None
vendor: BaseModel | None
applicable_to: str | None
type: str | None
licensee: BaseModel | None
eligibility: BaseModel | None
status: str | None
parameters: BaseModel | None # noqa: WPS110
template: BaseModel | None
audit: BaseModel | None


class EnrollmentServiceConfig:
"""Program enrollment service config."""

_endpoint = "/public/v1/program/enrollments"
_model_class = Enrollment
_collection_key = "data"


class EnrollmentService(
RenderMixin[Enrollment],
ManagedResourceMixin[Enrollment],
CollectionMixin[Enrollment],
Service[Enrollment],
EnrollmentServiceConfig,
):
"""Program enrollment service."""

def validate(self, resource_id: str, resource_data: ResourceData | None = None) -> Enrollment:
"""Validate enrollment.

Args:
resource_id: Enrollment ID
resource_data: Enrollment data will be validated

Returns:
Validated enrollment.
"""
return self._resource(resource_id).post("validate", json=resource_data)

def query(self, resource_id: str, resource_data: ResourceData | None = None) -> Enrollment:
"""Query enrollment.

Args:
resource_id: Enrollment ID
resource_data: Enrollment data will be queried

Returns:
Queried enrollment.
"""
return self._resource(resource_id).post("query", json=resource_data)

def process(self, resource_id: str, resource_data: ResourceData | None = None) -> Enrollment:
"""Process enrollment.

Args:
resource_id: Enrollment ID
resource_data: Enrollment data will be processed

Returns:
Processed enrollment.
"""
return self._resource(resource_id).post("process", json=resource_data)

def complete(self, resource_id: str, resource_data: ResourceData | None = None) -> Enrollment:
"""Complete enrollment.

Args:
resource_id: Enrollment ID
resource_data: Enrollment data will be completed

Returns:
Completed enrollment.
"""
return self._resource(resource_id).post("complete", json=resource_data)

def submit(self, resource_id: str, resource_data: ResourceData | None = None) -> Enrollment:
"""Submit enrollment.

Args:
resource_id: Enrollment ID
resource_data: Enrollment data will be submitted

Returns:
Submitted enrollment.
"""
return self._resource(resource_id).post("submit", json=resource_data)

def fail(self, resource_id: str, resource_data: ResourceData | None = None) -> Enrollment:
"""Fail enrollment.

Args:
resource_id: Enrollment ID
resource_data: Enrollment data will be failed

Returns:
Failed enrollment.
"""
return self._resource(resource_id).post("fail", json=resource_data)


class AsyncEnrollmentService(
AsyncRenderMixin[Enrollment],
AsyncManagedResourceMixin[Enrollment],
AsyncCollectionMixin[Enrollment],
AsyncService[Enrollment],
EnrollmentServiceConfig,
):
"""Async program enrollment service."""

async def validate(
self, resource_id: str, resource_data: ResourceData | None = None
) -> Enrollment:
"""Validate enrollment.

Args:
resource_id: Enrollment ID
resource_data: Enrollment data will be validated

Returns:
Validated enrollment.
"""
return await self._resource(resource_id).post("validate", json=resource_data)

async def query(
self, resource_id: str, resource_data: ResourceData | None = None
) -> Enrollment:
"""Query enrollment.

Args:
resource_id: Enrollment ID
resource_data: Enrollment data will be queried

Returns:
Queried enrollment.
"""
return await self._resource(resource_id).post("query", json=resource_data)

async def process(
self, resource_id: str, resource_data: ResourceData | None = None
) -> Enrollment:
"""Process enrollment.

Args:
resource_id: Enrollment ID
resource_data: Enrollment data will be processed

Returns:
Processed enrollment.
"""
return await self._resource(resource_id).post("process", json=resource_data)

async def complete(
self, resource_id: str, resource_data: ResourceData | None = None
) -> Enrollment:
"""Complete enrollment.

Args:
resource_id: Enrollment ID
resource_data: Enrollment data will be completed

Returns:
Completed enrollment.
"""
return await self._resource(resource_id).post("complete", json=resource_data)

async def submit(
self, resource_id: str, resource_data: ResourceData | None = None
) -> Enrollment:
"""Submit enrollment.

Args:
resource_id: Enrollment ID
resource_data: Enrollment data will be submitted

Returns:
Submitted enrollment.
"""
return await self._resource(resource_id).post("submit", json=resource_data)

async def fail(self, resource_id: str, resource_data: ResourceData | None = None) -> Enrollment:
"""Fail enrollment.

Args:
resource_id: Enrollment ID
resource_data: Enrollment data will be failed

Returns:
Failed enrollment.
"""
return await self._resource(resource_id).post("fail", json=resource_data)
30 changes: 30 additions & 0 deletions mpt_api_client/resources/program/mixins/render_mixin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
class RenderMixin[Model]:
"""Render resource mixin."""

def render(self, resource_id: str) -> str:
"""Render resource.

Args:
resource_id: Resource ID

Returns:
Rendered resource.
"""
response = self._resource(resource_id).do_request("GET", "render") # type: ignore[attr-defined]
return response.text # type: ignore[no-any-return]


class AsyncRenderMixin[Model]:
"""Asynchronous render resource mixin."""

async def render(self, resource_id: str) -> str:
"""Render resource.

Args:
resource_id: Resource ID

Returns:
Rendered resource.
"""
response = await self._resource(resource_id).do_request("GET", "render") # type: ignore[attr-defined]
return response.text # type: ignore[no-any-return]
11 changes: 11 additions & 0 deletions mpt_api_client/resources/program/program.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.program.enrollments import AsyncEnrollmentService, EnrollmentService
from mpt_api_client.resources.program.programs import AsyncProgramsService, ProgramsService


Expand All @@ -13,6 +14,11 @@ def programs(self) -> ProgramsService:
"""Programs service."""
return ProgramsService(http_client=self.http_client)

@property
def enrollments(self) -> EnrollmentService:
"""Enrollments service."""
return EnrollmentService(http_client=self.http_client)


class AsyncProgram:
"""Program MPT API Module."""
Expand All @@ -24,3 +30,8 @@ def __init__(self, *, http_client: AsyncHTTPClient):
def programs(self) -> AsyncProgramsService:
"""Programs service."""
return AsyncProgramsService(http_client=self.http_client)

@property
def enrollments(self) -> AsyncEnrollmentService:
"""Enrollments service."""
return AsyncEnrollmentService(http_client=self.http_client)
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ per-file-ignores = [
"tests/e2e/commerce/order/asset/*.py: WPS211 WPS202",
"tests/e2e/commerce/subscription/*.py: WPS202",
"tests/e2e/helpdesk/chats/links/*.py: WPS221 WPS202",
"tests/e2e/program/enrollment/*.py: WPS202 WPS204",
"tests/e2e/program/program/term/*.py: WPS202 WPS204",
"tests/unit/http/test_async_service.py: WPS204 WPS202",
"tests/unit/http/test_resource_accessor.py: WPS204 WPS202 WPS210 WPS219",
Expand Down
79 changes: 79 additions & 0 deletions tests/e2e/program/enrollment/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import pytest


@pytest.fixture
def enrollment_id(e2e_config):
return e2e_config["program.enrollment.id"]


@pytest.fixture
def invalid_enrollment_id():
return "ENR-0000-0000-0000"


@pytest.fixture
def query_template_id(e2e_config):
return e2e_config["program.enrollment.query.template.id"]


@pytest.fixture
def process_template_id(e2e_config):
return e2e_config["program.enrollment.process.template.id"]


@pytest.fixture
def complete_template_id(e2e_config):
return e2e_config["program.enrollment.complete.template.id"]


@pytest.fixture
def assignee_id(e2e_config):
return e2e_config["program.enrollment.assignee.id"]


@pytest.fixture
def enrollment_data(program_id, licensee_id):
return {
"program": {"id": program_id},
"parameters": {"ordering": []},
"certificant": {"id": licensee_id},
"licensee": {"id": licensee_id},
}


@pytest.fixture
def status_flow_enrollment_data_factory():
def factory(enrollment_id: str, template_id: str):
return {
"id": enrollment_id,
"template": {
"id": template_id,
"content": "TEMPLATE_CONTENT",
},
}

return factory


@pytest.fixture
def enrollment_status_message_factory():
def factory(enrollment_id: str):
return {
"id": enrollment_id,
"statusNotes": {
"message": "Failing enrollment for E2E test",
},
}

return factory


@pytest.fixture
def assignee_enrollment_data_factory(assignee_id):
def factory(enrollment_id: str):
return {
"id": enrollment_id,
"assignee": {"id": assignee_id},
}

return factory
Loading