From a795fc99aac02e8fb7425dee72d350c64465fe63 Mon Sep 17 00:00:00 2001 From: Mathis Kral Date: Tue, 21 Nov 2023 23:51:56 +0100 Subject: [PATCH] Add simple get and post tests to order package These tests mainly check the correct redirection and working input values, but not many edge cases or any business logic. Works on #48 --- .../java/catering/order/OrderController.java | 1 + .../OrderControllerIntegrationTests.java | 180 ++++++++++++++++++ 2 files changed, 181 insertions(+) create mode 100644 src/test/java/catering/order/OrderControllerIntegrationTests.java diff --git a/src/main/java/catering/order/OrderController.java b/src/main/java/catering/order/OrderController.java index 97a0f38..6d7bff7 100644 --- a/src/main/java/catering/order/OrderController.java +++ b/src/main/java/catering/order/OrderController.java @@ -100,6 +100,7 @@ public class OrderController { } @PostMapping("/allOrders/remove") + @PreAuthorize("hasRole('ADMIN')") public String removeOrder(@RequestParam Order.OrderIdentifier orderID, @LoggedIn Optional userAccount) { return userAccount.map(account -> { if (account.hasRole(Role.of("ADMIN"))) { diff --git a/src/test/java/catering/order/OrderControllerIntegrationTests.java b/src/test/java/catering/order/OrderControllerIntegrationTests.java new file mode 100644 index 0000000..bf956da --- /dev/null +++ b/src/test/java/catering/order/OrderControllerIntegrationTests.java @@ -0,0 +1,180 @@ +package catering.order; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.salespointframework.catalog.Product; +import org.salespointframework.inventory.UniqueInventory; +import org.salespointframework.inventory.UniqueInventoryItem; +import org.salespointframework.order.CartItem; +import org.salespointframework.order.OrderManagement; +import org.salespointframework.quantity.Quantity; +import org.salespointframework.useraccount.Password; +import org.salespointframework.useraccount.Role; +import org.salespointframework.useraccount.UserAccount; +import org.salespointframework.useraccount.UserAccountManagement; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.Pageable; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; + +import static org.hamcrest.Matchers.not; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.hamcrest.CoreMatchers.containsString; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +import java.time.LocalDateTime; + + +@AutoConfigureMockMvc +@SpringBootTest +public class OrderControllerIntegrationTests { + + @Autowired + MockMvc mvc; + + @Autowired + UniqueInventory inventory; + + @Autowired + OrderManagement orderManagement; + + @Autowired + UserAccountManagement userAccountManagement; + + UserAccount myUser; + UserAccount admin; + + CustomCart myCart; + + @BeforeEach + void setUp() { + if (userAccountManagement.findByUsername("andi").isEmpty()) { + userAccountManagement.create("andi", + Password.UnencryptedPassword.of("12345"), Role.of("CUSTOMER")); + } + + myUser = userAccountManagement.findByUsername("andi").get(); + admin = userAccountManagement.findByUsername("admin").get(); + + + if (orderManagement.findAll(Pageable.unpaged()).stream().findAny().isEmpty()) { + myCart = new CustomCart(OrderType.EVENT_CATERING, + LocalDateTime.of(2023, 12, 23, 10, 0), + LocalDateTime.of(2023, 12, 24, 10, 0)); + myCart.addOrUpdateItem(inventory.findAll().stream().findFirst().get().getProduct(), Quantity.of(1)); + + CustomOrder myOrder = new CustomOrder(myUser.getId(), myCart); + myCart.addItemsTo(myOrder); + + orderManagement.payOrder(myOrder); + orderManagement.completeOrder(myOrder); + } + } + + @Test + void customerViewsOrder() throws Exception { + mvc.perform(get("/myOrders").with(user("andi").roles("CUSTOMER"))) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("Menge"))) + .andExpect(model().attributeExists("orders")); + + mvc.perform(get("/myOrders").with(user("admin").roles("CUSTOMER"))) // WTF SPRING!11!!!! + .andExpect(status().isOk()) + .andExpect(content().string(containsString("0"))); + + mvc.perform(get("/myOrders").with(user("admin").roles("ADMIN"))) + .andExpect(status().isForbidden()); + } + + @Test + @WithMockUser(username = "admin", roles = "ADMIN") + void adminViewsOrder() throws Exception { + mvc.perform(get("/allOrders")) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("Menge"))) + .andExpect(model().attributeExists("orders")); + + mvc.perform(get("/allOrders").with(user("andi").roles("CUSTOMER"))) + .andExpect(status().isForbidden()); + } + + @Test + @WithMockUser(username = "admin", roles = "ADMIN") + void adminViewsOrderByDate() throws Exception { + mvc.perform(get("/allOrders/2023-12-23")) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("Menge"))) + .andExpect(model().attributeExists("orders")); + + mvc.perform(get("/allOrders/2023-10-12")) + .andExpect(status().isOk()) + .andExpect(content().string(not(containsString("Menge")))) + .andExpect(model().attributeExists("orders")); + } + + @Test + @WithMockUser(username = "admin", roles = "ADMIN") + void adminRemovesOrder() throws Exception { + mvc.perform(post("/allOrders/remove") + .param("orderID", orderManagement.findAll(Pageable.unpaged()).stream().findFirst().get().getId().toString())) + .andExpect(status().is3xxRedirection()) + .andExpect(redirectedUrl("/allOrders")); + } + + @Test + @WithMockUser(username = "andi", roles = "CUSTOMER") + void userPlansEvent() throws Exception { + mvc.perform(get("/event")) + .andExpect(status().isOk()) + .andExpect(model().attributeExists("invItems")); + + Product product = inventory.findAll().stream().findFirst().get().getProduct(); + + mvc.perform(post("/event/addProduct") + .param("pid", product.getId().toString()) + .param("number", "2")) + .andExpect(status().is3xxRedirection()) + .andExpect(redirectedUrl("/event")); + } + + @Test + @WithMockUser(username = "andi", roles = "CUSTOMER") + void userRemovesItemFromCart() throws Exception { + CartItem myItem = myCart.toList().get(0); + + mvc.perform(post("/event/removeProduct") + .param("itemId", myItem.getId())) + .andExpect(status().is3xxRedirection()) + .andExpect(redirectedUrl("/event")); + } + + @Test + @WithMockUser(username = "andi", roles = "CUSTOMER") + void userChangesDate() throws Exception { + mvc.perform(post("/event/changeDate") + .param("startDate", "2024-10-10") + .param("startHour", "10") + .param("finishDate", "2024-10-11") + .param("finishHour", "11")) + .andExpect(status().is3xxRedirection()) + .andExpect(redirectedUrl("/event")); + } + + @Test + @WithMockUser(username = "andi", roles = "CUSTOMER") + void userCheckOut() throws Exception { + Product product = inventory.findAll().stream().findFirst().get().getProduct(); + mvc.perform(post("/event/addProduct") + .param("pid", product.getId().toString()) + .param("number", "2")); + + mvc.perform(post("/event/checkout")) + .andExpect(status().is3xxRedirection()) + .andExpect(redirectedUrl("/event")); + } + +}