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
4 changes: 3 additions & 1 deletion e2e_config.test.json
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,10 @@
"notifications.subscriber.id": "NTS-0829-7123-7123",
"integration.extension.id": "EXT-6587-4477",
"integration.term.id": "ETC-6587-4477-0062",
"program.document.file.id": "PDM-9643-3741-0001",
"program.media.id": "PMD-9643-3741-0001",
"program.parameter.group.id": "PPG-9643-3741-0002",
"program.parameter.id": "PPM-9643-3741-0001",
"program.program.id": "PRG-9643-3741",
"program.document.file.id": "PDM-9643-3741-0001"
"program.template.id": "PTM-9643-3741-0004"
}
32 changes: 32 additions & 0 deletions mpt_api_client/resources/program/programs.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,14 @@
AsyncParameterGroupsService,
ParameterGroupsService,
)
from mpt_api_client.resources.program.programs_parameters import (
AsyncParametersService,
ParametersService,
)
from mpt_api_client.resources.program.programs_templates import (
AsyncTemplatesService,
TemplatesService,
)


class Program(Model):
Expand Down Expand Up @@ -101,6 +109,18 @@ def parameter_groups(self, program_id: str) -> ParameterGroupsService:
http_client=self.http_client, endpoint_params={"program_id": program_id}
)

def parameters(self, program_id: str) -> ParametersService: # noqa: WPS110
"""Return program parameters service."""
return ParametersService(
http_client=self.http_client, endpoint_params={"program_id": program_id}
)

def templates(self, program_id: str) -> TemplatesService:
"""Return program templates service."""
return TemplatesService(
http_client=self.http_client, endpoint_params={"program_id": program_id}
)


class AsyncProgramsService(
AsyncGetMixin[Program],
Expand Down Expand Up @@ -140,3 +160,15 @@ def parameter_groups(self, program_id: str) -> AsyncParameterGroupsService:
return AsyncParameterGroupsService(
http_client=self.http_client, endpoint_params={"program_id": program_id}
)

def parameters(self, program_id: str) -> AsyncParametersService: # noqa: WPS110
"""Return async program parameters service."""
return AsyncParametersService(
http_client=self.http_client, endpoint_params={"program_id": program_id}
)

def templates(self, program_id: str) -> AsyncTemplatesService:
"""Return async program templates service."""
return AsyncTemplatesService(
http_client=self.http_client, endpoint_params={"program_id": program_id}
)
69 changes: 69 additions & 0 deletions mpt_api_client/resources/program/programs_parameters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
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


class Parameter(Model):
"""Parameter resource.

Attributes:
name: Parameter name.
scope: Parameter scope.
phase: Parameter phase (e.g. Order, Fulfillment).
program: Reference to the program this parameter belongs to.
description: Parameter description.
multiple: Whether multiple values are allowed for this parameter.
external_id: External identifier for the parameter.
display_order: Display order of the parameter.
constraints: Parameter constraints (required, hidden, readonly).
options: Type-specific parameter options.
type: Parameter type (e.g. SingleLineText, MultiLineText, Address, etc.).
status: Parameter status.
audit: Audit information (created, updated events).
"""

name: str | None
scope: str | None
phase: str | None
program: BaseModel | None
description: str | None
multiple: bool | None
external_id: str | None
display_order: int | None
constraints: BaseModel | None
options: BaseModel | None
type: str | None
status: str | None
audit: BaseModel | None


class ParametersServiceConfig:
"""Parameters service configuration."""

_endpoint = "/public/v1/program/programs/{program_id}/parameters"
_model_class = Parameter
_collection_key = "data"


class ParametersService(
ManagedResourceMixin[Parameter],
CollectionMixin[Parameter],
Service[Parameter],
ParametersServiceConfig,
):
"""Parameters service."""


class AsyncParametersService(
AsyncManagedResourceMixin[Parameter],
AsyncCollectionMixin[Parameter],
AsyncService[Parameter],
ParametersServiceConfig,
):
"""Parameters service."""
59 changes: 59 additions & 0 deletions mpt_api_client/resources/program/programs_templates.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
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


class Template(Model):
"""Template resource.

Attributes:
name: Template name.
content: Template content.
default: Whether this is the default template.
external_ids: External identifiers.
type: Template type.
status: Template status.
program: Reference to the program.
audit: Audit information (created, updated events).
"""

name: str | None
content: str | None # noqa: WPS110
default: bool | None
external_ids: BaseModel | None
type: str | None
status: str | None
program: BaseModel | None
audit: BaseModel | None


class TemplatesServiceConfig:
"""Templates service configuration."""

_endpoint = "/public/v1/program/programs/{program_id}/templates"
_model_class = Template
_collection_key = "data"


class TemplatesService(
ManagedResourceMixin[Template],
CollectionMixin[Template],
Service[Template],
TemplatesServiceConfig,
):
"""Templates service."""


class AsyncTemplatesService(
AsyncManagedResourceMixin[Template],
AsyncCollectionMixin[Template],
AsyncService[Template],
TemplatesServiceConfig,
):
"""Templates service."""
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@ per-file-ignores = [
"mpt_api_client/resources/exchange/*.py: WPS235 WPS215",
"mpt_api_client/resources/integration/*.py: WPS214 WPS215 WPS235",
"mpt_api_client/resources/helpdesk/*.py: WPS204 WPS215 WPS214",
"mpt_api_client/resources/program/*.py: WPS204 WPS215",
"mpt_api_client/rql/query_builder.py: WPS110 WPS115 WPS210 WPS214",
"tests/e2e/accounts/*.py: WPS430 WPS202",
"tests/e2e/billing/*.py: WPS202 WPS421 WPS118",
Expand Down
32 changes: 32 additions & 0 deletions tests/e2e/program/program/parameter/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import pytest


@pytest.fixture
def parameter_id(e2e_config):
return e2e_config["program.parameter.id"]


@pytest.fixture
def invalid_parameter_id():
return "PPM-0000-0000-0000"


@pytest.fixture
def parameter_data():
return {
"externalId": "e2eCreatedProgramParameter",
"displayOrder": 100,
"scope": "Enrollment",
"phase": "Fulfillment",
"multiple": False,
"description": "E2E Created Program Parameter",
"type": "SingleLineText",
"constraints": {"hidden": False, "required": False, "readonly": False},
"name": "E2E Created Program Parameter",
"options": {
"type": "SingleLineText",
"placeholderText": "E2E Created Program Parameter",
"name": "E2E Created Program Parameter",
"hintText": "E2E Created Program Parameter",
},
}
68 changes: 68 additions & 0 deletions tests/e2e/program/program/parameter/test_async_parameter.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import pytest

from mpt_api_client.exceptions import MPTAPIError
from mpt_api_client.rql.query_builder import RQLQuery

pytestmark = [pytest.mark.flaky]


@pytest.fixture
async def created_parameter(async_mpt_vendor, program_id, parameter_data):
service = async_mpt_vendor.program.programs.parameters(program_id)
parameter = await service.create(parameter_data)
yield parameter
try:
await service.delete(parameter.id)
except MPTAPIError as error:
print(f"TEARDOWN - Unable to delete parameter {parameter.id}: {error.title}") # noqa: WPS421


def test_create_parameter(created_parameter):
result = created_parameter.name == "E2E Created Program Parameter"

assert result is True


async def test_update_parameter(async_mpt_vendor, program_id, created_parameter):
service = async_mpt_vendor.program.programs.parameters(program_id)
update_data = {"name": "E2E Updated Program Parameter"}

result = await service.update(created_parameter.id, update_data)

assert result.name == update_data["name"]


async def test_get_parameter(async_mpt_vendor, program_id, parameter_id):
service = async_mpt_vendor.program.programs.parameters(program_id)

result = await service.get(parameter_id)

assert result.id == parameter_id


async def test_get_invalid_parameter(async_mpt_vendor, program_id, invalid_parameter_id):
with pytest.raises(MPTAPIError):
await async_mpt_vendor.program.programs.parameters(program_id).get(invalid_parameter_id)


async def test_delete_parameter(async_mpt_vendor, program_id, created_parameter):
parameter_data = created_parameter

result = async_mpt_vendor.program.programs.parameters(program_id)

await result.delete(parameter_data.id)


async def test_filter_and_select_parameters(async_mpt_vendor, program_id, parameter_id):
select_fields = ["-description", "-audit"]
filtered_parameters = (
async_mpt_vendor.program.programs
.parameters(program_id)
.filter(RQLQuery(id=parameter_id))
.filter(RQLQuery(name="E2E Seeded Program Parameter"))
.select(*select_fields)
)

result = [parameter async for parameter in filtered_parameters.iterate()]

assert len(result) == 1
68 changes: 68 additions & 0 deletions tests/e2e/program/program/parameter/test_sync_parameter.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import pytest

from mpt_api_client.exceptions import MPTAPIError
from mpt_api_client.rql.query_builder import RQLQuery

pytestmark = [pytest.mark.flaky]


@pytest.fixture
def created_parameter(mpt_vendor, program_id, parameter_data):
service = mpt_vendor.program.programs.parameters(program_id)
parameter = service.create(parameter_data)
yield parameter
try:
service.delete(parameter.id)
except MPTAPIError as error:
print(f"TEARDOWN - Unable to delete parameter {parameter.id}: {error.title}") # noqa: WPS421


def test_create_parameter(created_parameter):
result = created_parameter.name == "E2E Created Program Parameter"

assert result is True


def test_update_parameter(mpt_vendor, program_id, created_parameter):
service = mpt_vendor.program.programs.parameters(program_id)
update_data = {"name": "E2E Updated Program Parameter"}

result = service.update(created_parameter.id, update_data)

assert result.name == update_data["name"]


def test_get_parameter(mpt_vendor, program_id, parameter_id):
service = mpt_vendor.program.programs.parameters(program_id)

result = service.get(parameter_id)

assert result.id == parameter_id


def test_get_invalid_parameter(mpt_vendor, program_id, invalid_parameter_id):
with pytest.raises(MPTAPIError):
mpt_vendor.program.programs.parameters(program_id).get(invalid_parameter_id)


def test_delete_parameter(mpt_vendor, program_id, created_parameter):
parameter_data = created_parameter

result = mpt_vendor.program.programs.parameters(program_id)

result.delete(parameter_data.id)


def test_filter_and_select_parameters(mpt_vendor, program_id, parameter_id):
select_fields = ["-description", "-audit"]
filtered_parameters = (
mpt_vendor.program.programs
.parameters(program_id)
.filter(RQLQuery(id=parameter_id))
.filter(RQLQuery(name="E2E Seeded Program Parameter"))
.select(*select_fields)
)

result = list(filtered_parameters.iterate())

assert len(result) == 1
22 changes: 22 additions & 0 deletions tests/e2e/program/program/template/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import pytest


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


@pytest.fixture
def invalid_template_id():
return "PTM-0000-0000-0000"


@pytest.fixture
def template_data():
return {
"name": "E2E Created Program Template",
"type": "EnrollmentProcessing",
"default": False,
"externalIds": {"vendor": None},
"content": "E2E Created Program Template",
}
Loading