PDLA_24/src/test/java/controller/ValidateurTest.java
2024-11-29 11:10:08 +01:00

200 lines
10 KiB
Java

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