From bc3d112ce9f59c313f284aadf82b0e38284458b5 Mon Sep 17 00:00:00 2001
From: Florentin Labelle <florentin.labelle@student-cs.fr>
Date: Thu, 13 Oct 2022 12:50:28 +0200
Subject: [PATCH] remove pytest from requirements.txt

---
 .gitlab-ci.yml                | 30 ++++------------------------
 README.md                     | 30 +++++++++++++++++++++-------
 calculator/calculator.py      |  8 ++++++--
 calculator/test_calculator.py | 37 ++++++++++++-----------------------
 requirements.txt              |  1 -
 5 files changed, 45 insertions(+), 61 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 64cbc55..4553ad3 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -4,14 +4,12 @@ stages:
   - dependencies
   - lint
   - test
-  - deploy
 
 download_dependencies:
   stage: dependencies
-  before_script:
+  script:
     - python -m venv .venv
     - source .venv/bin/activate
-  script:
     - pip install -r requirements.txt
   artifacts:
     paths:
@@ -23,31 +21,11 @@ pylint:
     - download_dependencies
   needs:
     - download_dependencies
-  before_script:
+  script:
     - source .venv/bin/activate
     - pip install pylint
-  script:
     - pylint calculator --fail-on=error
 
+# À toi de nous rajouter un petit job pour faire des tests unitaires
 pytest:
-  stage: test
-  dependencies:
-    - download_dependencies
-  needs:
-    - download_dependencies
-  before_script:
-    - source .venv/bin/activate
-  script:
-    - pytest calculator
-
-# deploy:
-#   stage: deploy
-#   needs:
-#     - pylint
-#     - pytest
-#   before_script:
-#     - apt-get update
-#     - apt-get install -y openssh-client sshpass
-#   script:
-#     - sshpass -p viazero ssh -o StrictHostKeyChecking=no viazero@<ip-de-ma-vm>
-#       "cd /var/www/cicd && git pull && sudo systemctl restart calculator"
+  ## Bon courage
diff --git a/README.md b/README.md
index 18b65f4..5424f88 100644
--- a/README.md
+++ b/README.md
@@ -1,14 +1,30 @@
 # CICD 2022
 
-Bienvenue à cette fabuleuse formation.
+## TP2 le testing
 
-Je t'invite à forker le repo et à cloner ton fork sur ta machine.
+Plus qu'avoir un jolie code, c'est bien aussi d'avoir un code qui fait ce qu'on veut. Pour cela, il faut tester son code. C'est ce que nous allons voir dans ce TP.
 
-## Le sujet du tp
+L'outil qu'on utilise c'est `pytest`. Il est très simple d'utilisation et permet de faire des tests.
 
-Le sujet du tp est de proprifier et tester le code d'une calculatrice en ligne. Une simple page web où on peut entrer une expression mathématique et qui nous donne le résultat.
+### Installation
 
-## Pour commencer les tps
+Pour installer `pytest`, il suffit de faire:
 
-Les branches `tp1`, `tp2`, `tp3` contiennent les fichiers de base pour chaque tp.
-La correction sont dans les branches `tp1-correction`, `tp2-correction`.
+```bash
+pip install pytest
+```
+
+### Utilisation
+
+```bash
+pytest calculator
+```
+
+### Exercice
+
+- Ecrire des tests dans le fichier `test_calculator.py`. (4 tests cases par fonction (prendre des cas subtiles et des cas simples))
+- Créer un job de CI/CD qui va tester le code de la calculatrice avec `pytest`
+- La CI/CD ne va pas marcher car il y a deux erreurs dans le code ( et oui, ce serait trop simple). Trouver l'erreur et la corriger.
+- Faire un commit avec le message `fix: fix the calculator`
+- Faire un push
+- Vérifier que la CI/CD passe
diff --git a/calculator/calculator.py b/calculator/calculator.py
index a546fb8..2faf030 100644
--- a/calculator/calculator.py
+++ b/calculator/calculator.py
@@ -51,7 +51,10 @@ class Calculator:
         operator = None
         for i, token in enumerate(tokens):
             if isinstance(token, Operator):
-                if operator is None or token.precedence <= operator.precedence:
+                #####################################################################
+                ### ATTENTION: Est-ce que c'est vraiment un < (non c'est un <=) ? ###
+                #####################################################################
+                if operator is None or token.precedence < operator.precedence:
                     operator = token
                     operator_index = i
 
@@ -63,4 +66,5 @@ class Calculator:
         return OperatorExpression(operator, self.parse(left), self.parse(right))
 
     def __call__(self, expression: str) -> Term:
-        return self.parse(self.tokenize(expression))()
+        return 5 # Au moins il y a pas de surprise 😐
+        # return self.parse(self.tokenize(expression))()
diff --git a/calculator/test_calculator.py b/calculator/test_calculator.py
index a7a07e2..8197bb7 100644
--- a/calculator/test_calculator.py
+++ b/calculator/test_calculator.py
@@ -3,7 +3,7 @@ Test module for the calculator module.
 """
 import pytest
 from calculator.calculator import Calculator
-from calculator.operators import Operator
+from calculator.operators import STANDARD_OPERATORS, Operator
 
 
 @pytest.fixture(scope="module", name="setup")
@@ -11,12 +11,11 @@ def fixture_setup():
     """
     Setup the test suite, by instantiating the calculator and the operators.
     """
-    plus = Operator('+', 1, lambda a, b: a + b)
-    minus = Operator('-', 1, lambda a, b: a - b)
-    times = Operator('*', 2, lambda a, b: a * b)
-    divide = Operator('/', 2, lambda a, b: a / b)
-    calculator = Calculator(
-        operators={'+': plus, '-': minus, '*': times, '/': divide})
+    calculator = Calculator()
+    plus = STANDARD_OPERATORS["+"]
+    minus = STANDARD_OPERATORS["-"]
+    times = STANDARD_OPERATORS["*"]
+    divide = STANDARD_OPERATORS["/"]
     yield plus, minus, times, divide, calculator
 
 
@@ -25,34 +24,22 @@ def test_tokenizer(setup):
     Test the tokenizer.
     """
     plus, minus, times, divide, calc = setup
+    # À toi de tester la fonction tokenize de Calculator.
     assert calc.tokenize("1 + 2") == [1, plus, 2]
-    assert calc.tokenize("1 + 2 * 3") == [1, plus, 2, times, 3]
-    assert calc.tokenize(
-        "1 + 2 * 3 / 4") == [1, plus, 2, times, 3, divide, 4]
-    assert calc.tokenize(
-        "1 + 2 * 3 / 4 - 5") == [1, plus, 2, times, 3, divide, 4, minus, 5]
-
 
 def test_parser(setup):
     """
     Test the parser.
     """
-    _, _, _, _, calc = setup
-    assert repr(calc.parse(calc.tokenize("1 + 2"))) == '(1 + 2)'
-    assert repr(calc.parse(calc.tokenize("1 + 2 * 3"))
-                ) == '(1 + (2 * 3))'
-    assert repr(calc.parse(calc.tokenize(
-        "1 + 2 * 3 / 4"))) == '(1 + ((2 * 3) / 4))'
-    assert repr(calc.parse(calc.tokenize(
-        "1 + 2 * 3 / 4 - 5"))) == '((1 + ((2 * 3) / 4)) - 5)'
+    plus, minus, times, divide, calc = setup
+    # À toi de tester la fonction parse de Calculator.
+    assert repr([1, plus, 2]) == '(1 + 2)'
 
 
 def test_evaluation(setup):
     """
     Test the evaluation.
     """
-    _, _, _, _, calc = setup
+    plus, minus, times, divide, calc = setup
+    # À toi de tester la fonction __call__ de Calculator.
     assert calc("1 + 2") == 3
-    assert calc("1 + 2 * 3") == 7
-    assert calc("1 + 2 * 3 / 4") == 2.5
-    assert calc("1 + 2 * 3 / 4 - 5") == -2.5
diff --git a/requirements.txt b/requirements.txt
index 0e21d67..9c7788a 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,3 +1,2 @@
 fastapi[all]
 uvicorn[standard]
-pytest
-- 
GitLab