@ -96,6 +96,9 @@ class FakePolicyService:
def _new_tab_memory ( self , user_id : int | None ) :
return { }
def _coerce_extraction_contract ( self , payload ) :
return payload if isinstance ( payload , dict ) else self . normalizer . empty_extraction_payload ( )
def _is_affirmative_message ( self , text : str ) - > bool :
normalized = self . normalizer . normalize_text ( text ) . strip ( ) . rstrip ( " .!?,;: " )
return normalized in { " sim " , " pode " , " ok " , " confirmo " , " aceito " , " fechado " , " pode sim " }
@ -1220,6 +1223,40 @@ class TurnDecisionContractTests(unittest.IsolatedAsyncioTestCase):
self . assertEqual ( response , " Certo, contexto anterior encerrado. Vamos seguir com agendamento de revisao. " )
def test_prepare_message_for_single_order_defers_explicit_domain_switch_with_open_flow ( self ) :
state = FakeState (
entries = {
" pending_review_drafts " : {
9 : {
" payload " : { " placa " : " ABC1234 " } ,
" expires_at " : datetime . utcnow ( ) + timedelta ( minutes = 15 ) ,
}
}
} ,
contexts = {
9 : {
" active_domain " : " review " ,
" generic_memory " : { } ,
" order_queue " : [ ] ,
" pending_order_selection " : None ,
" pending_switch " : None ,
}
} ,
)
service = FakePolicyService ( state )
policy = ConversationPolicy ( service = service )
routed_message , queue_notice , early_response = policy . prepare_message_for_single_order (
message = " quero comprar um carro de ate 62 mil " ,
user_id = 9 ,
routing_plan = { " orders " : [ { " domain " : " sales " , " message " : " quero comprar um carro de ate 62 mil " } ] } ,
)
self . assertEqual ( routed_message , " quero comprar um carro de ate 62 mil " )
self . assertIsNone ( queue_notice )
self . assertIsNone ( early_response )
self . assertEqual ( service . _get_user_context ( 9 ) . get ( " order_queue " ) , [ ] )
if __name__ == " __main__ " :
unittest . main ( )