diff --git a/pom.xml b/pom.xml index ea5d3a91d..c0ab78aad 100644 --- a/pom.xml +++ b/pom.xml @@ -70,9 +70,9 @@ spring-security-taglibs - org.springframework.security - spring-security-test - test + org.springframework.security + spring-security-test + test org.springframework.boot diff --git a/src/main/java/org/springframework/cheapy/configuration/SecurityConfiguration.java b/src/main/java/org/springframework/cheapy/configuration/SecurityConfiguration.java index 68efbd66b..6ec7dae83 100644 --- a/src/main/java/org/springframework/cheapy/configuration/SecurityConfiguration.java +++ b/src/main/java/org/springframework/cheapy/configuration/SecurityConfiguration.java @@ -44,8 +44,6 @@ 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("/offers/**/new").hasAnyAuthority("admin", "client") 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 33696f3bc..8f2b50ab5 100644 --- a/src/main/java/org/springframework/cheapy/web/FoodOfferController.java +++ b/src/main/java/org/springframework/cheapy/web/FoodOfferController.java @@ -31,7 +31,6 @@ public class FoodOfferController { this.clientService = clientService; } - @GetMapping("/offers/food/new") public String initCreationForm(Map model) { FoodOffer foodOffer = new FoodOffer(); @@ -65,6 +64,7 @@ public class FoodOfferController { modelMap.addAttribute("message", "You don't have access to this food offer"); } return "redirect:/offers/food/"+foodOfferId; + } @GetMapping("/offers/food/{foodOfferId}") public String processShowForm(@PathVariable("foodOfferId") int foodOfferId, Map model) { diff --git a/src/main/resources/db/mysql/data.sql b/src/main/resources/db/mysql/data.sql index 435f10c15..6a281a682 100644 --- a/src/main/resources/db/mysql/data.sql +++ b/src/main/resources/db/mysql/data.sql @@ -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/offers/time/createOrUpdateTimeOfferForm.jsp b/src/main/webapp/WEB-INF/jsp/offers/time/createOrUpdateTimeOfferForm.jsp index e8f92db9c..13aca05e8 100644 --- a/src/main/webapp/WEB-INF/jsp/offers/time/createOrUpdateTimeOfferForm.jsp +++ b/src/main/webapp/WEB-INF/jsp/offers/time/createOrUpdateTimeOfferForm.jsp @@ -19,6 +19,7 @@ +
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