diff --git a/build.gradle b/build.gradle index 9e86908..2211a07 100644 --- a/build.gradle +++ b/build.gradle @@ -26,6 +26,7 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-validation' developmentOnly 'org.springframework.boot:spring-boot-devtools' diff --git a/src/main/java/ru/lionarius/isdojplab/controller/HomeController.java b/src/main/java/ru/lionarius/isdojplab/controller/HomeController.java new file mode 100644 index 0000000..52dcaae --- /dev/null +++ b/src/main/java/ru/lionarius/isdojplab/controller/HomeController.java @@ -0,0 +1,15 @@ +package ru.lionarius.isdojplab.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class HomeController { + + @GetMapping("/") + public String home(Model model) { + model.addAttribute("message", "Добро пожаловать в магазин электротоваров!"); + return "home"; + } +} diff --git a/src/main/java/ru/lionarius/isdojplab/controller/ProductFormController.java b/src/main/java/ru/lionarius/isdojplab/controller/ProductFormController.java new file mode 100644 index 0000000..f853e7a --- /dev/null +++ b/src/main/java/ru/lionarius/isdojplab/controller/ProductFormController.java @@ -0,0 +1,29 @@ +package ru.lionarius.isdojplab.controller; + +import jakarta.validation.Valid; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import ru.lionarius.isdojplab.model.Product; + +@Controller +public class ProductFormController { + + @GetMapping("/product_form") + public String showForm(Model model) { + model.addAttribute("product", new Product()); + return "product_form"; + } + + @PostMapping("/product_form") + public String submitForm(@Valid @ModelAttribute("product") Product product, BindingResult bindingResult, Model model) { + if (bindingResult.hasErrors()) { + return "product_form"; + } + model.addAttribute("message", "Товар успешно добавлен: " + product.getName()); + return "redirect:/"; + } +} diff --git a/src/main/java/ru/lionarius/isdojplab/model/Product.java b/src/main/java/ru/lionarius/isdojplab/model/Product.java new file mode 100644 index 0000000..9480205 --- /dev/null +++ b/src/main/java/ru/lionarius/isdojplab/model/Product.java @@ -0,0 +1,20 @@ +package ru.lionarius.isdojplab.model; + +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class Product { + + @NotBlank(message = "Название товара обязательно") + private String name; + + @NotNull(message = "Цена товара обязательна") + @Min(value = 1, message = "Цена должна быть больше 0") + private Double price; + + @NotBlank(message = "Описание товара обязательно") + private String description; +} diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html new file mode 100644 index 0000000..65b374b --- /dev/null +++ b/src/main/resources/templates/home.html @@ -0,0 +1,10 @@ + + + + + Магазин электротоваров + + +

+ + \ No newline at end of file diff --git a/src/main/resources/templates/product_form.html b/src/main/resources/templates/product_form.html new file mode 100644 index 0000000..e7f93c6 --- /dev/null +++ b/src/main/resources/templates/product_form.html @@ -0,0 +1,28 @@ + + + + + Форма добавления товара + + +

Добавить новый товар

+
+

+ + + Ошибка +

+

+ + + Ошибка +

+

+ + + Ошибка +

+ +
+ + \ No newline at end of file diff --git a/src/test/java/ru/lionarius/isdojplab/HomeControllerTest.java b/src/test/java/ru/lionarius/isdojplab/HomeControllerTest.java new file mode 100644 index 0000000..e999996 --- /dev/null +++ b/src/test/java/ru/lionarius/isdojplab/HomeControllerTest.java @@ -0,0 +1,38 @@ +package ru.lionarius.isdojplab; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.test.web.servlet.MockMvc; +import ru.lionarius.isdojplab.controller.HomeController; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +@WebMvcTest(HomeController.class) +public class HomeControllerTest { + + @Autowired + private MockMvc mockMvc; + + @Test + public void testHomePageReturnsCorrectView() throws Exception { + mockMvc.perform(get("/")) + .andExpect(status().isOk()) + .andExpect(view().name("home")); + } + + @Test + public void testHomePageContainsMessage() throws Exception { + mockMvc.perform(get("/")) + .andExpect(status().isOk()) + .andExpect(model().attribute("message", "Добро пожаловать в магазин электротоваров!")); + } + + @Test + public void testHomePageRendersCorrectHtml() throws Exception { + mockMvc.perform(get("/")) + .andExpect(status().isOk()) + .andExpect(content().string(org.hamcrest.Matchers.containsString("Добро пожаловать в магазин электротоваров!"))); + } +} diff --git a/src/test/java/ru/lionarius/isdojplab/IsdojpLabApplicationTests.java b/src/test/java/ru/lionarius/isdojplab/IsdojpLabApplicationTests.java deleted file mode 100644 index 4ec7ad3..0000000 --- a/src/test/java/ru/lionarius/isdojplab/IsdojpLabApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package ru.lionarius.isdojplab; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class IsdojpLabApplicationTests { - - @Test - void contextLoads() { - } - -}