Tests
# Cas simple sans historique
result = preparer_appel(config={'produit': 'Python'}, historique=[], question='Salut')
assert len(result['messages']) == 2, 'Sans historique, il doit y avoir 2 messages (system + user)'
assert result['messages'][0]['role'] == 'system', 'Le premier message doit etre system'
assert result['messages'][-1]['role'] == 'user', 'Le dernier message doit etre user'
assert result['messages'][-1]['content'] == 'Salut', 'Le contenu user doit etre la question'
assert 'Python' in result['messages'][0]['content'], 'Le system prompt doit mentionner le produit'
assert result['dans_budget'] == True, 'Sans historique, on doit etre dans le budget'
assert isinstance(result['tokens_estimes'], int), 'Les tokens estimes doivent etre un entier'
# Avec historique
hist = [
{'role': 'user', 'content': 'Message 1'},
{'role': 'assistant', 'content': 'Réponse 1'},
]
result2 = preparer_appel(config={'produit': 'Django'}, historique=hist, question='Suite')
assert len(result2['messages']) == 4, 'Avec 2 msgs historique, il doit y avoir 4 messages au total'
assert result2['messages'][0]['role'] == 'system', 'Le system doit rester en premier'
assert result2['messages'][-1]['content'] == 'Suite', 'La question doit etre en dernier'
# Budget tres petit force la troncature
result3 = preparer_appel(config={'produit': 'X'}, historique=hist, question='Q', budget_tokens=30)
assert result3['messages'][0]['role'] == 'system', 'Le system doit toujours etre garde'
assert result3['messages'][-1]['content'] == 'Q', 'La question doit toujours etre gardee'
assert len(result3['messages']) <= len(hist) + 2, 'La conversation doit etre tronquee'
# Config avec niveau
result4 = preparer_appel(config={'produit': 'FastAPI', 'niveau': 'debutant'}, historique=[], question='Help')
assert 'debutant' in result4['messages'][0]['content'], 'Le niveau doit apparaitre dans le system prompt'