package controller; import database.DatabaseConnection; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.BeforeEach; 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 arbitraire pour le test private int benevoleID = 2; private int demandeID; // ID de demande fictif pour le test @BeforeEach void setUp() throws SQLException { // Initialiser la page de test page = new BenevoleDemandesEncoursPage(benevoleID); } @Test void testFinaliserDemande() { //on crée une demande avec le statut 'en cours' pour tester la méthode finaliserDemande() try (Connection connection = DatabaseConnection.getConnection()) { 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); 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); } } }