model) {
TimeOffer timeOffer = new TimeOffer();
model.put("timeOffer", timeOffer);
return VIEWS_NU_OFFER_CREATE_OR_UPDATE_FORM;
}
- @PostMapping("/timeOffers/new")
+ @PostMapping("/offers/time/new")
public String processCreationForm(@Valid TimeOffer timeOffer, BindingResult result) {
if (result.hasErrors()) {
return VIEWS_NU_OFFER_CREATE_OR_UPDATE_FORM;
@@ -60,10 +55,10 @@ public class TimeOfferController {
this.timeOfferService.saveTimeOffer(timeOffer);
- return "redirect:/TimeOffers/" + timeOffer.getId();
+ return "redirect:/offers/time/" + timeOffer.getId();
}
}
- @GetMapping(value ="/timeOffers/{timeOfferId}/activate")
+ @GetMapping(value ="/offers/time/{timeOfferId}/activate")
public String activateTimeOffer(@PathVariable("timeOfferId") final int timeOfferId, final ModelMap modelMap) {
Client client = this.clientService.getCurrentClient();
TimeOffer timeOffer=this.timeOfferService.findTimeOfferById(timeOfferId);
@@ -72,11 +67,10 @@ public class TimeOfferController {
timeOffer.setCode("TI-"+timeOfferId);
this.timeOfferService.saveTimeOffer(timeOffer);
- return "redirect:/timeOffers/" + timeOffer.getId();
} else {
modelMap.addAttribute("message", "You don't have access to this time offer");
}
- return "redirect:/timeOffers/";
+ return "redirect:/offers/time/" + timeOffer.getId();
}
@@ -88,7 +82,7 @@ public class TimeOfferController {
model.put("timeOffer", timeOffer);
- return "timeOffers/timeOffersShow";
+ return "offers/time/timeOffersShow";
}
diff --git a/src/main/resources/db/mysql/data.sql b/src/main/resources/db/mysql/data.sql
index 30ae2672e..435f10c15 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');
@@ -33,5 +33,5 @@ INSERT INTO clients VALUES (2,'david@gmail.com','C/Sevilla','09:30','22:00','60
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%');
INSERT INTO time_offers(start, end, code, type, client_id, init, finish, discount) VALUES ('2021-06-15 12:00:00', '2021-06-16 12:00:00', 'jkhlljk', 'active', null, '12:00:00', '13:00:00', '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', 'jkhlljk', 'active', null,5,'25%',10,'15%',15,'10%' );
+INSERT INTO speed_offers(id,start, end, code, type, client_id, gold, discount_gold, silver, discount_silver, bronze, discount_bronze) VALUES (3,'2021-06-15 12:00:00', '2021-06-16 12:00:00', 'jkhlljk', 'active', 1,5,'25%',10,'15%',15,'10%' );
INSERT INTO nu_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', 'jkhlljk', 'active', null,15,'25%',10,'15%',5,'10%' );
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 95%
rename from src/main/webapp/WEB-INF/jsp/timeOffers/createOrUpdateTimeOfferForm.jsp
rename to src/main/webapp/WEB-INF/jsp/offers/time/createOrUpdateTimeOfferForm.jsp
index 0dc37f439..e8f92db9c 100644
--- a/src/main/webapp/WEB-INF/jsp/timeOffers/createOrUpdateTimeOfferForm.jsp
+++ b/src/main/webapp/WEB-INF/jsp/offers/time/createOrUpdateTimeOfferForm.jsp
@@ -17,7 +17,7 @@
-
+
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/NuOfferControllerTests.java b/src/test/java/org/springframework/cheapy/web/NuOfferControllerTests.java
new file mode 100644
index 000000000..8e418a679
--- /dev/null
+++ b/src/test/java/org/springframework/cheapy/web/NuOfferControllerTests.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.NuOffer;
+import org.springframework.cheapy.model.User;
+import org.springframework.cheapy.service.ClientService;
+import org.springframework.cheapy.service.NuOfferService;
+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.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors;
+import org.springframework.test.web.servlet.MockMvc;
+
+@WebMvcTest(value = NuOfferController.class,
+excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = WebSecurityConfigurer.class),
+excludeAutoConfiguration = SecurityConfiguration.class)
+class NuOfferControllerTest {
+
+ private static final int TEST_CLIENT_ID = 1;
+ private static final int TEST_NUOFFER_ID = 1;
+
+ @Autowired
+ private MockMvc mockMvc;
+
+ @MockBean
+ private NuOfferService nuOfferService;
+
+ @MockBean
+ private ClientService clientService;
+
+ private NuOffer nu1;
+
+ @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);
+
+ NuOffer nu1test = new NuOffer();
+ nu1test.setId(TEST_NUOFFER_ID);
+ nu1test.setStart(LocalDateTime.of(2021, 12, 23, 12, 30));
+ nu1test.setEnd(LocalDateTime.of(2022, 12, 23, 12, 30));
+ nu1test.setGold(5);
+ nu1test.setDiscountGold("15%");
+ nu1test.setSilver(10);
+ nu1test.setDiscountGold("10%");
+ nu1test.setGold(15);
+ nu1test.setDiscountGold("5%");
+ nu1test.setClient(client1);
+ this.nu1 = nu1test;
+ BDDMockito.given(this.nuOfferService.findNuOfferById(TEST_NUOFFER_ID)).willReturn(this.nu1);
+ }
+
+ @WithMockUser(value = "spring", authorities = "client")
+ @Test
+ void testInitCreationForm() throws Exception {
+ mockMvc.perform(get("/offers/nu/new"))
+ .andExpect(status().isOk())
+ .andExpect(model().attributeExists("nuOffer"))
+ .andExpect(view().name("offers/nu/createOrUpdateNuOfferForm"));
+ }
+
+ @WithMockUser(value = "spring", authorities = "client")
+ @Test
+ void testProcessCreationFormSuccess() throws Exception {
+ mockMvc.perform(post("/offers/nu/new")
+ .with(SecurityMockMvcRequestPostProcessors.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/nu/new")
+ .with(csrf())
+ .param("start", "lsqdufhlqhf")
+ .param("end", "")
+ .param("gold", "gold")
+ .param("discountGold", "")
+ .param("silver", "")
+ .param("discountSilver", "")
+ .param("bronze", "")
+ .param("discountBronze", ""))
+ .andExpect(model().attributeHasErrors("nuOffer"))
+ .andExpect(model().attributeHasFieldErrors("nuOffer", "start"))
+ .andExpect(model().attributeHasFieldErrors("nuOffer", "end"))
+ .andExpect(model().attributeHasFieldErrors("nuOffer", "gold"))
+ .andExpect(model().attributeHasFieldErrors("nuOffer", "discountGold"))
+ .andExpect(model().attributeHasFieldErrors("nuOffer", "silver"))
+ .andExpect(model().attributeHasFieldErrors("nuOffer", "discountSilver"))
+ .andExpect(model().attributeHasFieldErrors("nuOffer", "bronze"))
+ .andExpect(model().attributeHasFieldErrors("nuOffer", "discountBronze"))
+ .andExpect(view().name("offers/nu/createOrUpdateNuOfferForm"));
+ }
+
+ @WithMockUser(value = "user1", authorities = "client")
+ @Test
+ void testActivateSuccess() throws Exception {
+ mockMvc.perform(get("/offers/nu/{nuOfferId}/activate", TEST_NUOFFER_ID))
+ .andExpect(status().is3xxRedirection())
+ .andExpect(view().name("redirect:/offers/nu/"+TEST_NUOFFER_ID));
+ }
+
+ @WithMockUser(value = "user1", authorities = "client")
+ @Test
+ void testActivateHasErrors() throws Exception {
+ mockMvc.perform(get("/offers/nu/{nuOfferId}/activate", TEST_NUOFFER_ID+1))
+ .andExpect(view().name("exception"));
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/test/java/org/springframework/cheapy/web/TimeOfferControllerTests.java b/src/test/java/org/springframework/cheapy/web/TimeOfferControllerTests.java
new file mode 100644
index 000000000..df93d9ac6
--- /dev/null
+++ b/src/test/java/org/springframework/cheapy/web/TimeOfferControllerTests.java
@@ -0,0 +1,140 @@
+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 java.time.LocalTime;
+
+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.TimeOffer;
+import org.springframework.cheapy.model.User;
+import org.springframework.cheapy.service.ClientService;
+import org.springframework.cheapy.service.TimeOfferService;
+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.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors;
+import org.springframework.test.web.servlet.MockMvc;
+
+@WebMvcTest(value = TimeOfferController.class,
+excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = WebSecurityConfigurer.class),
+excludeAutoConfiguration = SecurityConfiguration.class)
+class TimeOfferControllerTest {
+
+ private static final int TEST_CLIENT_ID = 1;
+ private static final int TEST_TIMEOFFER_ID = 1;
+
+ @Autowired
+ private MockMvc mockMvc;
+
+ @MockBean
+ private TimeOfferService timeOfferService;
+
+ @MockBean
+ private ClientService clientService;
+
+ private TimeOffer time1;
+
+ @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);
+
+ TimeOffer time1test = new TimeOffer();
+ time1test.setId(TEST_TIMEOFFER_ID);
+ time1test.setStart(LocalDateTime.of(2021, 12, 23, 12, 30));
+ time1test.setEnd(LocalDateTime.of(2022, 12, 23, 12, 30));
+ time1test.setInit(LocalTime.of(12, 00));
+ time1test.setFinish(LocalTime.of(13, 00));
+ time1test.setDiscount("10");
+ time1test.setClient(client1);
+ this.time1 = time1test;
+ BDDMockito.given(this.timeOfferService.findTimeOfferById(TEST_TIMEOFFER_ID)).willReturn(this.time1);
+ }
+
+ @WithMockUser(value = "spring", authorities = "client")
+ @Test
+ void testInitCreationForm() throws Exception {
+ mockMvc.perform(get("/offers/time/new"))
+ .andExpect(status().isOk())
+ .andExpect(model().attributeExists("timeOffer"))
+ .andExpect(view().name("offers/time/createOrUpdateTimeOfferForm"));
+ }
+
+ @WithMockUser(value = "spring", authorities = "client")
+ @Test
+ void testProcessCreationFormSuccess() throws Exception {
+ mockMvc.perform(post("/offers/time/new")
+ .with(SecurityMockMvcRequestPostProcessors.csrf())
+ .param("start", "23/12/2021 12:30")
+ .param("end", "23/12/2022 12:30")
+ .param("init", "12:30")
+ .param("finish", "13:30")
+ .param("discount", "10"))
+ .andExpect(status().is3xxRedirection());
+ }
+
+ @WithMockUser(value = "spring", authorities = "client")
+ @Test
+ void testProcessCreationFormHasErrors() throws Exception {
+ mockMvc.perform(post("/offers/time/new")
+ .with(csrf())
+ .param("start", "lsqdufhlqhf")
+ .param("end", "")
+ .param("init", "gold")
+ .param("finish", "")
+ .param("discount", ""))
+ .andExpect(model().attributeHasErrors("timeOffer"))
+ .andExpect(model().attributeHasFieldErrors("timeOffer", "start"))
+ .andExpect(model().attributeHasFieldErrors("timeOffer", "end"))
+ .andExpect(model().attributeHasFieldErrors("timeOffer", "init"))
+ .andExpect(model().attributeHasFieldErrors("timeOffer", "finish"))
+ .andExpect(model().attributeHasFieldErrors("timeOffer", "discount"))
+ .andExpect(view().name("offers/time/createOrUpdateTimeOfferForm"));
+ }
+
+ @WithMockUser(value = "user1", authorities = "client")
+ @Test
+ void testActivateSuccess() throws Exception {
+ mockMvc.perform(get("/offers/time/{timeOfferId}/activate", TEST_TIMEOFFER_ID))
+ .andExpect(status().is3xxRedirection())
+ .andExpect(view().name("redirect:/offers/time/"+TEST_TIMEOFFER_ID));
+ }
+
+ @WithMockUser(value = "user1", authorities = "client")
+ @Test
+ void testActivateHasErrors() throws Exception {
+ mockMvc.perform(get("/offers/time/{timeOfferId}/activate", TEST_TIMEOFFER_ID+1))
+ .andExpect(view().name("exception"));
+ }
+
+
+
+
+}
\ No newline at end of file