forked from HAL9000/cleveragents-core
31472b5413
Add Behave feature/step pairs that exercise uncovered branches across handlers, LSP, CLI, and service layers to reach the coverage gate. ISSUES CLOSED: #1232
217 lines
7.3 KiB
Python
217 lines
7.3 KiB
Python
"""Step definitions for cloud_handler_coverage_r3.feature.
|
|
|
|
Exercises the NotImplementedError stubs on CloudResourceHandler
|
|
for CRUD and lifecycle methods that are part of the ResourceHandler
|
|
protocol but intentionally unsupported for cloud resources.
|
|
|
|
Covered lines in src/cleveragents/resource/handlers/cloud.py:
|
|
480 - read()
|
|
484 - write()
|
|
488 - delete()
|
|
492 - list_children()
|
|
496 - diff()
|
|
500 - discover_children()
|
|
512 - create_sandbox()
|
|
523 - create_checkpoint()
|
|
534 - rollback_to()
|
|
545 - project_access()
|
|
"""
|
|
|
|
from unittest.mock import MagicMock
|
|
|
|
from behave import given, then, when
|
|
|
|
from cleveragents.domain.models.core.resource import (
|
|
PhysVirt,
|
|
Resource,
|
|
ResourceCapabilities,
|
|
SandboxStrategy,
|
|
)
|
|
from cleveragents.resource.handlers.cloud import CloudResourceHandler
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Helpers
|
|
# ---------------------------------------------------------------------------
|
|
|
|
_VALID_ULID = "01ARZ3NDEKTSV4RRFFQ69G5FAV"
|
|
|
|
|
|
def _make_resource(type_name: str = "aws-account") -> Resource:
|
|
"""Create a minimal Resource suitable for handler stub calls."""
|
|
return Resource(
|
|
resource_id=_VALID_ULID,
|
|
resource_type_name=type_name,
|
|
classification=PhysVirt.VIRTUAL,
|
|
properties={},
|
|
sandbox_strategy=SandboxStrategy.NONE,
|
|
capabilities=ResourceCapabilities(),
|
|
)
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Background
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
@given("clcov3 a CloudResourceHandler instance exists")
|
|
def step_create_handler(context):
|
|
"""Instantiate a CloudResourceHandler and store it on context."""
|
|
context.clcov3_handler = CloudResourceHandler()
|
|
|
|
|
|
@given("clcov3 a dummy cloud resource exists")
|
|
def step_create_resource(context):
|
|
"""Create a minimal Resource for use in stub calls."""
|
|
context.clcov3_resource = _make_resource()
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# CRUD stubs - When steps
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
@when("clcov3 I call read on the handler")
|
|
def step_call_read(context):
|
|
"""Call handler.read() and capture the expected NotImplementedError."""
|
|
context.clcov3_error = None
|
|
try:
|
|
context.clcov3_handler.read(resource=context.clcov3_resource, path="")
|
|
except NotImplementedError as exc:
|
|
context.clcov3_error = exc
|
|
|
|
|
|
@when("clcov3 I call write on the handler")
|
|
def step_call_write(context):
|
|
"""Call handler.write() and capture the expected NotImplementedError."""
|
|
context.clcov3_error = None
|
|
try:
|
|
context.clcov3_handler.write(
|
|
resource=context.clcov3_resource, path="/tmp/test", data=b"hello"
|
|
)
|
|
except NotImplementedError as exc:
|
|
context.clcov3_error = exc
|
|
|
|
|
|
@when("clcov3 I call delete on the handler")
|
|
def step_call_delete(context):
|
|
"""Call handler.delete() and capture the expected NotImplementedError."""
|
|
context.clcov3_error = None
|
|
try:
|
|
context.clcov3_handler.delete(resource=context.clcov3_resource, path="")
|
|
except NotImplementedError as exc:
|
|
context.clcov3_error = exc
|
|
|
|
|
|
@when("clcov3 I call list_children on the handler")
|
|
def step_call_list_children(context):
|
|
"""Call handler.list_children() and capture the expected NotImplementedError."""
|
|
context.clcov3_error = None
|
|
try:
|
|
context.clcov3_handler.list_children(resource=context.clcov3_resource)
|
|
except NotImplementedError as exc:
|
|
context.clcov3_error = exc
|
|
|
|
|
|
@when("clcov3 I call diff on the handler")
|
|
def step_call_diff(context):
|
|
"""Call handler.diff() and capture the expected NotImplementedError."""
|
|
context.clcov3_error = None
|
|
try:
|
|
context.clcov3_handler.diff(
|
|
resource=context.clcov3_resource, other_location="/other/path"
|
|
)
|
|
except NotImplementedError as exc:
|
|
context.clcov3_error = exc
|
|
|
|
|
|
@when("clcov3 I call discover_children on the handler")
|
|
def step_call_discover_children(context):
|
|
"""Call handler.discover_children() and capture the expected NotImplementedError."""
|
|
context.clcov3_error = None
|
|
try:
|
|
context.clcov3_handler.discover_children(resource=context.clcov3_resource)
|
|
except NotImplementedError as exc:
|
|
context.clcov3_error = exc
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Lifecycle stubs - When steps
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
@when("clcov3 I call create_sandbox on the handler")
|
|
def step_call_create_sandbox(context):
|
|
"""Call handler.create_sandbox() and capture the expected NotImplementedError."""
|
|
context.clcov3_error = None
|
|
try:
|
|
context.clcov3_handler.create_sandbox(
|
|
resource=context.clcov3_resource,
|
|
plan_id="plan-test-001",
|
|
sandbox_manager=MagicMock(),
|
|
)
|
|
except NotImplementedError as exc:
|
|
context.clcov3_error = exc
|
|
|
|
|
|
@when("clcov3 I call create_checkpoint on the handler")
|
|
def step_call_create_checkpoint(context):
|
|
"""Call handler.create_checkpoint() and capture the expected NotImplementedError."""
|
|
context.clcov3_error = None
|
|
try:
|
|
context.clcov3_handler.create_checkpoint(
|
|
resource=context.clcov3_resource,
|
|
plan_id="plan-test-001",
|
|
sandbox_manager=MagicMock(),
|
|
phase="execution",
|
|
)
|
|
except NotImplementedError as exc:
|
|
context.clcov3_error = exc
|
|
|
|
|
|
@when("clcov3 I call rollback_to on the handler")
|
|
def step_call_rollback_to(context):
|
|
"""Call handler.rollback_to() and capture the expected NotImplementedError."""
|
|
context.clcov3_error = None
|
|
try:
|
|
context.clcov3_handler.rollback_to(
|
|
resource=context.clcov3_resource,
|
|
plan_id="plan-test-001",
|
|
checkpoint_id="chk-001",
|
|
sandbox_manager=MagicMock(),
|
|
)
|
|
except NotImplementedError as exc:
|
|
context.clcov3_error = exc
|
|
|
|
|
|
@when("clcov3 I call project_access on the handler")
|
|
def step_call_project_access(context):
|
|
"""Call handler.project_access() and capture the expected NotImplementedError."""
|
|
context.clcov3_error = None
|
|
try:
|
|
context.clcov3_handler.project_access(
|
|
resource=context.clcov3_resource,
|
|
principal="user@example.com",
|
|
action="read",
|
|
project_id="proj-001",
|
|
)
|
|
except NotImplementedError as exc:
|
|
context.clcov3_error = exc
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Shared Then step
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
@then('clcov3 a NotImplementedError is stored with message "{method_name}"')
|
|
def step_verify_not_implemented(context, method_name):
|
|
"""Verify a NotImplementedError was captured and its message contains the method name."""
|
|
assert context.clcov3_error is not None, (
|
|
f"Expected NotImplementedError for {method_name}, but no exception was raised"
|
|
)
|
|
assert isinstance(context.clcov3_error, NotImplementedError), (
|
|
f"Expected NotImplementedError, got {type(context.clcov3_error).__name__}"
|
|
)
|
|
msg = str(context.clcov3_error)
|
|
assert method_name in msg, f"Expected '{method_name}' in error message, got: {msg}"
|