diff --git a/src/test/java/feature/CucumberTypeConfig.java b/src/test/java/feature/CucumberTypeConfig.java new file mode 100644 index 0000000..c89ab6d --- /dev/null +++ b/src/test/java/feature/CucumberTypeConfig.java @@ -0,0 +1,53 @@ +package feature; + +import com.xpeho.spring_boot_java_random_user.domain.entities.UserRequest; +import io.cucumber.java.DataTableType; + +import java.util.List; +import java.util.Map; + +/** + * Cucumber converters — transforment automatiquement les données + * des fichiers .feature en objets Java typés. + */ +public class CucumberTypeConfig { + + /** + * Représente une ligne de vérification field/expected dans une DataTable. + */ + public record FieldAssertion(String field, String expected) {} + + /** + * Convertit chaque ligne de la DataTable (2 colonnes sans en-tête) + * en un objet FieldAssertion. + */ + @DataTableType + public FieldAssertion fieldAssertion(List row) { + if (row.size() < 2) { + throw new IllegalArgumentException( + "DataTable row must have at least 2 columns (field | expected), got %d: %s" + .formatted(row.size(), row) + ); + } + return new FieldAssertion(row.get(0).trim(), row.get(1).trim()); + } + + /** + * Convertit une ligne de DataTable (Map) en UserRequest. + * Utilisable dans les .feature avec des tables à en-têtes. + */ + @DataTableType + public UserRequest userRequest(Map row) { + return new UserRequest( + row.get("gender"), + row.get("firstname"), + row.get("lastname"), + row.get("civility"), + row.get("email"), + row.get("phone"), + row.get("picture"), + row.get("nat") + ); + } + +} diff --git a/src/test/java/feature/StepDefinition.java b/src/test/java/feature/StepDefinition.java index a4423fa..a4a4793 100644 --- a/src/test/java/feature/StepDefinition.java +++ b/src/test/java/feature/StepDefinition.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.xpeho.spring_boot_java_random_user.domain.entities.UserRequest; -import io.cucumber.datatable.DataTable; +import feature.CucumberTypeConfig.FieldAssertion; import io.cucumber.java.en.And; import io.cucumber.java.en.Given; import io.cucumber.java.en.Then; @@ -46,26 +46,25 @@ public void theResponseStatusShouldBe(int expectedStatus) { } @And("the user profile") - public void theUserProfile(DataTable table) throws Exception{ + public void theUserProfile(List assertions) throws Exception { JsonNode body = objectMapper.readTree(latestResponse.getBody()); - List> rows = table.asLists(String.class); - for (List row : rows) { - String field = row.get(0).trim(); - String expected = row.get(1).trim(); - JsonNode valueNode = body.get(field); - assertNotNull(valueNode); - if ("".equals(expected)) { - createdUserId = valueNode.asLong(); - assertTrue(createdUserId > 0); - continue; - } - if ("".equals(expected)) { - assertNotNull(createdUserId); - assertEquals(createdUserId.toString(), valueNode.asText()); - continue; + for (FieldAssertion assertion : assertions) { + JsonNode valueNode = body.get(assertion.field()); + assertNotNull(valueNode, "Field '%s' not found in response".formatted(assertion.field())); + + switch (assertion.expected()) { + case "" -> { + createdUserId = valueNode.asLong(); + assertTrue(createdUserId > 0); + } + case "" -> { + assertNotNull(createdUserId); + assertEquals(createdUserId.toString(), valueNode.asText()); + } + default -> assertEquals(assertion.expected(), valueNode.asText(), + "Mismatch on field '%s'".formatted(assertion.field())); } - assertEquals(expected, valueNode.asText()); } } diff --git a/src/test/resources/features/get_user.feature b/src/test/resources/features/get_user.feature index 9dfb323..0d9fd0e 100644 --- a/src/test/resources/features/get_user.feature +++ b/src/test/resources/features/get_user.feature @@ -13,5 +13,5 @@ Feature: Get user endpoint | firstname | Emma | Scenario: Get a user that does not exist - When the client call to GET /random-users/999 + When the client call to GET /random-users/999999 Then the response status should be 404