Fix/sys integration issues (#494)

* Fix integration issues

* Fix query defaults

* Fix tests
This commit is contained in:
cybermaggedon 2025-09-05 08:38:15 +01:00 committed by GitHub
parent ed0e02791d
commit 50c37407c5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 341 additions and 133 deletions

View file

@ -93,9 +93,17 @@ class TestStructuredQueryServiceIntegration:
mock_objects_client = AsyncMock()
mock_objects_client.request.return_value = objects_response
integration_processor.client.side_effect = lambda name: (
mock_nlp_client if name == "nlp-query-request" else mock_objects_client
)
# Mock flow context to route to appropriate services
def flow_router(service_name):
if service_name == "nlp-query-request":
return mock_nlp_client
elif service_name == "objects-query-request":
return mock_objects_client
elif service_name == "response":
return flow_response
else:
return AsyncMock()
flow.side_effect = flow_router
# Act - Process the message
await integration_processor.on_message(msg, consumer, flow)
@ -116,7 +124,7 @@ class TestStructuredQueryServiceIntegration:
assert "orders" in objects_call_args.query
assert objects_call_args.variables["minAmount"] == "500.0" # Converted to string
assert objects_call_args.variables["state"] == "California"
assert objects_call_args.user == "default"
assert objects_call_args.user == "trustgraph"
assert objects_call_args.collection == "default"
# Verify response
@ -159,7 +167,15 @@ class TestStructuredQueryServiceIntegration:
mock_nlp_client = AsyncMock()
mock_nlp_client.request.return_value = nlp_error_response
integration_processor.client.return_value = mock_nlp_client
# Mock flow context to route to nlp service
def flow_router(service_name):
if service_name == "nlp-query-request":
return mock_nlp_client
elif service_name == "response":
return flow_response
else:
return AsyncMock()
flow.side_effect = flow_router
# Act
await integration_processor.on_message(msg, consumer, flow)
@ -215,9 +231,17 @@ class TestStructuredQueryServiceIntegration:
mock_objects_client = AsyncMock()
mock_objects_client.request.return_value = objects_error_response
integration_processor.client.side_effect = lambda name: (
mock_nlp_client if name == "nlp-query-request" else mock_objects_client
)
# Mock flow context to route to appropriate services
def flow_router(service_name):
if service_name == "nlp-query-request":
return mock_nlp_client
elif service_name == "objects-query-request":
return mock_objects_client
elif service_name == "response":
return flow_response
else:
return AsyncMock()
flow.side_effect = flow_router
# Act
await integration_processor.on_message(msg, consumer, flow)
@ -285,9 +309,17 @@ class TestStructuredQueryServiceIntegration:
mock_objects_client = AsyncMock()
mock_objects_client.request.return_value = objects_response
integration_processor.client.side_effect = lambda name: (
mock_nlp_client if name == "nlp-query-request" else mock_objects_client
)
# Mock flow context to route to appropriate services
def flow_router(service_name):
if service_name == "nlp-query-request":
return mock_nlp_client
elif service_name == "objects-query-request":
return mock_objects_client
elif service_name == "response":
return flow_response
else:
return AsyncMock()
flow.side_effect = flow_router
# Act
await integration_processor.on_message(msg, consumer, flow)
@ -405,9 +437,17 @@ class TestStructuredQueryServiceIntegration:
mock_objects_client = AsyncMock()
mock_objects_client.request.return_value = objects_response
integration_processor.client.side_effect = lambda name: (
mock_nlp_client if name == "nlp-query-request" else mock_objects_client
)
# Mock flow context to route to appropriate services
def flow_router(service_name):
if service_name == "nlp-query-request":
return mock_nlp_client
elif service_name == "objects-query-request":
return mock_objects_client
elif service_name == "response":
return flow_response
else:
return AsyncMock()
flow.side_effect = flow_router
# Act
await integration_processor.on_message(msg, consumer, flow)
@ -474,9 +514,17 @@ class TestStructuredQueryServiceIntegration:
mock_objects_client = AsyncMock()
mock_objects_client.request.return_value = objects_response
integration_processor.client.side_effect = lambda name: (
mock_nlp_client if name == "nlp-query-request" else mock_objects_client
)
# Mock flow context to route to appropriate services
def flow_router(service_name):
if service_name == "nlp-query-request":
return mock_nlp_client
elif service_name == "objects-query-request":
return mock_objects_client
elif service_name == "response":
return flow_response
else:
return AsyncMock()
flow.side_effect = flow_router
# Act
await integration_processor.on_message(msg, consumer, flow)
@ -514,34 +562,51 @@ class TestStructuredQueryServiceIntegration:
messages.append(msg)
flows.append(flow)
# Mock responses for all requests (6 total: 3 NLP + 3 Objects)
mock_responses = []
for i in range(6):
if i % 2 == 0: # NLP responses
mock_responses.append(QuestionToStructuredQueryResponse(
error=None,
graphql_query=f'query {{ test_{i//2} {{ id }} }}',
variables={},
detected_schemas=[f"test_{i//2}"],
confidence=0.9
))
else: # Objects responses
mock_responses.append(ObjectsQueryResponse(
error=None,
data=f'{{"test_{i//2}": [{{"id": "{i//2}"}}]}}',
errors=None,
extensions={}
))
# Set up individual flow routing for each concurrent request
service_call_count = 0
call_count = 0
def mock_client_side_effect(name):
nonlocal call_count
client = AsyncMock()
client.request.return_value = mock_responses[call_count]
call_count += 1
return client
integration_processor.client.side_effect = mock_client_side_effect
for i in range(3): # 3 concurrent requests
# Create NLP and Objects responses for this request
nlp_response = QuestionToStructuredQueryResponse(
error=None,
graphql_query=f'query {{ test_{i} {{ id }} }}',
variables={},
detected_schemas=[f"test_{i}"],
confidence=0.9
)
objects_response = ObjectsQueryResponse(
error=None,
data=f'{{"test_{i}": [{{"id": "{i}"}}]}}',
errors=None,
extensions={}
)
# Create mock services for this request
mock_nlp_client = AsyncMock()
mock_nlp_client.request.return_value = nlp_response
mock_objects_client = AsyncMock()
mock_objects_client.request.return_value = objects_response
# Set up flow routing for this specific request
flow_response = flows[i].return_value
def create_flow_router(nlp_client, objects_client, response_producer):
def flow_router(service_name):
nonlocal service_call_count
if service_name == "nlp-query-request":
service_call_count += 1
return nlp_client
elif service_name == "objects-query-request":
service_call_count += 1
return objects_client
elif service_name == "response":
return response_producer
else:
return AsyncMock()
return flow_router
flows[i].side_effect = create_flow_router(mock_nlp_client, mock_objects_client, flow_response)
# Act - Process all messages concurrently
import asyncio
@ -555,7 +620,7 @@ class TestStructuredQueryServiceIntegration:
await asyncio.gather(*tasks)
# Assert - All requests should be processed
assert call_count == 6 # 2 calls per request (NLP + Objects)
assert service_call_count == 6 # 2 calls per request (NLP + Objects)
for flow in flows:
flow.return_value.send.assert_called_once()
@ -580,7 +645,15 @@ class TestStructuredQueryServiceIntegration:
mock_nlp_client = AsyncMock()
mock_nlp_client.request.side_effect = Exception("Service timeout: Request took longer than 30s")
integration_processor.client.return_value = mock_nlp_client
# Mock flow context to route to nlp service
def flow_router(service_name):
if service_name == "nlp-query-request":
return mock_nlp_client
elif service_name == "response":
return flow_response
else:
return AsyncMock()
flow.side_effect = flow_router
# Act
await integration_processor.on_message(msg, consumer, flow)
@ -638,9 +711,17 @@ class TestStructuredQueryServiceIntegration:
mock_objects_client = AsyncMock()
mock_objects_client.request.return_value = objects_response
integration_processor.client.side_effect = lambda name: (
mock_nlp_client if name == "nlp-query-request" else mock_objects_client
)
# Mock flow context to route to appropriate services
def flow_router(service_name):
if service_name == "nlp-query-request":
return mock_nlp_client
elif service_name == "objects-query-request":
return mock_objects_client
elif service_name == "response":
return flow_response
else:
return AsyncMock()
flow.side_effect = flow_router
# Act
await integration_processor.on_message(msg, consumer, flow)