Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 53 additions & 0 deletions src/test/java/feature/CucumberTypeConfig.java
Original file line number Diff line number Diff line change
@@ -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<String> row) {
Comment thread
MayuriXx marked this conversation as resolved.
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<String,String>) en UserRequest.
* Utilisable dans les .feature avec des tables à en-têtes.
*/
@DataTableType
public UserRequest userRequest(Map<String, String> 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")
);
}

}
35 changes: 17 additions & 18 deletions src/test/java/feature/StepDefinition.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -46,26 +46,25 @@ public void theResponseStatusShouldBe(int expectedStatus) {
}

@And("the user profile")
public void theUserProfile(DataTable table) throws Exception{
public void theUserProfile(List<FieldAssertion> assertions) throws Exception {
JsonNode body = objectMapper.readTree(latestResponse.getBody());
List<List<String>> rows = table.asLists(String.class);
for (List<String> row : rows) {
String field = row.get(0).trim();
String expected = row.get(1).trim();
JsonNode valueNode = body.get(field);
assertNotNull(valueNode);

if ("<generated_id>".equals(expected)) {
createdUserId = valueNode.asLong();
assertTrue(createdUserId > 0);
continue;
}
if ("<created_id>".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 "<generated_id>" -> {
createdUserId = valueNode.asLong();
assertTrue(createdUserId > 0);
}
case "<created_id>" -> {
assertNotNull(createdUserId);
assertEquals(createdUserId.toString(), valueNode.asText());
}
default -> assertEquals(assertion.expected(), valueNode.asText(),
"Mismatch on field '%s'".formatted(assertion.field()));
}
assertEquals(expected, valueNode.asText());
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/test/resources/features/get_user.feature
Original file line number Diff line number Diff line change
Expand Up @@ -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
Loading