import unittest from app import postprocess class TestPostprocess(unittest.TestCase): def test_all_three_fields_consistent(self): recognized = [ {"field": "prix", "text": "10000", "confidence": 0.98}, {"field": "volume", "text": "14,28", "confidence": 0.95}, {"field": "prix_litre", "text": "700", "confidence": 0.90}, ] res = postprocess.process(recognized, fuel_price=700) self.assertEqual(res["detected_amount"], 10000.0) self.assertAlmostEqual(res["detected_liters"], 14.28, places=2) self.assertEqual(res["fuel_price"], 700.0) self.assertTrue(res["is_consistent"]) def test_configured_fuel_price_overrides_screen_reading(self): # Le prix configuré côté YELY doit toujours l'emporter sur celui lu # à l'écran, même si le CRNN lit une valeur différente (mauvaise # lecture ou écran mal calibré) — règle métier n°1. recognized = [ {"field": "prix", "text": "10000", "confidence": 0.98}, {"field": "volume", "text": "14.28", "confidence": 0.95}, {"field": "prix_litre", "text": "650", "confidence": 0.40}, ] res = postprocess.process(recognized, fuel_price=700) self.assertEqual(res["fuel_price"], 700.0) def test_liters_only_computes_amount(self): recognized = [{"field": "volume", "text": "20.00", "confidence": 0.9}] res = postprocess.process(recognized, fuel_price=875) self.assertAlmostEqual(res["detected_liters"], 20.0, places=2) self.assertIsNone(res["detected_amount"]) self.assertEqual(res["calculated_amount"], 17500.0) def test_amount_only_computes_liters(self): recognized = [{"field": "prix", "text": "10000", "confidence": 0.9}] res = postprocess.process(recognized, fuel_price=875) self.assertIsNone(res["detected_liters"]) self.assertEqual(res["detected_amount"], 10000.0) self.assertAlmostEqual(res["calculated_liters"], 11.43, places=2) def test_inconsistent_values_detected(self): recognized = [ {"field": "prix", "text": "10000", "confidence": 0.9}, {"field": "volume", "text": "20.00", "confidence": 0.9}, ] res = postprocess.process(recognized, fuel_price=875) self.assertFalse(res["is_consistent"]) def test_no_recognized_fields(self): res = postprocess.process([], fuel_price=875) self.assertEqual(res["raw_numbers"], []) self.assertIsNone(res["detected_liters"]) self.assertIsNone(res["detected_amount"]) if __name__ == "__main__": unittest.main()