From 6f0a431bd9624c56193eafa3d6b63b8cb0aa33b3 Mon Sep 17 00:00:00 2001 From: Factorino73 Date: Mon, 18 Mar 2024 04:01:02 +0400 Subject: [PATCH] LabWork02 --- demo/build.gradle | 4 + .../com/example/demo/DemoApplication.java | 47 ++++++++- .../demo/core/configuration/Constants.java | 10 ++ .../configuration/MapperConfiguration.java | 14 +++ .../core/configuration/WebConfiguration.java | 16 ++++ .../demo/core/error/NotFoundException.java | 8 ++ .../example/demo/core/model/BaseEntity.java | 26 +++++ .../core/repository/CommonRepository.java | 24 +++++ .../demo/core/repository/MapRepository.java | 68 +++++++++++++ .../demo/items/api/ItemController.java | 84 ++++++++++++++++ .../com/example/demo/items/api/ItemDto.java | 74 ++++++++++++++ .../example/demo/items/model/ItemEntity.java | 81 ++++++++++++++++ .../demo/items/repository/ItemRepository.java | 11 +++ .../demo/items/service/ItemService.java | 59 ++++++++++++ .../demo/messages/api/MessageController.java | 76 +++++++++++++++ .../example/demo/messages/api/MessageDto.java | 85 ++++++++++++++++ .../demo/messages/model/MessageEntity.java | 96 +++++++++++++++++++ .../repository/MessageRepository.java | 11 +++ .../demo/messages/service/MessageService.java | 53 ++++++++++ .../demo/speaker/api/SpeakerController.java | 23 +++++ .../configuration/SpeakerConfiguration.java | 27 ++++++ .../example/demo/speaker/domain/Speaker.java | 5 + .../demo/speaker/domain/SpeakerDeu.java | 28 ++++++ .../demo/speaker/domain/SpeakerEng.java | 26 +++++ .../demo/speaker/domain/SpeakerRus.java | 21 ++++ .../demo/speaker/service/SpeakerService.java | 21 ++++ .../demo/types/api/TypeController.java | 76 +++++++++++++++ .../com/example/demo/types/api/TypeDto.java | 36 +++++++ .../example/demo/types/model/TypeEntity.java | 50 ++++++++++ .../demo/types/repository/TypeRepository.java | 11 +++ .../demo/types/service/TypeService.java | 51 ++++++++++ .../example/demo/DemoApplicationTests.java | 13 --- .../com/example/demo/ItemServiceTests.java | 69 +++++++++++++ .../com/example/demo/MessageServiceTests.java | 65 +++++++++++++ .../com/example/demo/SpeakerServiceTests.java | 38 ++++++++ .../com/example/demo/TypeServiceTests.java | 63 ++++++++++++ 36 files changed, 1455 insertions(+), 15 deletions(-) create mode 100644 demo/src/main/java/com/example/demo/core/configuration/Constants.java create mode 100644 demo/src/main/java/com/example/demo/core/configuration/MapperConfiguration.java create mode 100644 demo/src/main/java/com/example/demo/core/configuration/WebConfiguration.java create mode 100644 demo/src/main/java/com/example/demo/core/error/NotFoundException.java create mode 100644 demo/src/main/java/com/example/demo/core/model/BaseEntity.java create mode 100644 demo/src/main/java/com/example/demo/core/repository/CommonRepository.java create mode 100644 demo/src/main/java/com/example/demo/core/repository/MapRepository.java create mode 100644 demo/src/main/java/com/example/demo/items/api/ItemController.java create mode 100644 demo/src/main/java/com/example/demo/items/api/ItemDto.java create mode 100644 demo/src/main/java/com/example/demo/items/model/ItemEntity.java create mode 100644 demo/src/main/java/com/example/demo/items/repository/ItemRepository.java create mode 100644 demo/src/main/java/com/example/demo/items/service/ItemService.java create mode 100644 demo/src/main/java/com/example/demo/messages/api/MessageController.java create mode 100644 demo/src/main/java/com/example/demo/messages/api/MessageDto.java create mode 100644 demo/src/main/java/com/example/demo/messages/model/MessageEntity.java create mode 100644 demo/src/main/java/com/example/demo/messages/repository/MessageRepository.java create mode 100644 demo/src/main/java/com/example/demo/messages/service/MessageService.java create mode 100644 demo/src/main/java/com/example/demo/speaker/api/SpeakerController.java create mode 100644 demo/src/main/java/com/example/demo/speaker/configuration/SpeakerConfiguration.java create mode 100644 demo/src/main/java/com/example/demo/speaker/domain/Speaker.java create mode 100644 demo/src/main/java/com/example/demo/speaker/domain/SpeakerDeu.java create mode 100644 demo/src/main/java/com/example/demo/speaker/domain/SpeakerEng.java create mode 100644 demo/src/main/java/com/example/demo/speaker/domain/SpeakerRus.java create mode 100644 demo/src/main/java/com/example/demo/speaker/service/SpeakerService.java create mode 100644 demo/src/main/java/com/example/demo/types/api/TypeController.java create mode 100644 demo/src/main/java/com/example/demo/types/api/TypeDto.java create mode 100644 demo/src/main/java/com/example/demo/types/model/TypeEntity.java create mode 100644 demo/src/main/java/com/example/demo/types/repository/TypeRepository.java create mode 100644 demo/src/main/java/com/example/demo/types/service/TypeService.java delete mode 100644 demo/src/test/java/com/example/demo/DemoApplicationTests.java create mode 100644 demo/src/test/java/com/example/demo/ItemServiceTests.java create mode 100644 demo/src/test/java/com/example/demo/MessageServiceTests.java create mode 100644 demo/src/test/java/com/example/demo/SpeakerServiceTests.java create mode 100644 demo/src/test/java/com/example/demo/TypeServiceTests.java diff --git a/demo/build.gradle b/demo/build.gradle index 1c63230..92a39ba 100644 --- a/demo/build.gradle +++ b/demo/build.gradle @@ -17,6 +17,10 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' + implementation 'org.modelmapper:modelmapper:3.2.0' + testImplementation 'org.springframework.boot:spring-boot-starter-test' } diff --git a/demo/src/main/java/com/example/demo/DemoApplication.java b/demo/src/main/java/com/example/demo/DemoApplication.java index 64b538a..d04e803 100644 --- a/demo/src/main/java/com/example/demo/DemoApplication.java +++ b/demo/src/main/java/com/example/demo/DemoApplication.java @@ -1,13 +1,56 @@ package com.example.demo; +import java.util.Objects; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -@SpringBootApplication -public class DemoApplication { +import com.example.demo.items.model.ItemEntity; +import com.example.demo.items.service.ItemService; +import com.example.demo.types.model.TypeEntity; +import com.example.demo.types.service.TypeService; +@SpringBootApplication +public class DemoApplication implements CommandLineRunner { + // Логгер + private final Logger log = LoggerFactory.getLogger(DemoApplication.class); + + // Бизнес-логика для сущности "Тип" (Тип книг) + private final TypeService typeService; + + // Бизнес-логика для сущности "Заказ" (Заказ, содержащий книги) + private final ItemService itemService; + + // Конструктор + public DemoApplication(TypeService typeService, ItemService itemService) { + this.typeService = typeService; + this.itemService = itemService; + } + + // Входная точка программы public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } + @Override + public void run(String... args) throws Exception { + if (args.length > 0 && Objects.equals("--populate", args[0])) { + log.info("Create default types values"); + final var type1 = typeService.create(new TypeEntity(null, "Protection")); + final var type2 = typeService.create(new TypeEntity(null, "Sharpness")); + final var type3 = typeService.create(new TypeEntity(null, "Infinity")); + + log.info("Create default items values"); + itemService.create(new ItemEntity(null, type1, 50.00, 20)); + itemService.create(new ItemEntity(null, type1, 12.00, 3)); + itemService.create(new ItemEntity(null, type2, 15.00, 30)); + itemService.create(new ItemEntity(null, type2, 64.00, 10)); + itemService.create(new ItemEntity(null, type2, 15.00, 6)); + itemService.create(new ItemEntity(null, type3, 80.00, 6)); + itemService.create(new ItemEntity(null, type3, 64.00, 3)); + } + } } diff --git a/demo/src/main/java/com/example/demo/core/configuration/Constants.java b/demo/src/main/java/com/example/demo/core/configuration/Constants.java new file mode 100644 index 0000000..25c8372 --- /dev/null +++ b/demo/src/main/java/com/example/demo/core/configuration/Constants.java @@ -0,0 +1,10 @@ +package com.example.demo.core.configuration; + +// Класс для задания констант +public class Constants { + // Базовый префикс REST-API + public static final String API_URL = "/api/1.0"; + + private Constants() { + } +} diff --git a/demo/src/main/java/com/example/demo/core/configuration/MapperConfiguration.java b/demo/src/main/java/com/example/demo/core/configuration/MapperConfiguration.java new file mode 100644 index 0000000..525c107 --- /dev/null +++ b/demo/src/main/java/com/example/demo/core/configuration/MapperConfiguration.java @@ -0,0 +1,14 @@ +package com.example.demo.core.configuration; + +import org.modelmapper.ModelMapper; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + + // Конфигурация для библиотеки ModelMapper +@Configuration +public class MapperConfiguration { + @Bean + ModelMapper modelMapper() { + return new ModelMapper(); + } +} diff --git a/demo/src/main/java/com/example/demo/core/configuration/WebConfiguration.java b/demo/src/main/java/com/example/demo/core/configuration/WebConfiguration.java new file mode 100644 index 0000000..04a047b --- /dev/null +++ b/demo/src/main/java/com/example/demo/core/configuration/WebConfiguration.java @@ -0,0 +1,16 @@ +package com.example.demo.core.configuration; + +import org.springframework.context.annotation.Configuration; +import org.springframework.lang.NonNull; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +// Конфигурация для отключения Cors-проверки +@Configuration +public class WebConfiguration implements WebMvcConfigurer { + @Override + public void addCorsMappings(@NonNull CorsRegistry registry) { + registry.addMapping("/**") + .allowedMethods("GET", "POST", "PUT", "DELETE"); + } +} diff --git a/demo/src/main/java/com/example/demo/core/error/NotFoundException.java b/demo/src/main/java/com/example/demo/core/error/NotFoundException.java new file mode 100644 index 0000000..d9990ea --- /dev/null +++ b/demo/src/main/java/com/example/demo/core/error/NotFoundException.java @@ -0,0 +1,8 @@ +package com.example.demo.core.error; + +// Собственное непроверяемое исключение +public class NotFoundException extends RuntimeException { + public NotFoundException(Long id) { + super(String.format("Entity with id [%s] is not found or not exists", id)); + } +} diff --git a/demo/src/main/java/com/example/demo/core/model/BaseEntity.java b/demo/src/main/java/com/example/demo/core/model/BaseEntity.java new file mode 100644 index 0000000..99ffa33 --- /dev/null +++ b/demo/src/main/java/com/example/demo/core/model/BaseEntity.java @@ -0,0 +1,26 @@ +package com.example.demo.core.model; + +// Абстрактный класс для базовой сущности +public abstract class BaseEntity { + // Идентфикатор + protected Long id; + + // Конструктор по умолчанию + protected BaseEntity() { + } + + // Конструктор с параметрами для создания объекта + protected BaseEntity(Long id) { + this.id = id; + } + + // Получить идентификатор + public Long getId() { + return id; + } + + // Установить идентификатор + public void setId(Long id) { + this.id = id; + } +} diff --git a/demo/src/main/java/com/example/demo/core/repository/CommonRepository.java b/demo/src/main/java/com/example/demo/core/repository/CommonRepository.java new file mode 100644 index 0000000..96976ac --- /dev/null +++ b/demo/src/main/java/com/example/demo/core/repository/CommonRepository.java @@ -0,0 +1,24 @@ +package com.example.demo.core.repository; + +import java.util.List; + +// Интерфейс хранилища элементов +public interface CommonRepository { + // Получить все элементы + List getAll(); + + // Получить элемент по идентификатору + E get(T id); + + // Добавить элемент + E create(E entity); + + // Изменить элемент + E update(E entity); + + // Удалить элемент + E delete(E entity); + + // Удалить все элементы + void deleteAll(); +} diff --git a/demo/src/main/java/com/example/demo/core/repository/MapRepository.java b/demo/src/main/java/com/example/demo/core/repository/MapRepository.java new file mode 100644 index 0000000..06e6136 --- /dev/null +++ b/demo/src/main/java/com/example/demo/core/repository/MapRepository.java @@ -0,0 +1,68 @@ +package com.example.demo.core.repository; + +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import com.example.demo.core.model.BaseEntity; + +// Абстрактный класс хранилища для всех базовых сущностей +public abstract class MapRepository implements CommonRepository { + // Набор элементов + private final Map entities = new TreeMap<>(); + + // Количество элементов хранилища + private Long lastId = 0L; + + // Конструктор по умолчанию + protected MapRepository() { + } + + // Получить все элементы + @Override + public List getAll() { + return entities.values().stream().toList(); + } + + // Получить элемент по идентификатору + @Override + public E get(Long id) { + return entities.get(id); + } + + // Добавить элемент + @Override + public E create(E entity) { + lastId++; + entity.setId(lastId); + entities.put(lastId, entity); + return entity; + } + + // Изменить элемент + @Override + public E update(E entity) { + if (get(entity.getId()) == null) { + return null; + } + entities.put(entity.getId(), entity); + return entity; + } + + // Удалить элемент + @Override + public E delete(E entity) { + if (get(entity.getId()) == null) { + return null; + } + entities.remove(entity.getId()); + return entity; + } + + // Удалить все элементы + @Override + public void deleteAll() { + lastId = 0L; + entities.clear(); + } +} diff --git a/demo/src/main/java/com/example/demo/items/api/ItemController.java b/demo/src/main/java/com/example/demo/items/api/ItemController.java new file mode 100644 index 0000000..5e01771 --- /dev/null +++ b/demo/src/main/java/com/example/demo/items/api/ItemController.java @@ -0,0 +1,84 @@ +package com.example.demo.items.api; + +import java.util.List; + +import org.modelmapper.ModelMapper; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.example.demo.core.configuration.Constants; +import com.example.demo.items.model.ItemEntity; +import com.example.demo.items.service.ItemService; +import com.example.demo.types.service.TypeService; + +import jakarta.validation.Valid; + +// Контроллер для сущности "Заказ" (Заказ, содержащий книги) +@RestController +@RequestMapping(Constants.API_URL + "/item") +public class ItemController { + // Бизнес-логика для сущности "Заказ" (Заказ, содержащий книги) + private final ItemService itemService; + + // Бизнес-логика для сущности "Тип" (Тип книги) + private final TypeService typeService; + + // Библиотека для преобразования сущности + private final ModelMapper modelMapper; + + // Конструктор + public ItemController(ItemService itemService, TypeService typeService, ModelMapper modelMapper) { + this.itemService = itemService; + this.typeService = typeService; + this.modelMapper = modelMapper; + } + + // Преобразовать из сущности в DTO + private ItemDto toDto(ItemEntity entity) { + return modelMapper.map(entity, ItemDto.class); + } + + // Преобразовать из DTO в сущность + private ItemEntity toEntity(@Valid ItemDto dto) { + final ItemEntity entity = modelMapper.map(dto, ItemEntity.class); + entity.setType(typeService.get(dto.getTypeId())); + return entity; + } + + // Получить все элементы или по заданному фильтру + @GetMapping + public List getAll(@RequestParam(name = "typeId", defaultValue = "0") Long typeId) { + return itemService.getAll(typeId).stream().map(this::toDto).toList(); + } + + // Получить элемент по идентификатору + @GetMapping("/{id}") + public ItemDto get(@PathVariable(name = "id") Long id) { + return toDto(itemService.get(id)); + } + + // Создать элемент + @PostMapping + public ItemDto create(@RequestBody @Valid ItemDto dto) { + return toDto(itemService.create(toEntity(dto))); + } + + // Изменить элемент + @PutMapping("/{id}") + public ItemDto update(@PathVariable(name = "id") Long id, @RequestBody @Valid ItemDto dto) { + return toDto(itemService.update(id, toEntity(dto))); + } + + // Удалить элемент + @DeleteMapping("/{id}") + public ItemDto delete(@PathVariable(name = "id") Long id) { + return toDto(itemService.delete(id)); + } +} diff --git a/demo/src/main/java/com/example/demo/items/api/ItemDto.java b/demo/src/main/java/com/example/demo/items/api/ItemDto.java new file mode 100644 index 0000000..34b49c0 --- /dev/null +++ b/demo/src/main/java/com/example/demo/items/api/ItemDto.java @@ -0,0 +1,74 @@ +package com.example.demo.items.api; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; + +// DTO для сущности "Заказ" (Заказ, содержащий книги) +public class ItemDto { + // Идентфикатор + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private Long id; + + // Идентификатор типа книги + @NotNull + @Min(1) + private Long typeId; + + // Цена книги + @NotNull + @Min(1) + private Double price; + + // Количество книг + @NotNull + @Min(1) + private Integer count; + + // Получить идентификатор + public Long getId() { + return id; + } + + // Установить идентификатор + public void setId(Long id) { + this.id = id; + } + + // Получить идентификатор типа книги + public Long getTypeId() { + return typeId; + } + + // Установить идентификатор типа книги + public void setTypeId(Long typeId) { + this.typeId = typeId; + } + + // Получить цену книги + public Double getPrice() { + return price; + } + + // Установить цену книги + public void setPrice(Double price) { + this.price = price; + } + + // Получить количество книг + public Integer getCount() { + return count; + } + + // Установить количество книг + public void setCount(Integer count) { + this.count = count; + } + + // Получить сумму заказа + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + public Double getSum() { + return price * count; + } +} diff --git a/demo/src/main/java/com/example/demo/items/model/ItemEntity.java b/demo/src/main/java/com/example/demo/items/model/ItemEntity.java new file mode 100644 index 0000000..ba7e67e --- /dev/null +++ b/demo/src/main/java/com/example/demo/items/model/ItemEntity.java @@ -0,0 +1,81 @@ +package com.example.demo.items.model; + +import java.util.Objects; + +import com.example.demo.core.model.BaseEntity; +import com.example.demo.types.model.TypeEntity; + +// Сущность "Заказ" (Заказ, содержащий книги) +public class ItemEntity extends BaseEntity { + // Тип книги + private TypeEntity type; + + // Цена книги + private Double price; + + // Количество книг + private Integer count; + + // Конструктор по умолчанию + public ItemEntity() { + super(); + } + + // Конструктор с параметрами для создания объекта + public ItemEntity(Long id, TypeEntity type, Double price, Integer count) { + super(id); + this.type = type; + this.price = price; + this.count = count; + } + + // Получить тип книги + public TypeEntity getType() { + return type; + } + + // Установить тип книги + public void setType(TypeEntity type) { + this.type = type; + } + + // Получить стоимость книги + public Double getPrice() { + return price; + } + + // Установить стоимость книги + public void setPrice(Double price) { + this.price = price; + } + + // Получить количество книг + public Integer getCount() { + return count; + } + + // Установить количество книг + public void setCount(Integer count) { + this.count = count; + } + + // Получить хэш-код объекта + @Override + public int hashCode() { + return Objects.hash(id, type, price, count); + } + + // Сравнить объекты + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + final ItemEntity other = (ItemEntity) obj; + return Objects.equals(other.getId(), id) + && Objects.equals(other.getType(), type) + && Objects.equals(other.getPrice(), price) + && Objects.equals(other.getCount(), count); + } +} diff --git a/demo/src/main/java/com/example/demo/items/repository/ItemRepository.java b/demo/src/main/java/com/example/demo/items/repository/ItemRepository.java new file mode 100644 index 0000000..61da1e4 --- /dev/null +++ b/demo/src/main/java/com/example/demo/items/repository/ItemRepository.java @@ -0,0 +1,11 @@ +package com.example.demo.items.repository; + +import org.springframework.stereotype.Repository; + +import com.example.demo.core.repository.MapRepository; +import com.example.demo.items.model.ItemEntity; + +// Хранилище для сущности "Заказ" (Заказ, содержащий книги) +@Repository +public class ItemRepository extends MapRepository { +} diff --git a/demo/src/main/java/com/example/demo/items/service/ItemService.java b/demo/src/main/java/com/example/demo/items/service/ItemService.java new file mode 100644 index 0000000..dbd12be --- /dev/null +++ b/demo/src/main/java/com/example/demo/items/service/ItemService.java @@ -0,0 +1,59 @@ +package com.example.demo.items.service; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +import org.springframework.stereotype.Service; + +import com.example.demo.core.error.NotFoundException; +import com.example.demo.items.model.ItemEntity; +import com.example.demo.items.repository.ItemRepository; + +// Бизнес-логика для сущности "Заказ" (Заказ, содержащий книги) +@Service +public class ItemService { + // Хранилище элементов + private final ItemRepository repository; + + // Конструктор + public ItemService(ItemRepository repository) { + this.repository = repository; + } + + // Получить все элементы или по заданному фильтру + public List getAll(Long typeId) { + if (Objects.equals(typeId, 0L)) { + return repository.getAll(); + } + return repository.getAll().stream() + .filter(item -> item.getType().getId().equals(typeId)) + .toList(); + } + + // Получить элемент по идентификатору + public ItemEntity get(Long id) { + return Optional.ofNullable(repository.get(id)) + .orElseThrow(() -> new NotFoundException(id)); + } + + // Создать элемент + public ItemEntity create(ItemEntity entity) { + return repository.create(entity); + } + + // Изменить элемент + public ItemEntity update(Long id, ItemEntity entity) { + final ItemEntity existsEntity = get(id); + existsEntity.setType(entity.getType()); + existsEntity.setPrice(entity.getPrice()); + existsEntity.setCount(entity.getCount()); + return repository.update(existsEntity); + } + + // Удалить элемент + public ItemEntity delete(Long id) { + final ItemEntity existsEntity = get(id); + return repository.delete(existsEntity); + } +} diff --git a/demo/src/main/java/com/example/demo/messages/api/MessageController.java b/demo/src/main/java/com/example/demo/messages/api/MessageController.java new file mode 100644 index 0000000..ff981c7 --- /dev/null +++ b/demo/src/main/java/com/example/demo/messages/api/MessageController.java @@ -0,0 +1,76 @@ +package com.example.demo.messages.api; + +import java.util.List; + +import org.modelmapper.ModelMapper; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.example.demo.core.configuration.Constants; +import com.example.demo.messages.model.MessageEntity; +import com.example.demo.messages.service.MessageService; + +import jakarta.validation.Valid; + +// Контроллер для сущности "Сообщение" +@RestController +@RequestMapping(Constants.API_URL + "/message") +public class MessageController { + // Бизнес-логика для сущности "Сообщение" + private final MessageService messageService; + + // Библиотека для преобразования сущности + private final ModelMapper modelMapper; + + // Конструктор + public MessageController(MessageService messageService, ModelMapper modelMapper) { + this.messageService = messageService; + this.modelMapper = modelMapper; + } + + // Преобразовать из сущности в DTO + private MessageDto toDto(MessageEntity entity) { + return modelMapper.map(entity, MessageDto.class); + } + + // Преобразовать из DTO в сущность + private MessageEntity toEntity(@Valid MessageDto dto) { + return modelMapper.map(dto, MessageEntity.class); + } + + // Получить все элементы + @GetMapping + public List getAll() { + return messageService.getAll().stream().map(this::toDto).toList(); + } + + // Получить элемент по идентификатору + @GetMapping("/{id}") + public MessageDto get(@PathVariable(name = "id") Long id) { + return toDto(messageService.get(id)); + } + + // Создать элемент + @PostMapping + public MessageDto create(@RequestBody @Valid MessageDto dto) { + return toDto(messageService.create(toEntity(dto))); + } + + // Изменить элемент + @PutMapping("/{id}") + public MessageDto update(@PathVariable(name = "id") Long id, @RequestBody @Valid MessageDto dto) { + return toDto(messageService.update(id, toEntity(dto))); + } + + // Удалить элемент + @DeleteMapping("/{id}") + public MessageDto delete(@PathVariable(name = "id") Long id) { + return toDto(messageService.delete(id)); + } +} diff --git a/demo/src/main/java/com/example/demo/messages/api/MessageDto.java b/demo/src/main/java/com/example/demo/messages/api/MessageDto.java new file mode 100644 index 0000000..4c1451c --- /dev/null +++ b/demo/src/main/java/com/example/demo/messages/api/MessageDto.java @@ -0,0 +1,85 @@ +package com.example.demo.messages.api; + +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; + +// DTO для сущности "Сообщение" +public class MessageDto { + // Идентфикатор + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private Long id; + + // Имя отправителя + @NotNull + @Min(1) + private String name; + + // Электронный адрес почты отправителя + @NotNull + @Min(1) + private String email; + + // Текст сообщения + @NotNull + @Min(1) + private String text; + + // Дата отправки + @NotNull + @Min(1) + private Date date; + + // Получить идентификатор + 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 String getEmail() { + return email; + } + + // Установить электронный адрес почты отправителя + public void setEmail(String email) { + this.email = email; + } + + // Получить текст сообщения + public String getText() { + return text; + } + + // Установить текст сообщения + public void setText(String text) { + this.text = text; + } + + // Получить дату отправления + public Date getDate() { + return date; + } + + // Установить дату отправления + public void setDate(Date date) { + this.date = date; + } +} diff --git a/demo/src/main/java/com/example/demo/messages/model/MessageEntity.java b/demo/src/main/java/com/example/demo/messages/model/MessageEntity.java new file mode 100644 index 0000000..0738dec --- /dev/null +++ b/demo/src/main/java/com/example/demo/messages/model/MessageEntity.java @@ -0,0 +1,96 @@ +package com.example.demo.messages.model; + +import java.util.Date; +import java.util.Objects; + +import com.example.demo.core.model.BaseEntity; + +// Сущность "Сообщение" +public class MessageEntity extends BaseEntity { + // Имя отправителя + private String name; + + // Электронный адрес почты отправителя + private String email; + + // Текст сообщения + private String text; + + // Дата отправки + private Date date; + + // Конструктор по умолчанию + public MessageEntity() { + super(); + } + + // Конструктор с параметрами для создания объекта + public MessageEntity(Long id, String name, String email, String text) { + super(id); + this.name = name; + this.email = email; + this.text = text; + this.date = new Date(); + } + + // Получить имя отправителя + public String getName() { + return name; + } + + // Установить имя отправителя + public void setName(String name) { + this.name = name; + } + + // Получить электронный адрес почты отправителя + public String getEmail() { + return email; + } + + // Установить электронный адрес почты отправителя + public void setEmail(String email) { + this.email = email; + } + + // Получить текст сообщения + public String getText() { + return text; + } + + // Установить текст сообщения + public void setText(String text) { + this.text = text; + } + + // Получить дату отправления + public Date getDate() { + return date; + } + + // Установить дату отправления + public void setDate(Date date) { + this.date = date; + } + + // Получить хэш-код объекта + @Override + public int hashCode() { + return Objects.hash(id, name, email, text, date); + } + + // Сравнить объекты + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + final MessageEntity other = (MessageEntity) obj; + return Objects.equals(other.getId(), id) + && Objects.equals(other.getName(), name) + && Objects.equals(other.getEmail(), email) + && Objects.equals(other.getText(), text) + && Objects.equals(other.getDate(), date); + } +} diff --git a/demo/src/main/java/com/example/demo/messages/repository/MessageRepository.java b/demo/src/main/java/com/example/demo/messages/repository/MessageRepository.java new file mode 100644 index 0000000..f67f587 --- /dev/null +++ b/demo/src/main/java/com/example/demo/messages/repository/MessageRepository.java @@ -0,0 +1,11 @@ +package com.example.demo.messages.repository; + +import org.springframework.stereotype.Repository; + +import com.example.demo.core.repository.MapRepository; +import com.example.demo.messages.model.MessageEntity; + +// Хранилище для сущности "Сообщение" +@Repository +public class MessageRepository extends MapRepository { +} diff --git a/demo/src/main/java/com/example/demo/messages/service/MessageService.java b/demo/src/main/java/com/example/demo/messages/service/MessageService.java new file mode 100644 index 0000000..b8be1ef --- /dev/null +++ b/demo/src/main/java/com/example/demo/messages/service/MessageService.java @@ -0,0 +1,53 @@ +package com.example.demo.messages.service; + +import java.util.List; +import java.util.Optional; + +import org.springframework.stereotype.Service; + +import com.example.demo.core.error.NotFoundException; +import com.example.demo.messages.model.MessageEntity; +import com.example.demo.messages.repository.MessageRepository; + +// Бизнес-логика для сущности "Сообщение" +@Service +public class MessageService { + // Хранилище элементов + private final MessageRepository repository; + + // Конструктор + public MessageService(MessageRepository repository) { + this.repository = repository; + } + + // Получить все элементы + public List getAll() { + return repository.getAll(); + } + + // Получить элемент по идентификатору + public MessageEntity get(Long id) { + return Optional.ofNullable(repository.get(id)) + .orElseThrow(() -> new NotFoundException(id)); + } + + // Создать элемент + public MessageEntity create(MessageEntity entity) { + return repository.create(entity); + } + + // Изменить элемент + public MessageEntity update(Long id, MessageEntity entity) { + final MessageEntity existsEntity = get(id); + existsEntity.setName(entity.getName()); + existsEntity.setEmail(entity.getEmail()); + existsEntity.setText(entity.getText()); + return repository.update(existsEntity); + } + + // Удалить элемент + public MessageEntity delete(Long id) { + final MessageEntity existsEntity = get(id); + return repository.delete(existsEntity); + } +} diff --git a/demo/src/main/java/com/example/demo/speaker/api/SpeakerController.java b/demo/src/main/java/com/example/demo/speaker/api/SpeakerController.java new file mode 100644 index 0000000..293296d --- /dev/null +++ b/demo/src/main/java/com/example/demo/speaker/api/SpeakerController.java @@ -0,0 +1,23 @@ +package com.example.demo.speaker.api; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.example.demo.speaker.service.SpeakerService; + +@RestController +public class SpeakerController { + private final SpeakerService speakerService; + + public SpeakerController(SpeakerService speakerService) { + this.speakerService = speakerService; + } + + @GetMapping + public String hello( + @RequestParam(value = "name", defaultValue = "Мир") String name, + @RequestParam(value = "lang", defaultValue = "ru") String lang) { + return speakerService.say(name, lang); + } +} diff --git a/demo/src/main/java/com/example/demo/speaker/configuration/SpeakerConfiguration.java b/demo/src/main/java/com/example/demo/speaker/configuration/SpeakerConfiguration.java new file mode 100644 index 0000000..0ef7cda --- /dev/null +++ b/demo/src/main/java/com/example/demo/speaker/configuration/SpeakerConfiguration.java @@ -0,0 +1,27 @@ +package com.example.demo.speaker.configuration; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.example.demo.speaker.domain.Speaker; +import com.example.demo.speaker.domain.SpeakerEng; +import com.example.demo.speaker.domain.SpeakerRus; + +@Configuration +public class SpeakerConfiguration { + private final Logger log = LoggerFactory.getLogger(SpeakerConfiguration.class); + + @Bean(value = "ru", initMethod = "init", destroyMethod = "destroy") + public SpeakerRus createRusSpeaker() { + log.info("Call createRusSpeaker()"); + return new SpeakerRus(); + } + + @Bean(value = "en") + public Speaker createEngSpeaker() { + log.info("Call createEngSpeaker()"); + return new SpeakerEng(); + } +} diff --git a/demo/src/main/java/com/example/demo/speaker/domain/Speaker.java b/demo/src/main/java/com/example/demo/speaker/domain/Speaker.java new file mode 100644 index 0000000..27a0a29 --- /dev/null +++ b/demo/src/main/java/com/example/demo/speaker/domain/Speaker.java @@ -0,0 +1,5 @@ +package com.example.demo.speaker.domain; + +public interface Speaker { + String say(); +} diff --git a/demo/src/main/java/com/example/demo/speaker/domain/SpeakerDeu.java b/demo/src/main/java/com/example/demo/speaker/domain/SpeakerDeu.java new file mode 100644 index 0000000..5909864 --- /dev/null +++ b/demo/src/main/java/com/example/demo/speaker/domain/SpeakerDeu.java @@ -0,0 +1,28 @@ +package com.example.demo.speaker.domain; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import jakarta.annotation.PostConstruct; +import jakarta.annotation.PreDestroy; + +@Component(value = "de") +public class SpeakerDeu implements Speaker { + private final Logger log = LoggerFactory.getLogger(SpeakerDeu.class); + + @Override + public String say() { + return "Hallo"; + } + + @PostConstruct + public void init() { + log.info("SpeakerDeu.init()"); + } + + @PreDestroy + public void destroy() { + log.info("SpeakerDeu.destroy()"); + } +} diff --git a/demo/src/main/java/com/example/demo/speaker/domain/SpeakerEng.java b/demo/src/main/java/com/example/demo/speaker/domain/SpeakerEng.java new file mode 100644 index 0000000..a310403 --- /dev/null +++ b/demo/src/main/java/com/example/demo/speaker/domain/SpeakerEng.java @@ -0,0 +1,26 @@ +package com.example.demo.speaker.domain; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; + +public class SpeakerEng implements Speaker, InitializingBean, DisposableBean { + private final Logger log = LoggerFactory.getLogger(SpeakerEng.class); + + @Override + public String say() { + return "Hello"; + } + + @Override + public void afterPropertiesSet() { + log.info("SpeakerEng.afterPropertiesSet()"); + } + + @Override + public void destroy() { + log.info("SpeakerEng.destroy()"); + + } +} diff --git a/demo/src/main/java/com/example/demo/speaker/domain/SpeakerRus.java b/demo/src/main/java/com/example/demo/speaker/domain/SpeakerRus.java new file mode 100644 index 0000000..d6ed18e --- /dev/null +++ b/demo/src/main/java/com/example/demo/speaker/domain/SpeakerRus.java @@ -0,0 +1,21 @@ +package com.example.demo.speaker.domain; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class SpeakerRus implements Speaker { + private final Logger log = LoggerFactory.getLogger(SpeakerRus.class); + + @Override + public String say() { + return "Привет"; + } + + public void init() { + log.info("SpeakerRus.init()"); + } + + public void destroy() { + log.info("SpeakerRus.destroy()"); + } +} diff --git a/demo/src/main/java/com/example/demo/speaker/service/SpeakerService.java b/demo/src/main/java/com/example/demo/speaker/service/SpeakerService.java new file mode 100644 index 0000000..de3a463 --- /dev/null +++ b/demo/src/main/java/com/example/demo/speaker/service/SpeakerService.java @@ -0,0 +1,21 @@ +package com.example.demo.speaker.service; + +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Service; + +import com.example.demo.speaker.domain.Speaker; + +@Service +public class SpeakerService { + private final ApplicationContext applicationContext; + + public SpeakerService(ApplicationContext applicationContext) { + this.applicationContext = applicationContext; + } + + public String say(String name, String lang) { + @SuppressWarnings("null") + final Speaker speaker = (Speaker) applicationContext.getBean(lang); + return String.format("%s, %s!", speaker.say(), name); + } +} diff --git a/demo/src/main/java/com/example/demo/types/api/TypeController.java b/demo/src/main/java/com/example/demo/types/api/TypeController.java new file mode 100644 index 0000000..3ff424f --- /dev/null +++ b/demo/src/main/java/com/example/demo/types/api/TypeController.java @@ -0,0 +1,76 @@ +package com.example.demo.types.api; + +import java.util.List; + +import org.modelmapper.ModelMapper; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.example.demo.core.configuration.Constants; +import com.example.demo.types.model.TypeEntity; +import com.example.demo.types.service.TypeService; + +import jakarta.validation.Valid; + +// Контроллер для сущности "Тип" (Тип книги) +@RestController +@RequestMapping(Constants.API_URL + "/type") +public class TypeController { + // Бизнес-логика для сущности "Тип" (Тип книги) + private final TypeService typeService; + + // Библиотека для преобразования сущности + private final ModelMapper modelMapper; + + // Конструктор + public TypeController(TypeService typeService, ModelMapper modelMapper) { + this.typeService = typeService; + this.modelMapper = modelMapper; + } + + // Преобразовать из сущности в DTO + private TypeDto toDto(TypeEntity entity) { + return modelMapper.map(entity, TypeDto.class); + } + + // Преобразовать из DTO в сущность + private TypeEntity toEntity(@Valid TypeDto dto) { + return modelMapper.map(dto, TypeEntity.class); + } + + // Получить все элементы + @GetMapping + public List getAll() { + return typeService.getAll().stream().map(this::toDto).toList(); + } + + // Получить элемент по идентификатору + @GetMapping("/{id}") + public TypeDto get(@PathVariable(name = "id") Long id) { + return toDto(typeService.get(id)); + } + + // Создать элемент + @PostMapping + public TypeDto create(@RequestBody @Valid TypeDto dto) { + return toDto(typeService.create(toEntity(dto))); + } + + // Изменить элемент + @PutMapping("/{id}") + public TypeDto update(@PathVariable(name = "id") Long id, @RequestBody @Valid TypeDto dto) { + return toDto(typeService.update(id, toEntity(dto))); + } + + // Удалить элемент + @DeleteMapping("/{id}") + public TypeDto delete(@PathVariable(name = "id") Long id) { + return toDto(typeService.delete(id)); + } +} diff --git a/demo/src/main/java/com/example/demo/types/api/TypeDto.java b/demo/src/main/java/com/example/demo/types/api/TypeDto.java new file mode 100644 index 0000000..62f766b --- /dev/null +++ b/demo/src/main/java/com/example/demo/types/api/TypeDto.java @@ -0,0 +1,36 @@ +package com.example.demo.types.api; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import jakarta.validation.constraints.NotBlank; + +// DTO для сущности "Тип" (Тип книги) +public class TypeDto { + // Идентфикатор + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private Long id; + + // Название типа + @NotBlank + private String 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/demo/src/main/java/com/example/demo/types/model/TypeEntity.java b/demo/src/main/java/com/example/demo/types/model/TypeEntity.java new file mode 100644 index 0000000..5b93660 --- /dev/null +++ b/demo/src/main/java/com/example/demo/types/model/TypeEntity.java @@ -0,0 +1,50 @@ +package com.example.demo.types.model; + +import java.util.Objects; + +import com.example.demo.core.model.BaseEntity; + +// Сущность "Тип" (Тип книги) +public class TypeEntity extends BaseEntity { + // Название типа + private String name; + + // Конструктор по умолчанию + public TypeEntity() { + super(); + } + + // Конструктор с параметрами для создания объекта + public TypeEntity(Long id, String name) { + super(id); + this.name = name; + } + + // Получить название типа + public String getName() { + return name; + } + + // Установить название типа + public void setName(String name) { + this.name = name; + } + + // Получить хэш-код объекта + @Override + public int hashCode() { + return Objects.hash(id, name); + } + + // Сравнить объекты + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + final TypeEntity other = (TypeEntity) obj; + return Objects.equals(other.getId(), id) + && Objects.equals(other.getName(), name); + } +} diff --git a/demo/src/main/java/com/example/demo/types/repository/TypeRepository.java b/demo/src/main/java/com/example/demo/types/repository/TypeRepository.java new file mode 100644 index 0000000..d491aec --- /dev/null +++ b/demo/src/main/java/com/example/demo/types/repository/TypeRepository.java @@ -0,0 +1,11 @@ +package com.example.demo.types.repository; + +import org.springframework.stereotype.Repository; + +import com.example.demo.core.repository.MapRepository; +import com.example.demo.types.model.TypeEntity; + +// Хранилище для сущности "Тип" (Тип книги) +@Repository +public class TypeRepository extends MapRepository { +} diff --git a/demo/src/main/java/com/example/demo/types/service/TypeService.java b/demo/src/main/java/com/example/demo/types/service/TypeService.java new file mode 100644 index 0000000..a4b7b55 --- /dev/null +++ b/demo/src/main/java/com/example/demo/types/service/TypeService.java @@ -0,0 +1,51 @@ +package com.example.demo.types.service; + +import java.util.List; +import java.util.Optional; + +import org.springframework.stereotype.Service; + +import com.example.demo.core.error.NotFoundException; +import com.example.demo.types.model.TypeEntity; +import com.example.demo.types.repository.TypeRepository; + +// Бизнес-логика для сущности "Тип" (Тип книг) +@Service +public class TypeService { + // Хранилище элементов + private final TypeRepository repository; + + // Конструктор + public TypeService(TypeRepository repository) { + this.repository = repository; + } + + // Получить все элементы + public List getAll() { + return repository.getAll(); + } + + // Получить элемент по идентификатору + public TypeEntity get(Long id) { + return Optional.ofNullable(repository.get(id)) + .orElseThrow(() -> new NotFoundException(id)); + } + + // Создать элемент + public TypeEntity create(TypeEntity entity) { + return repository.create(entity); + } + + // Изменить элемент + public TypeEntity update(Long id, TypeEntity entity) { + final TypeEntity existsEntity = get(id); + existsEntity.setName(entity.getName()); + return repository.update(existsEntity); + } + + // Удалить элемент + public TypeEntity delete(Long id) { + final TypeEntity existsEntity = get(id); + return repository.delete(existsEntity); + } +} diff --git a/demo/src/test/java/com/example/demo/DemoApplicationTests.java b/demo/src/test/java/com/example/demo/DemoApplicationTests.java deleted file mode 100644 index 2778a6a..0000000 --- a/demo/src/test/java/com/example/demo/DemoApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.demo; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class DemoApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/demo/src/test/java/com/example/demo/ItemServiceTests.java b/demo/src/test/java/com/example/demo/ItemServiceTests.java new file mode 100644 index 0000000..bbcf68d --- /dev/null +++ b/demo/src/test/java/com/example/demo/ItemServiceTests.java @@ -0,0 +1,69 @@ +package com.example.demo; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import com.example.demo.core.error.NotFoundException; +import com.example.demo.items.model.ItemEntity; +import com.example.demo.items.service.ItemService; +import com.example.demo.types.model.TypeEntity; +import com.example.demo.types.service.TypeService; + +@SpringBootTest +@TestMethodOrder(OrderAnnotation.class) +public class ItemServiceTests { + @Autowired + private ItemService itemService; + + @Autowired + private TypeService typeService; + + @Test + void getTest() { + Assertions.assertThrows(NotFoundException.class, () -> itemService.get(0L)); + } + + @Test + @Order(1) + void createTest() { + final TypeEntity type = typeService.create(new TypeEntity(null, "Protection")); + itemService.create(new ItemEntity(null, type, 50.00, 20)); + itemService.create(new ItemEntity(null, type, 12.00, 3)); + final ItemEntity last = itemService.create(new ItemEntity(null, type, 15.00, 6)); + + Assertions.assertEquals(3, itemService.getAll(0L).size()); + Assertions.assertEquals(last, itemService.get(3L)); + } + + @Test + @Order(2) + void updateTest() { + final TypeEntity type = typeService.create(new TypeEntity(null, "Sharpness")); + final ItemEntity entity = itemService.get(3L); + final Double oldPrice = entity.getPrice(); + final ItemEntity newEntity = itemService.update(3L, new ItemEntity(null, type, 30.00, 6)); + + Assertions.assertEquals(3, itemService.getAll(0L).size()); + Assertions.assertEquals(newEntity, itemService.get(3L)); + Assertions.assertEquals(30.00, newEntity.getPrice()); + Assertions.assertNotEquals(oldPrice, newEntity.getPrice()); + } + + @Test + @Order(3) + void deleteTest() { + itemService.delete(3L); + Assertions.assertEquals(2, itemService.getAll(0L).size()); + Assertions.assertThrows(NotFoundException.class, () -> itemService.get(3L)); + + final TypeEntity type = typeService.create(new TypeEntity(null, "Protection")); + final ItemEntity newEntity = itemService.create(new ItemEntity(null, type, 50.00, 10)); + Assertions.assertEquals(3, itemService.getAll(0L).size()); + Assertions.assertEquals(4L, newEntity.getId()); + } +} diff --git a/demo/src/test/java/com/example/demo/MessageServiceTests.java b/demo/src/test/java/com/example/demo/MessageServiceTests.java new file mode 100644 index 0000000..edb48db --- /dev/null +++ b/demo/src/test/java/com/example/demo/MessageServiceTests.java @@ -0,0 +1,65 @@ +package com.example.demo; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import com.example.demo.core.error.NotFoundException; +import com.example.demo.messages.model.MessageEntity; +import com.example.demo.messages.service.MessageService; + +@SpringBootTest +@TestMethodOrder(OrderAnnotation.class) +public class MessageServiceTests { + @Autowired + private MessageService messageService; + + @Test + void getTest() { + Assertions.assertThrows(NotFoundException.class, () -> messageService.get(0L)); + } + + @Test + @Order(1) + void createTest() { + messageService.create(new MessageEntity(null, "Владимир", "vladimir@mail.ru", "Текст")); + messageService.create(new MessageEntity(null, "Путин", "putin@mail.ru", "Молодец")); + final MessageEntity last = messageService.create(new MessageEntity(null, "Политик", "lider@mail.ru", "Борец")); + + Assertions.assertEquals(3, messageService.getAll().size()); + Assertions.assertEquals(last, messageService.get(3L)); + } + + @Test + @Order(2) + void updateTest() { + final String test = "TEST"; + final String email = "masenkin73@gmail.com"; + final String text = "aboba"; + final MessageEntity entity = messageService.get(3L); + final String oldName = entity.getName(); + final MessageEntity newEntity = messageService.update(3L, new MessageEntity(1L, test, email, text)); + + Assertions.assertEquals(3, messageService.getAll().size()); + Assertions.assertEquals(newEntity, messageService.get(3L)); + Assertions.assertEquals(test, newEntity.getName()); + Assertions.assertNotEquals(oldName, newEntity.getName()); + } + + @Test + @Order(3) + void deleteTest() { + messageService.delete(3L); + Assertions.assertEquals(2, messageService.getAll().size()); + final MessageEntity last = messageService.get(2L); + Assertions.assertEquals(2L, last.getId()); + + final MessageEntity newEntity = messageService.create(new MessageEntity(null, "name", "address@email.com", "text")); + Assertions.assertEquals(3, messageService.getAll().size()); + Assertions.assertEquals(4L, newEntity.getId()); + } +} diff --git a/demo/src/test/java/com/example/demo/SpeakerServiceTests.java b/demo/src/test/java/com/example/demo/SpeakerServiceTests.java new file mode 100644 index 0000000..cb43d1d --- /dev/null +++ b/demo/src/test/java/com/example/demo/SpeakerServiceTests.java @@ -0,0 +1,38 @@ +package com.example.demo; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import com.example.demo.speaker.service.SpeakerService; + +@SpringBootTest +class SpeakerServiceTests { + @Autowired + SpeakerService speakerService; + + @Test + void testSpeakerRus() { + final String res = speakerService.say("Мир", "ru"); + Assertions.assertEquals("Привет, Мир!", res); + } + + @Test + void testSpeakerEng() { + final String res = speakerService.say("World", "en"); + Assertions.assertEquals("Hello, World!", res); + } + + @Test + void testSpeakerDeu() { + final String res = speakerService.say("Welt", "de"); + Assertions.assertEquals("Hallo, Welt!", res); + } + + @Test + void testSpeakerErrorWired() { + Assertions.assertThrows(NoSuchBeanDefinitionException.class, () -> speakerService.say("Мир", "rus")); + } +} \ No newline at end of file diff --git a/demo/src/test/java/com/example/demo/TypeServiceTests.java b/demo/src/test/java/com/example/demo/TypeServiceTests.java new file mode 100644 index 0000000..611b67a --- /dev/null +++ b/demo/src/test/java/com/example/demo/TypeServiceTests.java @@ -0,0 +1,63 @@ +package com.example.demo; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import com.example.demo.core.error.NotFoundException; +import com.example.demo.types.model.TypeEntity; +import com.example.demo.types.service.TypeService; + +@SpringBootTest +@TestMethodOrder(OrderAnnotation.class) +class TypeServiceTests { + @Autowired + private TypeService typeService; + + @Test + void getTest() { + Assertions.assertThrows(NotFoundException.class, () -> typeService.get(0L)); + } + + @Test + @Order(1) + void createTest() { + typeService.create(new TypeEntity(null, "Protection")); + typeService.create(new TypeEntity(null, "Sharpness")); + final TypeEntity last = typeService.create(new TypeEntity(null, "Infinity")); + + Assertions.assertEquals(3, typeService.getAll().size()); + Assertions.assertEquals(last, typeService.get(3L)); + } + + @Test + @Order(2) + void updateTest() { + final String test = "TEST"; + final TypeEntity entity = typeService.get(3L); + final String oldName = entity.getName(); + final TypeEntity newEntity = typeService.update(3L, new TypeEntity(1L, test)); + + Assertions.assertEquals(3, typeService.getAll().size()); + Assertions.assertEquals(newEntity, typeService.get(3L)); + Assertions.assertEquals(test, newEntity.getName()); + Assertions.assertNotEquals(oldName, newEntity.getName()); + } + + @Test + @Order(3) + void deleteTest() { + typeService.delete(3L); + Assertions.assertEquals(2, typeService.getAll().size()); + final TypeEntity last = typeService.get(2L); + Assertions.assertEquals(2L, last.getId()); + + final TypeEntity newEntity = typeService.create(new TypeEntity(null, "Infinity")); + Assertions.assertEquals(3, typeService.getAll().size()); + Assertions.assertEquals(4L, newEntity.getId()); + } +}