@ -1,4 +1,5 @@
import unittest
from unittest . mock import patch
from datetime import datetime , timezone
from sqlalchemy import create_engine
@ -335,10 +336,10 @@ class _FakeToolArtifactRepository:
def update_artifact ( self , artifact : ToolArtifact , * * kwargs ) - > ToolArtifact :
artifact . artifact_status = kwargs [ " artifact_status " ]
artifact . storage_kind = kwargs [ " storage_kind " ]
artifact . storage_kind = kwargs . get ( " storage_kind " , artifact . storage_kind )
artifact . summary = kwargs [ " summary " ]
artifact . payload_json = kwargs [ " payload_json " ]
artifact . checksum = kwargs [ " checksum " ]
artifact . checksum = kwargs . get ( " checksum " , artifact . checksum )
artifact . author_staff_account_id = kwargs [ " author_staff_account_id " ]
artifact . author_display_name = kwargs [ " author_display_name " ]
artifact . updated_at = datetime ( 2026 , 3 , 31 , 18 , artifact . version_number , tzinfo = timezone . utc )
@ -654,9 +655,297 @@ class AdminToolManagementServiceTests(unittest.TestCase):
self . assertEqual ( payload [ " items " ] [ 0 ] [ " version_id " ] , intake_payload [ " draft_preview " ] [ " version_id " ] )
self . assertEqual ( payload [ " items " ] [ 0 ] [ " version_number " ] , 1 )
self . assertEqual ( payload [ " items " ] [ 0 ] [ " status " ] , ToolLifecycleStatus . DRAFT )
self . assertEqual ( payload [ " items " ] [ 0 ] [ " gate " ] , " director_review _required" )
self . assertEqual ( payload [ " items " ] [ 0 ] [ " gate " ] , " generation_pipeline _required" )
self . assertIn ( ToolLifecycleStatus . APPROVED , payload [ " supported_statuses " ] )
def test_run_generation_pipeline_promotes_version_to_generated ( self ) :
intake_payload = self . service . create_draft_submission (
{
" domain " : " revisao " ,
" tool_name " : " consultar_revisao_aberta " ,
" display_name " : " Consultar revisao aberta " ,
" description " : " Consulta revisoes abertas com filtros administrativos para a oficina. " ,
" business_goal " : " Ajudar o time a localizar revisoes abertas com mais contexto operacional. " ,
" parameters " : [
{
" name " : " placa " ,
" parameter_type " : " string " ,
" description " : " Placa usada na busca da revisao. " ,
" required " : True ,
}
] ,
} ,
owner_staff_account_id = 8 ,
owner_name = " Operacao de Oficina " ,
owner_role = StaffRole . COLABORADOR ,
)
payload = self . service . run_generation_pipeline (
intake_payload [ " draft_preview " ] [ " version_id " ] ,
runner_staff_account_id = 8 ,
runner_name = " Operacao de Oficina " ,
runner_role = StaffRole . COLABORADOR ,
)
self . assertEqual ( payload [ " status " ] , ToolLifecycleStatus . GENERATED )
self . assertEqual ( payload [ " current_step " ] , " validation " )
self . assertEqual ( payload [ " queue_entry " ] [ " gate " ] , " validation_required " )
self . assertEqual ( payload [ " queue_entry " ] [ " automated_validation_status " ] , " passed " )
self . assertEqual ( payload [ " queue_entry " ] [ " automated_validation_summary " ] , " 4/4 validacoes automaticas passaram antes da revisao humana. " )
self . assertEqual ( len ( payload [ " automated_validations " ] ) , 4 )
automated_checks = { check [ " key " ] : check for check in payload [ " automated_validations " ] }
self . assertEqual ( automated_checks [ " tool_contract " ] [ " status " ] , " passed " )
self . assertEqual ( automated_checks [ " tool_signature_schema " ] [ " status " ] , " passed " )
self . assertEqual ( automated_checks [ " tool_import_loading " ] [ " status " ] , " passed " )
self . assertEqual ( automated_checks [ " tool_smoke_tests " ] [ " status " ] , " passed " )
steps_by_key = { step [ " key " ] : step for step in payload [ " steps " ] }
self . assertEqual ( steps_by_key [ " manual_intake " ] [ " state " ] , " completed " )
self . assertEqual ( steps_by_key [ " generation " ] [ " state " ] , " completed " )
self . assertEqual ( steps_by_key [ " validation " ] [ " state " ] , " current " )
self . assertEqual ( self . draft_repository . drafts [ 0 ] . status , ToolLifecycleStatus . GENERATED )
self . assertEqual ( self . version_repository . versions [ 0 ] . status , ToolLifecycleStatus . GENERATED )
self . assertEqual ( self . metadata_repository . metadata_entries [ 0 ] . status , ToolLifecycleStatus . GENERATED )
generation_artifact = next (
artifact
for artifact in self . artifact_repository . artifacts
if artifact . artifact_kind == ToolArtifactKind . GENERATION_REQUEST
)
self . assertEqual ( generation_artifact . payload_json [ " pipeline_status " ] , " completed " )
self . assertEqual ( generation_artifact . payload_json [ " triggered_by_role " ] , StaffRole . COLABORADOR . value )
validation_artifact = next (
artifact
for artifact in self . artifact_repository . artifacts
if artifact . artifact_kind == ToolArtifactKind . VALIDATION_REPORT
)
self . assertEqual ( validation_artifact . artifact_status . value , " succeeded " )
self . assertEqual ( validation_artifact . payload_json [ " validation_scope " ] , " tool_contract " )
automated_checks = { check [ " key " ] : check for check in validation_artifact . payload_json [ " automated_checks " ] }
self . assertEqual ( automated_checks [ " tool_contract " ] [ " status " ] , " passed " )
self . assertEqual ( automated_checks [ " tool_signature_schema " ] [ " status " ] , " passed " )
self . assertEqual ( automated_checks [ " tool_import_loading " ] [ " status " ] , " passed " )
self . assertEqual ( automated_checks [ " tool_smoke_tests " ] [ " status " ] , " passed " )
self . assertEqual ( validation_artifact . payload_json [ " signature_schema " ] [ " callable_name " ] , GENERATED_TOOL_ENTRYPOINT )
self . assertEqual ( validation_artifact . payload_json [ " signature_schema " ] [ " signature " ] , " run(*, placa) " )
self . assertEqual ( validation_artifact . payload_json [ " import_loading " ] [ " loaded_callable " ] , GENERATED_TOOL_ENTRYPOINT )
self . assertEqual ( validation_artifact . payload_json [ " import_loading " ] [ " loaded_signature " ] , " run(*, placa) " )
self . assertEqual ( validation_artifact . payload_json [ " smoke_tests " ] [ " direct_result_type " ] , " dict " )
self . assertEqual ( validation_artifact . payload_json [ " smoke_tests " ] [ " runtime_result_type " ] , " dict " )
self . assertEqual ( validation_artifact . payload_json [ " smoke_tests " ] [ " invocation_arguments " ] [ " placa " ] , " sample_placa " )
self . assertEqual ( validation_artifact . payload_json [ " publication_envelope " ] [ " target_service " ] , " product " )
def test_run_generation_pipeline_marks_version_failed_when_contract_validation_fails ( self ) :
intake_payload = self . service . create_draft_submission (
{
" domain " : " revisao " ,
" tool_name " : " consultar_revisao_aberta " ,
" display_name " : " Consultar revisao aberta " ,
" description " : " Consulta revisoes abertas com filtros administrativos para a oficina. " ,
" business_goal " : " Ajudar o time a localizar revisoes abertas com mais contexto operacional. " ,
" parameters " : [ ] ,
} ,
owner_staff_account_id = 8 ,
owner_name = " Operacao de Oficina " ,
owner_role = StaffRole . COLABORADOR ,
)
self . metadata_repository . metadata_entries [ 0 ] . display_name = " No "
payload = self . service . run_generation_pipeline (
intake_payload [ " draft_preview " ] [ " version_id " ] ,
runner_staff_account_id = 8 ,
runner_name = " Operacao de Oficina " ,
runner_role = StaffRole . COLABORADOR ,
)
self . assertEqual ( payload [ " status " ] , ToolLifecycleStatus . FAILED )
self . assertEqual ( payload [ " current_step " ] , " generation " )
self . assertEqual ( payload [ " queue_entry " ] [ " gate " ] , " pipeline_retry_required " )
self . assertEqual ( payload [ " queue_entry " ] [ " automated_validation_status " ] , " failed " )
self . assertIn ( " revisar contrato da tool " , payload [ " queue_entry " ] [ " automated_validation_summary " ] . lower ( ) )
automated_checks = { check [ " key " ] : check for check in payload [ " automated_validations " ] }
self . assertEqual ( automated_checks [ " tool_contract " ] [ " status " ] , " failed " )
self . assertEqual ( automated_checks [ " tool_signature_schema " ] [ " status " ] , " passed " )
self . assertEqual ( automated_checks [ " tool_import_loading " ] [ " status " ] , " passed " )
self . assertEqual ( automated_checks [ " tool_smoke_tests " ] [ " status " ] , " passed " )
self . assertTrue ( automated_checks [ " tool_contract " ] [ " blocking_issues " ] )
self . assertEqual ( self . draft_repository . drafts [ 0 ] . status , ToolLifecycleStatus . FAILED )
self . assertEqual ( self . version_repository . versions [ 0 ] . status , ToolLifecycleStatus . FAILED )
self . assertEqual ( self . metadata_repository . metadata_entries [ 0 ] . status , ToolLifecycleStatus . FAILED )
validation_artifact = next (
artifact
for artifact in self . artifact_repository . artifacts
if artifact . artifact_kind == ToolArtifactKind . VALIDATION_REPORT
)
self . assertEqual ( validation_artifact . artifact_status . value , " failed " )
self . assertIn ( " display_name " , validation_artifact . payload_json [ " blocking_issues " ] [ 0 ] )
def test_run_generation_pipeline_marks_version_failed_when_signature_schema_validation_fails ( self ) :
intake_payload = self . service . create_draft_submission (
{
" domain " : " revisao " ,
" tool_name " : " consultar_revisao_aberta " ,
" display_name " : " Consultar revisao aberta " ,
" description " : " Consulta revisoes abertas com filtros administrativos para a oficina. " ,
" business_goal " : " Ajudar o time a localizar revisoes abertas com mais contexto operacional. " ,
" parameters " : [
{
" name " : " user_id " ,
" parameter_type " : " string " ,
" description " : " Identificador do usuario usado no filtro administrativo. " ,
" required " : True ,
}
] ,
} ,
owner_staff_account_id = 8 ,
owner_name = " Operacao de Oficina " ,
owner_role = StaffRole . COLABORADOR ,
)
payload = self . service . run_generation_pipeline (
intake_payload [ " draft_preview " ] [ " version_id " ] ,
runner_staff_account_id = 8 ,
runner_name = " Operacao de Oficina " ,
runner_role = StaffRole . COLABORADOR ,
)
self . assertEqual ( payload [ " status " ] , ToolLifecycleStatus . FAILED )
self . assertEqual ( payload [ " queue_entry " ] [ " gate " ] , " pipeline_retry_required " )
automated_checks = { check [ " key " ] : check for check in payload [ " automated_validations " ] }
self . assertEqual ( automated_checks [ " tool_contract " ] [ " status " ] , " passed " )
self . assertEqual ( automated_checks [ " tool_signature_schema " ] [ " status " ] , " failed " )
self . assertEqual ( automated_checks [ " tool_import_loading " ] [ " status " ] , " failed " )
self . assertEqual ( automated_checks [ " tool_smoke_tests " ] [ " status " ] , " failed " )
self . assertIn ( " user_id " , automated_checks [ " tool_signature_schema " ] [ " blocking_issues " ] [ 0 ] )
validation_artifact = next (
artifact
for artifact in self . artifact_repository . artifacts
if artifact . artifact_kind == ToolArtifactKind . VALIDATION_REPORT
)
self . assertEqual ( validation_artifact . artifact_status . value , " failed " )
self . assertIn ( " user_id " , validation_artifact . payload_json [ " signature_schema " ] [ " issues " ] [ 0 ] )
def test_run_generation_pipeline_marks_version_failed_when_import_loading_validation_fails ( self ) :
intake_payload = self . service . create_draft_submission (
{
" domain " : " revisao " ,
" tool_name " : " consultar_revisao_aberta " ,
" display_name " : " Consultar revisao aberta " ,
" description " : " Consulta revisoes abertas com filtros administrativos para a oficina. " ,
" business_goal " : " Ajudar o time a localizar revisoes abertas com mais contexto operacional. " ,
" parameters " : [
{
" name " : " placa " ,
" parameter_type " : " string " ,
" description " : " Placa usada na busca da revisao. " ,
" required " : True ,
}
] ,
} ,
owner_staff_account_id = 8 ,
owner_name = " Operacao de Oficina " ,
owner_role = StaffRole . COLABORADOR ,
)
with patch . object (
self . service ,
" _render_generated_tool_module_source " ,
return_value = " async def run(: \n pass \n " ,
) :
payload = self . service . run_generation_pipeline (
intake_payload [ " draft_preview " ] [ " version_id " ] ,
runner_staff_account_id = 8 ,
runner_name = " Operacao de Oficina " ,
runner_role = StaffRole . COLABORADOR ,
)
self . assertEqual ( payload [ " status " ] , ToolLifecycleStatus . FAILED )
self . assertEqual ( payload [ " queue_entry " ] [ " gate " ] , " pipeline_retry_required " )
automated_checks = { check [ " key " ] : check for check in payload [ " automated_validations " ] }
self . assertEqual ( automated_checks [ " tool_contract " ] [ " status " ] , " passed " )
self . assertEqual ( automated_checks [ " tool_signature_schema " ] [ " status " ] , " passed " )
self . assertEqual ( automated_checks [ " tool_import_loading " ] [ " status " ] , " failed " )
self . assertEqual ( automated_checks [ " tool_smoke_tests " ] [ " status " ] , " failed " )
self . assertIn ( " SyntaxError " , automated_checks [ " tool_import_loading " ] [ " blocking_issues " ] [ 0 ] )
validation_artifact = next (
artifact
for artifact in self . artifact_repository . artifacts
if artifact . artifact_kind == ToolArtifactKind . VALIDATION_REPORT
)
self . assertEqual ( validation_artifact . artifact_status . value , " failed " )
self . assertIn ( " SyntaxError " , validation_artifact . payload_json [ " import_loading " ] [ " issues " ] [ 0 ] )
self . assertIn ( " import/loading validation did not pass " , validation_artifact . payload_json [ " smoke_tests " ] [ " issues " ] [ 0 ] )
def test_run_generation_pipeline_marks_version_failed_when_smoke_tests_fail ( self ) :
intake_payload = self . service . create_draft_submission (
{
" domain " : " revisao " ,
" tool_name " : " consultar_revisao_aberta " ,
" display_name " : " Consultar revisao aberta " ,
" description " : " Consulta revisoes abertas com filtros administrativos para a oficina. " ,
" business_goal " : " Ajudar o time a localizar revisoes abertas com mais contexto operacional. " ,
" parameters " : [
{
" name " : " placa " ,
" parameter_type " : " string " ,
" description " : " Placa usada na busca da revisao. " ,
" required " : True ,
}
] ,
} ,
owner_staff_account_id = 8 ,
owner_name = " Operacao de Oficina " ,
owner_role = StaffRole . COLABORADOR ,
)
with patch . object (
self . service ,
" _render_generated_tool_module_source " ,
return_value = ' async def run(*, placa): \n raise RuntimeError( " smoke test boom " ) \n ' ,
) :
payload = self . service . run_generation_pipeline (
intake_payload [ " draft_preview " ] [ " version_id " ] ,
runner_staff_account_id = 8 ,
runner_name = " Operacao de Oficina " ,
runner_role = StaffRole . COLABORADOR ,
)
self . assertEqual ( payload [ " status " ] , ToolLifecycleStatus . FAILED )
self . assertEqual ( payload [ " queue_entry " ] [ " gate " ] , " pipeline_retry_required " )
automated_checks = { check [ " key " ] : check for check in payload [ " automated_validations " ] }
self . assertEqual ( automated_checks [ " tool_contract " ] [ " status " ] , " passed " )
self . assertEqual ( automated_checks [ " tool_signature_schema " ] [ " status " ] , " passed " )
self . assertEqual ( automated_checks [ " tool_import_loading " ] [ " status " ] , " passed " )
self . assertEqual ( automated_checks [ " tool_smoke_tests " ] [ " status " ] , " failed " )
self . assertIn ( " RuntimeError " , automated_checks [ " tool_smoke_tests " ] [ " blocking_issues " ] [ 0 ] )
validation_artifact = next (
artifact
for artifact in self . artifact_repository . artifacts
if artifact . artifact_kind == ToolArtifactKind . VALIDATION_REPORT
)
self . assertEqual ( validation_artifact . artifact_status . value , " failed " )
self . assertIn ( " RuntimeError " , validation_artifact . payload_json [ " smoke_tests " ] [ " issues " ] [ 0 ] )
def test_review_requires_generation_pipeline_before_validation ( self ) :
intake_payload = self . service . create_draft_submission (
{
" domain " : " locacao " ,
" tool_name " : " emitir_resumo_locacao " ,
" display_name " : " Emitir resumo de locacao " ,
" description " : " Resume contratos de locacao com filtros operacionais para o time interno. " ,
" business_goal " : " Dar visibilidade rapida aos contratos e aos principais dados da locacao. " ,
" parameters " : [ ] ,
} ,
owner_staff_account_id = 3 ,
owner_name = " Equipe Interna " ,
)
with self . assertRaisesRegex ( ValueError , " generated " ) :
self . service . review_version (
intake_payload [ " draft_preview " ] [ " version_id " ] ,
reviewer_staff_account_id = 99 ,
reviewer_name = " Diretoria " ,
reviewer_role = StaffRole . DIRETOR ,
)
def test_director_must_review_approve_and_publish_before_activation ( self ) :
intake_payload = self . service . create_draft_submission (
{
@ -679,6 +968,12 @@ class AdminToolManagementServiceTests(unittest.TestCase):
)
version_id = intake_payload [ " draft_preview " ] [ " version_id " ]
pipeline_payload = self . service . run_generation_pipeline (
version_id ,
runner_staff_account_id = 3 ,
runner_name = " Equipe Interna " ,
runner_role = StaffRole . COLABORADOR ,
)
review_payload = self . service . review_version (
version_id ,
reviewer_staff_account_id = 99 ,
@ -698,6 +993,9 @@ class AdminToolManagementServiceTests(unittest.TestCase):
publisher_role = StaffRole . DIRETOR ,
)
self . assertEqual ( pipeline_payload [ " status " ] , ToolLifecycleStatus . GENERATED )
self . assertEqual ( len ( pipeline_payload [ " automated_validations " ] ) , 4 )
self . assertTrue ( all ( check [ " status " ] == " passed " for check in pipeline_payload [ " automated_validations " ] ) )
self . assertEqual ( review_payload [ " status " ] , ToolLifecycleStatus . VALIDATED )
self . assertEqual ( review_payload [ " queue_entry " ] [ " gate " ] , " director_approval_required " )
self . assertEqual ( approve_payload [ " status " ] , ToolLifecycleStatus . APPROVED )
@ -749,6 +1047,7 @@ class AdminToolManagementServiceTests(unittest.TestCase):
owner_name = " Equipe Interna " ,
)
first_version_id = first_intake [ " draft_preview " ] [ " version_id " ]
self . service . run_generation_pipeline ( first_version_id , runner_staff_account_id = 7 , runner_name = " Equipe Interna " , runner_role = StaffRole . COLABORADOR )
self . service . review_version ( first_version_id , reviewer_staff_account_id = 99 , reviewer_name = " Diretoria " , reviewer_role = StaffRole . DIRETOR )
self . service . approve_version ( first_version_id , approver_staff_account_id = 99 , approver_name = " Diretoria " , approver_role = StaffRole . DIRETOR )
self . service . publish_version ( first_version_id , publisher_staff_account_id = 99 , publisher_name = " Diretoria " , publisher_role = StaffRole . DIRETOR )
@ -766,6 +1065,7 @@ class AdminToolManagementServiceTests(unittest.TestCase):
owner_name = " Equipe Interna " ,
)
second_version_id = second_intake [ " draft_preview " ] [ " version_id " ]
self . service . run_generation_pipeline ( second_version_id , runner_staff_account_id = 7 , runner_name = " Equipe Interna " , runner_role = StaffRole . COLABORADOR )
self . service . review_version ( second_version_id , reviewer_staff_account_id = 99 , reviewer_name = " Diretoria " , reviewer_role = StaffRole . DIRETOR )
self . service . approve_version ( second_version_id , approver_staff_account_id = 99 , approver_name = " Diretoria " , approver_role = StaffRole . DIRETOR )
self . service . publish_version ( second_version_id , publisher_staff_account_id = 99 , publisher_name = " Diretoria " , publisher_role = StaffRole . DIRETOR )