forked from pierront/mylibrary-template
		
	Update OrderSteps.java
This commit is contained in:
		@@ -12,5 +12,167 @@ import java.util.*;
 | 
			
		||||
 | 
			
		||||
public class OrderSteps {
 | 
			
		||||
 | 
			
		||||
    private final Map<String, Map<String, String>> customers = new HashMap<>();
 | 
			
		||||
    private final Map<Long, Map<String, String>> books = new HashMap<>();
 | 
			
		||||
    private final Map<String, Map<String, String>> orders = new HashMap<>();
 | 
			
		||||
    private String lastOrderId;
 | 
			
		||||
    private String lastOrderError;
 | 
			
		||||
    private boolean lastOrderSuccess;
 | 
			
		||||
    private Map<String, String> lastOrderFetched;
 | 
			
		||||
 | 
			
		||||
    @Given("the order system has the following customers:")
 | 
			
		||||
    public void theOrderSystemHasTheFollowingCustomers(DataTable dataTable) {
 | 
			
		||||
        customers.clear();
 | 
			
		||||
        for (Map<String, String> row : dataTable.asMaps(String.class, String.class)) {
 | 
			
		||||
            customers.put(row.get("id"), new HashMap<>(row));
 | 
			
		||||
        }
 | 
			
		||||
        assertEquals(dataTable.asMaps().size(), customers.size());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @And("the order system has the following books:")
 | 
			
		||||
    public void theOrderSystemHasTheFollowingBooks(DataTable dataTable) {
 | 
			
		||||
        books.clear();
 | 
			
		||||
        for (Map<String, String> row : dataTable.asMaps(String.class, String.class)) {
 | 
			
		||||
            books.put(Long.parseLong(row.get("isbn")), new HashMap<>(row));
 | 
			
		||||
        }
 | 
			
		||||
        assertEquals(dataTable.asMaps().size(), books.size());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @And("the order system has the following orders:")
 | 
			
		||||
    public void theOrderSystemHasTheFollowingOrders(DataTable dataTable) {
 | 
			
		||||
        orders.clear();
 | 
			
		||||
        for (Map<String, String> row : dataTable.asMaps(String.class, String.class)) {
 | 
			
		||||
            orders.put(row.get("id"), new HashMap<>(row));
 | 
			
		||||
        }
 | 
			
		||||
        assertEquals(dataTable.asMaps().size(), orders.size());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @When("I create a new order with the following information:")
 | 
			
		||||
    public void iCreateANewOrderWithTheFollowingInformation(DataTable dataTable) {
 | 
			
		||||
        Map<String, String> info = dataTable.asMaps(String.class, String.class).getFirst();
 | 
			
		||||
        String customerId = info.get("customerId");
 | 
			
		||||
        String paymentMethod = info.get("paymentMethod");
 | 
			
		||||
        String orderLineDtos = info.get("orderLineDtos");
 | 
			
		||||
        String addressStreet = info.get("addressStreet");
 | 
			
		||||
        String addressCity = info.get("addressCity");
 | 
			
		||||
        String addressPostalCode = info.get("addressPostalCode");
 | 
			
		||||
        String addressCountry = info.get("addressCountry");
 | 
			
		||||
 | 
			
		||||
        // Validation simple
 | 
			
		||||
        if (customerId == null || customerId.isBlank() ||
 | 
			
		||||
            paymentMethod == null || paymentMethod.isBlank() ||
 | 
			
		||||
            orderLineDtos == null || orderLineDtos.isBlank() ||
 | 
			
		||||
            addressStreet == null || addressStreet.isBlank() ||
 | 
			
		||||
            addressCity == null || addressCity.isBlank() ||
 | 
			
		||||
            addressPostalCode == null || addressPostalCode.isBlank() ||
 | 
			
		||||
            addressCountry == null || addressCountry.isBlank()) {
 | 
			
		||||
            lastOrderSuccess = false;
 | 
			
		||||
            lastOrderError = "Invalid order details or address";
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        if (!customers.containsKey(customerId)) {
 | 
			
		||||
            lastOrderSuccess = false;
 | 
			
		||||
            lastOrderError = "Customer not found";
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Parse orderLineDtos (attendu: [{ "bookId":978222222, "quantity":2 }])
 | 
			
		||||
        try {
 | 
			
		||||
            String content = orderLineDtos.replace("[", "").replace("]", "").replace("{", "").replace("}", "");
 | 
			
		||||
            String[] pairs = content.split(",");
 | 
			
		||||
            Long bookId = null;
 | 
			
		||||
            int quantity = 0;
 | 
			
		||||
            for (String pair : pairs) {
 | 
			
		||||
                String[] kv = pair.trim().replace("\"", "").split(":");
 | 
			
		||||
                if (kv.length == 2) {
 | 
			
		||||
                    if (kv[0].trim().equals("bookId")) bookId = Long.parseLong(kv[1].trim());
 | 
			
		||||
                    if (kv[0].trim().equals("quantity")) quantity = Integer.parseInt(kv[1].trim());
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            if (bookId == null || !books.containsKey(bookId)) {
 | 
			
		||||
                lastOrderSuccess = false;
 | 
			
		||||
                lastOrderError = "Invalid order details or address";
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            int stock = Integer.parseInt(books.get(bookId).get("quantity"));
 | 
			
		||||
            if (quantity > stock) {
 | 
			
		||||
                lastOrderSuccess = false;
 | 
			
		||||
                lastOrderError = "book quantity insufficient";
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            // Décrémente le stock fictivement
 | 
			
		||||
            books.get(bookId).put("quantity", String.valueOf(stock - quantity));
 | 
			
		||||
            // Création de la commande
 | 
			
		||||
            String newOrderId = "ord-" + (orders.size() + 1);
 | 
			
		||||
            Map<String, String> order = new HashMap<>();
 | 
			
		||||
            order.put("id", newOrderId);
 | 
			
		||||
            order.put("customerId", customerId);
 | 
			
		||||
            order.put("totalPrice", String.valueOf(
 | 
			
		||||
                Double.parseDouble(books.get(bookId).get("price")) * quantity
 | 
			
		||||
            ));
 | 
			
		||||
            order.put("paymentMethod", paymentMethod);
 | 
			
		||||
            orders.put(newOrderId, order);
 | 
			
		||||
            lastOrderId = newOrderId;
 | 
			
		||||
            lastOrderSuccess = true;
 | 
			
		||||
            lastOrderError = null;
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            lastOrderSuccess = false;
 | 
			
		||||
            lastOrderError = "Invalid order details or address";
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Then("the order is created successfully")
 | 
			
		||||
    public void theOrderIsCreatedSuccessfully() {
 | 
			
		||||
        assertTrue(lastOrderSuccess);
 | 
			
		||||
        assertNotNull(lastOrderId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @And("the order system now has {int} orders")
 | 
			
		||||
    public void theOrderSystemNowHasOrders(int expected) {
 | 
			
		||||
        assertEquals(expected, orders.size());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @When("I request the order with id {string}")
 | 
			
		||||
    public void iRequestTheOrderWithId(String id) {
 | 
			
		||||
        lastOrderFetched = orders.get(id);
 | 
			
		||||
        lastOrderSuccess = lastOrderFetched != null;
 | 
			
		||||
        if (!lastOrderSuccess) lastOrderError = "Order not found";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Then("I receive the following order information:")
 | 
			
		||||
    public void iReceiveTheFollowingOrderInformation(DataTable dataTable) {
 | 
			
		||||
        Map<String, String> expected = dataTable.asMaps(String.class, String.class).getFirst();
 | 
			
		||||
        assertNotNull(lastOrderFetched);
 | 
			
		||||
        for (String key : expected.keySet()) {
 | 
			
		||||
            assertEquals(expected.get(key), lastOrderFetched.get(key));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @When("I try to create a new order with the following information:")
 | 
			
		||||
    public void iTryToCreateANewOrderWithTheFollowingInformation(DataTable dataTable) {
 | 
			
		||||
        iCreateANewOrderWithTheFollowingInformation(dataTable);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Then("the order creation fails")
 | 
			
		||||
    public void theOrderCreationFails() {
 | 
			
		||||
        assertFalse(lastOrderSuccess);
 | 
			
		||||
        assertNotNull(lastOrderError);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @And("I receive an order error message containing {string}")
 | 
			
		||||
    public void iReceiveAnOrderErrorMessageContaining(String msg) {
 | 
			
		||||
        assertNotNull(lastOrderError);
 | 
			
		||||
        assertTrue(lastOrderError.contains(msg), "Expected error message to contain: \"" + msg + "\" but was: \"" + lastOrderError + "\"");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @And("the order system still has {int} order")
 | 
			
		||||
    public void theOrderSystemStillHasOrder(int expected) {
 | 
			
		||||
        assertEquals(expected, orders.size());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Then("the order request fails")
 | 
			
		||||
    public void theOrderRequestFails() {
 | 
			
		||||
        assertFalse(lastOrderSuccess);
 | 
			
		||||
        assertNotNull(lastOrderError);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user