Skip to content

Commit 42ab336

Browse files
author
Robert Segal
committed
Added endpoints and e2e tests for program parameters
1 parent b3a6309 commit 42ab336

10 files changed

Lines changed: 373 additions & 0 deletions

File tree

e2e_config.test.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
"program.document.file.id": "PDM-9643-3741-0001",
7474
"program.media.id": "PMD-9643-3741-0001",
7575
"program.parameter.group.id": "PPG-9643-3741-0002",
76+
"program.parameter.id": "PPM-9643-3741-0001",
7677
"program.program.id": "PRG-9643-3741",
7778
"program.template.id": "PTM-9643-3741-0004"
7879
}

mpt_api_client/resources/program/programs.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@
2222
AsyncParameterGroupsService,
2323
ParameterGroupsService,
2424
)
25+
from mpt_api_client.resources.program.programs_parameters import (
26+
AsyncParametersService,
27+
ParametersService,
28+
)
2529
from mpt_api_client.resources.program.programs_templates import (
2630
AsyncTemplatesService,
2731
TemplatesService,
@@ -105,6 +109,12 @@ def parameter_groups(self, program_id: str) -> ParameterGroupsService:
105109
http_client=self.http_client, endpoint_params={"program_id": program_id}
106110
)
107111

112+
def parameters(self, program_id: str) -> ParametersService: # noqa: WPS110
113+
"""Return program parameters service."""
114+
return ParametersService(
115+
http_client=self.http_client, endpoint_params={"program_id": program_id}
116+
)
117+
108118
def templates(self, program_id: str) -> TemplatesService:
109119
"""Return program templates service."""
110120
return TemplatesService(
@@ -151,6 +161,12 @@ def parameter_groups(self, program_id: str) -> AsyncParameterGroupsService:
151161
http_client=self.http_client, endpoint_params={"program_id": program_id}
152162
)
153163

164+
def parameters(self, program_id: str) -> AsyncParametersService: # noqa: WPS110
165+
"""Return async program parameters service."""
166+
return AsyncParametersService(
167+
http_client=self.http_client, endpoint_params={"program_id": program_id}
168+
)
169+
154170
def templates(self, program_id: str) -> AsyncTemplatesService:
155171
"""Return async program templates service."""
156172
return AsyncTemplatesService(
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
from mpt_api_client.http import AsyncService, Service
2+
from mpt_api_client.http.mixins import (
3+
AsyncCollectionMixin,
4+
AsyncManagedResourceMixin,
5+
CollectionMixin,
6+
ManagedResourceMixin,
7+
)
8+
from mpt_api_client.models import Model
9+
from mpt_api_client.models.model import BaseModel
10+
11+
12+
class Parameter(Model):
13+
"""Parameter resource.
14+
15+
Attributes:
16+
name: Parameter name.
17+
scope: Parameter scope.
18+
phase: Parameter phase (e.g. Order, Fulfillment).
19+
program: Reference to the program this parameter belongs to.
20+
description: Parameter description.
21+
multiple: Whether multiple values are allowed for this parameter.
22+
external_id: External identifier for the parameter.
23+
display_order: Display order of the parameter.
24+
constraints: Parameter constraints (required, hidden, readonly).
25+
options: Type-specific parameter options.
26+
type: Parameter type (e.g. SingleLineText, MultiLineText, Address, etc.).
27+
status: Parameter status.
28+
audit: Audit information (created, updated events).
29+
"""
30+
31+
name: str | None
32+
scope: str | None
33+
phase: str | None
34+
program: BaseModel | None
35+
description: str | None
36+
multiple: bool | None
37+
external_id: str | None
38+
display_order: int | None
39+
constraints: BaseModel | None
40+
options: BaseModel | None
41+
type: str | None
42+
status: str | None
43+
audit: BaseModel | None
44+
45+
46+
class ParametersServiceConfig:
47+
"""Parameters service configuration."""
48+
49+
_endpoint = "/public/v1/program/programs/{program_id}/parameters"
50+
_model_class = Parameter
51+
_collection_key = "data"
52+
53+
54+
class ParametersService(
55+
ManagedResourceMixin[Parameter],
56+
CollectionMixin[Parameter],
57+
Service[Parameter],
58+
ParametersServiceConfig,
59+
):
60+
"""Parameters service."""
61+
62+
63+
class AsyncParametersService(
64+
AsyncManagedResourceMixin[Parameter],
65+
AsyncCollectionMixin[Parameter],
66+
AsyncService[Parameter],
67+
ParametersServiceConfig,
68+
):
69+
"""Parameters service."""
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 parameter_id(e2e_config):
6+
return e2e_config["program.parameter.id"]
7+
8+
9+
@pytest.fixture
10+
def invalid_parameter_id():
11+
return "PPM-0000-0000-0000"
12+
13+
14+
@pytest.fixture
15+
def parameter_data():
16+
return {
17+
"externalId": "e2eCreatedProgramParameter",
18+
"displayOrder": 100,
19+
"scope": "Enrollment",
20+
"phase": "Fulfillment",
21+
"multiple": False,
22+
"description": "E2E Created Program Parameter",
23+
"type": "SingleLineText",
24+
"constraints": {"hidden": False, "required": False, "readonly": False},
25+
"name": "E2E Created Program Parameter",
26+
"options": {
27+
"type": "SingleLineText",
28+
"placeholderText": "E2E Created Program Parameter",
29+
"name": "E2E Created Program Parameter",
30+
"hintText": "E2E Created Program Parameter",
31+
},
32+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import pytest
2+
3+
from mpt_api_client.exceptions import MPTAPIError
4+
from mpt_api_client.rql.query_builder import RQLQuery
5+
6+
pytestmark = [pytest.mark.flaky]
7+
8+
9+
@pytest.fixture
10+
async def created_parameter(async_mpt_vendor, program_id, parameter_data):
11+
service = async_mpt_vendor.program.programs.parameters(program_id)
12+
parameter = await service.create(parameter_data)
13+
yield parameter
14+
try:
15+
await service.delete(parameter.id)
16+
except MPTAPIError as error:
17+
print(f"TEARDOWN - Unable to delete parameter {parameter.id}: {error.title}") # noqa: WPS421
18+
19+
20+
def test_create_parameter(created_parameter):
21+
result = created_parameter.name == "E2E Created Program Parameter"
22+
23+
assert result is True
24+
25+
26+
async def test_update_parameter(async_mpt_vendor, program_id, created_parameter):
27+
service = async_mpt_vendor.program.programs.parameters(program_id)
28+
update_data = {"name": "E2E Updated Program Parameter"}
29+
30+
result = await service.update(created_parameter.id, update_data)
31+
32+
assert result.name == update_data["name"]
33+
34+
35+
async def test_get_parameter(async_mpt_vendor, program_id, parameter_id):
36+
service = async_mpt_vendor.program.programs.parameters(program_id)
37+
38+
result = await service.get(parameter_id)
39+
40+
assert result.id == parameter_id
41+
42+
43+
async def test_get_invalid_parameter(async_mpt_vendor, program_id, invalid_parameter_id):
44+
with pytest.raises(MPTAPIError):
45+
await async_mpt_vendor.program.programs.parameters(program_id).get(invalid_parameter_id)
46+
47+
48+
async def test_delete_parameter(async_mpt_vendor, program_id, created_parameter):
49+
parameter_data = created_parameter
50+
51+
result = async_mpt_vendor.program.programs.parameters(program_id)
52+
53+
await result.delete(parameter_data.id)
54+
55+
56+
async def test_filter_and_select_parameters(async_mpt_vendor, program_id, parameter_id):
57+
select_fields = ["-description", "-audit"]
58+
filtered_parameters = (
59+
async_mpt_vendor.program.programs
60+
.parameters(program_id)
61+
.filter(RQLQuery(id=parameter_id))
62+
.filter(RQLQuery(name="E2E Seeded Program Parameter"))
63+
.select(*select_fields)
64+
)
65+
66+
result = [parameter async for parameter in filtered_parameters.iterate()]
67+
68+
assert len(result) == 1
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import pytest
2+
3+
from mpt_api_client.exceptions import MPTAPIError
4+
from mpt_api_client.rql.query_builder import RQLQuery
5+
6+
pytestmark = [pytest.mark.flaky]
7+
8+
9+
@pytest.fixture
10+
def created_parameter(mpt_vendor, program_id, parameter_data):
11+
service = mpt_vendor.program.programs.parameters(program_id)
12+
parameter = service.create(parameter_data)
13+
yield parameter
14+
try:
15+
service.delete(parameter.id)
16+
except MPTAPIError as error:
17+
print(f"TEARDOWN - Unable to delete parameter {parameter.id}: {error.title}") # noqa: WPS421
18+
19+
20+
def test_create_parameter(created_parameter):
21+
result = created_parameter.name == "E2E Created Program Parameter"
22+
23+
assert result is True
24+
25+
26+
def test_update_parameter(mpt_vendor, program_id, created_parameter):
27+
service = mpt_vendor.program.programs.parameters(program_id)
28+
update_data = {"name": "E2E Updated Program Parameter"}
29+
30+
result = service.update(created_parameter.id, update_data)
31+
32+
assert result.name == update_data["name"]
33+
34+
35+
def test_get_parameter(mpt_vendor, program_id, parameter_id):
36+
service = mpt_vendor.program.programs.parameters(program_id)
37+
38+
result = service.get(parameter_id)
39+
40+
assert result.id == parameter_id
41+
42+
43+
def test_get_invalid_parameter(mpt_vendor, program_id, invalid_parameter_id):
44+
with pytest.raises(MPTAPIError):
45+
mpt_vendor.program.programs.parameters(program_id).get(invalid_parameter_id)
46+
47+
48+
def test_delete_parameter(mpt_vendor, program_id, created_parameter):
49+
parameter_data = created_parameter
50+
51+
result = mpt_vendor.program.programs.parameters(program_id)
52+
53+
result.delete(parameter_data.id)
54+
55+
56+
def test_filter_and_select_parameters(mpt_vendor, program_id, parameter_id):
57+
select_fields = ["-description", "-audit"]
58+
filtered_parameters = (
59+
mpt_vendor.program.programs
60+
.parameters(program_id)
61+
.filter(RQLQuery(id=parameter_id))
62+
.filter(RQLQuery(name="E2E Seeded Program Parameter"))
63+
.select(*select_fields)
64+
)
65+
66+
result = list(filtered_parameters.iterate())
67+
68+
assert len(result) == 1

tests/e2e/program/program/template/test_async_template.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ async def test_get_template(async_mpt_vendor, program_id, template_id):
4040
assert result.id == template_id
4141

4242

43+
async def test_get_template_invalid_id(async_mpt_vendor, program_id, invalid_template_id):
44+
with pytest.raises(MPTAPIError):
45+
await async_mpt_vendor.program.programs.templates(program_id).get(invalid_template_id)
46+
47+
4348
async def test_delete_template(async_mpt_vendor, program_id, created_template):
4449
template_data = created_template
4550

tests/e2e/program/program/template/test_sync_template.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ def test_get_template(mpt_vendor, program_id, template_id):
4040
assert result.id == template_id
4141

4242

43+
def test_get_template_invalid_id(mpt_vendor, program_id, invalid_template_id):
44+
with pytest.raises(MPTAPIError):
45+
mpt_vendor.program.programs.templates(program_id).get(invalid_template_id)
46+
47+
4348
def test_delete_template(mpt_vendor, program_id, created_template):
4449
template_data = created_template
4550

tests/unit/resources/program/test_programs.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616
AsyncParameterGroupsService,
1717
ParameterGroupsService,
1818
)
19+
from mpt_api_client.resources.program.programs_parameters import (
20+
AsyncParametersService,
21+
ParametersService,
22+
)
1923
from mpt_api_client.resources.program.programs_templates import (
2024
AsyncTemplatesService,
2125
TemplatesService,
@@ -98,6 +102,7 @@ def test_async_mixins_present(async_programs_service, method):
98102
("documents", DocumentService),
99103
("media", MediaService),
100104
("parameter_groups", ParameterGroupsService),
105+
("parameters", ParametersService),
101106
("templates", TemplatesService),
102107
],
103108
)
@@ -114,6 +119,7 @@ def test_property_services(programs_service, service_method, expected_service_cl
114119
("documents", AsyncDocumentService),
115120
("media", AsyncMediaService),
116121
("parameter_groups", AsyncParameterGroupsService),
122+
("parameters", AsyncParametersService),
117123
("templates", AsyncTemplatesService),
118124
],
119125
)

0 commit comments

Comments
 (0)