diff --git a/src/main/java/com/example/demo/Application.java b/src/main/java/com/example/demo/Application.java deleted file mode 100644 index e0e37af..0000000 --- a/src/main/java/com/example/demo/Application.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.example.demo; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class Application { - - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } - -} diff --git a/src/main/java/com/example/demo/api/v1/cows/controller/CowsApi.java b/src/main/java/com/example/demo/api/v1/cows/controller/CowsApi.java deleted file mode 100644 index 3883c28..0000000 --- a/src/main/java/com/example/demo/api/v1/cows/controller/CowsApi.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.example.demo.api.v1.cows.controller; - -import com.example.demo.api.v1.cows.model.request.AddCowRequest; -import com.example.demo.api.v1.cows.model.request.UpdateCowDetailsRequest; -import com.example.demo.api.v1.cows.model.response.FullCowResponse; -import com.example.demo.api.v1.cows.model.response.ShortCowResponse; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import java.util.List; - -@Tag(name = "Cows", description = "API для работы с коровами") -public interface CowsApi { - - @Operation(summary = "Запросить всех коров") - List getAllCows(); - - @Operation(summary = "Запросить всех коров конкретного фермера") - List farmerCows(long farmerId); - - @Operation(summary = "Запросить корову по ее ID") - FullCowResponse cow(long id); - - @Operation(summary = "Добавить корову фермеру") - void addCowByFarmer(AddCowRequest request); - - @Operation(summary = "Обновить описание коровы") - void updateCowDetails(UpdateCowDetailsRequest request); - - @Operation(summary = "Удалить корову") - void deleteCow(long id); -} diff --git a/src/main/java/com/example/demo/api/v1/cows/controller/CowsController.java b/src/main/java/com/example/demo/api/v1/cows/controller/CowsController.java deleted file mode 100644 index 0aa33ce..0000000 --- a/src/main/java/com/example/demo/api/v1/cows/controller/CowsController.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.example.demo.api.v1.cows.controller; - -import com.example.demo.api.v1.cows.model.entity.CowEntity; -import com.example.demo.api.v1.cows.model.request.AddCowRequest; -import com.example.demo.api.v1.cows.model.request.UpdateCowDetailsRequest; -import com.example.demo.api.v1.cows.model.response.FullCowResponse; -import com.example.demo.api.v1.cows.model.response.ShortCowResponse; -import com.example.demo.api.v1.cows.service.AddCowToFarmer; -import com.example.demo.api.v1.cows.service.DeleteCowById; -import com.example.demo.api.v1.cows.service.GetAllCows; -import com.example.demo.api.v1.cows.service.GetAllCowsFarmerByFarmerId; -import com.example.demo.api.v1.cows.service.GetCowById; -import com.example.demo.api.v1.cows.service.UpdateCow; -import java.util.List; -import java.util.stream.Collectors; -import lombok.RequiredArgsConstructor; -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; - -@RestController -@RequestMapping("/v1/farmers") -@RequiredArgsConstructor -public class CowsController implements CowsApi { - - private final GetAllCows allCows; - private final GetAllCowsFarmerByFarmerId cowsFarmer; - private final GetCowById cowById; - private final AddCowToFarmer addCowToFarmer; - private final UpdateCow updateCow; - private final DeleteCowById deleteCowById; - - @GetMapping("/cows") - @Override - public List getAllCows() { - return allCows.execute() - .stream() - .map(CowEntity::toShortResponse) - .collect(Collectors.toList()); - } - - @GetMapping("/{farmerId}/cows") - @Override - public List farmerCows(@PathVariable long farmerId) { - return cowsFarmer.execute(farmerId) - .stream() - .map(CowEntity::toShortResponse) - .collect(Collectors.toList()); - } - - @GetMapping("/cows/{id}") - @Override - public FullCowResponse cow(@PathVariable long id) { - return cowById.execute(id).toFullResponse(); - } - - @PostMapping("/cows") - @Override - public void addCowByFarmer(@RequestBody AddCowRequest request) { - addCowToFarmer.execute(request); - } - - @PutMapping("/cows") - @Override - public void updateCowDetails(@RequestBody UpdateCowDetailsRequest request) { - updateCow.execute(request); - } - - @DeleteMapping("/cows/{id}") - @Override - public void deleteCow(@PathVariable long id) { - deleteCowById.execute(id); - } -} diff --git a/src/main/java/com/example/demo/api/v1/cows/model/entity/CowEntity.java b/src/main/java/com/example/demo/api/v1/cows/model/entity/CowEntity.java deleted file mode 100644 index b7c1c6a..0000000 --- a/src/main/java/com/example/demo/api/v1/cows/model/entity/CowEntity.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.example.demo.api.v1.cows.model.entity; - -import com.example.demo.api.v1.cows.model.enums.Color; -import com.example.demo.api.v1.cows.model.enums.CowStatus; -import com.example.demo.api.v1.cows.model.request.UpdateCowDetailsRequest; -import com.example.demo.api.v1.cows.model.response.FullCowResponse; -import com.example.demo.api.v1.cows.model.response.ShortCowResponse; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Entity -@Table(name = "farmer_cow") -@AllArgsConstructor -@NoArgsConstructor -public class CowEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "id") - private Long id; - - @Column(name = "farmer_id") - private Long farmerId; - - @Column(name = "name") - private String name; - - @Column(name = "color") - private Color color; - - @Column(name = "liters") - private int liters; - - @Column(name = "status") - private CowStatus status; - - public ShortCowResponse toShortResponse() { - return new ShortCowResponse(id, name, status); - } - - public FullCowResponse toFullResponse() { - return new FullCowResponse(id, farmerId, name, color, liters, status); - } - - public void update(UpdateCowDetailsRequest request) { - if (request.getName() != null) - name = request.getName(); - if (request.getColor() != null) - color = request.getColor(); - if (request.getLiters() != null) - liters = request.getLiters(); - if (request.getStatus() != null) - status = request.getStatus(); - } -} diff --git a/src/main/java/com/example/demo/api/v1/cows/model/enums/Color.java b/src/main/java/com/example/demo/api/v1/cows/model/enums/Color.java deleted file mode 100644 index e92aaa0..0000000 --- a/src/main/java/com/example/demo/api/v1/cows/model/enums/Color.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.example.demo.api.v1.cows.model.enums; - -public enum Color { - RED, BLACK, BROWN, WHITE -} diff --git a/src/main/java/com/example/demo/api/v1/cows/model/enums/CowStatus.java b/src/main/java/com/example/demo/api/v1/cows/model/enums/CowStatus.java deleted file mode 100644 index e6ec4e8..0000000 --- a/src/main/java/com/example/demo/api/v1/cows/model/enums/CowStatus.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.example.demo.api.v1.cows.model.enums; - -public enum CowStatus { - OK("Здоровая, доится"), - REST("В запуске"), - TREATMENT("На лечении"), - DEAD("Умерла"), - SOLD("Продана"); - - CowStatus(String description) { - } -} diff --git a/src/main/java/com/example/demo/api/v1/cows/model/request/AddCowRequest.java b/src/main/java/com/example/demo/api/v1/cows/model/request/AddCowRequest.java deleted file mode 100644 index 5ca6868..0000000 --- a/src/main/java/com/example/demo/api/v1/cows/model/request/AddCowRequest.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.example.demo.api.v1.cows.model.request; - -import com.example.demo.api.v1.cows.model.entity.CowEntity; -import com.example.demo.api.v1.cows.model.enums.Color; -import com.example.demo.api.v1.cows.model.enums.CowStatus; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import jakarta.validation.constraints.Min; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@JsonIgnoreProperties(ignoreUnknown = true) -@AllArgsConstructor -@NoArgsConstructor -public class AddCowRequest { - - @NotNull(message = "Не может быть null") - @Min(value = 1L, message = "Не может быть меньше 1") - private Long farmerId; - - @NotBlank(message = "Не может быть null или состоять из пробельных символов") - private String name; - - @NotNull(message = "Не может быть null") - private Color color; - - @Min(value = 0, message = "Не может быть меньше 0") - private int liters; - - @NotNull(message = "Не может быть null") - private CowStatus status; - - public CowEntity toEntity() { - return new CowEntity( - null, - farmerId, - name, - color, - liters, - status - ); - } -} diff --git a/src/main/java/com/example/demo/api/v1/cows/model/request/UpdateCowDetailsRequest.java b/src/main/java/com/example/demo/api/v1/cows/model/request/UpdateCowDetailsRequest.java deleted file mode 100644 index 0973591..0000000 --- a/src/main/java/com/example/demo/api/v1/cows/model/request/UpdateCowDetailsRequest.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.example.demo.api.v1.cows.model.request; - -import com.example.demo.api.v1.cows.model.enums.Color; -import com.example.demo.api.v1.cows.model.enums.CowStatus; -import com.example.demo.validation.annotation.NullableNotBlank; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import jakarta.validation.constraints.Min; -import jakarta.validation.constraints.NotNull; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@AllArgsConstructor -@NoArgsConstructor -@JsonIgnoreProperties(ignoreUnknown = true) -public class UpdateCowDetailsRequest { - - @NotNull(message = "Не может быть null") - @Min(value = 1L, message = "Не может быть меньше 1") - private Long id; - - @NullableNotBlank - private String name; - - private Color color; - - @Min(value = 0, message = "Не может быть меньше 0") - private Integer liters; - - private CowStatus status; -} diff --git a/src/main/java/com/example/demo/api/v1/cows/model/response/FullCowResponse.java b/src/main/java/com/example/demo/api/v1/cows/model/response/FullCowResponse.java deleted file mode 100644 index 0be5030..0000000 --- a/src/main/java/com/example/demo/api/v1/cows/model/response/FullCowResponse.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.example.demo.api.v1.cows.model.response; - -import com.example.demo.api.v1.cows.model.enums.Color; -import com.example.demo.api.v1.cows.model.enums.CowStatus; - -public record FullCowResponse( - Long id, - Long farmerId, - String name, - Color color, - int liters, - CowStatus status -) { -} diff --git a/src/main/java/com/example/demo/api/v1/cows/model/response/ShortCowResponse.java b/src/main/java/com/example/demo/api/v1/cows/model/response/ShortCowResponse.java deleted file mode 100644 index 84cb9f7..0000000 --- a/src/main/java/com/example/demo/api/v1/cows/model/response/ShortCowResponse.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.example.demo.api.v1.cows.model.response; - -import com.example.demo.api.v1.cows.model.enums.CowStatus; - -public record ShortCowResponse( - Long id, - String name, - CowStatus status) { -} diff --git a/src/main/java/com/example/demo/api/v1/cows/repository/CowRepository.java b/src/main/java/com/example/demo/api/v1/cows/repository/CowRepository.java deleted file mode 100644 index bc73f07..0000000 --- a/src/main/java/com/example/demo/api/v1/cows/repository/CowRepository.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.example.demo.api.v1.cows.repository; - -import com.example.demo.api.v1.cows.model.entity.CowEntity; -import jakarta.transaction.Transactional; -import java.util.List; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Modifying; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import org.springframework.stereotype.Repository; - -@Repository -public interface CowRepository extends JpaRepository { - - List findAllByFarmerId(long farmerId); - - @Modifying - @Transactional - @Query(nativeQuery = true, value = "delete from farmer_cow c where c.id = :id") - int deleteCowById(@Param("id") long id); -} \ No newline at end of file diff --git a/src/main/java/com/example/demo/api/v1/cows/service/AddCowToFarmer.java b/src/main/java/com/example/demo/api/v1/cows/service/AddCowToFarmer.java deleted file mode 100644 index 9ffb017..0000000 --- a/src/main/java/com/example/demo/api/v1/cows/service/AddCowToFarmer.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.example.demo.api.v1.cows.service; - -import com.example.demo.api.v1.cows.model.request.AddCowRequest; -import com.example.demo.api.v1.cows.repository.CowRepository; -import com.example.demo.validation.service.ValidateRequest; -import jakarta.transaction.Transactional; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -@Service -@Slf4j -@Transactional -@RequiredArgsConstructor -public class AddCowToFarmer { - - private final CowRepository cowRepository; - private final ValidateRequest validate; - - public void execute(AddCowRequest request) { - log.info("Обработка запроса 'добавить корову фермеру': {}", request); - validate.single(request); - cowRepository.save(request.toEntity()); - } -} diff --git a/src/main/java/com/example/demo/api/v1/cows/service/DeleteCowById.java b/src/main/java/com/example/demo/api/v1/cows/service/DeleteCowById.java deleted file mode 100644 index 4c9ef4c..0000000 --- a/src/main/java/com/example/demo/api/v1/cows/service/DeleteCowById.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.example.demo.api.v1.cows.service; - -import com.example.demo.api.v1.cows.repository.CowRepository; -import com.example.demo.common.exceptions.BadRequestException; -import com.example.demo.common.exceptions.NotFoundException; -import jakarta.transaction.Transactional; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -@Service -@Slf4j -@RequiredArgsConstructor -public class DeleteCowById { - - private final CowRepository cowRepository; - - @Transactional - public void execute(long id) { - log.info("Обработка запроса 'удалить корову по ее ID': {}", id); - if (id < 1) - throw new BadRequestException("ID коровы не может быть меньше 1"); - var resultDeleted = cowRepository.deleteCowById(id); - if (resultDeleted == 0) - throw new NotFoundException("Корова с ID = " + id + " не найдена"); - } -} diff --git a/src/main/java/com/example/demo/api/v1/cows/service/GetAllCows.java b/src/main/java/com/example/demo/api/v1/cows/service/GetAllCows.java deleted file mode 100644 index edce82f..0000000 --- a/src/main/java/com/example/demo/api/v1/cows/service/GetAllCows.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.example.demo.api.v1.cows.service; - -import com.example.demo.api.v1.cows.model.entity.CowEntity; -import com.example.demo.api.v1.cows.repository.CowRepository; -import jakarta.transaction.Transactional; -import java.util.List; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -@Service -@Slf4j -@Transactional -@RequiredArgsConstructor -public class GetAllCows { - - private final CowRepository cowRepository; - - public List execute() { - log.info("Обработка запроса 'вернуть всех коров'"); - return cowRepository.findAll(); - } -} diff --git a/src/main/java/com/example/demo/api/v1/cows/service/GetAllCowsFarmerByFarmerId.java b/src/main/java/com/example/demo/api/v1/cows/service/GetAllCowsFarmerByFarmerId.java deleted file mode 100644 index 8cfeb5c..0000000 --- a/src/main/java/com/example/demo/api/v1/cows/service/GetAllCowsFarmerByFarmerId.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.example.demo.api.v1.cows.service; - -import com.example.demo.api.v1.cows.model.entity.CowEntity; -import com.example.demo.api.v1.cows.repository.CowRepository; -import com.example.demo.common.exceptions.BadRequestException; -import com.example.demo.validation.service.ValidateRequest; -import jakarta.transaction.Transactional; -import java.util.List; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -@Service -@Slf4j -@Transactional -@RequiredArgsConstructor -public class GetAllCowsFarmerByFarmerId { - - private final CowRepository cowRepository; - private final ValidateRequest validate; - - public List execute(long farmerId) { - log.info("Обработка запроса 'вернуть всех коров конкретного фермера': {}", farmerId); - if (farmerId < 1) - throw new BadRequestException("ID фермера не может быть меньше 1"); - return cowRepository.findAllByFarmerId(farmerId); - } -} diff --git a/src/main/java/com/example/demo/api/v1/cows/service/GetCowById.java b/src/main/java/com/example/demo/api/v1/cows/service/GetCowById.java deleted file mode 100644 index 8b2f920..0000000 --- a/src/main/java/com/example/demo/api/v1/cows/service/GetCowById.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.example.demo.api.v1.cows.service; - -import com.example.demo.api.v1.cows.model.entity.CowEntity; -import com.example.demo.api.v1.cows.repository.CowRepository; -import com.example.demo.common.exceptions.BadRequestException; -import com.example.demo.common.exceptions.NotFoundException; -import com.example.demo.validation.service.ValidateRequest; -import jakarta.transaction.Transactional; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -@Service -@Slf4j -@Transactional -@RequiredArgsConstructor -public class GetCowById { - - private final CowRepository cowRepository; - private final ValidateRequest validate; - - public CowEntity execute(long id) { - log.info("Обработка запроса 'найти корову по ее ID': {}", id); - if (id < 1) - throw new BadRequestException("ID коровы не может быть меньше 1"); - return cowRepository.findById(id) - .orElseThrow(() -> new NotFoundException("Корова с ID = " + id + " не найдена")); - } -} diff --git a/src/main/java/com/example/demo/api/v1/cows/service/UpdateCow.java b/src/main/java/com/example/demo/api/v1/cows/service/UpdateCow.java deleted file mode 100644 index aa69adf..0000000 --- a/src/main/java/com/example/demo/api/v1/cows/service/UpdateCow.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.example.demo.api.v1.cows.service; - - -import com.example.demo.api.v1.cows.model.request.UpdateCowDetailsRequest; -import com.example.demo.api.v1.cows.repository.CowRepository; -import com.example.demo.common.exceptions.NotFoundException; -import com.example.demo.validation.service.ValidateRequest; -import jakarta.transaction.Transactional; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -@Service -@Slf4j -@Transactional -@RequiredArgsConstructor -public class UpdateCow { - - private final CowRepository cowRepository; - private final ValidateRequest validate; - - public void execute(UpdateCowDetailsRequest request) { - log.info("Обработка запроса 'обновить данные коровы': {}", request); - validate.single(request); - var existentCow = cowRepository.findById(request.getId()) - .orElseThrow(() -> new NotFoundException("Корова с ID = " + request.getId() + " не найдена")); - existentCow.update(request); - cowRepository.save(existentCow); - } -} diff --git a/src/main/java/com/example/demo/api/v1/farmes/controller/FarmersApi.java b/src/main/java/com/example/demo/api/v1/farmes/controller/FarmersApi.java deleted file mode 100644 index b15120b..0000000 --- a/src/main/java/com/example/demo/api/v1/farmes/controller/FarmersApi.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.example.demo.api.v1.farmes.controller; - -import com.example.demo.api.v1.cows.model.request.UpdateCowDetailsRequest; -import com.example.demo.api.v1.cows.model.response.FullCowResponse; -import com.example.demo.api.v1.cows.model.response.ShortCowResponse; -import com.example.demo.api.v1.farmes.model.request.AddFarmerRequest; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import java.util.List; - -@Tag(name = "Farmers", description = "API для работы с фермерами") -public interface FarmersApi { - - @Operation(summary = "Запросить всех фермеров") - List getAllFarmers(); - - @Operation(summary = "Запросить фермера по его ID") - FullCowResponse farmer(long id); - - @Operation(summary = "Добавить фермера") - void addFarmer(AddFarmerRequest request); - - @Operation(summary = "Обновить описание фермера") - void updateFarmerDetails(UpdateCowDetailsRequest request); - - @Operation(summary = "Удалить фермера") - void deleteFarmer(long id); -} diff --git a/src/main/java/com/example/demo/api/v1/farmes/model/entity/FarmerEntity.java b/src/main/java/com/example/demo/api/v1/farmes/model/entity/FarmerEntity.java deleted file mode 100644 index 58ec705..0000000 --- a/src/main/java/com/example/demo/api/v1/farmes/model/entity/FarmerEntity.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.example.demo.api.v1.farmes.model.entity; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Entity -@Table(name = "farmer") -@AllArgsConstructor -@NoArgsConstructor -public class FarmerEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "id") - private Long id; - - @Column(name = "first_name") - private String firstName; - - @Column(name = "middle_name") - private String middleName; - - @Column(name = "last_name") - private String lastName; -} diff --git a/src/main/java/com/example/demo/api/v1/farmes/model/request/AddFarmerRequest.java b/src/main/java/com/example/demo/api/v1/farmes/model/request/AddFarmerRequest.java deleted file mode 100644 index c32f318..0000000 --- a/src/main/java/com/example/demo/api/v1/farmes/model/request/AddFarmerRequest.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.example.demo.api.v1.farmes.model.request; - -public class AddFarmerRequest { -} diff --git a/src/main/java/com/example/demo/api/v1/farmes/repository/FarmerRepository.java b/src/main/java/com/example/demo/api/v1/farmes/repository/FarmerRepository.java deleted file mode 100644 index 880e03c..0000000 --- a/src/main/java/com/example/demo/api/v1/farmes/repository/FarmerRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.example.demo.api.v1.farmes.repository; - -import com.example.demo.api.v1.farmes.model.entity.FarmerEntity; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface FarmerRepository extends JpaRepository { -} diff --git a/src/main/java/com/example/demo/common/errorhandler/ErrorHandlerController.java b/src/main/java/com/example/demo/common/errorhandler/ErrorHandlerController.java deleted file mode 100644 index 5fe59ba..0000000 --- a/src/main/java/com/example/demo/common/errorhandler/ErrorHandlerController.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.example.demo.common.errorhandler; - -import static java.util.Collections.singletonList; - -import com.example.demo.common.exceptions.BadRequestException; -import com.example.demo.common.exceptions.NotFoundException; -import com.example.demo.validation.model.ErrorResponse; -import com.example.demo.validation.model.Violation; -import jakarta.validation.ConstraintViolationException; -import java.util.List; -import java.util.stream.Collectors; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.bind.annotation.RestControllerAdvice; - -@Slf4j -@RestControllerAdvice -public class ErrorHandlerController { - - @ResponseStatus(HttpStatus.BAD_REQUEST) - @ExceptionHandler(ConstraintViolationException.class) - public ErrorResponse handleValidationErrors(ConstraintViolationException ex) { - var errors = ex.getConstraintViolations() - .stream() - .map(it -> new Violation(it.getPropertyPath().toString(), it.getMessage())) - .collect(Collectors.toList()); - - return new ErrorResponse(errors); - } - - @ResponseStatus(HttpStatus.BAD_REQUEST) - @ExceptionHandler(BadRequestException.class) - public ErrorResponse handleJpaObjectRetrievalFailure(BadRequestException ex) { - return new ErrorResponse(violation((ex))); - } - - @ResponseStatus(HttpStatus.NOT_FOUND) - @ExceptionHandler(NotFoundException.class) - public ErrorResponse handleNotFoundEntityException(NotFoundException ex) { - return new ErrorResponse(violation(ex)); - } - - @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) - @ExceptionHandler(Exception.class) - public ErrorResponse handleGenericErrors(Exception ex) { - log.error("Ошибка", ex); - return new ErrorResponse(violation(ex)); - } - - private List violation(Exception ex) { - return singletonList(new Violation(ex.getClass().getSimpleName(), ex.getMessage())); - } -} diff --git a/src/main/java/com/example/demo/common/exceptions/BadRequestException.java b/src/main/java/com/example/demo/common/exceptions/BadRequestException.java deleted file mode 100644 index 5fd1cc5..0000000 --- a/src/main/java/com/example/demo/common/exceptions/BadRequestException.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.example.demo.common.exceptions; - -public class BadRequestException extends LightWeightExceptions { - - public BadRequestException(String message) { - super(message); - } -} diff --git a/src/main/java/com/example/demo/common/exceptions/LightWeightExceptions.java b/src/main/java/com/example/demo/common/exceptions/LightWeightExceptions.java deleted file mode 100644 index e4bd4a1..0000000 --- a/src/main/java/com/example/demo/common/exceptions/LightWeightExceptions.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.example.demo.common.exceptions; - -public class LightWeightExceptions extends RuntimeException { - - public LightWeightExceptions(String message) { - super(message, null, false, false); - } -} diff --git a/src/main/java/com/example/demo/common/exceptions/NotFoundException.java b/src/main/java/com/example/demo/common/exceptions/NotFoundException.java deleted file mode 100644 index edb40db..0000000 --- a/src/main/java/com/example/demo/common/exceptions/NotFoundException.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.example.demo.common.exceptions; - -public class NotFoundException extends LightWeightExceptions { - - public NotFoundException(String message) { - super(message); - } -} diff --git a/src/main/java/com/example/demo/config/SpringdocConfig.java b/src/main/java/com/example/demo/config/SpringdocConfig.java deleted file mode 100644 index 8d56387..0000000 --- a/src/main/java/com/example/demo/config/SpringdocConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.example.demo.config; - -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.info.Info; -import io.swagger.v3.oas.models.info.License; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class SpringdocConfig { - - @Bean - public OpenAPI openAPI() { - return new OpenAPI() - .info(new Info().title("Farm API") - .license(new License().name("Apache 2.0").url("http://springdoc.org"))); - } -} diff --git a/src/main/java/com/example/demo/validation/annotation/NullableNotBlank.java b/src/main/java/com/example/demo/validation/annotation/NullableNotBlank.java deleted file mode 100644 index e96e2a1..0000000 --- a/src/main/java/com/example/demo/validation/annotation/NullableNotBlank.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.example.demo.validation.annotation; - -import com.example.demo.validation.service.NullableNotBlankValidator; -import jakarta.validation.Constraint; -import jakarta.validation.Payload; -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Documented -@Constraint(validatedBy = NullableNotBlankValidator.class) -@Target({ElementType.FIELD}) -@Retention(RetentionPolicy.RUNTIME) -public @interface NullableNotBlank { - - String message() default "Не может быть пустым или состоять из пробельных символов"; - - Class[] groups() default {}; - - Class[] payload() default {}; -} diff --git a/src/main/java/com/example/demo/validation/model/ErrorResponse.java b/src/main/java/com/example/demo/validation/model/ErrorResponse.java deleted file mode 100644 index 1e735c0..0000000 --- a/src/main/java/com/example/demo/validation/model/ErrorResponse.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.example.demo.validation.model; - -import java.util.List; - -public record ErrorResponse( - List errors -) { -} diff --git a/src/main/java/com/example/demo/validation/model/Violation.java b/src/main/java/com/example/demo/validation/model/Violation.java deleted file mode 100644 index 05f3d9b..0000000 --- a/src/main/java/com/example/demo/validation/model/Violation.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.example.demo.validation.model; - -public record Violation( - String key, - String error -) { -} diff --git a/src/main/java/com/example/demo/validation/service/NullableNotBlankValidator.java b/src/main/java/com/example/demo/validation/service/NullableNotBlankValidator.java deleted file mode 100644 index bf0861b..0000000 --- a/src/main/java/com/example/demo/validation/service/NullableNotBlankValidator.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.example.demo.validation.service; - -import com.example.demo.validation.annotation.NullableNotBlank; -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; - -public class NullableNotBlankValidator implements ConstraintValidator { - - public boolean isValid(String value, ConstraintValidatorContext context) { - return value == null || !value.isBlank(); - } -} diff --git a/src/main/java/com/example/demo/validation/service/ValidateRequest.java b/src/main/java/com/example/demo/validation/service/ValidateRequest.java deleted file mode 100644 index cfba622..0000000 --- a/src/main/java/com/example/demo/validation/service/ValidateRequest.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.example.demo.validation.service; - -import jakarta.validation.ConstraintViolationException; -import jakarta.validation.Validator; -import java.util.Collection; -import java.util.stream.Collectors; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class ValidateRequest { - - private final Validator validator; - - public void single(T request) { - var violations = validator.validate(request); - if (!violations.isEmpty()) - throw new ConstraintViolationException(violations); - } - - public void collection(Collection request) { - var violations = request.stream() - .flatMap(it -> validator.validate(it).stream()) - .collect(Collectors.toSet()); - if (!violations.isEmpty()) - throw new ConstraintViolationException(violations); - } -} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml deleted file mode 100644 index 007b6f8..0000000 --- a/src/main/resources/application.yml +++ /dev/null @@ -1,45 +0,0 @@ -server: - port: 8008 -# servlet: -# context-path: /api - -management: - endpoint: - metrics.enabled: true - endpoints: - web: - exposure: - include: '*' - -spring: - main: - allow-bean-definition-overriding: true - jackson: - deserialization: - read-date-timestamps-as-nanoseconds: false - datasource: - url: ${DATABASE_URL:jdbc:postgresql://localhost:5432/farm_db} - username: ${DATABASE_USER:kate} - password: ${DATABASE_PASSWORD:password} - driver-class-name: org.postgresql.Driver - liquibase: - enabled: true - liquibaseSchema: public - change-log: classpath:db/changelog/db.changelog-master.yml - jpa: - show-sql: true - open-in-view: false - generate-ddl: false - hibernate: - ddl-auto: none - naming: - physical-strategy: org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy - implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy - -springdoc: - packagesToScan: - - com.example.demo.api - api-docs.path: /api-docs - - - diff --git a/src/main/resources/db/changelog/db.changelog-master.yml b/src/main/resources/db/changelog/db.changelog-master.yml deleted file mode 100644 index 3af9ecc..0000000 --- a/src/main/resources/db/changelog/db.changelog-master.yml +++ /dev/null @@ -1,3 +0,0 @@ -databaseChangeLog: - - include: - file: db/changelog/v1/master.yml diff --git a/src/main/resources/db/changelog/v1/init.sql b/src/main/resources/db/changelog/v1/init.sql deleted file mode 100644 index 7b91ade..0000000 --- a/src/main/resources/db/changelog/v1/init.sql +++ /dev/null @@ -1,20 +0,0 @@ -create table if not exists farmer -( - id bigserial primary key, - first_name text, - middle_name text, - last_name text -); - -create table if not exists farmer_cow -( - id bigserial primary key, - farmer_id bigint not null - constraint fk_cow_to_farmer - references farmer - on delete cascade, - name varchar(50), - color varchar(10), - liters int2, - status varchar(10) -); diff --git a/src/main/resources/db/changelog/v1/master.yml b/src/main/resources/db/changelog/v1/master.yml deleted file mode 100644 index ac4fb89..0000000 --- a/src/main/resources/db/changelog/v1/master.yml +++ /dev/null @@ -1,3 +0,0 @@ -databaseChangeLog: - - include: - file: db/changelog/v1/init.sql diff --git a/src/test/java/com/example/demo/api/v1/cows/model/request/AddCowRequestTest.java b/src/test/java/com/example/demo/api/v1/cows/model/request/AddCowRequestTest.java deleted file mode 100644 index daa905e..0000000 --- a/src/test/java/com/example/demo/api/v1/cows/model/request/AddCowRequestTest.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.example.demo.api.v1.cows.model.request; - -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; - -import com.example.demo.api.v1.cows.model.enums.Color; -import com.example.demo.api.v1.cows.model.enums.CowStatus; -import com.example.demo.validation.service.ValidateRequest; -import jakarta.validation.ConstraintViolationException; -import jakarta.validation.Validation; -import jakarta.validation.Validator; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -class AddCowRequestTest { - - private final Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); - private final ValidateRequest validate = new ValidateRequest(validator); - - @Test - @DisplayName("При проверке валидного запроса не будет выброшено исключение") - void validateRequest1() { - var request = new AddCowRequest(1L, "name", Color.RED, 1, CowStatus.OK); - - assertDoesNotThrow(() -> validate.single(request)); - } - - @Test - @DisplayName("Если id фермера меньше 1, то должно быть выброшено исключение") - void validateRequest2() { - var request = new AddCowRequest(0L, "name", Color.RED, 1, CowStatus.OK); - var expectedError = "farmerId: Не может быть меньше 1"; - - var ex = assertThrows( - ConstraintViolationException.class, - () -> validate.single(request) - ); - - assertNotNull(ex); - assertEquals(expectedError, ex.getMessage()); - } - - @Test - @DisplayName("Если id фермера null, то должно быть выброшено исключение") - void validateRequest3() { - var request = new AddCowRequest(null, "name", Color.RED, 1, CowStatus.OK); - var expectedError = "farmerId: Не может быть null"; - - var ex = assertThrows( - ConstraintViolationException.class, - () -> validate.single(request) - ); - - assertNotNull(ex); - assertEquals(expectedError, ex.getMessage()); - } -} \ No newline at end of file diff --git a/src/test/java/com/example/demo/api/v1/cows/model/request/UpdateCowDetailsRequestTest.java b/src/test/java/com/example/demo/api/v1/cows/model/request/UpdateCowDetailsRequestTest.java deleted file mode 100644 index 6bcc7bc..0000000 --- a/src/test/java/com/example/demo/api/v1/cows/model/request/UpdateCowDetailsRequestTest.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.example.demo.api.v1.cows.model.request; - -import static com.example.demo.api.v1.cows.model.enums.Color.RED; -import static com.example.demo.api.v1.cows.model.enums.CowStatus.OK; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertThrows; - -import com.example.demo.validation.service.ValidateRequest; -import jakarta.validation.ConstraintViolationException; -import jakarta.validation.Validation; -import jakarta.validation.Validator; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; - -class UpdateCowDetailsRequestTest { - - private final Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); - private final ValidateRequest validate = new ValidateRequest(validator); - - @Test - @DisplayName("При проверке валидного запроса не будет выброшено исключение") - void validateUpdateRequest1() { - var request = new UpdateCowDetailsRequest(1L, "name", RED, 1, OK); - - assertDoesNotThrow(() -> validate.single(request)); - } - - @Test - @DisplayName("Если id коровы null должно быть выброшено исключение") - void validateUpdateRequest2() { - var request = new UpdateCowDetailsRequest(null, "name", RED, 1, OK); - var expectedError = "id: Не может быть null"; - - var exception = assertThrows(ConstraintViolationException.class, - () -> validate.single(request) - ); - assertNotNull(exception); - assertEquals(expectedError, exception.getMessage()); - } - - @Test - @DisplayName("Если id коровы меньше 1, должно быть выброшено исключение") - void validateUpdateRequest3() { - var request = new UpdateCowDetailsRequest(0L, "name", RED, 1, OK); - var expectedError = "id: Не может быть меньше 1"; - - var exception = assertThrows(ConstraintViolationException.class, - () -> validate.single(request) - ); - assertNotNull(exception); - assertEquals(expectedError, exception.getMessage()); - } - - @ParameterizedTest - @ValueSource(strings = {"", " ", " ", " ", "\n", "\t"}) - @DisplayName("Если имя коровы пустое или состоит из пробельных символов, должно быть выброшено исключение") - void validateUpdateRequest5(String name) { - var request = new UpdateCowDetailsRequest(1L, name, RED, 1, OK); - var expectedError = "name: Не может быть пустым или состоять из пробельных символов"; - - var exception = assertThrows(ConstraintViolationException.class, - () -> validate.single(request) - ); - - assertNotNull(exception); - assertEquals(expectedError, exception.getMessage()); - } - - @Test - @DisplayName("Если удой коровы меньше 0л, должно быть выброшено исключение") - void validateUpdateRequest6() { - var request = new UpdateCowDetailsRequest(1L, "name", RED, -1, OK); - var expectedError = "liters: Не может быть меньше 0"; - - var exception = assertThrows(ConstraintViolationException.class, - () -> validate.single(request) - ); - assertNotNull(exception); - assertEquals(expectedError, exception.getMessage()); - } -} \ No newline at end of file diff --git a/src/test/java/com/example/demo/api/v1/cows/repository/BasicIT.java b/src/test/java/com/example/demo/api/v1/cows/repository/BasicIT.java deleted file mode 100644 index e18566f..0000000 --- a/src/test/java/com/example/demo/api/v1/cows/repository/BasicIT.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.example.demo.api.v1.cows.repository; - -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.DynamicPropertyRegistry; -import org.springframework.test.context.DynamicPropertySource; -import org.testcontainers.containers.PostgreSQLContainer; -import org.testcontainers.junit.jupiter.Container; -import org.testcontainers.junit.jupiter.Testcontainers; - -@Testcontainers -@SpringBootTest( - webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -public interface BasicIT { - - @BeforeAll - static void beforeAll() { - postgres.start(); - } - - @AfterAll - static void afterAll() { - postgres.stop(); - } - - @Container - PostgreSQLContainer postgres = - new PostgreSQLContainer<>("postgres:15-alpine"); - - @DynamicPropertySource - static void setPostgreSQLProperties(DynamicPropertyRegistry registry) { - registry.add("spring.datasource.url", postgres::getJdbcUrl); - registry.add("spring.datasource.username", postgres::getUsername); - registry.add("spring.datasource.password", postgres::getPassword); - } -} diff --git a/src/test/java/com/example/demo/api/v1/cows/repository/CowRepositoryTest.java b/src/test/java/com/example/demo/api/v1/cows/repository/CowRepositoryTest.java deleted file mode 100644 index 886c133..0000000 --- a/src/test/java/com/example/demo/api/v1/cows/repository/CowRepositoryTest.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.example.demo.api.v1.cows.repository; - -import static com.example.demo.api.v1.cows.model.enums.Color.RED; -import static com.example.demo.api.v1.cows.model.enums.CowStatus.OK; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import com.example.demo.api.v1.cows.model.entity.CowEntity; -import com.example.demo.api.v1.farmes.model.entity.FarmerEntity; -import com.example.demo.api.v1.farmes.repository.FarmerRepository; -import java.util.List; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - - -class CowRepositoryTest implements BasicIT { - - @Autowired - private CowRepository cows; - - @Autowired - private FarmerRepository farmers; - - @AfterEach - void tearDown() { - farmers.deleteAll(); - } - - @Test - @DisplayName("По id фермера должны найти всех его коров") - void findAllByFarmerId1() { - var farmer1 = farmers.save( - new FarmerEntity(null, "Mikl", "Ivanovich", "Duglas") - ); - var cow11 = cows.save( - new CowEntity(null, farmer1.getId(), "Elka", RED, 15, OK) - ); - var cow12 = cows.save( - new CowEntity(null, farmer1.getId(), "Elka", RED, 15, OK) - ); - - var farmer2 = farmers.save( - new FarmerEntity(null, "Jon", "Anatolyevich", "Bjovi") - ); - var cow21 = cows.save( - new CowEntity(null, farmer2.getId(), "Elka", RED, 15, OK) - ); - var expected = List.of(cow11, cow12); - - var result = cows.findAllByFarmerId(farmer1.getId()); - - assertEquals(expected, result); - } - - @Test - @DisplayName("Если у фермера нет коров, должен вернуться пустой список") - void findAllByFarmerId2() { - var farmer1 = farmers.save( - new FarmerEntity(null, "Mikl", "Ivanovich", "Duglas") - ); - var farmer2 = farmers.save( - new FarmerEntity(null, "Jon", "Anatolyevich", "Bjovi") - ); - var cow21 = cows.save( - new CowEntity(null, farmer2.getId(), "Elka", RED, 15, OK) - ); - - var result = cows.findAllByFarmerId(farmer1.getId()); - - assertTrue(result.isEmpty()); - } - - @Test - @DisplayName("Если фермера c таким id нет, должен вернуться пустой список") - void findAllByFarmerId3() { - var farmer2 = farmers.save( - new FarmerEntity(null, "Jon", "Anatolyevich", "Bjovi") - ); - var cow21 = cows.save( - new CowEntity(null, farmer2.getId(), "Elka", RED, 15, OK) - ); - - var result = cows.findAllByFarmerId(0); - - assertTrue(result.isEmpty()); - } - - @Test - @DisplayName("Если корова с таким id есть, то она будет удалена и метод вернёт 1") - void deleteCowById1() { - var farmer1 = farmers.save( - new FarmerEntity(null, "Mikl", "Ivanovich", "Duglas") - ); - var cow11 = cows.save( - new CowEntity(null, farmer1.getId(), "Elka", RED, 15, OK) - ); - var cow12 = cows.save( - new CowEntity(null, farmer1.getId(), "Elka", RED, 15, OK) - ); - - var farmer2 = farmers.save( - new FarmerEntity(null, "Jon", "Anatolyevich", "Bjovi") - ); - var cow21 = cows.save( - new CowEntity(null, farmer2.getId(), "Elka", RED, 15, OK) - ); - var expected = 1; - - var result = cows.deleteCowById(cow11.getId()); - - assertEquals(expected, result); - assertTrue(cows.findById(cow11.getId()).isEmpty()); - } - - @Test - @DisplayName("Если коровы с таким id нет, то метод вернёт 0") - void deleteCowById2() { - var farmer1 = farmers.save( - new FarmerEntity(null, "Mikl", "Ivanovich", "Duglas") - ); - var cow11 = cows.save( - new CowEntity(null, farmer1.getId(), "Elka", RED, 15, OK) - ); - var cow12 = cows.save( - new CowEntity(null, farmer1.getId(), "Elka", RED, 15, OK) - ); - - var farmer2 = farmers.save( - new FarmerEntity(null, "Jon", "Anatolyevich", "Bjovi") - ); - var cow21 = cows.save( - new CowEntity(null, farmer2.getId(), "Elka", RED, 15, OK) - ); - var expected = 0; - - var result = cows.deleteCowById(0L); - - assertEquals(expected, result); - } -} \ No newline at end of file diff --git a/src/test/java/com/example/demo/api/v1/cows/service/AddCowToFarmerTest.java b/src/test/java/com/example/demo/api/v1/cows/service/AddCowToFarmerTest.java deleted file mode 100644 index eff1434..0000000 --- a/src/test/java/com/example/demo/api/v1/cows/service/AddCowToFarmerTest.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.example.demo.api.v1.cows.service; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import com.example.demo.api.v1.cows.model.entity.CowEntity; -import com.example.demo.api.v1.cows.model.request.AddCowRequest; -import com.example.demo.api.v1.cows.repository.CowRepository; -import com.example.demo.common.exceptions.LightWeightExceptions; -import com.example.demo.validation.service.ValidateRequest; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -class AddCowToFarmerTest { - - private final CowRepository cows = mock(CowRepository.class); - private final ValidateRequest validate = mock(ValidateRequest.class); - private final AddCowToFarmer service = new AddCowToFarmer(cows, validate); - - - @Test - @DisplayName("При получении валидного запроса корова добавится успешно") - void execute1() { - final var request = new AddCowRequest(); - final var expectedCow = request.toEntity(); - - doNothing().when(validate).single(any()); - when(cows.save(any())).thenReturn(new CowEntity()); - - service.execute(request); - - verify(validate, times(1)).single(request); - verify(cows, times(1)).save(expectedCow); - } - - @Test - @DisplayName("При получении невалидного запроса корова не будет добавлена") - void execute2() { - var request = new AddCowRequest(); - - doThrow(new LightWeightExceptions("123")).when(validate).single(any()); - - var ex = assertThrows( - LightWeightExceptions.class, - () -> service.execute(request) - ); - - assertEquals("123", ex.getMessage()); - verify(validate, times(1)).single(request); - verify(cows, times(0)).save(any()); - } -} \ No newline at end of file diff --git a/src/test/java/com/example/demo/api/v1/cows/service/DeleteCowByIdTest.java b/src/test/java/com/example/demo/api/v1/cows/service/DeleteCowByIdTest.java deleted file mode 100644 index 23c1601..0000000 --- a/src/test/java/com/example/demo/api/v1/cows/service/DeleteCowByIdTest.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.example.demo.api.v1.cows.service; - -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import com.example.demo.api.v1.cows.repository.CowRepository; -import com.example.demo.common.exceptions.BadRequestException; -import com.example.demo.common.exceptions.NotFoundException; -import com.example.demo.validation.service.ValidateRequest; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; - -class DeleteCowByIdTest { - - private final CowRepository cows = mock(CowRepository.class); - private final ValidateRequest valid = mock(ValidateRequest.class); - - private final DeleteCowById service = new DeleteCowById(cows); - - @ParameterizedTest - @ValueSource(longs = {1, 2, 3}) - @DisplayName("Когда передаём валидный id, корова будет удалена, метод возвращает 1") - void execude1(long id) { - var expected = 1; - - when(cows.deleteCowById(id)).thenReturn(expected); - - service.execute(id); - assertTrue(cows.findById(id).isEmpty()); - } - - @ParameterizedTest - @ValueSource(longs = {-1, -2, -3}) - @DisplayName("Если id коровы меньше 1 будет выброшено исключение") - void execute2(long id) { - - assertThrows(BadRequestException.class, () -> service.execute(id)); - } - - @Test - @DisplayName("Если id коровы не найдено в базе, будет выброшено исключение") - void execute3() { - assertThrows(NotFoundException.class, () -> service.execute(3L)); - } -} \ No newline at end of file diff --git a/src/test/java/com/example/demo/api/v1/cows/service/GetAllCowsFarmerByFarmerIdTest.java b/src/test/java/com/example/demo/api/v1/cows/service/GetAllCowsFarmerByFarmerIdTest.java deleted file mode 100644 index 8a3cd36..0000000 --- a/src/test/java/com/example/demo/api/v1/cows/service/GetAllCowsFarmerByFarmerIdTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.example.demo.api.v1.cows.service; - -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import com.example.demo.api.v1.cows.model.entity.CowEntity; -import com.example.demo.api.v1.cows.repository.CowRepository; -import com.example.demo.common.exceptions.BadRequestException; -import com.example.demo.validation.service.ValidateRequest; -import java.util.List; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - - -class GetAllCowsFarmerByFarmerIdTest { - - private final CowRepository cows = mock(CowRepository.class); - private final ValidateRequest valid = mock(ValidateRequest.class); - - private final GetAllCowsFarmerByFarmerId service = new GetAllCowsFarmerByFarmerId(cows, valid); - - @Test - @DisplayName("когда передаём правильный id, не должно быть выброшено исключение") - void execute1() { - var cow1 = new CowEntity(); - cow1.setFarmerId(1L); - - var cow2 = new CowEntity(); - var cow3 = new CowEntity(); - - cows.save(cow1); - cows.save(cow2); - cows.save(cow3); - - var resultList = List.of(cow1); - - when(cows.findAllByFarmerId(1L)).thenReturn(resultList); - assertDoesNotThrow(() -> service.execute(1)); - } - - @Test - @DisplayName("когда передаём не валидный id, будет выброшено исключение") - void execute() { - assertThrows(BadRequestException.class, () -> service.execute(0)); - } -} \ No newline at end of file diff --git a/src/test/java/com/example/demo/api/v1/cows/service/GetAllCowsTest.java b/src/test/java/com/example/demo/api/v1/cows/service/GetAllCowsTest.java deleted file mode 100644 index 50f9c4b..0000000 --- a/src/test/java/com/example/demo/api/v1/cows/service/GetAllCowsTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.example.demo.api.v1.cows.service; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import com.example.demo.api.v1.cows.model.entity.CowEntity; -import com.example.demo.api.v1.cows.repository.CowRepository; -import java.util.List; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -class GetAllCowsTest { - - private final CowRepository cows = mock(CowRepository.class); - - private final GetAllCows service = new GetAllCows(cows); - - @Test - @DisplayName("при запросе получаем список всех коров") - void execute() { - - var cow1 = new CowEntity(); - var cow2 = new CowEntity(); - var cow3 = new CowEntity(); - var expected = List.of(cow1, cow2, cow3); - when(cows.findAll()).thenReturn(expected); - - var result = service.execute(); - - assertEquals(result, expected); - } -} \ No newline at end of file diff --git a/src/test/java/com/example/demo/api/v1/cows/service/GetCowByIdTest.java b/src/test/java/com/example/demo/api/v1/cows/service/GetCowByIdTest.java deleted file mode 100644 index 7066906..0000000 --- a/src/test/java/com/example/demo/api/v1/cows/service/GetCowByIdTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.example.demo.api.v1.cows.service; - -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import com.example.demo.api.v1.cows.model.entity.CowEntity; -import com.example.demo.api.v1.cows.repository.CowRepository; -import com.example.demo.common.exceptions.BadRequestException; -import com.example.demo.common.exceptions.NotFoundException; -import com.example.demo.validation.service.ValidateRequest; -import java.util.Optional; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; - -class GetCowByIdTest { - - private final CowRepository cows = mock(CowRepository.class); - private final ValidateRequest valid = mock(ValidateRequest.class); - - private final GetCowById service = new GetCowById(cows, valid); - - @ParameterizedTest - @ValueSource(longs = {1, 2, 3}) - @DisplayName("когда передаём валидный id, не должно быть выброшено исключение") - void execute1(long id) { - - var expected = Optional.of(new CowEntity()); - when(cows.findById(id)).thenReturn(expected); - - var result = Optional.of(service.execute(id)); - - assertEquals(expected, result); - assertDoesNotThrow(() -> service.execute(id)); - } - - @ParameterizedTest - @ValueSource(longs = {0, -1}) - @DisplayName("Если id меньше 1, будет выброшено исключение") - void execute2(long id) { - - assertThrows(BadRequestException.class, () -> service.execute(id)); - } - - @Test - @DisplayName("когда передаём id которого нет в базе, должно быть выброшено исключение") - void execute3() { - assertThrows(NotFoundException.class, () -> service.execute(1L)); - } -} \ No newline at end of file diff --git a/src/test/java/com/example/demo/api/v1/cows/service/UpdateCowTest.java b/src/test/java/com/example/demo/api/v1/cows/service/UpdateCowTest.java deleted file mode 100644 index 44badf9..0000000 --- a/src/test/java/com/example/demo/api/v1/cows/service/UpdateCowTest.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.example.demo.api.v1.cows.service; - -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import com.example.demo.api.v1.cows.model.entity.CowEntity; -import com.example.demo.api.v1.cows.model.request.UpdateCowDetailsRequest; -import com.example.demo.api.v1.cows.repository.CowRepository; -import com.example.demo.common.exceptions.LightWeightExceptions; -import com.example.demo.common.exceptions.NotFoundException; -import com.example.demo.validation.service.ValidateRequest; -import java.util.Optional; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -class UpdateCowTest { - - private final CowRepository cows = mock(CowRepository.class); - private final ValidateRequest valid = mock(ValidateRequest.class); - - private final UpdateCow service = new UpdateCow(cows, valid); - - @Test - @DisplayName("При получении валидного запроса, обновление происходит успешно") - void execute1() { - - final var request = new UpdateCowDetailsRequest(); - - - doNothing().when(valid).single(any()); - - when(cows.findById(any())).thenReturn(Optional.of(new CowEntity())); - when(cows.save(any())).thenReturn(new CowEntity()); - - service.execute(request); - - verify(valid, times(1)).single(request); - verify(cows, times(1)).findById(request.getId()); - verify(cows, times(1)).save(any()); - } - - @Test - @DisplayName("При получении невалидного запроса, будет выброшено исключение") - void execute2() { - - var request = new UpdateCowDetailsRequest(); - - doThrow(new LightWeightExceptions("")).when(valid).single(any()); - - assertThrows(LightWeightExceptions.class, - () -> service.execute(request) - ); - - verify(valid, times(1)).single(request); - verify(cows, times(0)).findById(request.getId()); - verify(cows, times(0)).save(any()); - } - - @Test - @DisplayName("При попытке обновить данные коровы, id которой нет в базе, будет выброшено исключение") - void execute3() { - - var request = new UpdateCowDetailsRequest(); - - when(cows.findById(request.getId())).thenThrow(NotFoundException.class); - - assertThrows(NotFoundException.class, - () -> service.execute(request) - ); - - verify(valid, times(1)).single(request); - verify(cows, times(1)).findById(request.getId()); - verify(cows, times(0)).save(any()); - } -} \ No newline at end of file