Skip to content

Commit 4c2c253

Browse files
crowecawcawmwiebe
authored andcommitted
fix: run extensions field validator even when template omits extensions field
Signed-off-by: Stephen Crowe <6042774+crowecawcaw@users.noreply.github.com>
1 parent 326e85d commit 4c2c253

File tree

2 files changed

+56
-3
lines changed

2 files changed

+56
-3
lines changed

src/openjd/model/v2023_09/_model.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2893,7 +2893,7 @@ class JobTemplate(OpenJDModel_v2023_09):
28932893
"""
28942894

28952895
specificationVersion: Literal[TemplateSpecificationVersion.JOBTEMPLATE_v2023_09] # noqa: N815
2896-
extensions: Optional[ExtensionNameList] = None
2896+
extensions: Optional[ExtensionNameList] = Field(default=None, validate_default=True)
28972897
name: JobTemplateName
28982898
steps: StepTemplateList
28992899
description: Optional[Description] = None
@@ -3116,7 +3116,7 @@ class EnvironmentTemplate(OpenJDModel_v2023_09):
31163116
"""
31173117

31183118
specificationVersion: Literal[TemplateSpecificationVersion.ENVIRONMENT_v2023_09]
3119-
extensions: Optional[ExtensionNameList] = None
3119+
extensions: Optional[ExtensionNameList] = Field(default=None, validate_default=True)
31203120
parameterDefinitions: Optional[JobParameterDefinitionList] = None
31213121
environment: Environment
31223122

test/openjd/model/v2023_09/test_feature_bundle_1.py

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import pytest
55
from pydantic import ValidationError
66

7-
from openjd.model import create_job
7+
from openjd.model import create_job, decode_job_template
88
from openjd.model._parse import _parse_model
99
from openjd.model.v2023_09 import (
1010
Action,
@@ -57,6 +57,59 @@ def test_extension_not_supported(self) -> None:
5757
assert "FEATURE_BUNDLE_1" in str(excinfo.value)
5858

5959

60+
class TestExtensionFieldEnablement:
61+
"""Tests for extension enablement based on template's extensions field and supported_extensions."""
62+
63+
@pytest.mark.parametrize(
64+
"template_declares_ext,supported_extensions,param_count,should_pass",
65+
[
66+
# Template declares extension, supported includes it - passes with 51 params
67+
(True, ["FEATURE_BUNDLE_1"], 51, True),
68+
# Template declares extension, supported excludes it - fails (unsupported ext)
69+
(True, ["TASK_CHUNKING"], 51, False),
70+
# Template declares extension, supported is None - fails (unsupported ext)
71+
(True, None, 51, False),
72+
# Template omits extension, supported includes it - fails (50 param limit)
73+
(False, ["FEATURE_BUNDLE_1"], 51, False),
74+
# Template omits extension, all supported - fails (50 param limit)
75+
(False, ["TASK_CHUNKING", "REDACTED_ENV_VARS", "FEATURE_BUNDLE_1"], 51, False),
76+
# Template omits extension, none supported - fails (50 param limit)
77+
(False, [], 51, False),
78+
# Template omits extension, supported is None - fails (50 param limit)
79+
(False, None, 51, False),
80+
# Template within default limit - passes regardless
81+
(False, ["FEATURE_BUNDLE_1"], 50, True),
82+
# Template omits extension, supported is None, within limit - passes
83+
(False, None, 50, True),
84+
],
85+
)
86+
def test_extension_enablement(
87+
self,
88+
template_declares_ext: bool,
89+
supported_extensions: list[str],
90+
param_count: int,
91+
should_pass: bool,
92+
) -> None:
93+
"""Test that extension features require explicit declaration in template."""
94+
params = [{"name": f"P{i}", "type": "INT", "default": i} for i in range(param_count)]
95+
data: dict = {
96+
"specificationVersion": "jobtemplate-2023-09",
97+
"name": "Test",
98+
"parameterDefinitions": params,
99+
"steps": [{"name": "s", "script": STEP_SCRIPT}],
100+
}
101+
if template_declares_ext:
102+
data["extensions"] = ["FEATURE_BUNDLE_1"]
103+
104+
if should_pass:
105+
result = decode_job_template(template=data, supported_extensions=supported_extensions)
106+
assert result.parameterDefinitions is not None
107+
assert len(result.parameterDefinitions) == param_count
108+
else:
109+
with pytest.raises(Exception):
110+
decode_job_template(template=data, supported_extensions=supported_extensions)
111+
112+
60113
class TestActionTimeoutFormatString:
61114
"""Tests for timeout format string support in Action."""
62115

0 commit comments

Comments
 (0)