diff --git a/src/main/java/controller/BenevoleDemandesEncoursPage.java b/src/main/java/controller/BenevoleDemandesEncoursPage.java index 626651c..d00c507 100644 --- a/src/main/java/controller/BenevoleDemandesEncoursPage.java +++ b/src/main/java/controller/BenevoleDemandesEncoursPage.java @@ -65,6 +65,13 @@ public class BenevoleDemandesEncoursPage extends JFrame { loadDemandesEnCours(); } + //Méthodes de type get() + public JTable getTable() {return this.table;} + public DefaultTableModel getTableModel() {return this.tableModel;} + public JButton getFinaliserDemandeButton() {return this.finaliserDemandeButton;} + public JButton getRetourBenevoleButton() {return this.retourBenevoleButton;} + public int getID() {return this.utilisateurId;} + // Méthode pour charger les demandes acceptées private void loadDemandesEnCours() { try (Connection connection = DatabaseConnection.getConnection()) { diff --git a/src/test/java/controller/BenevoleDemandesEncoursPageTest.java b/src/test/java/controller/BenevoleDemandesEncoursPageTest.java index 6f24624..2a25ac1 100644 --- a/src/test/java/controller/BenevoleDemandesEncoursPageTest.java +++ b/src/test/java/controller/BenevoleDemandesEncoursPageTest.java @@ -2,53 +2,192 @@ package controller; import database.DatabaseConnection; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.BeforeEach; -import javax.swing.*; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.sql.Connection; import java.sql.PreparedStatement; +import java.sql.ResultSet; import java.sql.SQLException; import static org.junit.jupiter.api.Assertions.*; class BenevoleDemandesEncoursPageTest { private BenevoleDemandesEncoursPage page; - private int utilisateurId = 1; // ID utilisateur fictif pour le test - private int demandeId = 1; // ID de demande fictif pour le test + private int utilisateurID = 1; // ID utilisateur arbitraire pour le test + private int benevoleID = 2; + private int demandeID; // ID de demande fictif pour le test @BeforeEach void setUp() throws SQLException { - try (Connection connection = DatabaseConnection.getConnection()) { - // Création d'un utilisateur minimal pour éviter les erreurs de clé étrangère - String utilisateurInsertSQL = "INSERT IGNORE INTO utilisateur (id) VALUES (?)"; - PreparedStatement utilisateurStatement = connection.prepareStatement(utilisateurInsertSQL); - utilisateurStatement.setInt(1, utilisateurId); - utilisateurStatement.executeUpdate(); - - // Insérer une demande liée à cet utilisateur pour le test - String demandeInsertSQL = "INSERT INTO demandes_aide (id, description, statut, benevole_id) VALUES (?, ?, ?, ?)"; - PreparedStatement demandeStatement = connection.prepareStatement(demandeInsertSQL); - demandeStatement.setInt(1, demandeId); - demandeStatement.setString(2, "Test demande description"); - demandeStatement.setString(3, "en cours"); - demandeStatement.setInt(4, utilisateurId); - demandeStatement.executeUpdate(); - } - // Initialiser la page de test - page = new BenevoleDemandesEncoursPage(utilisateurId); + page = new BenevoleDemandesEncoursPage(benevoleID); } - @Test - private void finaliserDemande(int demandeId) { + + @Test + void testFinaliserDemande() { + //on crée une demande avec le statut 'en cours' pour tester la méthode finaliserDemande() try (Connection connection = DatabaseConnection.getConnection()) { - // Mettre à jour le statut de la demande - String sql = "UPDATE demandes_aide SET statut = 'finalisée' WHERE id = ?"; + String insertSQL = "INSERT INTO demandes_aide (statut, utilisateur_id, benevole_id, description) VALUES (?, ?, ?, ?)"; + PreparedStatement insertStatement = connection.prepareStatement(insertSQL, PreparedStatement.RETURN_GENERATED_KEYS); + insertStatement.setString(1, "en cours"); + insertStatement.setInt(2, utilisateurID); // Aucun utilisateur affecté + insertStatement.setInt(3, benevoleID); // Aucun bénévole affecté initialement + insertStatement.setString(4, "Demande de test pour JUnit / Test finaliserDemande"); + insertStatement.executeUpdate(); + + // Récupération de l'ID généré pour pouvoir le supprimer après + ResultSet generatedKeys = insertStatement.getGeneratedKeys(); + if (generatedKeys.next()) { + demandeID = generatedKeys.getInt(1); + } + + // on met à jour la table avec la nouvelle demande rajoutée + // on utilise une méthode détournée pour accéder à la méthode private 'loadDemandesEnCours()' + Method loadDemandesEnCoursMethod = BenevoleDemandesEncoursPage.class.getDeclaredMethod("loadDemandesEnCours"); + loadDemandesEnCoursMethod.setAccessible(true); // permet d'appeler la méthode même si elle est private + loadDemandesEnCoursMethod.invoke(page); // on l'appele + + //test de prendreDemande(); on sélectionne la dernière ligne de la table car elle correspond à la demande test + int lastRow = page.getTable().getRowCount()-1; + page.getTable().setRowSelectionInterval(lastRow, lastRow); + + // idem que pour loadDemandesEnCours() comme finaliserDemande() est aussi en private + Method finaliserDemandeMethod = BenevoleDemandesEncoursPage.class.getDeclaredMethod("finaliserDemande"); + finaliserDemandeMethod.setAccessible(true); // permet d'appeler la méthode même si elle est private + finaliserDemandeMethod.invoke(page); // on l'appele + + // on attend un moment pour que la base de données se mette à jour + Thread.sleep(1000); + + String sql = "SELECT statut FROM demandes_aide WHERE id = ?"; PreparedStatement statement = connection.prepareStatement(sql); - statement.setInt(1, demandeId); - statement.executeUpdate(); - } catch (SQLException e) { - e.printStackTrace(); // Juste un print des erreurs, pas d'affichage de message + statement.setInt(1, demandeID); + ResultSet resultSet = statement.executeQuery(); + + String currentStatus = ""; + if (resultSet.next()) { + currentStatus = resultSet.getString("statut"); + } + + assertEquals("finalisée", currentStatus, "Le statut doit être 'finalisée'."); + + // Suppression de la demande de test après le test de prendreDemande() + String deleteSQL = "DELETE FROM demandes_aide WHERE id = ?"; + PreparedStatement deleteStatement = connection.prepareStatement(deleteSQL); + deleteStatement.setInt(1, demandeID); + deleteStatement.executeUpdate(); + } catch (InterruptedException | InvocationTargetException | NoSuchMethodException | IllegalAccessException | + SQLException e) { + throw new RuntimeException(e); + } + } + + @Test + void testLoadDemandesEnCours() { + try (Connection connection = DatabaseConnection.getConnection()) { + //on crée un utilisateur test pour charger et tester uniquement les demandes de test, pas celles existantes + int testUserID = -1; + String testUserNom = "Test Mc Testy"; + String testUserEmail = "test@example.com"; + String testUserRole = "benevole"; // l'utilisateur de test doit être un bénévole pour pouvoir tester la méthode + String insertSQL0 = "INSERT INTO utilisateur (nom, mail, role) VALUES (?, ?, ?)"; + PreparedStatement insertStatement0 = connection.prepareStatement(insertSQL0, PreparedStatement.RETURN_GENERATED_KEYS); + insertStatement0.setString(1, testUserNom); + insertStatement0.setString(2, testUserEmail); + insertStatement0.setString(3, testUserRole); + insertStatement0.executeUpdate(); + + // Récupération de l'ID du user de test généré pour pouvoir le supprimer après + ResultSet generatedKeysUser = insertStatement0.getGeneratedKeys(); + if (generatedKeysUser.next()) { + testUserID = generatedKeysUser.getInt(1); + } + + //on met une première demande test dans la bdd + String desc = "Demande de test pour JUnit / Test loadDemandesEnCours"; + String insertSQL = "INSERT INTO demandes_aide (statut, utilisateur_id, benevole_id, description) VALUES (?, ?, ?, ?)"; + PreparedStatement insertStatement = connection.prepareStatement(insertSQL, PreparedStatement.RETURN_GENERATED_KEYS); + insertStatement.setString(1, "en cours"); + insertStatement.setInt(2, utilisateurID); + insertStatement.setInt(3, benevoleID); + insertStatement.setString(4, desc); + insertStatement.executeUpdate(); + + // Récupération de l'ID généré pour pouvoir le supprimer après + ResultSet generatedKeys = insertStatement.getGeneratedKeys(); + if (generatedKeys.next()) { + demandeID = generatedKeys.getInt(1); + } + + //on rajoute deux autres demandes pour tester l'affichage + String desc2 = "Demande de test pour JUnit / Test loadDemandesEnCours 2"; + String insertSQL2 = "INSERT INTO demandes_aide (statut, utilisateur_id, benevole_id, description) VALUES (?, ?, ?, ?)"; + PreparedStatement insertStatement2 = connection.prepareStatement(insertSQL2, PreparedStatement.RETURN_GENERATED_KEYS); + insertStatement2.setString(1, "en cours"); + insertStatement2.setInt(2, utilisateurID); + insertStatement2.setInt(3, benevoleID); + insertStatement2.setString(4, desc2); + insertStatement2.executeUpdate(); + + String desc3 = "Demande de test pour JUnit / Test loadDemandesEnCours 2"; + String insertSQL3 = "INSERT INTO demandes_aide (statut, utilisateur_id, benevole_id, description) VALUES (?, ?, ?, ?)"; + PreparedStatement insertStatement3 = connection.prepareStatement(insertSQL3, PreparedStatement.RETURN_GENERATED_KEYS); + insertStatement3.setString(1, "en cours"); + insertStatement3.setInt(2, utilisateurID); + insertStatement3.setInt(3, benevoleID); + insertStatement3.setString(4, desc3); + insertStatement3.executeUpdate(); + + // on met à jour la table avec les nouvelles demandes rajoutées + // on utilise une méthode détournée pour accéder à la méthode private 'loadDemandesEnCours()' + Method loadDemandesEnCoursMethod = BenevoleDemandesEncoursPage.class.getDeclaredMethod("loadDemandesEnCours"); + loadDemandesEnCoursMethod.setAccessible(true); // permet d'appeler la méthode même si elle est private + loadDemandesEnCoursMethod.invoke(page); // on l'appele + + //on récupère toutes les descriptions chargées dans la page (chaque ligne uniquement pour la colonne description) + //page.getTableModel().getValueAt(); + + String sql = "SELECT statut FROM demandes_aide WHERE id = ?"; + PreparedStatement statement = connection.prepareStatement(sql); + statement.setInt(1, demandeID); + ResultSet resultSet = statement.executeQuery(); + + String currentStatus = ""; + if (resultSet.next()) { + currentStatus = resultSet.getString("statut"); + } + + String desc_expected = desc + desc2 + desc3; + assertEquals(desc_expected, currentStatus, "La description combinée doit être : " + desc_expected); + + // Suppression des demande de test après le test de prendreDemande() + //les id se suivent donc on a juste besoin de un seul demandeID + String deleteSQL = "DELETE FROM demandes_aide WHERE id = ?"; + PreparedStatement deleteStatement = connection.prepareStatement(deleteSQL); + deleteStatement.setInt(1, demandeID); + deleteStatement.executeUpdate(); + + String deleteSQL2 = "DELETE FROM demandes_aide WHERE id = ?"; + PreparedStatement deleteStatement2 = connection.prepareStatement(deleteSQL2); + deleteStatement2.setInt(1, (demandeID+1)); + deleteStatement2.executeUpdate(); + + String deleteSQL3 = "DELETE FROM demandes_aide WHERE id = ?"; + PreparedStatement deleteStatement3 = connection.prepareStatement(deleteSQL3); + deleteStatement3.setInt(1, (demandeID+2)); + deleteStatement3.executeUpdate(); + + //on supprime également l'user test + String deleteSQLUser = "DELETE FROM utilisateur WHERE id = ?"; + PreparedStatement deleteStatementUser = connection.prepareStatement(deleteSQLUser); + deleteStatementUser.setInt(1, testUserID); + deleteStatementUser.executeUpdate(); + } catch (InvocationTargetException | NoSuchMethodException | IllegalAccessException | + SQLException e) { + throw new RuntimeException(e); } } diff --git a/src/test/java/controller/LoginPageTest.java b/src/test/java/controller/LoginPageTest.java index becbdc4..ff07423 100644 --- a/src/test/java/controller/LoginPageTest.java +++ b/src/test/java/controller/LoginPageTest.java @@ -51,6 +51,14 @@ class LoginPageTest { // Check if the login page closed after a successful login assertFalse(loginPage.isVisible(), "LoginPage should close after a successful login."); + + //delete user after test + try (Connection connection = DatabaseConnection.getConnection()) { + String deleteSQL = "DELETE FROM utilisateur WHERE email = ?"; + PreparedStatement deleteStatement = connection.prepareStatement(deleteSQL); + deleteStatement.setString(1, email); + deleteStatement.executeUpdate(); + } } @Test