From 90665acc51febba0d5134d62393484e73d8b81b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20?= =?UTF-8?q?=D0=9E=D1=80=D1=83=D0=B4=D0=B6=D0=B5=D0=B2?= Date: Mon, 24 May 2021 00:17:24 +0400 Subject: [PATCH] 2021-03 spring-15-mvc added --- 2021-03/spring-15-mvc/.gitignore | 24 ++++ 2021-03/spring-15-mvc/pom.xml | 20 +++ 2021-03/spring-15-mvc/requests.http | 11 ++ .../spring-mvc-exercise/.gitignore | 24 ++++ .../spring-15-mvc/spring-mvc-exercise/pom.xml | 54 ++++++++ .../src/main/java/ru/otus/spring/Main.java | 28 ++++ .../java/ru/otus/spring/domain/Email.java | 20 +++ .../java/ru/otus/spring/domain/Person.java | 37 ++++++ .../spring/repostory/PersonRepository.java | 11 ++ .../otus/spring/rest/NotFoundException.java | 7 + .../ru/otus/spring/rest/PersonController.java | 13 ++ .../java/ru/otus/spring/rest/PersonDto.java | 54 ++++++++ .../spring/rest/PersonControllerTest.java | 84 ++++++++++++ .../spring-mvc-solution-1/.gitignore | 24 ++++ .../spring-mvc-solution-1/pom.xml | 52 ++++++++ .../src/main/java/ru/otus/spring/Main.java | 28 ++++ .../java/ru/otus/spring/domain/Person.java | 37 ++++++ .../spring/repostory/PersonRepository.java | 11 ++ .../ru/otus/spring/rest/ErrorHandler.java | 4 + .../otus/spring/rest/NotFoundException.java | 7 + .../ru/otus/spring/rest/PersonController.java | 24 ++++ .../java/ru/otus/spring/rest/PersonDto.java | 54 ++++++++ .../spring/rest/PersonControllerTest.java | 84 ++++++++++++ .../spring-mvc-solution-2/.gitignore | 24 ++++ .../spring-mvc-solution-2/pom.xml | 53 ++++++++ .../src/main/java/ru/otus/spring/Main.java | 28 ++++ .../java/ru/otus/spring/domain/Person.java | 37 ++++++ .../spring/repostory/PersonRepository.java | 11 ++ .../ru/otus/spring/rest/ErrorHandler.java | 2 + .../otus/spring/rest/NotFoundException.java | 7 + .../ru/otus/spring/rest/PersonController.java | 38 ++++++ .../java/ru/otus/spring/rest/PersonDto.java | 54 ++++++++ .../spring/rest/PersonControllerTest.java | 84 ++++++++++++ .../spring-mvc-solution-3/.gitignore | 24 ++++ .../spring-mvc-solution-3/pom.xml | 53 ++++++++ .../src/main/java/ru/otus/spring/Main.java | 28 ++++ .../java/ru/otus/spring/domain/Person.java | 37 ++++++ .../spring/repostory/PersonRepository.java | 11 ++ .../ru/otus/spring/rest/ErrorHandler.java | 2 + .../otus/spring/rest/NotFoundException.java | 7 + .../ru/otus/spring/rest/PersonController.java | 43 ++++++ .../java/ru/otus/spring/rest/PersonDto.java | 54 ++++++++ .../spring/rest/PersonControllerTest.java | 84 ++++++++++++ .../spring-mvc-solution-4/.gitignore | 24 ++++ .../spring-mvc-solution-4/pom.xml | 52 ++++++++ .../src/main/java/ru/otus/spring/Main.java | 28 ++++ .../java/ru/otus/spring/domain/Person.java | 37 ++++++ .../spring/repostory/PersonRepository.java | 11 ++ .../ru/otus/spring/rest/ErrorHandler.java | 2 + .../otus/spring/rest/NotFoundException.java | 7 + .../ru/otus/spring/rest/PersonController.java | 62 +++++++++ .../java/ru/otus/spring/rest/PersonDto.java | 54 ++++++++ .../spring/rest/PersonControllerTest.java | 122 ++++++++++++++++++ 53 files changed, 1792 insertions(+) create mode 100644 2021-03/spring-15-mvc/.gitignore create mode 100644 2021-03/spring-15-mvc/pom.xml create mode 100644 2021-03/spring-15-mvc/requests.http create mode 100644 2021-03/spring-15-mvc/spring-mvc-exercise/.gitignore create mode 100644 2021-03/spring-15-mvc/spring-mvc-exercise/pom.xml create mode 100644 2021-03/spring-15-mvc/spring-mvc-exercise/src/main/java/ru/otus/spring/Main.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-exercise/src/main/java/ru/otus/spring/domain/Email.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-exercise/src/main/java/ru/otus/spring/domain/Person.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-exercise/src/main/java/ru/otus/spring/repostory/PersonRepository.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-exercise/src/main/java/ru/otus/spring/rest/NotFoundException.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-exercise/src/main/java/ru/otus/spring/rest/PersonController.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-exercise/src/main/java/ru/otus/spring/rest/PersonDto.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-exercise/src/test/java/ru/otus/spring/rest/PersonControllerTest.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-1/.gitignore create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-1/pom.xml create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-1/src/main/java/ru/otus/spring/Main.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-1/src/main/java/ru/otus/spring/domain/Person.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-1/src/main/java/ru/otus/spring/repostory/PersonRepository.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-1/src/main/java/ru/otus/spring/rest/ErrorHandler.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-1/src/main/java/ru/otus/spring/rest/NotFoundException.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-1/src/main/java/ru/otus/spring/rest/PersonController.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-1/src/main/java/ru/otus/spring/rest/PersonDto.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-1/src/test/java/ru/otus/spring/rest/PersonControllerTest.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-2/.gitignore create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-2/pom.xml create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-2/src/main/java/ru/otus/spring/Main.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-2/src/main/java/ru/otus/spring/domain/Person.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-2/src/main/java/ru/otus/spring/repostory/PersonRepository.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-2/src/main/java/ru/otus/spring/rest/ErrorHandler.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-2/src/main/java/ru/otus/spring/rest/NotFoundException.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-2/src/main/java/ru/otus/spring/rest/PersonController.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-2/src/main/java/ru/otus/spring/rest/PersonDto.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-2/src/test/java/ru/otus/spring/rest/PersonControllerTest.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-3/.gitignore create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-3/pom.xml create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-3/src/main/java/ru/otus/spring/Main.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-3/src/main/java/ru/otus/spring/domain/Person.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-3/src/main/java/ru/otus/spring/repostory/PersonRepository.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-3/src/main/java/ru/otus/spring/rest/ErrorHandler.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-3/src/main/java/ru/otus/spring/rest/NotFoundException.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-3/src/main/java/ru/otus/spring/rest/PersonController.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-3/src/main/java/ru/otus/spring/rest/PersonDto.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-3/src/test/java/ru/otus/spring/rest/PersonControllerTest.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-4/.gitignore create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-4/pom.xml create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-4/src/main/java/ru/otus/spring/Main.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-4/src/main/java/ru/otus/spring/domain/Person.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-4/src/main/java/ru/otus/spring/repostory/PersonRepository.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-4/src/main/java/ru/otus/spring/rest/ErrorHandler.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-4/src/main/java/ru/otus/spring/rest/NotFoundException.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-4/src/main/java/ru/otus/spring/rest/PersonController.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-4/src/main/java/ru/otus/spring/rest/PersonDto.java create mode 100644 2021-03/spring-15-mvc/spring-mvc-solution-4/src/test/java/ru/otus/spring/rest/PersonControllerTest.java diff --git a/2021-03/spring-15-mvc/.gitignore b/2021-03/spring-15-mvc/.gitignore new file mode 100644 index 00000000..4ea52072 --- /dev/null +++ b/2021-03/spring-15-mvc/.gitignore @@ -0,0 +1,24 @@ +target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/build/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ diff --git a/2021-03/spring-15-mvc/pom.xml b/2021-03/spring-15-mvc/pom.xml new file mode 100644 index 00000000..9fe92a9b --- /dev/null +++ b/2021-03/spring-15-mvc/pom.xml @@ -0,0 +1,20 @@ + + + 4.0.0 + + ru.otus + spring-mvc-class-work + 1.0 + + pom + + + spring-mvc-exercise + spring-mvc-solution-1 + spring-mvc-solution-2 + spring-mvc-solution-3 + spring-mvc-solution-4 + + diff --git a/2021-03/spring-15-mvc/requests.http b/2021-03/spring-15-mvc/requests.http new file mode 100644 index 00000000..e892d644 --- /dev/null +++ b/2021-03/spring-15-mvc/requests.http @@ -0,0 +1,11 @@ +POST http://localhost:8080/person +Content-Type: application/json + +{ + "id": "1", + "name": "Gogol'" +} + +### +GET http://localhost:8080/person + diff --git a/2021-03/spring-15-mvc/spring-mvc-exercise/.gitignore b/2021-03/spring-15-mvc/spring-mvc-exercise/.gitignore new file mode 100644 index 00000000..4ea52072 --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-exercise/.gitignore @@ -0,0 +1,24 @@ +target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/build/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ diff --git a/2021-03/spring-15-mvc/spring-mvc-exercise/pom.xml b/2021-03/spring-15-mvc/spring-mvc-exercise/pom.xml new file mode 100644 index 00000000..963f4145 --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-exercise/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + + ru.otus + spring-mvc-exercise + 1.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.4.5 + + + + 11 + 11 + + + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + + + + + org.springframework.data + spring-data-keyvalue + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/2021-03/spring-15-mvc/spring-mvc-exercise/src/main/java/ru/otus/spring/Main.java b/2021-03/spring-15-mvc/spring-mvc-exercise/src/main/java/ru/otus/spring/Main.java new file mode 100644 index 00000000..c8a54bea --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-exercise/src/main/java/ru/otus/spring/Main.java @@ -0,0 +1,28 @@ +package ru.otus.spring; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.map.repository.config.EnableMapRepositories; +import ru.otus.spring.domain.Person; +import ru.otus.spring.repostory.PersonRepository; + +import javax.annotation.PostConstruct; + +@EnableMapRepositories +@SpringBootApplication +public class Main { + + public static void main(String[] args) { + SpringApplication.run(Main.class); + } + + @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") + @Autowired + private PersonRepository repository; + + @PostConstruct + public void init() { + repository.save(new Person(1, "Pushkin")); + } +} diff --git a/2021-03/spring-15-mvc/spring-mvc-exercise/src/main/java/ru/otus/spring/domain/Email.java b/2021-03/spring-15-mvc/spring-mvc-exercise/src/main/java/ru/otus/spring/domain/Email.java new file mode 100644 index 00000000..97859832 --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-exercise/src/main/java/ru/otus/spring/domain/Email.java @@ -0,0 +1,20 @@ +package ru.otus.spring.domain; + +public class Email { + + private long id; + + private String email; + + public Email(String email) { + this.email = email; + } + + public long getId() { + return id; + } + + public String getEmail() { + return email; + } +} diff --git a/2021-03/spring-15-mvc/spring-mvc-exercise/src/main/java/ru/otus/spring/domain/Person.java b/2021-03/spring-15-mvc/spring-mvc-exercise/src/main/java/ru/otus/spring/domain/Person.java new file mode 100644 index 00000000..4fea35dc --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-exercise/src/main/java/ru/otus/spring/domain/Person.java @@ -0,0 +1,37 @@ +package ru.otus.spring.domain; + +import org.springframework.data.annotation.Id; +import org.springframework.data.keyvalue.annotation.KeySpace; + +@KeySpace("person") +public class Person { + + @Id + private long id; + private String name; + + public Person(String name) { + this.name = name; + } + + public Person(long id, String name) { + this.id = id; + this.name = name; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/2021-03/spring-15-mvc/spring-mvc-exercise/src/main/java/ru/otus/spring/repostory/PersonRepository.java b/2021-03/spring-15-mvc/spring-mvc-exercise/src/main/java/ru/otus/spring/repostory/PersonRepository.java new file mode 100644 index 00000000..dd8a6966 --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-exercise/src/main/java/ru/otus/spring/repostory/PersonRepository.java @@ -0,0 +1,11 @@ +package ru.otus.spring.repostory; + +import org.springframework.data.repository.PagingAndSortingRepository; +import ru.otus.spring.domain.Person; + +import java.util.List; + +public interface PersonRepository extends PagingAndSortingRepository { + + List findAll(); +} diff --git a/2021-03/spring-15-mvc/spring-mvc-exercise/src/main/java/ru/otus/spring/rest/NotFoundException.java b/2021-03/spring-15-mvc/spring-mvc-exercise/src/main/java/ru/otus/spring/rest/NotFoundException.java new file mode 100644 index 00000000..3d98ee4a --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-exercise/src/main/java/ru/otus/spring/rest/NotFoundException.java @@ -0,0 +1,7 @@ +package ru.otus.spring.rest; + +public class NotFoundException extends RuntimeException{ + + public NotFoundException() { + } +} diff --git a/2021-03/spring-15-mvc/spring-mvc-exercise/src/main/java/ru/otus/spring/rest/PersonController.java b/2021-03/spring-15-mvc/spring-mvc-exercise/src/main/java/ru/otus/spring/rest/PersonController.java new file mode 100644 index 00000000..344a34b7 --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-exercise/src/main/java/ru/otus/spring/rest/PersonController.java @@ -0,0 +1,13 @@ +package ru.otus.spring.rest; + +import ru.otus.spring.repostory.PersonRepository; + + +public class PersonController { + + private final PersonRepository repository; + + public PersonController(PersonRepository repository) { + this.repository = repository; + } +} diff --git a/2021-03/spring-15-mvc/spring-mvc-exercise/src/main/java/ru/otus/spring/rest/PersonDto.java b/2021-03/spring-15-mvc/spring-mvc-exercise/src/main/java/ru/otus/spring/rest/PersonDto.java new file mode 100644 index 00000000..c561e56a --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-exercise/src/main/java/ru/otus/spring/rest/PersonDto.java @@ -0,0 +1,54 @@ +/* + * Copyright 2016 Russian Post + * + * This source code is Russian Post Confidential Proprietary. + * This software is protected by copyright. All rights and titles are reserved. + * You shall not use, copy, distribute, modify, decompile, disassemble or reverse engineer the software. + * Otherwise this violation would be treated by law and would be subject to legal prosecution. + * Legal use of the software provides receipt of a license from the right name only. + */ +package ru.otus.spring.rest; + +import ru.otus.spring.domain.Person; + +/** + * DTO that represents Account + */ +@SuppressWarnings("all") +public class PersonDto { + + private long id; + private String name; + + public PersonDto() { + } + + public PersonDto(long id, String name) { + this.id = id; + this.name = name; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public static Person toDomainObject(PersonDto dto) { + return new Person(dto.getId(), dto.getName()); + } + + public static PersonDto toDto(Person account) { + return new PersonDto(account.getId(), account.getName()); + } +} diff --git a/2021-03/spring-15-mvc/spring-mvc-exercise/src/test/java/ru/otus/spring/rest/PersonControllerTest.java b/2021-03/spring-15-mvc/spring-mvc-exercise/src/test/java/ru/otus/spring/rest/PersonControllerTest.java new file mode 100644 index 00000000..086bf53c --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-exercise/src/test/java/ru/otus/spring/rest/PersonControllerTest.java @@ -0,0 +1,84 @@ +package ru.otus.spring.rest; + +import com.fasterxml.jackson.databind.ObjectMapper; +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.boot.test.mock.mockito.MockBean; +import org.springframework.test.web.servlet.MockMvc; +import ru.otus.spring.domain.Person; +import ru.otus.spring.repostory.PersonRepository; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import static org.mockito.BDDMockito.given; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(PersonController.class) +class PersonControllerTest { + + public static final String ERROR_STRING = "Таких тут нет!"; + + @Autowired + private MockMvc mvc; + + @Autowired + private ObjectMapper mapper; + + @MockBean + private PersonRepository repository; + + @Test + void shouldReturnCorrectPersonsList() throws Exception { + List persons = List.of(new Person(1, "Person1"), new Person(2, "Person2")); + given(repository.findAll()).willReturn(persons); + + List expectedResult = persons.stream() + .map(PersonDto::toDto).collect(Collectors.toList()); + + mvc.perform(get("/persons/all")) + .andExpect(status().isOk()) + .andExpect(content().json(mapper.writeValueAsString(expectedResult))); + } + + @Test + void shouldReturnCorrectPersonByIdInRequest() throws Exception { + Person person = new Person(1, "Person1"); + given(repository.findById(1L)).willReturn(Optional.of(person)); + PersonDto expectedResult = PersonDto.toDto(person); + + mvc.perform(get("/persons").param("id", "1")) + .andExpect(status().isOk()) + .andExpect(content().json(mapper.writeValueAsString(expectedResult))); + } + + @Test + void shouldReturnCorrectPersonByIdInPath() throws Exception { + Person person = new Person(1, "Person1"); + given(repository.findById(1L)).willReturn(Optional.of(person)); + PersonDto expectedResult = PersonDto.toDto(person); + + mvc.perform(get("/persons/1")) + .andExpect(status().isOk()) + .andExpect(content().json(mapper.writeValueAsString(expectedResult))); + } + + @Test + void shouldReturnExpectedErrorWhenPersonNotFound() throws Exception { + given(repository.findById(1L)).willReturn(Optional.empty()); + + mvc.perform(get("/persons").param("id", "1")) + .andExpect(status().isBadRequest()) + .andExpect(content().string(ERROR_STRING)); + + mvc.perform(get("/persons/1")) + .andExpect(status().isBadRequest()) + .andExpect(content().string(ERROR_STRING)); + } + + +} \ No newline at end of file diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-1/.gitignore b/2021-03/spring-15-mvc/spring-mvc-solution-1/.gitignore new file mode 100644 index 00000000..4ea52072 --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-1/.gitignore @@ -0,0 +1,24 @@ +target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/build/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-1/pom.xml b/2021-03/spring-15-mvc/spring-mvc-solution-1/pom.xml new file mode 100644 index 00000000..bff84828 --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-1/pom.xml @@ -0,0 +1,52 @@ + + + 4.0.0 + + ru.otus + spring-mvc-solution-1 + 1.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.4.5 + + + + 11 + 11 + + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + + + + org.springframework.data + spring-data-keyvalue + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-1/src/main/java/ru/otus/spring/Main.java b/2021-03/spring-15-mvc/spring-mvc-solution-1/src/main/java/ru/otus/spring/Main.java new file mode 100644 index 00000000..c8a54bea --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-1/src/main/java/ru/otus/spring/Main.java @@ -0,0 +1,28 @@ +package ru.otus.spring; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.map.repository.config.EnableMapRepositories; +import ru.otus.spring.domain.Person; +import ru.otus.spring.repostory.PersonRepository; + +import javax.annotation.PostConstruct; + +@EnableMapRepositories +@SpringBootApplication +public class Main { + + public static void main(String[] args) { + SpringApplication.run(Main.class); + } + + @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") + @Autowired + private PersonRepository repository; + + @PostConstruct + public void init() { + repository.save(new Person(1, "Pushkin")); + } +} diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-1/src/main/java/ru/otus/spring/domain/Person.java b/2021-03/spring-15-mvc/spring-mvc-solution-1/src/main/java/ru/otus/spring/domain/Person.java new file mode 100644 index 00000000..4fea35dc --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-1/src/main/java/ru/otus/spring/domain/Person.java @@ -0,0 +1,37 @@ +package ru.otus.spring.domain; + +import org.springframework.data.annotation.Id; +import org.springframework.data.keyvalue.annotation.KeySpace; + +@KeySpace("person") +public class Person { + + @Id + private long id; + private String name; + + public Person(String name) { + this.name = name; + } + + public Person(long id, String name) { + this.id = id; + this.name = name; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-1/src/main/java/ru/otus/spring/repostory/PersonRepository.java b/2021-03/spring-15-mvc/spring-mvc-solution-1/src/main/java/ru/otus/spring/repostory/PersonRepository.java new file mode 100644 index 00000000..dd8a6966 --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-1/src/main/java/ru/otus/spring/repostory/PersonRepository.java @@ -0,0 +1,11 @@ +package ru.otus.spring.repostory; + +import org.springframework.data.repository.PagingAndSortingRepository; +import ru.otus.spring.domain.Person; + +import java.util.List; + +public interface PersonRepository extends PagingAndSortingRepository { + + List findAll(); +} diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-1/src/main/java/ru/otus/spring/rest/ErrorHandler.java b/2021-03/spring-15-mvc/spring-mvc-solution-1/src/main/java/ru/otus/spring/rest/ErrorHandler.java new file mode 100644 index 00000000..b87f3ed6 --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-1/src/main/java/ru/otus/spring/rest/ErrorHandler.java @@ -0,0 +1,4 @@ +package ru.otus.spring.rest; + +public class ErrorHandler { +} diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-1/src/main/java/ru/otus/spring/rest/NotFoundException.java b/2021-03/spring-15-mvc/spring-mvc-solution-1/src/main/java/ru/otus/spring/rest/NotFoundException.java new file mode 100644 index 00000000..3d98ee4a --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-1/src/main/java/ru/otus/spring/rest/NotFoundException.java @@ -0,0 +1,7 @@ +package ru.otus.spring.rest; + +public class NotFoundException extends RuntimeException{ + + public NotFoundException() { + } +} diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-1/src/main/java/ru/otus/spring/rest/PersonController.java b/2021-03/spring-15-mvc/spring-mvc-solution-1/src/main/java/ru/otus/spring/rest/PersonController.java new file mode 100644 index 00000000..ca14e393 --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-1/src/main/java/ru/otus/spring/rest/PersonController.java @@ -0,0 +1,24 @@ +package ru.otus.spring.rest; + +import org.springframework.web.bind.annotation.*; +import ru.otus.spring.repostory.PersonRepository; + +import java.util.List; +import java.util.stream.Collectors; + +@RestController +public class PersonController { + + private final PersonRepository repository; + + public PersonController(PersonRepository repository) { + this.repository = repository; + } + + @RequestMapping(value = "/persons/all", method = RequestMethod.GET) + public List getAllPersons() { + return repository.findAll().stream() + .map(PersonDto::toDto) + .collect(Collectors.toList()); + } +} diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-1/src/main/java/ru/otus/spring/rest/PersonDto.java b/2021-03/spring-15-mvc/spring-mvc-solution-1/src/main/java/ru/otus/spring/rest/PersonDto.java new file mode 100644 index 00000000..c561e56a --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-1/src/main/java/ru/otus/spring/rest/PersonDto.java @@ -0,0 +1,54 @@ +/* + * Copyright 2016 Russian Post + * + * This source code is Russian Post Confidential Proprietary. + * This software is protected by copyright. All rights and titles are reserved. + * You shall not use, copy, distribute, modify, decompile, disassemble or reverse engineer the software. + * Otherwise this violation would be treated by law and would be subject to legal prosecution. + * Legal use of the software provides receipt of a license from the right name only. + */ +package ru.otus.spring.rest; + +import ru.otus.spring.domain.Person; + +/** + * DTO that represents Account + */ +@SuppressWarnings("all") +public class PersonDto { + + private long id; + private String name; + + public PersonDto() { + } + + public PersonDto(long id, String name) { + this.id = id; + this.name = name; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public static Person toDomainObject(PersonDto dto) { + return new Person(dto.getId(), dto.getName()); + } + + public static PersonDto toDto(Person account) { + return new PersonDto(account.getId(), account.getName()); + } +} diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-1/src/test/java/ru/otus/spring/rest/PersonControllerTest.java b/2021-03/spring-15-mvc/spring-mvc-solution-1/src/test/java/ru/otus/spring/rest/PersonControllerTest.java new file mode 100644 index 00000000..086bf53c --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-1/src/test/java/ru/otus/spring/rest/PersonControllerTest.java @@ -0,0 +1,84 @@ +package ru.otus.spring.rest; + +import com.fasterxml.jackson.databind.ObjectMapper; +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.boot.test.mock.mockito.MockBean; +import org.springframework.test.web.servlet.MockMvc; +import ru.otus.spring.domain.Person; +import ru.otus.spring.repostory.PersonRepository; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import static org.mockito.BDDMockito.given; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(PersonController.class) +class PersonControllerTest { + + public static final String ERROR_STRING = "Таких тут нет!"; + + @Autowired + private MockMvc mvc; + + @Autowired + private ObjectMapper mapper; + + @MockBean + private PersonRepository repository; + + @Test + void shouldReturnCorrectPersonsList() throws Exception { + List persons = List.of(new Person(1, "Person1"), new Person(2, "Person2")); + given(repository.findAll()).willReturn(persons); + + List expectedResult = persons.stream() + .map(PersonDto::toDto).collect(Collectors.toList()); + + mvc.perform(get("/persons/all")) + .andExpect(status().isOk()) + .andExpect(content().json(mapper.writeValueAsString(expectedResult))); + } + + @Test + void shouldReturnCorrectPersonByIdInRequest() throws Exception { + Person person = new Person(1, "Person1"); + given(repository.findById(1L)).willReturn(Optional.of(person)); + PersonDto expectedResult = PersonDto.toDto(person); + + mvc.perform(get("/persons").param("id", "1")) + .andExpect(status().isOk()) + .andExpect(content().json(mapper.writeValueAsString(expectedResult))); + } + + @Test + void shouldReturnCorrectPersonByIdInPath() throws Exception { + Person person = new Person(1, "Person1"); + given(repository.findById(1L)).willReturn(Optional.of(person)); + PersonDto expectedResult = PersonDto.toDto(person); + + mvc.perform(get("/persons/1")) + .andExpect(status().isOk()) + .andExpect(content().json(mapper.writeValueAsString(expectedResult))); + } + + @Test + void shouldReturnExpectedErrorWhenPersonNotFound() throws Exception { + given(repository.findById(1L)).willReturn(Optional.empty()); + + mvc.perform(get("/persons").param("id", "1")) + .andExpect(status().isBadRequest()) + .andExpect(content().string(ERROR_STRING)); + + mvc.perform(get("/persons/1")) + .andExpect(status().isBadRequest()) + .andExpect(content().string(ERROR_STRING)); + } + + +} \ No newline at end of file diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-2/.gitignore b/2021-03/spring-15-mvc/spring-mvc-solution-2/.gitignore new file mode 100644 index 00000000..4ea52072 --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-2/.gitignore @@ -0,0 +1,24 @@ +target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/build/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-2/pom.xml b/2021-03/spring-15-mvc/spring-mvc-solution-2/pom.xml new file mode 100644 index 00000000..bb0ed71d --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-2/pom.xml @@ -0,0 +1,53 @@ + + + 4.0.0 + + ru.otus + spring-mvc-solution-2 + 1.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.4.5 + + + + 11 + 11 + + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + + + + + org.springframework.data + spring-data-keyvalue + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-2/src/main/java/ru/otus/spring/Main.java b/2021-03/spring-15-mvc/spring-mvc-solution-2/src/main/java/ru/otus/spring/Main.java new file mode 100644 index 00000000..c8a54bea --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-2/src/main/java/ru/otus/spring/Main.java @@ -0,0 +1,28 @@ +package ru.otus.spring; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.map.repository.config.EnableMapRepositories; +import ru.otus.spring.domain.Person; +import ru.otus.spring.repostory.PersonRepository; + +import javax.annotation.PostConstruct; + +@EnableMapRepositories +@SpringBootApplication +public class Main { + + public static void main(String[] args) { + SpringApplication.run(Main.class); + } + + @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") + @Autowired + private PersonRepository repository; + + @PostConstruct + public void init() { + repository.save(new Person(1, "Pushkin")); + } +} diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-2/src/main/java/ru/otus/spring/domain/Person.java b/2021-03/spring-15-mvc/spring-mvc-solution-2/src/main/java/ru/otus/spring/domain/Person.java new file mode 100644 index 00000000..4fea35dc --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-2/src/main/java/ru/otus/spring/domain/Person.java @@ -0,0 +1,37 @@ +package ru.otus.spring.domain; + +import org.springframework.data.annotation.Id; +import org.springframework.data.keyvalue.annotation.KeySpace; + +@KeySpace("person") +public class Person { + + @Id + private long id; + private String name; + + public Person(String name) { + this.name = name; + } + + public Person(long id, String name) { + this.id = id; + this.name = name; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-2/src/main/java/ru/otus/spring/repostory/PersonRepository.java b/2021-03/spring-15-mvc/spring-mvc-solution-2/src/main/java/ru/otus/spring/repostory/PersonRepository.java new file mode 100644 index 00000000..dd8a6966 --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-2/src/main/java/ru/otus/spring/repostory/PersonRepository.java @@ -0,0 +1,11 @@ +package ru.otus.spring.repostory; + +import org.springframework.data.repository.PagingAndSortingRepository; +import ru.otus.spring.domain.Person; + +import java.util.List; + +public interface PersonRepository extends PagingAndSortingRepository { + + List findAll(); +} diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-2/src/main/java/ru/otus/spring/rest/ErrorHandler.java b/2021-03/spring-15-mvc/spring-mvc-solution-2/src/main/java/ru/otus/spring/rest/ErrorHandler.java new file mode 100644 index 00000000..07a077d4 --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-2/src/main/java/ru/otus/spring/rest/ErrorHandler.java @@ -0,0 +1,2 @@ +package ru.otus.spring.rest;public class ErrorHandler { +} diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-2/src/main/java/ru/otus/spring/rest/NotFoundException.java b/2021-03/spring-15-mvc/spring-mvc-solution-2/src/main/java/ru/otus/spring/rest/NotFoundException.java new file mode 100644 index 00000000..3d98ee4a --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-2/src/main/java/ru/otus/spring/rest/NotFoundException.java @@ -0,0 +1,7 @@ +package ru.otus.spring.rest; + +public class NotFoundException extends RuntimeException{ + + public NotFoundException() { + } +} diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-2/src/main/java/ru/otus/spring/rest/PersonController.java b/2021-03/spring-15-mvc/spring-mvc-solution-2/src/main/java/ru/otus/spring/rest/PersonController.java new file mode 100644 index 00000000..4f974cac --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-2/src/main/java/ru/otus/spring/rest/PersonController.java @@ -0,0 +1,38 @@ +package ru.otus.spring.rest; + +import org.springframework.web.bind.annotation.*; +import ru.otus.spring.domain.Person; +import ru.otus.spring.repostory.PersonRepository; + +import java.util.List; +import java.util.stream.Collectors; + +@RestController +public class PersonController { + + private final PersonRepository repository; + + public PersonController(PersonRepository repository) { + this.repository = repository; + } + + @RequestMapping(value = "/persons/all", method = RequestMethod.GET, params = {}) + public List getAllPersons() { + return repository.findAll().stream() + .map(PersonDto::toDto) + .collect(Collectors.toList()); + } + + @RequestMapping(value = "/persons", method = RequestMethod.GET) + public PersonDto getPersonByIdInRequest(@RequestParam("id") long id) { + Person person = repository.findById(id).orElseThrow(NotFoundException::new); + return PersonDto.toDto(person); + } + + @GetMapping("/persons/{id}") + public PersonDto getPersonByIdInPath(@PathVariable("id") long id) { + Person person = repository.findById(id).orElseThrow(NotFoundException::new); + return PersonDto.toDto(person); + } + +} diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-2/src/main/java/ru/otus/spring/rest/PersonDto.java b/2021-03/spring-15-mvc/spring-mvc-solution-2/src/main/java/ru/otus/spring/rest/PersonDto.java new file mode 100644 index 00000000..c561e56a --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-2/src/main/java/ru/otus/spring/rest/PersonDto.java @@ -0,0 +1,54 @@ +/* + * Copyright 2016 Russian Post + * + * This source code is Russian Post Confidential Proprietary. + * This software is protected by copyright. All rights and titles are reserved. + * You shall not use, copy, distribute, modify, decompile, disassemble or reverse engineer the software. + * Otherwise this violation would be treated by law and would be subject to legal prosecution. + * Legal use of the software provides receipt of a license from the right name only. + */ +package ru.otus.spring.rest; + +import ru.otus.spring.domain.Person; + +/** + * DTO that represents Account + */ +@SuppressWarnings("all") +public class PersonDto { + + private long id; + private String name; + + public PersonDto() { + } + + public PersonDto(long id, String name) { + this.id = id; + this.name = name; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public static Person toDomainObject(PersonDto dto) { + return new Person(dto.getId(), dto.getName()); + } + + public static PersonDto toDto(Person account) { + return new PersonDto(account.getId(), account.getName()); + } +} diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-2/src/test/java/ru/otus/spring/rest/PersonControllerTest.java b/2021-03/spring-15-mvc/spring-mvc-solution-2/src/test/java/ru/otus/spring/rest/PersonControllerTest.java new file mode 100644 index 00000000..086bf53c --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-2/src/test/java/ru/otus/spring/rest/PersonControllerTest.java @@ -0,0 +1,84 @@ +package ru.otus.spring.rest; + +import com.fasterxml.jackson.databind.ObjectMapper; +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.boot.test.mock.mockito.MockBean; +import org.springframework.test.web.servlet.MockMvc; +import ru.otus.spring.domain.Person; +import ru.otus.spring.repostory.PersonRepository; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import static org.mockito.BDDMockito.given; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(PersonController.class) +class PersonControllerTest { + + public static final String ERROR_STRING = "Таких тут нет!"; + + @Autowired + private MockMvc mvc; + + @Autowired + private ObjectMapper mapper; + + @MockBean + private PersonRepository repository; + + @Test + void shouldReturnCorrectPersonsList() throws Exception { + List persons = List.of(new Person(1, "Person1"), new Person(2, "Person2")); + given(repository.findAll()).willReturn(persons); + + List expectedResult = persons.stream() + .map(PersonDto::toDto).collect(Collectors.toList()); + + mvc.perform(get("/persons/all")) + .andExpect(status().isOk()) + .andExpect(content().json(mapper.writeValueAsString(expectedResult))); + } + + @Test + void shouldReturnCorrectPersonByIdInRequest() throws Exception { + Person person = new Person(1, "Person1"); + given(repository.findById(1L)).willReturn(Optional.of(person)); + PersonDto expectedResult = PersonDto.toDto(person); + + mvc.perform(get("/persons").param("id", "1")) + .andExpect(status().isOk()) + .andExpect(content().json(mapper.writeValueAsString(expectedResult))); + } + + @Test + void shouldReturnCorrectPersonByIdInPath() throws Exception { + Person person = new Person(1, "Person1"); + given(repository.findById(1L)).willReturn(Optional.of(person)); + PersonDto expectedResult = PersonDto.toDto(person); + + mvc.perform(get("/persons/1")) + .andExpect(status().isOk()) + .andExpect(content().json(mapper.writeValueAsString(expectedResult))); + } + + @Test + void shouldReturnExpectedErrorWhenPersonNotFound() throws Exception { + given(repository.findById(1L)).willReturn(Optional.empty()); + + mvc.perform(get("/persons").param("id", "1")) + .andExpect(status().isBadRequest()) + .andExpect(content().string(ERROR_STRING)); + + mvc.perform(get("/persons/1")) + .andExpect(status().isBadRequest()) + .andExpect(content().string(ERROR_STRING)); + } + + +} \ No newline at end of file diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-3/.gitignore b/2021-03/spring-15-mvc/spring-mvc-solution-3/.gitignore new file mode 100644 index 00000000..4ea52072 --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-3/.gitignore @@ -0,0 +1,24 @@ +target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/build/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-3/pom.xml b/2021-03/spring-15-mvc/spring-mvc-solution-3/pom.xml new file mode 100644 index 00000000..8e83469e --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-3/pom.xml @@ -0,0 +1,53 @@ + + + 4.0.0 + + ru.otus + spring-mvc-solution-3 + 1.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.4.5 + + + + 11 + 11 + + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + + + + + org.springframework.data + spring-data-keyvalue + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-3/src/main/java/ru/otus/spring/Main.java b/2021-03/spring-15-mvc/spring-mvc-solution-3/src/main/java/ru/otus/spring/Main.java new file mode 100644 index 00000000..c8a54bea --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-3/src/main/java/ru/otus/spring/Main.java @@ -0,0 +1,28 @@ +package ru.otus.spring; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.map.repository.config.EnableMapRepositories; +import ru.otus.spring.domain.Person; +import ru.otus.spring.repostory.PersonRepository; + +import javax.annotation.PostConstruct; + +@EnableMapRepositories +@SpringBootApplication +public class Main { + + public static void main(String[] args) { + SpringApplication.run(Main.class); + } + + @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") + @Autowired + private PersonRepository repository; + + @PostConstruct + public void init() { + repository.save(new Person(1, "Pushkin")); + } +} diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-3/src/main/java/ru/otus/spring/domain/Person.java b/2021-03/spring-15-mvc/spring-mvc-solution-3/src/main/java/ru/otus/spring/domain/Person.java new file mode 100644 index 00000000..4fea35dc --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-3/src/main/java/ru/otus/spring/domain/Person.java @@ -0,0 +1,37 @@ +package ru.otus.spring.domain; + +import org.springframework.data.annotation.Id; +import org.springframework.data.keyvalue.annotation.KeySpace; + +@KeySpace("person") +public class Person { + + @Id + private long id; + private String name; + + public Person(String name) { + this.name = name; + } + + public Person(long id, String name) { + this.id = id; + this.name = name; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-3/src/main/java/ru/otus/spring/repostory/PersonRepository.java b/2021-03/spring-15-mvc/spring-mvc-solution-3/src/main/java/ru/otus/spring/repostory/PersonRepository.java new file mode 100644 index 00000000..dd8a6966 --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-3/src/main/java/ru/otus/spring/repostory/PersonRepository.java @@ -0,0 +1,11 @@ +package ru.otus.spring.repostory; + +import org.springframework.data.repository.PagingAndSortingRepository; +import ru.otus.spring.domain.Person; + +import java.util.List; + +public interface PersonRepository extends PagingAndSortingRepository { + + List findAll(); +} diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-3/src/main/java/ru/otus/spring/rest/ErrorHandler.java b/2021-03/spring-15-mvc/spring-mvc-solution-3/src/main/java/ru/otus/spring/rest/ErrorHandler.java new file mode 100644 index 00000000..07a077d4 --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-3/src/main/java/ru/otus/spring/rest/ErrorHandler.java @@ -0,0 +1,2 @@ +package ru.otus.spring.rest;public class ErrorHandler { +} diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-3/src/main/java/ru/otus/spring/rest/NotFoundException.java b/2021-03/spring-15-mvc/spring-mvc-solution-3/src/main/java/ru/otus/spring/rest/NotFoundException.java new file mode 100644 index 00000000..3d98ee4a --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-3/src/main/java/ru/otus/spring/rest/NotFoundException.java @@ -0,0 +1,7 @@ +package ru.otus.spring.rest; + +public class NotFoundException extends RuntimeException{ + + public NotFoundException() { + } +} diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-3/src/main/java/ru/otus/spring/rest/PersonController.java b/2021-03/spring-15-mvc/spring-mvc-solution-3/src/main/java/ru/otus/spring/rest/PersonController.java new file mode 100644 index 00000000..580fbff1 --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-3/src/main/java/ru/otus/spring/rest/PersonController.java @@ -0,0 +1,43 @@ +package ru.otus.spring.rest; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import ru.otus.spring.domain.Person; +import ru.otus.spring.repostory.PersonRepository; + +import java.util.List; +import java.util.stream.Collectors; + +@RestController +public class PersonController { + + private final PersonRepository repository; + + public PersonController(PersonRepository repository) { + this.repository = repository; + } + + @RequestMapping(value = "/persons/all", method = RequestMethod.GET, params = {}) + public List getAllPersons() { + return repository.findAll().stream() + .map(PersonDto::toDto) + .collect(Collectors.toList()); + } + + @RequestMapping(value = "/persons", method = RequestMethod.GET) + public PersonDto getPersonByIdInRequest(@RequestParam("id") long id) { + Person person = repository.findById(id).orElseThrow(NotFoundException::new); + return PersonDto.toDto(person); + } + + @GetMapping("/persons/{id}") + public PersonDto getPersonByIdInPath(@PathVariable("id") long id) { + Person person = repository.findById(id).orElseThrow(NotFoundException::new); + return PersonDto.toDto(person); + } + + @ExceptionHandler(NotFoundException.class) + public ResponseEntity handleNotFound(NotFoundException ex) { + return ResponseEntity.badRequest().body("Таких тут нет!"); + } +} diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-3/src/main/java/ru/otus/spring/rest/PersonDto.java b/2021-03/spring-15-mvc/spring-mvc-solution-3/src/main/java/ru/otus/spring/rest/PersonDto.java new file mode 100644 index 00000000..c561e56a --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-3/src/main/java/ru/otus/spring/rest/PersonDto.java @@ -0,0 +1,54 @@ +/* + * Copyright 2016 Russian Post + * + * This source code is Russian Post Confidential Proprietary. + * This software is protected by copyright. All rights and titles are reserved. + * You shall not use, copy, distribute, modify, decompile, disassemble or reverse engineer the software. + * Otherwise this violation would be treated by law and would be subject to legal prosecution. + * Legal use of the software provides receipt of a license from the right name only. + */ +package ru.otus.spring.rest; + +import ru.otus.spring.domain.Person; + +/** + * DTO that represents Account + */ +@SuppressWarnings("all") +public class PersonDto { + + private long id; + private String name; + + public PersonDto() { + } + + public PersonDto(long id, String name) { + this.id = id; + this.name = name; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public static Person toDomainObject(PersonDto dto) { + return new Person(dto.getId(), dto.getName()); + } + + public static PersonDto toDto(Person account) { + return new PersonDto(account.getId(), account.getName()); + } +} diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-3/src/test/java/ru/otus/spring/rest/PersonControllerTest.java b/2021-03/spring-15-mvc/spring-mvc-solution-3/src/test/java/ru/otus/spring/rest/PersonControllerTest.java new file mode 100644 index 00000000..a913fb5a --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-3/src/test/java/ru/otus/spring/rest/PersonControllerTest.java @@ -0,0 +1,84 @@ +package ru.otus.spring.rest; + +import com.fasterxml.jackson.databind.ObjectMapper; +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.boot.test.mock.mockito.MockBean; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import ru.otus.spring.domain.Person; +import ru.otus.spring.repostory.PersonRepository; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import static org.mockito.BDDMockito.given; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(PersonController.class) +class PersonControllerTest { + + public static final String ERROR_STRING = "Таких тут нет!"; + @Autowired + private MockMvc mvc; + + @Autowired + private ObjectMapper mapper; + + @MockBean + private PersonRepository repository; + + @Test + void shouldReturnCorrectPersonsList() throws Exception { + List persons = List.of(new Person(1, "Person1"), new Person(2, "Person2")); + given(repository.findAll()).willReturn(persons); + + List expectedResult = persons.stream() + .map(PersonDto::toDto).collect(Collectors.toList()); + + mvc.perform(get("/persons/all")) + .andExpect(status().isOk()) + .andExpect(content().json(mapper.writeValueAsString(expectedResult))); + } + + @Test + void shouldReturnCorrectPersonByIdInRequest() throws Exception { + Person person = new Person(1, "Person1"); + given(repository.findById(1L)).willReturn(Optional.of(person)); + PersonDto expectedResult = PersonDto.toDto(person); + + mvc.perform(get("/persons").param("id", "1")) + .andExpect(status().isOk()) + .andExpect(content().json(mapper.writeValueAsString(expectedResult))); + } + + @Test + void shouldReturnCorrectPersonByIdInPath() throws Exception { + Person person = new Person(1, "Person1"); + given(repository.findById(1L)).willReturn(Optional.of(person)); + PersonDto expectedResult = PersonDto.toDto(person); + + mvc.perform(get("/persons/1")) + .andExpect(status().isOk()) + .andExpect(content().json(mapper.writeValueAsString(expectedResult))); + } + + @Test + void shouldReturnExpectedErrorWhenPersonNotFound() throws Exception { + given(repository.findById(1L)).willReturn(Optional.empty()); + + mvc.perform(get("/persons").param("id", "1")) + .andExpect(status().isBadRequest()) + .andExpect(content().string(ERROR_STRING)); + + mvc.perform(get("/persons/1")) + .andExpect(status().isBadRequest()) + .andExpect(content().string(ERROR_STRING)); + } + + +} \ No newline at end of file diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-4/.gitignore b/2021-03/spring-15-mvc/spring-mvc-solution-4/.gitignore new file mode 100644 index 00000000..4ea52072 --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-4/.gitignore @@ -0,0 +1,24 @@ +target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/build/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-4/pom.xml b/2021-03/spring-15-mvc/spring-mvc-solution-4/pom.xml new file mode 100644 index 00000000..3aa7eeb1 --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-4/pom.xml @@ -0,0 +1,52 @@ + + + 4.0.0 + + ru.otus + spring-mvc-solution-4 + 1.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.4.5 + + + + 11 + 11 + + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-test + + + + org.springframework.data + spring-data-keyvalue + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-4/src/main/java/ru/otus/spring/Main.java b/2021-03/spring-15-mvc/spring-mvc-solution-4/src/main/java/ru/otus/spring/Main.java new file mode 100644 index 00000000..c8a54bea --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-4/src/main/java/ru/otus/spring/Main.java @@ -0,0 +1,28 @@ +package ru.otus.spring; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.map.repository.config.EnableMapRepositories; +import ru.otus.spring.domain.Person; +import ru.otus.spring.repostory.PersonRepository; + +import javax.annotation.PostConstruct; + +@EnableMapRepositories +@SpringBootApplication +public class Main { + + public static void main(String[] args) { + SpringApplication.run(Main.class); + } + + @SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection") + @Autowired + private PersonRepository repository; + + @PostConstruct + public void init() { + repository.save(new Person(1, "Pushkin")); + } +} diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-4/src/main/java/ru/otus/spring/domain/Person.java b/2021-03/spring-15-mvc/spring-mvc-solution-4/src/main/java/ru/otus/spring/domain/Person.java new file mode 100644 index 00000000..4fea35dc --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-4/src/main/java/ru/otus/spring/domain/Person.java @@ -0,0 +1,37 @@ +package ru.otus.spring.domain; + +import org.springframework.data.annotation.Id; +import org.springframework.data.keyvalue.annotation.KeySpace; + +@KeySpace("person") +public class Person { + + @Id + private long id; + private String name; + + public Person(String name) { + this.name = name; + } + + public Person(long id, String name) { + this.id = id; + this.name = name; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-4/src/main/java/ru/otus/spring/repostory/PersonRepository.java b/2021-03/spring-15-mvc/spring-mvc-solution-4/src/main/java/ru/otus/spring/repostory/PersonRepository.java new file mode 100644 index 00000000..dd8a6966 --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-4/src/main/java/ru/otus/spring/repostory/PersonRepository.java @@ -0,0 +1,11 @@ +package ru.otus.spring.repostory; + +import org.springframework.data.repository.PagingAndSortingRepository; +import ru.otus.spring.domain.Person; + +import java.util.List; + +public interface PersonRepository extends PagingAndSortingRepository { + + List findAll(); +} diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-4/src/main/java/ru/otus/spring/rest/ErrorHandler.java b/2021-03/spring-15-mvc/spring-mvc-solution-4/src/main/java/ru/otus/spring/rest/ErrorHandler.java new file mode 100644 index 00000000..07a077d4 --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-4/src/main/java/ru/otus/spring/rest/ErrorHandler.java @@ -0,0 +1,2 @@ +package ru.otus.spring.rest;public class ErrorHandler { +} diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-4/src/main/java/ru/otus/spring/rest/NotFoundException.java b/2021-03/spring-15-mvc/spring-mvc-solution-4/src/main/java/ru/otus/spring/rest/NotFoundException.java new file mode 100644 index 00000000..3d98ee4a --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-4/src/main/java/ru/otus/spring/rest/NotFoundException.java @@ -0,0 +1,7 @@ +package ru.otus.spring.rest; + +public class NotFoundException extends RuntimeException{ + + public NotFoundException() { + } +} diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-4/src/main/java/ru/otus/spring/rest/PersonController.java b/2021-03/spring-15-mvc/spring-mvc-solution-4/src/main/java/ru/otus/spring/rest/PersonController.java new file mode 100644 index 00000000..51ad268d --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-4/src/main/java/ru/otus/spring/rest/PersonController.java @@ -0,0 +1,62 @@ +package ru.otus.spring.rest; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import ru.otus.spring.domain.Person; +import ru.otus.spring.repostory.PersonRepository; + +import java.util.List; +import java.util.stream.Collectors; + +@RestController +public class PersonController { + + private final PersonRepository repository; + + public PersonController(PersonRepository repository) { + this.repository = repository; + } + + @RequestMapping(value = "/persons/all", method = RequestMethod.GET, params = {}) + public List getAllPersons() { + return repository.findAll().stream() + .map(PersonDto::toDto) + .collect(Collectors.toList()); + } + + @RequestMapping(value = "/persons", method = RequestMethod.GET) + public PersonDto getPersonByIdInRequest(@RequestParam("id") long id) { + Person person = repository.findById(id).orElseThrow(NotFoundException::new); + return PersonDto.toDto(person); + } + + @GetMapping("/persons/{id}") + public PersonDto getPersonByIdInPath(@PathVariable("id") long id) { + Person person = repository.findById(id).orElseThrow(NotFoundException::new); + return PersonDto.toDto(person); + } + + @PostMapping("/persons") + public PersonDto createNewPerson(@RequestBody PersonDto dto) { + Person person = PersonDto.toDomainObject(dto); + Person savedPerson = repository.save(person); + return PersonDto.toDto(savedPerson); + } + + @PutMapping("/persons/{id}/name") + public PersonDto updateNameById(@PathVariable("id") long id, @RequestParam("name") String name) { + Person person = repository.findById(id).orElseThrow(NotFoundException::new); + person.setName(name); + return PersonDto.toDto(repository.save(person)); + } + + @DeleteMapping("/persons/{id}") + public void deleteById(@PathVariable("id") long id) { + repository.deleteById(id); + } + + @ExceptionHandler(NotFoundException.class) + public ResponseEntity handleNotFound(NotFoundException ex) { + return ResponseEntity.badRequest().body("Таких тут нет!"); + } +} diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-4/src/main/java/ru/otus/spring/rest/PersonDto.java b/2021-03/spring-15-mvc/spring-mvc-solution-4/src/main/java/ru/otus/spring/rest/PersonDto.java new file mode 100644 index 00000000..c561e56a --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-4/src/main/java/ru/otus/spring/rest/PersonDto.java @@ -0,0 +1,54 @@ +/* + * Copyright 2016 Russian Post + * + * This source code is Russian Post Confidential Proprietary. + * This software is protected by copyright. All rights and titles are reserved. + * You shall not use, copy, distribute, modify, decompile, disassemble or reverse engineer the software. + * Otherwise this violation would be treated by law and would be subject to legal prosecution. + * Legal use of the software provides receipt of a license from the right name only. + */ +package ru.otus.spring.rest; + +import ru.otus.spring.domain.Person; + +/** + * DTO that represents Account + */ +@SuppressWarnings("all") +public class PersonDto { + + private long id; + private String name; + + public PersonDto() { + } + + public PersonDto(long id, String name) { + this.id = id; + this.name = name; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public static Person toDomainObject(PersonDto dto) { + return new Person(dto.getId(), dto.getName()); + } + + public static PersonDto toDto(Person account) { + return new PersonDto(account.getId(), account.getName()); + } +} diff --git a/2021-03/spring-15-mvc/spring-mvc-solution-4/src/test/java/ru/otus/spring/rest/PersonControllerTest.java b/2021-03/spring-15-mvc/spring-mvc-solution-4/src/test/java/ru/otus/spring/rest/PersonControllerTest.java new file mode 100644 index 00000000..0a49473d --- /dev/null +++ b/2021-03/spring-15-mvc/spring-mvc-solution-4/src/test/java/ru/otus/spring/rest/PersonControllerTest.java @@ -0,0 +1,122 @@ +package ru.otus.spring.rest; + +import com.fasterxml.jackson.databind.ObjectMapper; +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.boot.test.mock.mockito.MockBean; +import org.springframework.test.web.servlet.MockMvc; +import ru.otus.spring.domain.Person; +import ru.otus.spring.repostory.PersonRepository; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.springframework.http.MediaType.APPLICATION_JSON; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(PersonController.class) +class PersonControllerTest { + + public static final String ERROR_STRING = "Таких тут нет!"; + + @Autowired + private MockMvc mvc; + + @Autowired + private ObjectMapper mapper; + + @MockBean + private PersonRepository repository; + + @Test + void shouldReturnCorrectPersonsList() throws Exception { + List persons = List.of(new Person(1, "Person1"), new Person(2, "Person2")); + given(repository.findAll()).willReturn(persons); + + List expectedResult = persons.stream() + .map(PersonDto::toDto).collect(Collectors.toList()); + + mvc.perform(get("/persons/all")) + .andExpect(status().isOk()) + .andExpect(content().json(mapper.writeValueAsString(expectedResult))); + } + + @Test + void shouldReturnCorrectPersonByIdInRequest() throws Exception { + Person person = new Person(1, "Person1"); + given(repository.findById(1L)).willReturn(Optional.of(person)); + PersonDto expectedResult = PersonDto.toDto(person); + + mvc.perform(get("/persons").param("id", "1")) + .andExpect(status().isOk()) + .andExpect(content().json(mapper.writeValueAsString(expectedResult))); + } + + @Test + void shouldReturnCorrectPersonByIdInPath() throws Exception { + Person person = new Person(1, "Person1"); + given(repository.findById(1L)).willReturn(Optional.of(person)); + PersonDto expectedResult = PersonDto.toDto(person); + + mvc.perform(get("/persons/1")) + .andExpect(status().isOk()) + .andExpect(content().json(mapper.writeValueAsString(expectedResult))); + } + + @Test + void shouldReturnExpectedErrorWhenPersonNotFound() throws Exception { + given(repository.findById(1L)).willReturn(Optional.empty()); + + mvc.perform(get("/persons").param("id", "1")) + .andExpect(status().isBadRequest()) + .andExpect(content().string(ERROR_STRING)); + + mvc.perform(get("/persons/1")) + .andExpect(status().isBadRequest()) + .andExpect(content().string(ERROR_STRING)); + } + + @Test + void shouldCorrectSaveNewPerson() throws Exception { + Person person = new Person(1, "Person1"); + given(repository.save(any())).willReturn(person); + String expectedResult = mapper.writeValueAsString(PersonDto.toDto(person)); + + mvc.perform(post("/persons").contentType(APPLICATION_JSON) + .content(expectedResult)) + .andExpect(status().isOk()) + .andExpect(content().json(expectedResult)); + } + + @Test + void shouldCorrectUpdatePersonName() throws Exception { + Person person = new Person(1, "Person1"); + given(repository.findById(1L)).willReturn(Optional.of(person)); + given(repository.save(any())).willAnswer(invocation -> invocation.getArgument(0)); + + Person expectedPerson = new Person(1, "Person2"); + String expectedResult = mapper.writeValueAsString(PersonDto.toDto(expectedPerson)); + + mvc.perform(put("/persons/{id}/name", 1).param("name", expectedPerson.getName()) + .content(expectedResult)) + .andExpect(status().isOk()) + .andExpect(content().json(expectedResult)); + } + + @Test + void shouldCorrectDeletePerson() throws Exception { + mvc.perform(delete("/persons/1")) + .andExpect(status().isOk()); + verify(repository, times(1)).deleteById(1L); + } + + +} \ No newline at end of file