@ -951,11 +951,6 @@ class TurnDecisionContractTests(unittest.IsolatedAsyncioTestCase):
service . _fallback_format_tool_result = lambda tool_name , tool_result : (
f " Pedido { tool_result [ ' numero_pedido ' ] } atualizado. \n Status: { tool_result [ ' status ' ] } "
)
async def fake_render_tool_response_with_fallback ( * * kwargs ) :
return " nao deveria usar llm "
service . _render_tool_response_with_fallback = fake_render_tool_response_with_fallback
service . _http_exception_detail = lambda exc : str ( exc )
service . _is_low_value_response = lambda text : False
@ -1438,6 +1433,152 @@ class TurnDecisionContractTests(unittest.IsolatedAsyncioTestCase):
self . assertIn ( " Encontrei 2 veiculo(s): " , response )
async def test_handle_message_prioritizes_order_flow_for_explicit_order_request_without_extracted_fields ( self ) :
state = FakeState (
contexts = {
1 : {
" active_domain " : " general " ,
" generic_memory " : { } ,
" shared_memory " : { } ,
" order_queue " : [ ] ,
" pending_order_selection " : None ,
" pending_switch " : None ,
" last_stock_results " : [ ] ,
" selected_vehicle " : None ,
}
}
)
service = OrquestradorService . __new__ ( OrquestradorService )
service . state = state
service . normalizer = EntityNormalizer ( )
service . policy = ConversationPolicy ( service = service )
service . _empty_extraction_payload = service . normalizer . empty_extraction_payload
service . _log_turn_event = lambda * args , * * kwargs : None
service . _compose_order_aware_response = lambda response , user_id , queue_notice = None : response
async def fake_maybe_auto_advance_next_order ( base_response : str , user_id : int | None ) :
return base_response
service . _maybe_auto_advance_next_order = fake_maybe_auto_advance_next_order
service . _upsert_user_context = lambda user_id : None
async def fake_extract_turn_decision ( message : str , user_id : int | None ) :
return {
" intent " : " general " ,
" domain " : " general " ,
" action " : " answer_user " ,
" entities " : {
" generic_memory " : { } ,
" review_fields " : { } ,
" review_management_fields " : { } ,
" order_fields " : { } ,
" cancel_order_fields " : { } ,
} ,
" missing_fields " : [ ] ,
" selection_index " : None ,
" tool_name " : None ,
" tool_arguments " : { } ,
" response_to_user " : " Claro! Voce gostaria de fazer um pedido de um veiculo ou agendar uma revisao? " ,
}
service . _extract_turn_decision_with_llm = fake_extract_turn_decision
async def fake_try_resolve_pending_order_selection ( * * kwargs ) :
return None
service . _try_resolve_pending_order_selection = fake_try_resolve_pending_order_selection
async def fake_try_continue_queued_order ( * * kwargs ) :
return None
service . _try_continue_queued_order = fake_try_continue_queued_order
async def fake_extract_message_plan ( message : str , user_id : int | None ) :
return {
" orders " : [
{
" domain " : " sales " ,
" message " : message ,
" entities " : service . normalizer . empty_extraction_payload ( ) ,
}
]
}
service . _extract_message_plan_with_llm = fake_extract_message_plan
service . _prepare_message_for_single_order = lambda message , user_id , routing_plan = None : ( message , None , None )
service . _resolve_entities_for_message_plan = lambda message_plan , routed_message : service . normalizer . empty_extraction_payload ( )
async def fake_extract_entities ( message : str , user_id : int | None ) :
return {
" generic_memory " : { } ,
" review_fields " : { } ,
" review_management_fields " : { } ,
" order_fields " : { } ,
" cancel_order_fields " : { } ,
" intents " : { } ,
}
service . _extract_entities_with_llm = fake_extract_entities
async def fake_extract_missing_sales_search_context_with_llm ( * * kwargs ) :
return { }
service . _extract_missing_sales_search_context_with_llm = fake_extract_missing_sales_search_context_with_llm
service . _domain_from_intents = lambda intents : " general "
service . _handle_context_switch = lambda * * kwargs : None
service . _update_active_domain = lambda * * kwargs : None
async def fake_try_execute_orchestration_control_tool ( * * kwargs ) :
return None
service . _try_execute_orchestration_control_tool = fake_try_execute_orchestration_control_tool
async def fake_try_execute_business_tool_from_turn_decision ( * * kwargs ) :
return None
service . _try_execute_business_tool_from_turn_decision = fake_try_execute_business_tool_from_turn_decision
async def fake_try_handle_review_management ( * * kwargs ) :
return None
service . _try_handle_review_management = fake_try_handle_review_management
async def fake_try_confirm_pending_review ( * * kwargs ) :
return None
service . _try_confirm_pending_review = fake_try_confirm_pending_review
async def fake_try_collect_and_schedule_review ( * * kwargs ) :
return None
service . _try_collect_and_schedule_review = fake_try_collect_and_schedule_review
async def fake_try_collect_and_cancel_order ( * * kwargs ) :
return None
service . _try_collect_and_cancel_order = fake_try_collect_and_cancel_order
async def fake_try_handle_order_listing ( * * kwargs ) :
return None
service . _try_handle_order_listing = fake_try_handle_order_listing
async def fake_try_collect_and_create_order ( * * kwargs ) :
return (
" Para seguir com o pedido, me diga qual carro voce procura. \n "
" Se preferir, posso listar opcoes por faixa de preco, modelo ou tipo de carro. "
)
service . _try_collect_and_create_order = fake_try_collect_and_create_order
response = await service . handle_message (
" Quero fazer um pedido " ,
user_id = 1 ,
)
self . assertIn ( " Para seguir com o pedido " , response )
self . assertNotIn ( " Qual veiculo voce gostaria de pedir " , response )
def test_should_prioritize_review_flow_when_review_draft_is_open ( self ) :
state = FakeState (
entries = {
@ -2568,6 +2709,70 @@ class TurnDecisionContractTests(unittest.IsolatedAsyncioTestCase):
self . assertIsNone ( response )
self . assertIsNotNone ( state . get_entry ( " pending_order_drafts " , 1 ) )
async def test_active_sales_follow_up_prioritizes_cancel_order_over_stale_order_create_draft ( self ) :
state = FakeState (
entries = {
" pending_order_drafts " : {
1 : {
" payload " : {
" cpf " : " 12345678909 " ,
" vehicle_id " : 15 ,
" modelo_veiculo " : " Volkswagen T-Cross 2022 " ,
" valor_veiculo " : 73224.0 ,
} ,
" expires_at " : utc_now ( ) + timedelta ( minutes = 15 ) ,
}
} ,
" pending_cancel_order_drafts " : {
1 : {
" payload " : { " numero_pedido " : " PED-20260312110556-BBA37F " } ,
" expires_at " : utc_now ( ) + timedelta ( minutes = 15 ) ,
}
} ,
} ,
contexts = {
1 : {
" active_domain " : " sales " ,
" active_task " : " order_cancel " ,
" generic_memory " : { " cpf " : " 12345678909 " } ,
" shared_memory " : { " cpf " : " 12345678909 " } ,
" order_queue " : [ ] ,
" pending_order_selection " : None ,
" pending_switch " : None ,
" last_stock_results " : [ ] ,
" selected_vehicle " : None ,
}
} ,
)
service = OrquestradorService . __new__ ( OrquestradorService )
service . state = state
service . normalizer = EntityNormalizer ( )
service . _get_user_context = lambda user_id : state . get_user_context ( user_id )
service . _save_user_context = lambda user_id , context : state . save_user_context ( user_id , context )
async def fake_try_collect_and_create_order ( * * kwargs ) :
raise AssertionError ( " nao deveria priorizar order_create enquanto order_cancel aguarda motivo " )
async def fake_try_collect_and_cancel_order ( * * kwargs ) :
self . assertEqual ( kwargs [ " message " ] , " desisti da compra " )
self . assertEqual ( kwargs [ " user_id " ] , 1 )
return " Pedido PED-20260312110556-BBA37F atualizado. \n Status: Cancelado "
service . _try_collect_and_create_order = fake_try_collect_and_create_order
service . _try_collect_and_cancel_order = fake_try_collect_and_cancel_order
async def finish ( response : str , queue_notice : str | None = None ) :
return response
response = await service . _try_handle_active_sales_follow_up (
message = " desisti da compra " ,
user_id = 1 ,
finish = finish ,
)
self . assertIn ( " Pedido PED-20260312110556-BBA37F atualizado. " , response )
self . assertIn ( " Status: Cancelado " , response )
async def test_active_sales_follow_up_allows_new_budget_search_to_reset_open_order_draft ( self ) :
state = FakeState (
entries = {
@ -2746,57 +2951,135 @@ class TurnDecisionContractTests(unittest.IsolatedAsyncioTestCase):
self . assertTrue ( prioritized )
async def test_pending_order_selection_prefers_turn_decision_domain ( self ) :
def test_should_prioritize_order_flow_for_explicit_order_request_without_entities ( self ) :
state = FakeState (
contexts = {
9 : {
" pending_order_selection " : {
" orders " : [
{ " domain " : " review " , " message " : " agendar revisao " , " memory_seed " : { } } ,
{ " domain " : " sales " , " message " : " fazer pedido " , " memory_seed " : { } } ,
] ,
" expires_at " : utc_now ( ) + timedelta ( minutes = 15 ) ,
} ,
" order_queue " : [ ] ,
1 : {
" active_domain " : " general " ,
" generic_memory " : { } ,
" shared_memory " : { } ,
" last_stock_results " : [ ] ,
" selected_vehicle " : None ,
}
}
)
policy = ConversationPolicy ( service = FakePolicyService ( state ) )
service = OrquestradorService . __new__ ( OrquestradorService )
service . state = state
service . normalizer = EntityNormalizer ( )
service . _get_user_context = lambda user_id : state . get_user_context ( user_id )
response = await policy . try_resolve_pending_order_selection (
message = " quero comprar " ,
user_id = 9 ,
turn_decision = { " domain " : " sales " , " intent " : " order_create " , " action " : " collect_order_create " } ,
prioritized = service . _should_prioritize_order_flow (
turn_decision = { " intent " : " order_create " , " domain " : " sales " , " action " : " answer_user " } ,
extracted_entities = {
" generic_memory " : { } ,
" review_fields " : { } ,
" review_management_fields " : { } ,
" order_fields " : { } ,
" cancel_order_fields " : { } ,
" intents " : { } ,
} ,
user_id = 1 ,
message = " Quero fazer um pedido " ,
)
self . assertIn ( " Vou comecar por: Venda: fazer pedido " , response )
self . assert True( prioritized )
async def test_pending_order_selection_prefers_turn_decision_selection_index ( self ) :
def test_should_prioritize_order_flow_for_explicit_order_request_even_when_model_returns_general ( self ) :
state = FakeState (
contexts = {
9 : {
" pending_order_selection " : {
" orders " : [
{ " domain " : " review " , " message " : " agendar revisao " , " memory_seed " : { } } ,
{ " domain " : " sales " , " message " : " fazer pedido " , " memory_seed " : { } } ,
] ,
" expires_at " : utc_now ( ) + timedelta ( minutes = 15 ) ,
} ,
" order_queue " : [ ] ,
1 : {
" active_domain " : " general " ,
" generic_memory " : { } ,
" shared_memory " : { } ,
" last_stock_results " : [ ] ,
" selected_vehicle " : None ,
}
}
)
policy = ConversationPolicy ( service = FakePolicyService ( state ) )
response = await policy . try_resolve_pending_order_selection (
message = " esse " ,
user_id = 9 ,
turn_decision = { " domain " : " general " , " intent " : " general " , " action " : " answer_user " , " selection_index " : 1 } ,
)
service = OrquestradorService . __new__ ( OrquestradorService )
service . state = state
service . normalizer = EntityNormalizer ( )
service . _get_user_context = lambda user_id : state . get_user_context ( user_id )
prioritized = service . _should_prioritize_order_flow (
turn_decision = { " intent " : " general " , " domain " : " general " , " action " : " answer_user " } ,
extracted_entities = {
" generic_memory " : { } ,
" review_fields " : { } ,
" review_management_fields " : { } ,
" order_fields " : { } ,
" cancel_order_fields " : { } ,
" intents " : { } ,
} ,
user_id = 1 ,
message = " Quero fazer um pedido " ,
)
self . assertTrue ( prioritized )
def test_normalize_tool_name_maps_trade_in_alias_and_arguments ( self ) :
normalizer = EntityNormalizer ( )
tool_name = normalizer . normalize_tool_name ( " avaliar_troca_veiculo " )
arguments = normalizer . normalize_tool_arguments (
tool_name ,
{ " modelo " : " Onix " , " ano " : 2020 , " quilometragem " : 45000 } ,
)
self . assertEqual ( tool_name , " avaliar_veiculo_troca " )
self . assertEqual ( arguments , { " modelo " : " Onix " , " ano " : 2020 , " km " : 45000 } )
async def test_pending_order_selection_prefers_turn_decision_domain ( self ) :
state = FakeState (
contexts = {
9 : {
" pending_order_selection " : {
" orders " : [
{ " domain " : " review " , " message " : " agendar revisao " , " memory_seed " : { } } ,
{ " domain " : " sales " , " message " : " fazer pedido " , " memory_seed " : { } } ,
] ,
" expires_at " : utc_now ( ) + timedelta ( minutes = 15 ) ,
} ,
" order_queue " : [ ] ,
" active_domain " : " general " ,
" generic_memory " : { } ,
}
}
)
policy = ConversationPolicy ( service = FakePolicyService ( state ) )
response = await policy . try_resolve_pending_order_selection (
message = " quero comprar " ,
user_id = 9 ,
turn_decision = { " domain " : " sales " , " intent " : " order_create " , " action " : " collect_order_create " } ,
)
self . assertIn ( " Vou comecar por: Venda: fazer pedido " , response )
async def test_pending_order_selection_prefers_turn_decision_selection_index ( self ) :
state = FakeState (
contexts = {
9 : {
" pending_order_selection " : {
" orders " : [
{ " domain " : " review " , " message " : " agendar revisao " , " memory_seed " : { } } ,
{ " domain " : " sales " , " message " : " fazer pedido " , " memory_seed " : { } } ,
] ,
" expires_at " : utc_now ( ) + timedelta ( minutes = 15 ) ,
} ,
" order_queue " : [ ] ,
" active_domain " : " general " ,
" generic_memory " : { } ,
}
}
)
policy = ConversationPolicy ( service = FakePolicyService ( state ) )
response = await policy . try_resolve_pending_order_selection (
message = " esse " ,
user_id = 9 ,
turn_decision = { " domain " : " general " , " intent " : " general " , " action " : " answer_user " , " selection_index " : 1 } ,
)
self . assertIn ( " Vou comecar por: Venda: fazer pedido " , response )
@ -2898,5 +3181,329 @@ class TurnDecisionContractTests(unittest.IsolatedAsyncioTestCase):
self . assertEqual ( service . _get_user_context ( 9 ) . get ( " order_queue " ) , [ ] )
async def test_tool_continuar_proximo_pedido_reports_empty_queue ( self ) :
state = FakeState (
contexts = {
1 : {
" active_domain " : " sales " ,
" generic_memory " : { } ,
" shared_memory " : { } ,
" order_queue " : [ ] ,
" pending_order_selection " : None ,
" pending_switch " : None ,
" last_stock_results " : [ ] ,
" selected_vehicle " : None ,
}
}
)
service = OrquestradorService . __new__ ( OrquestradorService )
service . state = state
service . normalizer = EntityNormalizer ( )
service . policy = ConversationPolicy ( service = service )
service . _get_user_context = lambda user_id : state . get_user_context ( user_id )
service . _save_user_context = lambda user_id , context : state . save_user_context ( user_id , context )
response = await service . _tool_continuar_proximo_pedido ( user_id = 1 )
self . assertEqual ( response , " Nao ha pedidos pendentes na fila para continuar. " )
async def test_tool_cancelar_fluxo_atual_preserves_queue ( self ) :
state = FakeState (
entries = {
" pending_order_drafts " : {
1 : {
" payload " : { " vehicle_id " : 7 } ,
" expires_at " : utc_now ( ) + timedelta ( minutes = 15 ) ,
}
}
} ,
contexts = {
1 : {
" active_domain " : " sales " ,
" active_task " : " order_create " ,
" generic_memory " : { " orcamento_max " : 70000 } ,
" shared_memory " : { " orcamento_max " : 70000 } ,
" order_queue " : [ { " domain " : " review " , " message " : " agendar revisao " } ] ,
" pending_order_selection " : None ,
" pending_switch " : None ,
" last_stock_results " : [ { " id " : 7 , " modelo " : " Fiat Argo 2020 " , " categoria " : " suv " , " preco " : 61857.0 } ] ,
" selected_vehicle " : { " id " : 7 , " modelo " : " Fiat Argo 2020 " , " categoria " : " suv " , " preco " : 61857.0 } ,
}
}
)
service = OrquestradorService . __new__ ( OrquestradorService )
service . state = state
service . normalizer = EntityNormalizer ( )
service . policy = ConversationPolicy ( service = service )
service . _get_user_context = lambda user_id : state . get_user_context ( user_id )
service . _save_user_context = lambda user_id , context : state . save_user_context ( user_id , context )
result = await service . _tool_cancelar_fluxo_atual ( user_id = 1 )
self . assertEqual ( result [ " message " ] , " Fluxo atual de compra de veiculo cancelado. " )
self . assertIsNone ( state . get_entry ( " pending_order_drafts " , 1 ) )
self . assertEqual ( state . get_user_context ( 1 ) [ " order_queue " ] , [ { " domain " : " review " , " message " : " agendar revisao " } ] )
async def test_tool_descartar_pedidos_pendentes_preserves_active_flow ( self ) :
state = FakeState (
entries = {
" pending_order_drafts " : {
1 : {
" payload " : { " vehicle_id " : 7 } ,
" expires_at " : utc_now ( ) + timedelta ( minutes = 15 ) ,
}
}
} ,
contexts = {
1 : {
" active_domain " : " sales " ,
" active_task " : " order_create " ,
" generic_memory " : { " orcamento_max " : 70000 } ,
" shared_memory " : { " orcamento_max " : 70000 } ,
" order_queue " : [ { " domain " : " review " , " message " : " agendar revisao " } ] ,
" pending_order_selection " : {
" orders " : [
{ " domain " : " sales " , " message " : " comprar carro " } ,
{ " domain " : " review " , " message " : " remarcar revisao " } ,
] ,
" expires_at " : utc_now ( ) + timedelta ( minutes = 15 ) ,
} ,
" pending_switch " : {
" target_domain " : " review " ,
" queued_message " : " agendar revisao " ,
" expires_at " : utc_now ( ) + timedelta ( minutes = 15 ) ,
} ,
" last_stock_results " : [ ] ,
" selected_vehicle " : None ,
}
}
)
service = OrquestradorService . __new__ ( OrquestradorService )
service . state = state
service . normalizer = EntityNormalizer ( )
service . policy = ConversationPolicy ( service = service )
service . _get_user_context = lambda user_id : state . get_user_context ( user_id )
service . _save_user_context = lambda user_id , context : state . save_user_context ( user_id , context )
result = await service . _tool_descartar_pedidos_pendentes ( user_id = 1 )
self . assertEqual ( result [ " message " ] , " Descartei 4 pedidos pendentes da fila. " )
self . assertIsNotNone ( state . get_entry ( " pending_order_drafts " , 1 ) )
self . assertEqual ( state . get_user_context ( 1 ) [ " order_queue " ] , [ ] )
self . assertIsNone ( state . get_user_context ( 1 ) [ " pending_order_selection " ] )
self . assertIsNone ( state . get_user_context ( 1 ) [ " pending_switch " ] )
async def test_handle_message_prioritizes_trade_in_evaluation_over_freeform_answer ( self ) :
state = FakeState (
contexts = {
1 : {
" active_domain " : " general " ,
" generic_memory " : { } ,
" shared_memory " : { } ,
" order_queue " : [ ] ,
" pending_order_selection " : None ,
" pending_switch " : None ,
" last_stock_results " : [ ] ,
" selected_vehicle " : None ,
}
}
)
service = OrquestradorService . __new__ ( OrquestradorService )
service . state = state
service . normalizer = EntityNormalizer ( )
service . policy = ConversationPolicy ( service = service )
service . tool_executor = FakeToolExecutor (
result = {
" modelo " : " Onix " ,
" ano " : 2020 ,
" km " : 45000 ,
" valor_estimado_troca " : 65432.0 ,
}
)
service . _empty_extraction_payload = service . normalizer . empty_extraction_payload
service . _log_turn_event = lambda * args , * * kwargs : None
service . _compose_order_aware_response = lambda response , user_id , queue_notice = None : response
service . _fallback_format_tool_result = lambda tool_name , tool_result : (
" Estimativa de troca concluida. \n "
f " Veiculo: { tool_result [ ' modelo ' ] } { tool_result [ ' ano ' ] } \n "
f " Quilometragem: { tool_result [ ' km ' ] } km \n "
f " Valor estimado: R$ { tool_result [ ' valor_estimado_troca ' ] : .2f } "
)
service . _http_exception_detail = lambda exc : str ( exc )
service . _get_user_context = lambda user_id : state . get_user_context ( user_id )
service . _save_user_context = lambda user_id , context : state . save_user_context ( user_id , context )
async def fake_maybe_auto_advance_next_order ( base_response : str , user_id : int | None ) :
return base_response
service . _maybe_auto_advance_next_order = fake_maybe_auto_advance_next_order
service . _upsert_user_context = lambda user_id : None
async def fake_try_handle_pending_stock_selection_follow_up ( * * kwargs ) :
return None
service . _try_handle_pending_stock_selection_follow_up = fake_try_handle_pending_stock_selection_follow_up
async def fake_try_handle_active_sales_follow_up ( * * kwargs ) :
return None
service . _try_handle_active_sales_follow_up = fake_try_handle_active_sales_follow_up
async def fake_try_handle_active_review_follow_up ( * * kwargs ) :
return None
service . _try_handle_active_review_follow_up = fake_try_handle_active_review_follow_up
async def fake_try_handle_immediate_context_reset ( * * kwargs ) :
return None
service . _try_handle_immediate_context_reset = fake_try_handle_immediate_context_reset
async def fake_try_resolve_pending_order_selection ( * * kwargs ) :
return None
service . _try_resolve_pending_order_selection = fake_try_resolve_pending_order_selection
async def fake_try_continue_queued_order ( * * kwargs ) :
return None
service . _try_continue_queued_order = fake_try_continue_queued_order
async def fake_extract_turn_decision ( message : str , user_id : int | None ) :
return {
" intent " : " general " ,
" domain " : " general " ,
" action " : " answer_user " ,
" entities " : service . normalizer . empty_extraction_payload ( ) ,
" missing_fields " : [ ] ,
" selection_index " : None ,
" tool_name " : None ,
" tool_arguments " : { } ,
" response_to_user " : " Legal! Para fazer a avaliacao, preciso da versao e da placa. " ,
}
service . _extract_turn_decision_with_llm = fake_extract_turn_decision
async def fake_extract_message_plan ( message : str , user_id : int | None ) :
return {
" orders " : [
{
" domain " : " sales " ,
" message " : message ,
" entities " : service . normalizer . empty_extraction_payload ( ) ,
}
]
}
service . _extract_message_plan_with_llm = fake_extract_message_plan
service . _prepare_message_for_single_order = lambda message , user_id , routing_plan = None : ( message , None , None )
service . _resolve_entities_for_message_plan = lambda message_plan , routed_message : service . normalizer . empty_extraction_payload ( )
async def fake_extract_entities ( message : str , user_id : int | None ) :
return service . normalizer . empty_extraction_payload ( )
service . _extract_entities_with_llm = fake_extract_entities
async def fake_extract_missing_sales_search_context_with_llm ( * * kwargs ) :
return { }
service . _extract_missing_sales_search_context_with_llm = fake_extract_missing_sales_search_context_with_llm
service . _domain_from_intents = lambda intents : " general "
service . _handle_context_switch = lambda * * kwargs : None
service . _update_active_domain = lambda * * kwargs : None
async def fake_try_execute_orchestration_control_tool ( * * kwargs ) :
return None
service . _try_execute_orchestration_control_tool = fake_try_execute_orchestration_control_tool
async def fake_try_handle_review_management ( * * kwargs ) :
raise AssertionError ( " nao deveria entrar em gerenciamento de revisao para avaliacao de troca " )
service . _try_handle_review_management = fake_try_handle_review_management
async def fake_try_confirm_pending_review ( * * kwargs ) :
raise AssertionError ( " nao deveria entrar em confirmacao de revisao para avaliacao de troca " )
service . _try_confirm_pending_review = fake_try_confirm_pending_review
async def fake_try_collect_and_schedule_review ( * * kwargs ) :
raise AssertionError ( " nao deveria entrar em agendamento de revisao para avaliacao de troca " )
service . _try_collect_and_schedule_review = fake_try_collect_and_schedule_review
async def fake_try_collect_and_cancel_order ( * * kwargs ) :
raise AssertionError ( " nao deveria entrar em cancelamento de pedido para avaliacao de troca " )
service . _try_collect_and_cancel_order = fake_try_collect_and_cancel_order
async def fake_try_handle_order_listing ( * * kwargs ) :
raise AssertionError ( " nao deveria entrar em listagem de pedidos para avaliacao de troca " )
service . _try_handle_order_listing = fake_try_handle_order_listing
async def fake_try_collect_and_create_order ( * * kwargs ) :
raise AssertionError ( " nao deveria entrar em compra para avaliacao de troca " )
service . _try_collect_and_create_order = fake_try_collect_and_create_order
response = await service . handle_message (
" Quero avaliar meu carro para troca: Onix 2020, 45000 km " ,
user_id = 1 ,
)
self . assertIn ( " Estimativa de troca concluida " , response )
self . assertEqual (
service . tool_executor . calls ,
[ ( " avaliar_veiculo_troca " , { " modelo " : " Onix " , " ano " : 2020 , " km " : 45000 } , 1 ) ] ,
)
async def test_active_review_follow_up_ignores_trade_in_request ( self ) :
state = FakeState (
entries = {
" pending_review_drafts " : {
1 : {
" payload " : { " placa " : " ABC1234 " } ,
" expires_at " : utc_now ( ) + timedelta ( minutes = 15 ) ,
}
}
} ,
contexts = {
1 : {
" active_domain " : " review " ,
" generic_memory " : { } ,
" shared_memory " : { } ,
" order_queue " : [ ] ,
" pending_order_selection " : None ,
" pending_switch " : None ,
" last_stock_results " : [ ] ,
" selected_vehicle " : None ,
}
}
)
service = OrquestradorService . __new__ ( OrquestradorService )
service . state = state
service . normalizer = EntityNormalizer ( )
service . _get_user_context = lambda user_id : state . get_user_context ( user_id )
service . _save_user_context = lambda user_id , context : state . save_user_context ( user_id , context )
async def fake_try_collect_and_schedule_review ( * * kwargs ) :
raise AssertionError ( " nao deveria consumir avaliacao de troca como follow-up de revisao " )
service . _try_collect_and_schedule_review = fake_try_collect_and_schedule_review
async def finish ( response : str , queue_notice : str | None = None ) :
return response
response = await service . _try_handle_active_review_follow_up (
message = " Quero avaliar meu carro para troca: Onix 2020, 45000 km " ,
user_id = 1 ,
finish = finish ,
)
self . assertIsNone ( response )
if __name__ == " __main__ " :
unittest . main ( )