File size: 2,345 Bytes
117b6e0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d9886c6
117b6e0
 
 
 
 
d9886c6
 
 
 
 
 
 
 
 
 
 
 
 
117b6e0
 
 
 
 
d9886c6
117b6e0
 
 
 
 
d9886c6
117b6e0
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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()