from __future__ import annotations import unittest from api.task_tool_policy import build_task_tool_policy class TaskToolPolicyTests(unittest.TestCase): def test_e2e_literal_contract_forbids_tools_and_returns_exact_token(self) -> None: policy = build_task_tool_policy( "Rispondi ESCLUSIVAMENTE con TEST_E2E_OK. Non usare strumenti, tool, " "comandi shell, file, rete, servizi esterni, azioni o card." ) self.assertTrue(policy.forbid_tools) self.assertEqual(policy.literal_response, "TEST_E2E_OK") self.assertFalse(policy.allow_local_csv_conversion) def test_explicit_tool_denial_without_literal_contract_stays_tool_free(self) -> None: policy = build_task_tool_policy("Spiega il concetto senza usare strumenti o rete.") self.assertTrue(policy.forbid_tools) self.assertIsNone(policy.literal_response) self.assertFalse(policy.allow_local_csv_conversion) def test_restricted_local_csv_conversion_is_explicitly_qualified(self) -> None: policy = build_task_tool_policy( "Esegui solo nel workspace VFS locale questa conversione deterministica.\n" "Crea capability_catalog.csv con contenuto esatto: id,name,active\n" "1,alpha,true\n2,beta,false\n" ". Poi crea capability_catalog.json con lo stesso catalogo come array JSON valido di due oggetti.\n" "Non usare rete, shell, servizi esterni o provider aggiuntivi." ) self.assertTrue(policy.forbid_tools) self.assertIsNone(policy.literal_response) self.assertTrue(policy.allow_local_csv_conversion) def test_normal_task_remains_unrestricted(self) -> None: policy = build_task_tool_policy("Cerca le notizie di oggi e sintetizzale.") self.assertFalse(policy.forbid_tools) self.assertIsNone(policy.literal_response) self.assertFalse(policy.allow_local_csv_conversion) def test_partial_wording_does_not_create_a_literal_contract(self) -> None: policy = build_task_tool_policy("Rispondi esclusivamente con una spiegazione, senza strumenti.") self.assertTrue(policy.forbid_tools) self.assertIsNone(policy.literal_response) self.assertFalse(policy.allow_local_csv_conversion) if __name__ == "__main__": unittest.main()