diff --git a/src/test/java/controller/ValidateurTest.java b/src/test/java/controller/ValidateurTest.java index 159b9a6..22552e5 100644 --- a/src/test/java/controller/ValidateurTest.java +++ b/src/test/java/controller/ValidateurTest.java @@ -1,28 +1,181 @@ package controller; +import database.DatabaseConnection; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import javax.swing.*; +import javax.swing.table.DefaultTableModel; +import java.lang.reflect.Field; +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 JTable table; + private DefaultTableModel tableModel; + private JButton validerButton; + private JButton rejeterButton; + private JButton retourButton; + private int utilisateurId = 1; // Example user ID for testing @BeforeEach - void setUp() { - validateur = new Validateur(3); // Utilisateur ID fictif + void setUp() throws NoSuchFieldException, IllegalAccessException { + validateur = new Validateur(utilisateurId); + + // Access private fields using reflection + table = (JTable) getField("table"); + tableModel = (DefaultTableModel) getField("tableModel"); + validerButton = (JButton) getField("validerButton"); + rejeterButton = (JButton) getField("rejeterButton"); + retourButton = (JButton) getField("retourButton"); + } + + // Helper method to access private fields + private Object getField(String fieldName) throws NoSuchFieldException, IllegalAccessException { + Field field = Validateur.class.getDeclaredField(fieldName); + field.setAccessible(true); + return field.get(validateur); } @Test - void testValidateurNotNull() { - // Vérifier si la page du validateur est bien créée - assertNotNull(validateur); + void testLoadDemandesEnAttente() throws SQLException { + // Insert a test pending request + int demandeId; + try (Connection connection = DatabaseConnection.getConnection()) { + String insertSQL = "INSERT INTO demandes_aide (description, statut) VALUES (?, 'soumise')"; + PreparedStatement insertStatement = connection.prepareStatement(insertSQL, PreparedStatement.RETURN_GENERATED_KEYS); + insertStatement.setString(1, "Pending request for test"); + insertStatement.executeUpdate(); + + ResultSet generatedKeys = insertStatement.getGeneratedKeys(); + generatedKeys.next(); + demandeId = generatedKeys.getInt(1); + } + + // Invoke loadDemandesEnAttente and verify the request appears in the table + Method loadDemandesEnAttenteMethod = Validateur.class.getDeclaredMethod("loadDemandesEnAttente"); + loadDemandesEnAttenteMethod.setAccessible(true); + loadDemandesEnAttenteMethod.invoke(validateur); + + boolean found = false; + for (int i = 0; i < tableModel.getRowCount(); i++) { + if ((int) tableModel.getValueAt(i, 0) == demandeId) { + found = true; + break; + } + } + assertTrue(found, "The pending request should be loaded in the table."); + + // Clean up test data + try (Connection connection = DatabaseConnection.getConnection()) { + String deleteSQL = "DELETE FROM demandes_aide WHERE id = ?"; + PreparedStatement deleteStatement = connection.prepareStatement(deleteSQL); + deleteStatement.setInt(1, demandeId); + deleteStatement.executeUpdate(); + } } @Test - void testDemandeStatutModification() { - // Tester si le changement de statut d'une demande fonctionne correctement - // assertDoesNotThrow(() -> validateur.modifierStatutDemande(1, "validée")); // ID de la demande fictif + void testValiderDemande() throws SQLException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { + // Insert a test pending request + int demandeId; + try (Connection connection = DatabaseConnection.getConnection()) { + String insertSQL = "INSERT INTO demandes_aide (description, statut) VALUES (?, 'soumise')"; + PreparedStatement insertStatement = connection.prepareStatement(insertSQL, PreparedStatement.RETURN_GENERATED_KEYS); + insertStatement.setString(1, "Pending request to validate"); + insertStatement.executeUpdate(); + + ResultSet generatedKeys = insertStatement.getGeneratedKeys(); + generatedKeys.next(); + demandeId = generatedKeys.getInt(1); + } + + // Select the row and invoke validerDemande method + tableModel.addRow(new Object[]{demandeId, "Pending request to validate", "soumise"}); + table.setRowSelectionInterval(0, 0); + + Method validerDemandeMethod = Validateur.class.getDeclaredMethod("validerDemande"); + validerDemandeMethod.setAccessible(true); + validerDemandeMethod.invoke(validateur); + + // Verify that the request status was updated in the database + try (Connection connection = DatabaseConnection.getConnection()) { + String sql = "SELECT statut FROM demandes_aide WHERE id = ?"; + PreparedStatement statement = connection.prepareStatement(sql); + statement.setInt(1, demandeId); + ResultSet resultSet = statement.executeQuery(); + + assertTrue(resultSet.next(), "The request should exist in the database."); + assertEquals("acceptée", resultSet.getString("statut"), "The request status should be 'acceptée'."); + + // Clean up test data + String deleteSQL = "DELETE FROM demandes_aide WHERE id = ?"; + PreparedStatement deleteStatement = connection.prepareStatement(deleteSQL); + deleteStatement.setInt(1, demandeId); + deleteStatement.executeUpdate(); + } + } + + @Test + void testRejeterDemande() throws SQLException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { + // Insert a test pending request + int demandeId; + try (Connection connection = DatabaseConnection.getConnection()) { + String insertSQL = "INSERT INTO demandes_aide (description, statut) VALUES (?, 'soumise')"; + PreparedStatement insertStatement = connection.prepareStatement(insertSQL, PreparedStatement.RETURN_GENERATED_KEYS); + insertStatement.setString(1, "Pending request to reject"); + insertStatement.executeUpdate(); + + ResultSet generatedKeys = insertStatement.getGeneratedKeys(); + generatedKeys.next(); + demandeId = generatedKeys.getInt(1); + } + + // Select the row and invoke rejeterDemande method + tableModel.addRow(new Object[]{demandeId, "Pending request to reject", "soumise"}); + table.setRowSelectionInterval(0, 0); + + // Simulate entering a rejection reason + String motifRejet = "Test motif de rejet"; + JOptionPane.showMessageDialog(validateur, motifRejet); // Simulate the input dialog + + Method rejeterDemandeMethod = Validateur.class.getDeclaredMethod("rejeterDemande"); + rejeterDemandeMethod.setAccessible(true); + rejeterDemandeMethod.invoke(validateur); + + // Verify that the request status and rejection reason were updated in the database + try (Connection connection = DatabaseConnection.getConnection()) { + String sql = "SELECT statut, motif_rejet FROM demandes_aide WHERE id = ?"; + PreparedStatement statement = connection.prepareStatement(sql); + statement.setInt(1, demandeId); + ResultSet resultSet = statement.executeQuery(); + + assertTrue(resultSet.next(), "The request should exist in the database."); + assertEquals("rejetée", resultSet.getString("statut"), "The request status should be 'rejetée'."); + assertEquals(motifRejet, resultSet.getString("motif_rejet"), "The rejection reason should be saved in the database."); + + // Clean up test data + String deleteSQL = "DELETE FROM demandes_aide WHERE id = ?"; + PreparedStatement deleteStatement = connection.prepareStatement(deleteSQL); + deleteStatement.setInt(1, demandeId); + deleteStatement.executeUpdate(); + } + } + + @Test + void testRetourButtonAction() { + // Simulate clicking the "Retour à la connexion" button + retourButton.doClick(); + + // Check that the current frame is disposed + assertFalse(validateur.isVisible(), "Validateur page should be closed after clicking 'Retour à la connexion'."); } }