File size: 2,761 Bytes
31404a1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
52
53
54
55
import json
import unittest
from unittest.mock import patch

from engine.suggestions import generate_suggestions, fallback_suggestions, _parse
from test_conversations import Client, answer


class SuggestionTests(unittest.TestCase):
    def test_language_and_persona_reach_single_model_call(self):
        client = Client()
        items = fallback_suggestions('Turkish')
        with patch.object(client, 'chat_completion', return_value=answer(json.dumps(items))) as completion:
            result = generate_suggestions({'name': 'Hermione'}, [], client, 'test',
                                          language='Turkish', persona={'name': 'Deniz', 'background': 'A shy student'})
        self.assertEqual(items, result)
        completion.assert_called_once()
        system = completion.call_args.args[0][0]['content']
        self.assertIn('Turkish', system)
        self.assertIn('Deniz', system)
        self.assertIn('A shy student', system)
        self.assertIn('Write as this user persona', system)

    def test_empty_persona_omits_role_data_and_english_is_explicit(self):
        client = Client()
        with patch.object(client, 'chat_completion', return_value=answer(json.dumps(fallback_suggestions('English')))) as completion:
            generate_suggestions({}, [], client, persona={})
        system = completion.call_args.args[0][0]['content']
        self.assertNotIn('USER PERSONA', system)
        self.assertIn('in English', system)

    def test_failure_uses_selected_language_without_translation_call(self):
        client = Client(fail=True)
        result = generate_suggestions({}, [], client, language='Turkish', persona={'name': 'Deniz'})
        self.assertEqual(fallback_suggestions('Turkish'), result)
        self.assertEqual(1, len(client.calls))
        self.assertIn('konuya', result[0]['text'])

    def test_each_ui_language_has_four_localized_fallbacks(self):
        languages = ['English', 'French', 'German', 'Italian', 'Russian', 'Turkish', 'Chinese']
        for language in languages:
            items = fallback_suggestions(language)
            self.assertEqual(4, len(items))
            self.assertEqual(items, _parse(json.dumps(items)))
            if language != 'English':
                self.assertNotEqual(fallback_suggestions('English')[0]['text'], items[0]['text'])
        changed = fallback_suggestions('English')
        changed[0]['text'] = 'Modified'
        self.assertNotEqual('Modified', fallback_suggestions('English')[0]['text'])

    def test_malformed_output_rejected(self):
        for invalid in [[], [None] * 4, [{'tone': 'x', 'emoji': 'x', 'text': ''}] * 4]:
            with self.subTest(invalid=invalid), self.assertRaises(ValueError):
                _parse(json.dumps(invalid))