PDLA_24/src/test/java/controller/BenevoleDemandesEncoursPageTest.java
2024-11-29 09:31:14 +01:00

194 lines
10 KiB
Java

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