package controller; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import javax.swing.*; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.sql.SQLException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import database.DatabaseConnection; import static org.junit.jupiter.api.Assertions.*; class BenevoleDemandesPageTest { private BenevoleDemandesPage benevoleDemandesPage; private JTable table; private int benevoleID = 2; //pour tester on prend arbitrairement un utilisateur qui est un bénévole private int demandeID; //on crée manuellment une demande pour les tests (on la supprime après) @BeforeEach void setUp() throws SQLException { //on crée la page des demandes acceptés benevoleDemandesPage = new BenevoleDemandesPage(benevoleID); } @Test void testBenevoleDemandesPage() { // Vérifier si la page des demandes de bénévoles est bien créée assertNotNull(benevoleDemandesPage); assertEquals(benevoleID,benevoleDemandesPage.getID(),"id pas correct"); } @Test void testListeDemandesNonVide() { try { // on utilise une méthode détournée pour accéder à la méthode private 'loadDemandesAcceptees()' Method loadDemandesAccepteesMethod = BenevoleDemandesPage.class.getDeclaredMethod("loadDemandesAcceptees"); loadDemandesAccepteesMethod.setAccessible(true); // permet d'appeler la méthode même si elle est private loadDemandesAccepteesMethod.invoke(benevoleDemandesPage); // on l'appele // Vérifie si la liste des demandes a bien été chargée assertNotNull(benevoleDemandesPage.getTable()); assertNotNull(benevoleDemandesPage.getTableModel()); } catch (InvocationTargetException | NoSuchMethodException | IllegalAccessException e) { throw new RuntimeException(e); } } @Test void testPrendreDemande() throws SQLException { //on crée une demande avec le statut 'acceptée' pour tester la méthode prendreDemande() 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, "acceptée"); insertStatement.setNull(2, java.sql.Types.INTEGER); // Aucun utilisateur affecté insertStatement.setNull(3, java.sql.Types.INTEGER); // Aucun bénévole affecté initialement insertStatement.setString(4, "Demande de test pour JUnit"); 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 'loadDemandesAcceptees()' Method loadDemandesAccepteesMethod = BenevoleDemandesPage.class.getDeclaredMethod("loadDemandesAcceptees"); loadDemandesAccepteesMethod.setAccessible(true); // permet d'appeler la méthode même si elle est private loadDemandesAccepteesMethod.invoke(benevoleDemandesPage); // on l'appele //test de prendreDemande(); on sélectionne la dernière ligne de la table car elle correspond à la demande test int lastRow = benevoleDemandesPage.getTable().getRowCount()-1; benevoleDemandesPage.getTable().setRowSelectionInterval(lastRow, lastRow); // idem que pour loadDemandesAcceptees() comme prendreDemande() est aussi en private Method prendreDemandeMethod = BenevoleDemandesPage.class.getDeclaredMethod("prendreDemande"); prendreDemandeMethod.setAccessible(true); // permet d'appeler la méthode même si elle est private prendreDemandeMethod.invoke(benevoleDemandesPage); // on l'appele // on attend un moment pour que la base de données se mette à jour Thread.sleep(1000); String sql = "SELECT statut, benevole_id FROM demandes_aide WHERE id = ?"; PreparedStatement statement = connection.prepareStatement(sql); statement.setInt(1, demandeID); ResultSet resultSet = statement.executeQuery(); String currentStatus = ""; int currentBenevole = -1; if (resultSet.next()) { currentStatus = resultSet.getString("statut"); currentBenevole = resultSet.getInt("benevole_id"); } assertEquals("en cours", currentStatus, "Le statut doit être 'en cours'."); assertEquals(benevoleID, currentBenevole, "L'id du bénévole n'a pas correctement été attribué."); // 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 e) { throw new RuntimeException(e); } } @Test void testPrendreDemandeNonSelectionnee() { // Désélectionner toute ligne pour simuler l'absence de sélection benevoleDemandesPage.getTable().clearSelection(); // on enregistre l'état avant l'appel de la méthode int rowCountBefore = benevoleDemandesPage.getTableModel().getRowCount(); //test de prendreDemande() sans rien sélectionner JButton prendreButton = benevoleDemandesPage.getPrendreDemandeButton(); prendreButton.doClick(); // on vérifier que l'état de la table n'a pas changé (la table n'a pas été modifiée) int rowCountAfter = benevoleDemandesPage.getTableModel().getRowCount(); assertEquals(rowCountBefore, rowCountAfter, "La table ne doit pas être modifiée si aucune demande n'est sélectionnée."); } }