PDLA_24/src/test/java/controller/BenevoleDemandesPageTest.java
2024-11-16 15:52:35 +01:00

133 lines
6.4 KiB
Java

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.");
}
}