fix(test): fix ResourceRepository test mock exhaustion on retry
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 1m0s
CI / quality (pull_request) Successful in 1m4s
CI / benchmark-regression (pull_request) Failing after 1m9s
CI / typecheck (pull_request) Successful in 1m23s
CI / security (pull_request) Successful in 1m35s
CI / build (pull_request) Successful in 43s
CI / helm (pull_request) Successful in 50s
CI / push-validation (pull_request) Successful in 50s
CI / unit_tests (pull_request) Failing after 3m34s
CI / coverage (pull_request) Has been skipped
CI / docker (pull_request) Has been skipped
CI / integration_tests (pull_request) Successful in 4m4s
CI / e2e_tests (pull_request) Successful in 4m13s
CI / status-check (pull_request) Failing after 13s
CI / benchmark-publish (pull_request) Has been skipped
CI / lint (pull_request) Successful in 1m0s
CI / quality (pull_request) Successful in 1m4s
CI / benchmark-regression (pull_request) Failing after 1m9s
CI / typecheck (pull_request) Successful in 1m23s
CI / security (pull_request) Successful in 1m35s
CI / build (pull_request) Successful in 43s
CI / helm (pull_request) Successful in 50s
CI / push-validation (pull_request) Successful in 50s
CI / unit_tests (pull_request) Failing after 3m34s
CI / coverage (pull_request) Has been skipped
CI / docker (pull_request) Has been skipped
CI / integration_tests (pull_request) Successful in 4m4s
CI / e2e_tests (pull_request) Successful in 4m13s
CI / status-check (pull_request) Failing after 13s
The @database_retry decorator retries on DatabaseError up to 3 times. The ResourceRepository test used a side_effect list with only 2 items for session.query().filter_by().first(), which was exhausted on the second retry attempt, causing StopIteration to propagate unexpectedly. Fix: replace the side_effect list with a side_effect function that dispatches based on the model class being queried, ensuring the correct mock value is returned on every retry attempt.
This commit is contained in:
@@ -268,11 +268,23 @@ def step_create_resource(context: Context) -> None:
|
||||
# Configure the session to return a resource type row (so type validation passes)
|
||||
type_row_mock = MagicMock()
|
||||
type_row_mock.name = "test/resource-type"
|
||||
query_mock = MagicMock()
|
||||
# First query (for resource type) returns the type row
|
||||
# Second query (for existing resource) returns None
|
||||
query_mock.filter_by.return_value.first.side_effect = [type_row_mock, None]
|
||||
context.shared_session.query.return_value = query_mock
|
||||
|
||||
# Use a side_effect function on session.query so that each call returns
|
||||
# the correct mock regardless of how many times the @database_retry
|
||||
# decorator retries the operation.
|
||||
from cleveragents.infrastructure.database.models import ResourceTypeModel
|
||||
|
||||
def query_side_effect(model_class: Any) -> MagicMock:
|
||||
q = MagicMock()
|
||||
if model_class is ResourceTypeModel:
|
||||
# Type-lookup query: always return the type row
|
||||
q.filter_by.return_value.first.return_value = type_row_mock
|
||||
else:
|
||||
# Duplicate-check query: always return None (no existing resource)
|
||||
q.filter_by.return_value.first.return_value = None
|
||||
return q
|
||||
|
||||
context.shared_session.query.side_effect = query_side_effect
|
||||
try:
|
||||
context.repo_under_test.create(_make_fake_resource())
|
||||
except Exception as exc:
|
||||
|
||||
Reference in New Issue
Block a user