Files
cleveragents-core/features/steps/enums_coverage_steps.py
T
brent.edwards c5004ae918
CI / lint (pull_request) Failing after 16s
CI / typecheck (pull_request) Successful in 27s
CI / coverage (pull_request) Has been skipped
CI / security (pull_request) Successful in 19s
CI / quality (pull_request) Failing after 15s
CI / behave (3.11) (pull_request) Failing after 11s
CI / behave (3.12) (pull_request) Failing after 10s
CI / behave (3.13) (pull_request) Failing after 14s
CI / docker (pull_request) Has been skipped
CI / helm (pull_request) Has been skipped
CI / build (pull_request) Failing after 13s
build(features/steps): fix 14 files to match new ruff format
2026-02-12 02:26:03 +00:00

410 lines
14 KiB
Python

"""Step definitions for enum coverage testing."""
from behave import given, then, when
from cleveragents.domain.models.core.enums import (
FallbackType,
ModelErrKind,
ModelProvider,
ModelPublisher,
)
# ModelPublisher enum tests
@given("I import the ModelPublisher enum")
def step_import_model_publisher(context):
"""Import the ModelPublisher enum."""
context.enum_class = ModelPublisher
context.current_enum = ModelPublisher
@when("I check all ModelPublisher values")
def step_check_model_publisher_values(context):
"""Check all ModelPublisher enum values."""
context.enum_values = {
"OPENAI": ModelPublisher.OPENAI,
"ANTHROPIC": ModelPublisher.ANTHROPIC,
"GOOGLE": ModelPublisher.GOOGLE,
"DEEPSEEK": ModelPublisher.DEEPSEEK,
"PERPLEXITY": ModelPublisher.PERPLEXITY,
"QWEN": ModelPublisher.QWEN,
"MISTRAL": ModelPublisher.MISTRAL,
}
@then('ModelPublisher.{member} should equal "{expected}"')
def step_verify_model_publisher_value(context, member, expected):
"""Verify ModelPublisher enum member value."""
actual = getattr(ModelPublisher, member)
assert actual.value == expected, f"Expected {expected}, got {actual.value}"
@given("I have a ModelPublisher enum value")
def step_have_model_publisher_value(context):
"""Have a ModelPublisher enum value."""
context.enum_value = ModelPublisher.OPENAI
@when("I convert ModelPublisher.{member} to string")
def step_convert_model_publisher_to_string(context, member):
"""Convert ModelPublisher member to string."""
context.enum_value = getattr(ModelPublisher, member)
context.string_value = str(context.enum_value)
# ModelErrKind enum tests
@given("I import the ModelErrKind enum")
def step_import_model_err_kind(context):
"""Import the ModelErrKind enum."""
context.enum_class = ModelErrKind
context.current_enum = ModelErrKind
@when("I check all ModelErrKind values")
def step_check_model_err_kind_values(context):
"""Check all ModelErrKind enum values."""
context.enum_values = {
"OVERLOADED": ModelErrKind.OVERLOADED,
"CONTEXT_TOO_LONG": ModelErrKind.CONTEXT_TOO_LONG,
"RATE_LIMITED": ModelErrKind.RATE_LIMITED,
"SUBSCRIPTION_QUOTA_EXHAUSTED": ModelErrKind.SUBSCRIPTION_QUOTA_EXHAUSTED,
"OTHER": ModelErrKind.OTHER,
"CACHE_SUPPORT": ModelErrKind.CACHE_SUPPORT,
}
@then('ModelErrKind.{member} should equal "{expected}"')
def step_verify_model_err_kind_value(context, member, expected):
"""Verify ModelErrKind enum member value."""
actual = getattr(ModelErrKind, member)
assert actual.value == expected, f"Expected {expected}, got {actual.value}"
@given("I have a ModelErrKind enum value")
def step_have_model_err_kind_value(context):
"""Have a ModelErrKind enum value."""
context.enum_value = ModelErrKind.RATE_LIMITED
@when("I convert ModelErrKind.{member} to string")
def step_convert_model_err_kind_to_string(context, member):
"""Convert ModelErrKind member to string."""
context.enum_value = getattr(ModelErrKind, member)
context.string_value = str(context.enum_value)
# FallbackType enum tests
@given("I import the FallbackType enum")
def step_import_fallback_type(context):
"""Import the FallbackType enum."""
context.enum_class = FallbackType
context.current_enum = FallbackType
@when("I check all FallbackType values")
def step_check_fallback_type_values(context):
"""Check all FallbackType enum values."""
context.enum_values = {
"ERROR": FallbackType.ERROR,
"CONTEXT": FallbackType.CONTEXT,
"PROVIDER": FallbackType.PROVIDER,
}
@then('FallbackType.{member} should equal "{expected}"')
def step_verify_fallback_type_value(context, member, expected):
"""Verify FallbackType enum member value."""
actual = getattr(FallbackType, member)
assert actual.value == expected, f"Expected {expected}, got {actual.value}"
@given("I have a FallbackType enum value")
def step_have_fallback_type_value(context):
"""Have a FallbackType enum value."""
context.enum_value = FallbackType.ERROR
@when("I convert FallbackType.{member} to string")
def step_convert_fallback_type_to_string(context, member):
"""Convert FallbackType member to string."""
context.enum_value = getattr(FallbackType, member)
context.string_value = str(context.enum_value)
# ModelProvider enum tests
@given("I import the ModelProvider enum")
def step_import_model_provider(context):
"""Import the ModelProvider enum."""
context.enum_class = ModelProvider
context.current_enum = ModelProvider
@when("I check all ModelProvider values")
def step_check_model_provider_values(context):
"""Check all ModelProvider enum values."""
context.enum_values = {
"OPENROUTER": ModelProvider.OPENROUTER,
"OPENAI": ModelProvider.OPENAI,
"ANTHROPIC": ModelProvider.ANTHROPIC,
"ANTHROPIC_CLAUDE_MAX": ModelProvider.ANTHROPIC_CLAUDE_MAX,
"GOOGLE_AI_STUDIO": ModelProvider.GOOGLE_AI_STUDIO,
"GOOGLE_VERTEX": ModelProvider.GOOGLE_VERTEX,
"AZURE_OPENAI": ModelProvider.AZURE_OPENAI,
"DEEPSEEK": ModelProvider.DEEPSEEK,
"PERPLEXITY": ModelProvider.PERPLEXITY,
"AMAZON_BEDROCK": ModelProvider.AMAZON_BEDROCK,
}
@then('ModelProvider.{member} should equal "{expected}"')
def step_verify_model_provider_value(context, member, expected):
"""Verify ModelProvider enum member value."""
actual = getattr(ModelProvider, member)
assert actual.value == expected, f"Expected {expected}, got {actual.value}"
@given("I have a ModelProvider enum value")
def step_have_model_provider_value(context):
"""Have a ModelProvider enum value."""
context.enum_value = ModelProvider.OPENAI
@when("I convert ModelProvider.{member} to string")
def step_convert_model_provider_to_string(context, member):
"""Convert ModelProvider member to string."""
context.enum_value = getattr(ModelProvider, member)
context.string_value = str(context.enum_value)
# Generic enum tests
@then("it should be a string type")
def step_verify_string_type(context):
"""Verify the value is a string."""
assert isinstance(context.string_value, str), (
f"Not a string: {type(context.string_value)}"
)
@then('it should equal "{expected}"')
def step_verify_string_value(context, expected):
"""Verify the string value matches expected."""
# For enums that inherit from str, Enum, the value is the string representation
actual_value = (
context.enum_value.value
if hasattr(context, "enum_value")
else context.string_value
)
assert actual_value == expected, f"Expected {expected}, got {actual_value}"
@when("I check enum membership")
def step_check_enum_membership(context):
"""Check enum membership."""
context.membership_checks = {}
@then('"{value}" should be a valid {enum_name} value')
def step_verify_valid_enum_value(context, value, enum_name):
"""Verify a value is valid for the enum."""
enum_class = context.current_enum
# Check if we can create enum from value
try:
member = enum_class(value)
assert member.value == value
context.membership_checks[value] = True
except ValueError as exc:
raise AssertionError(f"{value} is not a valid {enum_name} value") from exc
@then('"{value}" should not be a valid {enum_name} value')
def step_verify_invalid_enum_value(context, value, enum_name):
"""Verify a value is not valid for the enum."""
enum_class = context.current_enum
# Check that we cannot create enum from value
try:
enum_class(value)
raise AssertionError(f"{value} should not be a valid {enum_name} value")
except ValueError:
context.membership_checks[value] = False
@when("I iterate over all {enum_name} values")
def step_iterate_enum_values(context, enum_name):
"""Iterate over all enum values."""
context.enum_members = list(context.current_enum)
context.member_count = len(context.enum_members)
@then("I should get {count:d} enum members")
def step_verify_enum_count(context, count):
"""Verify the number of enum members."""
assert context.member_count == count, (
f"Expected {count} members, got {context.member_count}"
)
@then("each member should be a {enum_name} instance")
def step_verify_enum_instances(context, enum_name):
"""Verify each member is an instance of the enum."""
for member in context.enum_members:
assert isinstance(member, context.current_enum), (
f"{member} is not a {enum_name} instance"
)
# Enum comparison tests
@given("I have ModelPublisher enum values")
def step_have_model_publisher_values_for_comparison(context):
"""Have ModelPublisher enum values for comparison."""
context.enum1 = ModelPublisher.OPENAI
context.enum2 = ModelPublisher.OPENAI
context.enum3 = ModelPublisher.ANTHROPIC
@when("I compare enum values")
def step_compare_enum_values(context):
"""Compare enum values."""
context.comparison_results = {
"equal": context.enum1 == context.enum2,
"not_equal": context.enum1 != context.enum3,
"same_is": context.enum1 is ModelPublisher.OPENAI,
}
@then("ModelPublisher.OPENAI should equal ModelPublisher.OPENAI")
def step_verify_enum_equality(context):
"""Verify enum equality."""
assert context.comparison_results["equal"], "Enum values should be equal"
@then("ModelPublisher.OPENAI should not equal ModelPublisher.ANTHROPIC")
def step_verify_enum_inequality(context):
"""Verify enum inequality."""
assert context.comparison_results["not_equal"], "Enum values should not be equal"
# Enum attribute tests
@when("I access the name attribute of ModelPublisher.{member}")
def step_access_enum_name(context, member):
"""Access the name attribute of an enum member."""
enum_member = getattr(ModelPublisher, member)
context.enum_name = enum_member.name
@then('the name should be "{expected}"')
def step_verify_enum_name(context, expected):
"""Verify the enum name attribute."""
assert context.enum_name == expected, (
f"Expected name {expected}, got {context.enum_name}"
)
@when("I access the value attribute of ModelPublisher.{member}")
def step_access_enum_value(context, member):
"""Access the value attribute of an enum member."""
enum_member = getattr(ModelPublisher, member)
context.enum_value_attr = enum_member.value
@then('the value should be "{expected}"')
def step_verify_enum_value_attr(context, expected):
"""Verify the enum value attribute."""
assert context.enum_value_attr == expected, (
f"Expected value {expected}, got {context.enum_value_attr}"
)
# Creating enum from value
@when('I create ModelProvider from value "{value}"')
def step_create_enum_from_value(context, value):
"""Create enum from string value."""
try:
context.created_enum = ModelProvider(value)
context.creation_successful = True
except ValueError as e:
context.created_enum = None
context.creation_successful = False
context.creation_error = e
@then("I should get ModelProvider.{member}")
def step_verify_created_enum(context, member):
"""Verify the created enum member."""
expected = getattr(ModelProvider, member)
assert context.creation_successful, "Enum creation failed"
assert context.created_enum == expected, (
f"Expected {expected}, got {context.created_enum}"
)
assert context.created_enum is expected, "Enum instances should be identical"
# Enum hash tests
@given("I have ModelErrKind enum values")
def step_have_model_err_kind_values_for_hash(context):
"""Have ModelErrKind enum values for hash testing."""
context.enum_values_for_hash = [
ModelErrKind.OVERLOADED,
ModelErrKind.RATE_LIMITED,
ModelErrKind.OTHER,
]
@when("I use enum values as dictionary keys")
def step_use_enum_as_dict_keys(context):
"""Use enum values as dictionary keys."""
context.enum_dict = {}
for i, enum_val in enumerate(context.enum_values_for_hash):
context.enum_dict[enum_val] = f"value_{i}"
# Test hash consistency
context.hash_values = [hash(e) for e in context.enum_values_for_hash]
@then("the enum values should work as dictionary keys")
def step_verify_enum_dict_keys(context):
"""Verify enums work as dictionary keys."""
assert len(context.enum_dict) == len(context.enum_values_for_hash)
# Verify we can retrieve values
assert context.enum_dict[ModelErrKind.OVERLOADED] == "value_0"
assert context.enum_dict[ModelErrKind.RATE_LIMITED] == "value_1"
assert context.enum_dict[ModelErrKind.OTHER] == "value_2"
@then("the hash should be consistent")
def step_verify_hash_consistency(context):
"""Verify hash values are consistent."""
# Re-hash the same enums
new_hash_values = [hash(e) for e in context.enum_values_for_hash]
# Hashes should be the same
for old_hash, new_hash in zip(context.hash_values, new_hash_values, strict=False):
assert old_hash == new_hash, "Hash values should be consistent"
# Enum string representation tests
@when("I get the string representation")
def step_get_string_representation(context):
"""Get string representation of enum."""
context.repr_value = repr(context.enum_value)
context.str_value = str(context.enum_value)
@then('repr should contain "{expected}"')
def step_verify_repr_contains(context, expected):
"""Verify repr contains expected string."""
assert expected in context.repr_value, (
f"'{expected}' not in repr: {context.repr_value}"
)
@then('str should equal "{expected}"')
def step_verify_str_equals(context, expected):
"""Verify str equals expected."""
# For str, Enum classes, str() returns the value, not the name
assert context.enum_value.value == expected, (
f"Expected str '{expected}', got '{context.enum_value.value}'"
)