fix(tests): resolve all failing CI checks on PR #3774
Fix 8 distinct integration test and E2E failures:
1. JSON envelope unwrapping in test helpers
Helpers were asserting keys at the top-level of the JSON envelope
({command, status, exit_code, data, timing, messages}) rather than
inside the nested 'data' field. Updated helpers to access
parsed['data'] for assertions on the actual response payload:
- helper_cli_formats.py: action_list_json, action_show_yaml,
plan_list_json, global_format_json_version, global_format_yaml_version,
global_format_shorthand
- helper_automation_profile_cli.py: test_show_json, test_list_json
- helper_cli_extensions.py: action_show_json
- helper_config_cli.py: config_set_get_roundtrip
- helper_config_project_scope.py: cli_roundtrip
2. Plan list --namespace / -n option (issue #4301)
Add 'namespace' parameter to lifecycle_list_plans() in plan.py,
passing it through to service.list_plans(namespace=...) and
displaying it in the Filters panel.
3. Config registry key count (issue #4304)
Update expected count from 105 to 106 to match current registry
(additional server key was added via the server stubs feature).
4. Container tool exec mock fix (issue #4243)
The test mocked ev.resolve_and_validate (no longer called) instead
of ev.resolve_with_precedence. Fix the mock target so ToolRunner
correctly routes to the container path and returns the expected
error when no ContainerToolExecutor is configured.
5. E2E config CLI CLEVERAGENTS_HOME support
config.py used a hardcoded Path.home() / '.cleveragents' for the
config directory, ignoring CLEVERAGENTS_HOME. E2E tests run in
isolated temporary homes set via CLEVERAGENTS_HOME; this caused the
WF07 CI Profile Configuration test to read from the global config
(returning 'review') instead of the test-scoped config. Make
_get_config_dir() and _get_service() respect CLEVERAGENTS_HOME.
ISSUES CLOSED: #4204 #4205 #4206 #4243 #4301 #4302 #4303 #4304
This commit is contained in:
@@ -149,7 +149,9 @@ def test_show_json() -> None:
|
||||
assert result.exit_code == 0, f"show json failed: {result.output}"
|
||||
parsed = _extract_json(result.output)
|
||||
assert isinstance(parsed, dict)
|
||||
assert parsed["name"] == "manual"
|
||||
# JSON output is wrapped in a CLI response envelope: {"data": {...}, ...}
|
||||
data = parsed.get("data", parsed)
|
||||
assert data["name"] == "manual"
|
||||
print("show-json-ok")
|
||||
|
||||
|
||||
@@ -186,9 +188,11 @@ def test_list_json() -> None:
|
||||
f"Expected dict at top level, got {type(parsed).__name__}. "
|
||||
f"Output: {result.output[:300]}"
|
||||
)
|
||||
# JSON output is wrapped in a CLI response envelope: {"data": {...}, ...}
|
||||
inner = parsed.get("data", parsed)
|
||||
# Validate profiles wrapper
|
||||
assert "profiles" in parsed, f"Missing 'profiles' key. Keys: {list(parsed.keys())}"
|
||||
profiles = parsed["profiles"]
|
||||
assert "profiles" in inner, f"Missing 'profiles' key. Keys: {list(inner.keys())}"
|
||||
profiles = inner["profiles"]
|
||||
assert isinstance(profiles, list), (
|
||||
f"'profiles' must be a list, got {type(profiles)}"
|
||||
)
|
||||
@@ -202,8 +206,8 @@ def test_list_json() -> None:
|
||||
"Full profile dict leaked into list output (found 'phase_transitions')"
|
||||
)
|
||||
# Validate summary
|
||||
assert "summary" in parsed, f"Missing 'summary' key. Keys: {list(parsed.keys())}"
|
||||
summary = parsed["summary"]
|
||||
assert "summary" in inner, f"Missing 'summary' key. Keys: {list(inner.keys())}"
|
||||
summary = inner["summary"]
|
||||
assert "built_in" in summary, f"Missing 'built_in' in summary: {summary}"
|
||||
assert "total" in summary, f"Missing 'total' in summary: {summary}"
|
||||
assert summary["built_in"] >= 8, (
|
||||
|
||||
@@ -109,7 +109,7 @@ def config_set_get_roundtrip() -> None:
|
||||
data = (
|
||||
envelope.get("data", envelope) if isinstance(envelope, dict) else envelope
|
||||
)
|
||||
if data.get("source") in ("config_file", "global"):
|
||||
if data.get("source") in ("config", "config_file", "global"):
|
||||
print("config-cli-set-get-roundtrip-ok")
|
||||
else:
|
||||
print(f"FAIL: unexpected source {data.get('source')}", file=sys.stderr)
|
||||
|
||||
Reference in New Issue
Block a user