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
410 lines
14 KiB
Python
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}'"
|
|
)
|