package controller; import database.DatabaseConnection; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; 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 ValidateurTest { private Validateur validateur; private int validateurID = 3; // utilisateur arbitraire qui va valider les demandes de test private int utilisateurID = 1; // utilisateur arbitraire qui va créer les demandes de test private int demandeID; //on crée manuellment une demande pour les tests (on la supprime après) @BeforeEach void setUp() { validateur = new Validateur(validateurID); } @Test void testValiderDemande() throws SQLException { //on crée une demande avec le statut 'soumise' pour tester la méthode validerDemande() 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, "soumise"); insertStatement.setInt(2, utilisateurID); insertStatement.setNull(3, java.sql.Types.INTEGER); // Aucun bénévole affecté initialement insertStatement.setString(4, "Demande de test pour JUnit / Test validation"); 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 'loadDemandesEnAttente()' Method loadDemandesEnAttenteMethod = Validateur.class.getDeclaredMethod("loadDemandesEnAttente"); loadDemandesEnAttenteMethod.setAccessible(true); // permet d'appeler la méthode même si elle est private loadDemandesEnAttenteMethod.invoke(validateur); // on l'appele //test de validerDemande(); on sélectionne la dernière ligne de la table car elle correspond à la demande test int lastRow = validateur.getTable().getRowCount()-1; validateur.getTable().setRowSelectionInterval(lastRow, lastRow); // idem que pour loadDemandesEnAttente() comme rejeterDemande() est aussi en private Method rejeterDemandeMethod = Validateur.class.getDeclaredMethod("validerDemande"); rejeterDemandeMethod.setAccessible(true); // permet d'appeler la méthode même si elle est private rejeterDemandeMethod.invoke(validateur); // 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("acceptée", currentStatus, "Le statut doit être 'accepté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 testRejeterDemande() { //on crée une demande avec le statut 'soumise' pour tester la méthode rejeterDemande() 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, "soumise"); insertStatement.setInt(2, utilisateurID); insertStatement.setNull(3, java.sql.Types.INTEGER); // Aucun bénévole affecté initialement insertStatement.setString(4, "Demande de test pour JUnit / Test rejet"); 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 'loadDemandesEnAttente()' Method loadDemandesEnAttenteMethod = Validateur.class.getDeclaredMethod("loadDemandesEnAttente"); loadDemandesEnAttenteMethod.setAccessible(true); // permet d'appeler la méthode même si elle est private loadDemandesEnAttenteMethod.invoke(validateur); // on l'appele //test de rejeterDemande(); on sélectionne la dernière ligne de la table car elle correspond à la demande test int lastRow = validateur.getTable().getRowCount()-1; validateur.getTable().setRowSelectionInterval(lastRow, lastRow); // idem que pour loadDemandesEnAttente() comme rejeterDemande() est aussi en private Method rejeterDemandeMethod = Validateur.class.getDeclaredMethod("rejeterDemande"); rejeterDemandeMethod.setAccessible(true); // permet d'appeler la méthode même si elle est private rejeterDemandeMethod.invoke(validateur); // 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("rejetée", currentStatus, "Le statut doit être 'rejeté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 testLoadDemandesEnAttente() { try (Connection connection = DatabaseConnection.getConnection()) { // Créer trois demandes tests String desc1 = "Demande de test 1 pour JUnit / Test loadDemandesEnAttente"; String desc2 = "Demande de test 2 pour JUnit / Test loadDemandesEnAttente"; String desc3 = "Demande de test 3 pour JUnit / Test loadDemandesEnAttente"; // Insertion de la première demande 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, "soumise"); insertStatement.setInt(2, utilisateurID); insertStatement.setNull(3, java.sql.Types.INTEGER); //pas de benevole attribué insertStatement.setString(4, desc1); insertStatement.executeUpdate(); ResultSet generatedKeys = insertStatement.getGeneratedKeys(); if (generatedKeys.next()) { demandeID = generatedKeys.getInt(1); } // Insertion des autres demandes insertStatement.setString(4, desc2); insertStatement.executeUpdate(); insertStatement.setString(4, desc3); insertStatement.executeUpdate(); // Charger les demandes dans la table Method loadDemandesEnAttenteMethod = Validateur.class.getDeclaredMethod("loadDemandesEnAttente"); loadDemandesEnAttenteMethod.setAccessible(true); loadDemandesEnAttenteMethod.invoke(validateur); // Vérifier que les descriptions sont bien chargées int lastRow = validateur.getTable().getRowCount()-1; String desc_actual = (String) validateur.getTableModel().getValueAt(lastRow-2, 1) + (String) validateur.getTableModel().getValueAt(lastRow-1, 1) + (String) validateur.getTableModel().getValueAt(lastRow, 1); String desc_expected = desc1 + desc2 + desc3; assertEquals(desc_expected, desc_actual, "Les descriptions doivent correspondre"); // Nettoyage des données de test for (int i = 0; i < 3; i++) { String deleteSQL = "DELETE FROM demandes_aide WHERE id = ?"; PreparedStatement deleteStatement = connection.prepareStatement(deleteSQL); deleteStatement.setInt(1, demandeID + i); deleteStatement.executeUpdate(); } } catch (SQLException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { throw new RuntimeException(e); } } }