diff --git a/pom.xml b/pom.xml index 38e0cd40b..c0ab78aad 100644 --- a/pom.xml +++ b/pom.xml @@ -69,6 +69,11 @@ org.springframework.security spring-security-taglibs + + org.springframework.security + spring-security-test + test + org.springframework.boot spring-boot-starter-security diff --git a/src/main/java/org/springframework/cheapy/configuration/SecurityConfiguration.java b/src/main/java/org/springframework/cheapy/configuration/SecurityConfiguration.java index 4c119fe2c..25a12bc0d 100644 --- a/src/main/java/org/springframework/cheapy/configuration/SecurityConfiguration.java +++ b/src/main/java/org/springframework/cheapy/configuration/SecurityConfiguration.java @@ -44,12 +44,12 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter { .antMatchers("/usuarios/new").permitAll() .antMatchers("/admin/**").hasAnyAuthority("admin") - .antMatchers("/speedOffers/**").hasAnyAuthority("admin", "client") - .antMatchers("/foodOffers/**").hasAnyAuthority("admin", "client") .antMatchers("/owners/**").hasAnyAuthority("owner", "admin") .antMatchers("/clients/new").permitAll() - .antMatchers("/offers/**").hasAnyAuthority("admin") + .antMatchers("/offers/**/new").hasAnyAuthority("admin","client") + .antMatchers("/offers/**/activate").hasAnyAuthority("admin","client") + .antMatchers("/offers/**").permitAll() .and().formLogin() .loginPage("/login").permitAll() diff --git a/src/main/java/org/springframework/cheapy/model/Offer.java b/src/main/java/org/springframework/cheapy/model/Offer.java index c41ca9040..f5c92c10d 100644 --- a/src/main/java/org/springframework/cheapy/model/Offer.java +++ b/src/main/java/org/springframework/cheapy/model/Offer.java @@ -29,10 +29,7 @@ import org.springframework.format.annotation.DateTimeFormat; @MappedSuperclass public class Offer extends BaseEntity { - - /** - * - */ + private static final long serialVersionUID = 1L; //Clase padre @@ -46,7 +43,6 @@ public class Offer extends BaseEntity { @Future private LocalDateTime end; - private String code; @Enumerated(value = EnumType.STRING) diff --git a/src/main/java/org/springframework/cheapy/model/SpeedOffer.java b/src/main/java/org/springframework/cheapy/model/SpeedOffer.java index 0ef65d7a2..021a89106 100644 --- a/src/main/java/org/springframework/cheapy/model/SpeedOffer.java +++ b/src/main/java/org/springframework/cheapy/model/SpeedOffer.java @@ -10,9 +10,6 @@ import javax.validation.constraints.NotNull; @Table(name = "speed_offers") public class SpeedOffer extends Offer { - /** - * - */ private static final long serialVersionUID = 1L; @NotNull diff --git a/src/main/java/org/springframework/cheapy/model/User.java b/src/main/java/org/springframework/cheapy/model/User.java index bd5b2dd30..e9c232562 100644 --- a/src/main/java/org/springframework/cheapy/model/User.java +++ b/src/main/java/org/springframework/cheapy/model/User.java @@ -7,7 +7,6 @@ import javax.validation.constraints.NotBlank; @Entity @Table(name = "users") -//@MappedSuperclass public class User{ @Id @@ -18,10 +17,6 @@ public class User{ boolean enabled; - - /** - * - */ private static final long serialVersionUID = 1L; diff --git a/src/main/java/org/springframework/cheapy/web/FoodOfferController.java b/src/main/java/org/springframework/cheapy/web/FoodOfferController.java index af191c66d..c41974569 100644 --- a/src/main/java/org/springframework/cheapy/web/FoodOfferController.java +++ b/src/main/java/org/springframework/cheapy/web/FoodOfferController.java @@ -20,7 +20,7 @@ import org.springframework.web.bind.annotation.PostMapping; @Controller public class FoodOfferController { - private static final String VIEWS_FOOD_OFFER_CREATE_OR_UPDATE_FORM = "foodOffers/createOrUpdateFoodOfferForm"; + private static final String VIEWS_FOOD_OFFER_CREATE_OR_UPDATE_FORM = "offers/food/createOrUpdateFoodOfferForm"; private final FoodOfferService foodOfferService; private final ClientService clientService; @@ -31,19 +31,14 @@ public class FoodOfferController { this.clientService = clientService; } - @InitBinder - public void setAllowedFields(WebDataBinder dataBinder) { - dataBinder.setDisallowedFields("id"); - } - - @GetMapping("/foodOffers/new") + @GetMapping("/offers/food/new") public String initCreationForm(Map model) { FoodOffer foodOffer = new FoodOffer(); model.put("foodOffer", foodOffer); return VIEWS_FOOD_OFFER_CREATE_OR_UPDATE_FORM; } - @PostMapping("/foodOffers/new") + @PostMapping("/offers/food/new") public String processCreationForm(@Valid FoodOffer foodOffer, BindingResult result) { if (result.hasErrors()) { return VIEWS_FOOD_OFFER_CREATE_OR_UPDATE_FORM; @@ -53,11 +48,11 @@ public class FoodOfferController { foodOffer.setClient(client); foodOffer.setType(StatusOffer.hidden); this.foodOfferService.saveFoodOffer(foodOffer); - return "redirect:/foodOffers/" + foodOffer.getId(); + return "redirect:/offers/food/" + foodOffer.getId(); } } - @GetMapping(value = "/foodOffers/{foodOfferId}/activate") + @GetMapping(value = "/offers/food/{foodOfferId}/activate") public String activateFoodOffer(@PathVariable("foodOfferId") final int foodOfferId, ModelMap modelMap) { FoodOffer foodOffer = this.foodOfferService.findFoodOfferById(foodOfferId); Client client = this.clientService.getCurrentClient(); @@ -68,7 +63,7 @@ public class FoodOfferController { } else { modelMap.addAttribute("message", "You don't have access to this food offer"); } - return "redirect:/foodOffers/"; + return "redirect:/offers/food/" + foodOffer.getId(); } @GetMapping("/offers/food/{foodOfferId}") public String processShowForm(@PathVariable("foodOfferId") int foodOfferId, Map model) { @@ -77,7 +72,7 @@ public class FoodOfferController { model.put("foodOffer", foodOffer); - return "foodOffers/foodOffersShow"; + return "offers/food/foodOffersShow"; } } diff --git a/src/main/java/org/springframework/cheapy/web/SpeedOfferController.java b/src/main/java/org/springframework/cheapy/web/SpeedOfferController.java index f9678e4bc..7b9e071b8 100644 --- a/src/main/java/org/springframework/cheapy/web/SpeedOfferController.java +++ b/src/main/java/org/springframework/cheapy/web/SpeedOfferController.java @@ -37,7 +37,7 @@ import org.springframework.web.bind.annotation.PostMapping; @Controller public class SpeedOfferController { - private static final String VIEWS_SPEED_OFFER_CREATE_OR_UPDATE_FORM = "speedOffers/createOrUpdateSpeedOfferForm"; + private static final String VIEWS_SPEED_OFFER_CREATE_OR_UPDATE_FORM = "offers/speed/createOrUpdateSpeedOfferForm"; private final SpeedOfferService speedOfferService; private final ClientService clientService; @@ -47,19 +47,14 @@ public class SpeedOfferController { this.clientService = clientService; } - @InitBinder - public void setAllowedFields(WebDataBinder dataBinder) { - dataBinder.setDisallowedFields("id"); - } - - @GetMapping("/speedOffers/new") + @GetMapping("/offers/speed/new") public String initCreationForm(Map model) { SpeedOffer speedOffer = new SpeedOffer(); model.put("speedOffer", speedOffer); return VIEWS_SPEED_OFFER_CREATE_OR_UPDATE_FORM; } - @PostMapping("/speedOffers/new") + @PostMapping("/offers/speed/new") public String processCreationForm(@Valid SpeedOffer speedOffer, BindingResult result) { if (result.hasErrors()) { return VIEWS_SPEED_OFFER_CREATE_OR_UPDATE_FORM; @@ -69,11 +64,11 @@ public class SpeedOfferController { speedOffer.setClient(client); speedOffer.setType(StatusOffer.hidden); this.speedOfferService.saveSpeedOffer(speedOffer); - return "redirect:/speedOffers/" + speedOffer.getId(); + return "redirect:/offers/speed/" + speedOffer.getId(); } } - @GetMapping(value = "/speedOffers/{speedOfferId}/activate") + @GetMapping(value = "/offers/speed/{speedOfferId}/activate") public String activateSpeedOffer(@PathVariable("speedOfferId") final int speedOfferId, ModelMap modelMap) { SpeedOffer speedOffer = this.speedOfferService.findSpeedOfferById(speedOfferId); Client client = this.clientService.getCurrentClient(); @@ -84,7 +79,7 @@ public class SpeedOfferController { } else { modelMap.addAttribute("message", "You don't have access to this speed offer"); } - return "redirect:/speedOffers/"; + return "redirect:/offers/speed/" + speedOffer.getId(); } @GetMapping("/offers/speed/{speedOfferId}") @@ -92,6 +87,6 @@ public class SpeedOfferController { SpeedOffer speedOffer=this.speedOfferService.findSpeedOfferById(speedOfferId); model.put("speedOffer", speedOffer); - return "speedOffers/speedOffersShow"; + return "offers/speed/speedOffersShow"; } } diff --git a/src/main/resources/db/mysql/data.sql b/src/main/resources/db/mysql/data.sql index 30ae2672e..73fcd9849 100644 --- a/src/main/resources/db/mysql/data.sql +++ b/src/main/resources/db/mysql/data.sql @@ -9,17 +9,17 @@ INSERT INTO owners VALUES (8, 'Maria', 'Escobito', '345 Maple St.', 'Madison', ' INSERT INTO owners VALUES (9, 'David', 'Schroeder', '2749 Blackhawk Trail', 'Madison', '6085559435'); INSERT INTO owners VALUES (10, 'Carlos', 'Estaban', '2335 Independence La.', 'Waunakee', '6085555487'); -INSERT INTO users (dtype,username,password,enabled) VALUES ('user','admin','admin', TRUE ); +INSERT INTO users (dtype,username,password,enabled) VALUES ('User','admin','admin', TRUE ); INSERT INTO authorities VALUES ('admin','admin'); -INSERT INTO users (dtype,username,password,enabled) VALUES ('user','manoli','manoli', TRUE ); -INSERT INTO authorities VALUES ('manoli','cliente'); -INSERT INTO users (dtype,username,password,enabled) VALUES ('user','david','david', TRUE ); -INSERT INTO authorities VALUES ('david','cliente'); -INSERT INTO users (dtype,username,password,enabled) VALUES ('user','paco','paco', TRUE ); +INSERT INTO users (dtype,username,password,enabled) VALUES ('User','manoli','manoli', TRUE ); +INSERT INTO authorities VALUES ('manoli','client'); +INSERT INTO users (dtype,username,password,enabled) VALUES ('User','david','david', TRUE ); +INSERT INTO authorities VALUES ('david','client'); +INSERT INTO users (dtype,username,password,enabled) VALUES ('User','paco','paco', TRUE ); INSERT INTO authorities VALUES ('paco','usuario'); -INSERT INTO users (dtype,username,password,enabled) VALUES ('user','lolo','lolo', TRUE ); +INSERT INTO users (dtype,username,password,enabled) VALUES ('User','lolo','lolo', TRUE ); INSERT INTO authorities VALUES ('lolo','usuario'); -INSERT INTO users (dtype,username,password,enabled) VALUES ('user','pepe','pepe', TRUE ); +INSERT INTO users (dtype,username,password,enabled) VALUES ('User','pepe','pepe', TRUE ); INSERT INTO authorities VALUES ('pepe','usuario'); INSERT INTO usuarios VALUES (1, 'admin', 'admin', 'admin', 'C/admin', '000000000', 'admin@gmail.com','admin'); @@ -27,8 +27,8 @@ INSERT INTO usuarios VALUES (2, 'Paco', 'Naranjo', '21154416G', 'C/Esperanza', ' INSERT INTO usuarios VALUES (3, 'Lolo', 'Lopez', '25486596L', 'C/Macarena', '690670547' ,'Lolo@gmail.com','lolo'); INSERT INTO usuarios VALUES (4, 'Pepe', 'Lopez', '12456776V', 'C/Macarena', '690670547', 'Pepe@gmail.com','pepe'); -INSERT INTO clients VALUES (1,'manoli@gmail.com','C/Betis','10:00','22:00','608726190', 'description 1', 'code1', 'ESPAÑOLA','manoli'); -INSERT INTO clients VALUES (2,'david@gmail.com','C/Sevilla','09:30','22:00','608726190', 'description 2', 'code2', 'americana','david'); +INSERT INTO clients VALUES (1,'manoli@gmail.com','C/Betis','10:00','22:00','608726190', 'description 1', 'code1', 'ESPAÑOLA','manoli'); +INSERT INTO clients VALUES (2,'david@gmail.com','C/Sevilla','09:30','22:00','608726190', 'description 2', 'code2', 'americana','david'); INSERT INTO food_offers(start, end, code, type, client_id, food, discount, units) VALUES ('2021-06-15 12:00:00', '2021-06-16 12:00:00', 'FO-1', 'active', null, 'macarrones', '15%', 10); INSERT INTO speed_offers(start, end, code, type, client_id, gold, discount_gold, silver, discount_silver, bronze, discount_bronze) VALUES ('2021-06-15 12:00:00', '2021-06-16 12:00:00', 'SP-1', 'active', null, 5, '15%', 10, '10%', 15, '5%'); diff --git a/src/main/webapp/WEB-INF/jsp/foodOffers/createOrUpdateFoodOfferForm.jsp b/src/main/webapp/WEB-INF/jsp/offers/food/createOrUpdateFoodOfferForm.jsp similarity index 100% rename from src/main/webapp/WEB-INF/jsp/foodOffers/createOrUpdateFoodOfferForm.jsp rename to src/main/webapp/WEB-INF/jsp/offers/food/createOrUpdateFoodOfferForm.jsp diff --git a/src/main/webapp/WEB-INF/jsp/foodOffers/foodOffersShow.jsp b/src/main/webapp/WEB-INF/jsp/offers/food/foodOffersShow.jsp similarity index 100% rename from src/main/webapp/WEB-INF/jsp/foodOffers/foodOffersShow.jsp rename to src/main/webapp/WEB-INF/jsp/offers/food/foodOffersShow.jsp diff --git a/src/main/webapp/WEB-INF/jsp/nuOffers/createOrUpdateNuOfferForm.jsp b/src/main/webapp/WEB-INF/jsp/offers/nu/createOrUpdateNuOfferForm.jsp similarity index 100% rename from src/main/webapp/WEB-INF/jsp/nuOffers/createOrUpdateNuOfferForm.jsp rename to src/main/webapp/WEB-INF/jsp/offers/nu/createOrUpdateNuOfferForm.jsp diff --git a/src/main/webapp/WEB-INF/jsp/nuOffers/nuOffersShow.jsp b/src/main/webapp/WEB-INF/jsp/offers/nu/nuOffersShow.jsp similarity index 100% rename from src/main/webapp/WEB-INF/jsp/nuOffers/nuOffersShow.jsp rename to src/main/webapp/WEB-INF/jsp/offers/nu/nuOffersShow.jsp diff --git a/src/main/webapp/WEB-INF/jsp/speedOffers/createOrUpdateSpeedOfferForm.jsp b/src/main/webapp/WEB-INF/jsp/offers/speed/createOrUpdateSpeedOfferForm.jsp similarity index 100% rename from src/main/webapp/WEB-INF/jsp/speedOffers/createOrUpdateSpeedOfferForm.jsp rename to src/main/webapp/WEB-INF/jsp/offers/speed/createOrUpdateSpeedOfferForm.jsp diff --git a/src/main/webapp/WEB-INF/jsp/speedOffers/speedOffersShow.jsp b/src/main/webapp/WEB-INF/jsp/offers/speed/speedOffersShow.jsp similarity index 100% rename from src/main/webapp/WEB-INF/jsp/speedOffers/speedOffersShow.jsp rename to src/main/webapp/WEB-INF/jsp/offers/speed/speedOffersShow.jsp diff --git a/src/main/webapp/WEB-INF/jsp/timeOffers/createOrUpdateTimeOfferForm.jsp b/src/main/webapp/WEB-INF/jsp/offers/time/createOrUpdateTimeOfferForm.jsp similarity index 100% rename from src/main/webapp/WEB-INF/jsp/timeOffers/createOrUpdateTimeOfferForm.jsp rename to src/main/webapp/WEB-INF/jsp/offers/time/createOrUpdateTimeOfferForm.jsp diff --git a/src/main/webapp/WEB-INF/jsp/timeOffers/timeOffersShow.jsp b/src/main/webapp/WEB-INF/jsp/offers/time/timeOffersShow.jsp similarity index 100% rename from src/main/webapp/WEB-INF/jsp/timeOffers/timeOffersShow.jsp rename to src/main/webapp/WEB-INF/jsp/offers/time/timeOffersShow.jsp diff --git a/src/test/java/org/springframework/cheapy/web/FoodOfferControllerTests.java b/src/test/java/org/springframework/cheapy/web/FoodOfferControllerTests.java new file mode 100644 index 000000000..c2e4a4348 --- /dev/null +++ b/src/test/java/org/springframework/cheapy/web/FoodOfferControllerTests.java @@ -0,0 +1,137 @@ +package org.springframework.cheapy.web; + +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; + +import java.time.LocalDateTime; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.BDDMockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.cheapy.configuration.SecurityConfiguration; +import org.springframework.cheapy.model.Client; +import org.springframework.cheapy.model.FoodOffer; +import org.springframework.cheapy.model.User; +import org.springframework.cheapy.service.ClientService; +import org.springframework.cheapy.service.FoodOfferService; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.FilterType; +import org.springframework.security.config.annotation.web.WebSecurityConfigurer; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; + + + +@WebMvcTest(value = FoodOfferController.class, +excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = WebSecurityConfigurer.class), +excludeAutoConfiguration = SecurityConfiguration.class) +class FoodOfferControllerTest { + + private static final int TEST_CLIENT_ID = 1; + private static final int TEST_FOODOFFER_ID = 1; + + @Autowired + private MockMvc mockMvc; + + @MockBean + private FoodOfferService foodOfferService; + + @MockBean + private ClientService clientService; + + private FoodOffer fo1; + + @BeforeEach + void setup() { + User user1 = new User(); + user1.setUsername("user1"); + user1.setPassword("user1"); + Client client1 = new Client(); + client1.setId(TEST_CLIENT_ID); + client1.setEmail("client1"); + client1.setAddress("client1"); + client1.setInit("01:00"); + client1.setFinish("01:01"); + client1.setTelephone("123456789"); + client1.setDescription("client1"); + client1.setCode("client1"); + client1.setFood("client1"); + client1.setUsername(user1); + BDDMockito.given(this.clientService.getCurrentClient()).willReturn(client1); + + FoodOffer fo1test = new FoodOffer(); + fo1test.setId(TEST_FOODOFFER_ID); + fo1test.setStart(LocalDateTime.of(2021, 12, 23, 12, 30)); + fo1test.setEnd(LocalDateTime.of(2022, 12, 23, 12, 30)); + fo1test.setFood("fo1test"); + fo1test.setDiscount("fo1test"); + fo1test.setUnits(1); + fo1test.setClient(client1); + this.fo1 = fo1test; + BDDMockito.given(this.foodOfferService.findFoodOfferById(TEST_FOODOFFER_ID)).willReturn(this.fo1); + + } + + @WithMockUser(value = "spring", authorities = "client") + @Test + void testInitCreationForm() throws Exception { + mockMvc.perform(get("/offers/food/new")) + .andExpect(status().isOk()) + .andExpect(model().attributeExists("foodOffer")) + .andExpect(view().name("offers/food/createOrUpdateFoodOfferForm")); + } + + @WithMockUser(value = "spring", authorities = "client") + @Test + void testProcessCreationFormSuccess() throws Exception { + mockMvc.perform(post("/offers/food/new") + .with(csrf()) + .param("start", "23/12/2021 12:30") + .param("end", "23/12/2022 12:30") + .param("food", "food") + .param("discount", "10%") + .param("units", "1")) + .andExpect(status().is3xxRedirection()); + } + + @WithMockUser(value = "spring", authorities = "client") + @Test + void testProcessCreationFormHasErrors() throws Exception { + mockMvc.perform(post("/offers/food/new") + .with(csrf()) + .param("start", "lsqdufhlqhf") + .param("end", "") + .param("food", "") + .param("discount", "") + .param("units", "qsdfy")) + .andExpect(model().attributeHasErrors("foodOffer")) + .andExpect(model().attributeHasFieldErrors("foodOffer", "start")) + .andExpect(model().attributeHasFieldErrors("foodOffer", "end")) + .andExpect(model().attributeHasFieldErrors("foodOffer", "food")) + .andExpect(model().attributeHasFieldErrors("foodOffer", "discount")) + .andExpect(model().attributeHasFieldErrors("foodOffer", "units")) + .andExpect(view().name("offers/food/createOrUpdateFoodOfferForm")); + } + + @WithMockUser(value = "user1", authorities = "client") + @Test + void testActivateSuccess() throws Exception { + mockMvc.perform(get("/offers/food/{foodOfferId}/activate", TEST_FOODOFFER_ID)) + .andExpect(status().is3xxRedirection()) + .andExpect(view().name("redirect:/offers/food/"+TEST_FOODOFFER_ID)); + } + + @WithMockUser(value = "user1", authorities = "client") + @Test + void testActivateHasErrors() throws Exception { + mockMvc.perform(get("/offers/food/{foodOfferId}/activate", TEST_FOODOFFER_ID+1)) + .andExpect(view().name("exception")); + } +} \ No newline at end of file diff --git a/src/test/java/org/springframework/cheapy/web/SpeedOfferControllerTests.java b/src/test/java/org/springframework/cheapy/web/SpeedOfferControllerTests.java new file mode 100644 index 000000000..c20615d3d --- /dev/null +++ b/src/test/java/org/springframework/cheapy/web/SpeedOfferControllerTests.java @@ -0,0 +1,149 @@ +package org.springframework.cheapy.web; + +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; + +import java.time.LocalDateTime; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.BDDMockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.cheapy.configuration.SecurityConfiguration; +import org.springframework.cheapy.model.Client; +import org.springframework.cheapy.model.SpeedOffer; +import org.springframework.cheapy.model.User; +import org.springframework.cheapy.service.ClientService; +import org.springframework.cheapy.service.SpeedOfferService; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.FilterType; +import org.springframework.security.config.annotation.web.WebSecurityConfigurer; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.web.servlet.MockMvc; + + + +@WebMvcTest(value = SpeedOfferController.class, +excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = WebSecurityConfigurer.class), +excludeAutoConfiguration = SecurityConfiguration.class) +class SpeedOfferControllerTest { + + private static final int TEST_CLIENT_ID = 1; + private static final int TEST_SPEEDOFFER_ID = 1; + + @Autowired + private MockMvc mockMvc; + + @MockBean + private SpeedOfferService speedOfferService; + + @MockBean + private ClientService clientService; + + private SpeedOffer sp1; + + @BeforeEach + void setup() { + User user1 = new User(); + user1.setUsername("user1"); + user1.setPassword("user1"); + Client client1 = new Client(); + client1.setId(TEST_CLIENT_ID); + client1.setEmail("client1"); + client1.setAddress("client1"); + client1.setInit("01:00"); + client1.setFinish("01:01"); + client1.setTelephone("123456789"); + client1.setDescription("client1"); + client1.setCode("client1"); + client1.setFood("client1"); + client1.setUsername(user1); + BDDMockito.given(this.clientService.getCurrentClient()).willReturn(client1); + + SpeedOffer sp1test = new SpeedOffer(); + sp1test.setId(TEST_SPEEDOFFER_ID); + sp1test.setStart(LocalDateTime.of(2021, 12, 23, 12, 30)); + sp1test.setEnd(LocalDateTime.of(2022, 12, 23, 12, 30)); + sp1test.setGold(5); + sp1test.setDiscountGold("15%"); + sp1test.setSilver(10); + sp1test.setDiscountGold("10%"); + sp1test.setGold(15); + sp1test.setDiscountGold("5%"); + sp1test.setClient(client1); + this.sp1 = sp1test; + BDDMockito.given(this.speedOfferService.findSpeedOfferById(TEST_SPEEDOFFER_ID)).willReturn(this.sp1); + + } + + @WithMockUser(value = "spring", authorities = "client") + @Test + void testInitCreationForm() throws Exception { + mockMvc.perform(get("/offers/speed/new")) + .andExpect(status().isOk()) + .andExpect(model().attributeExists("speedOffer")) + .andExpect(view().name("offers/speed/createOrUpdateSpeedOfferForm")); + } + + @WithMockUser(value = "spring", authorities = "client") + @Test + void testProcessCreationFormSuccess() throws Exception { + mockMvc.perform(post("/offers/speed/new") + .with(csrf()) + .param("start", "23/12/2021 12:30") + .param("end", "23/12/2022 12:30") + .param("gold", "5") + .param("discountGold", "15%") + .param("silver", "10") + .param("discountSilver", "10%") + .param("bronze", "15") + .param("discountBronze", "5%")) + .andExpect(status().is3xxRedirection()); + } + + @WithMockUser(value = "spring", authorities = "client") + @Test + void testProcessCreationFormHasErrors() throws Exception { + mockMvc.perform(post("/offers/speed/new") + .with(csrf()) + .param("start", "lsqdufhlqhf") + .param("end", "") + .param("gold", "gold") + .param("discountGold", "") + .param("silver", "") + .param("discountSilver", "") + .param("bronze", "") + .param("discountBronze", "")) + .andExpect(model().attributeHasErrors("speedOffer")) + .andExpect(model().attributeHasFieldErrors("speedOffer", "start")) + .andExpect(model().attributeHasFieldErrors("speedOffer", "end")) + .andExpect(model().attributeHasFieldErrors("speedOffer", "gold")) + .andExpect(model().attributeHasFieldErrors("speedOffer", "discountGold")) + .andExpect(model().attributeHasFieldErrors("speedOffer", "silver")) + .andExpect(model().attributeHasFieldErrors("speedOffer", "discountSilver")) + .andExpect(model().attributeHasFieldErrors("speedOffer", "bronze")) + .andExpect(model().attributeHasFieldErrors("speedOffer", "discountBronze")) + .andExpect(view().name("offers/speed/createOrUpdateSpeedOfferForm")); + } + + @WithMockUser(value = "user1", authorities = "client") + @Test + void testActivateSuccess() throws Exception { + mockMvc.perform(get("/offers/speed/{speedOfferId}/activate", TEST_SPEEDOFFER_ID)) + .andExpect(status().is3xxRedirection()) + .andExpect(view().name("redirect:/offers/speed/"+TEST_SPEEDOFFER_ID)); + } + + @WithMockUser(value = "user1", authorities = "client") + @Test + void testActivateHasErrors() throws Exception { + mockMvc.perform(get("/offers/speed/{speedOfferId}/activate", TEST_SPEEDOFFER_ID+1)) + .andExpect(view().name("exception")); + } +} \ No newline at end of file