From 873dd23ed70394aff38eeb026f1bf1430883b935 Mon Sep 17 00:00:00 2001 From: Isbel Ochoa Date: Sat, 26 Oct 2024 13:15:39 +0300 Subject: [PATCH] [#12] Create required DTOs for controllers --- .../com/i8ai/training/store/model/Lot.java | 8 +- .../com/i8ai/training/store/model/Pack.java | 6 +- .../i8ai/training/store/model/Product.java | 2 +- .../store/repository/LotRepository.java | 5 +- .../store/repository/OfferRepository.java | 8 +- .../store/repository/PackRepository.java | 11 ++- .../store/repository/SaleRepository.java | 8 +- .../training/store/rest/LotController.java | 16 ++-- .../training/store/rest/OfferController.java | 13 ++- .../training/store/rest/PackController.java | 16 ++-- .../store/rest/ProductController.java | 10 +- .../training/store/rest/SaleController.java | 14 ++- .../training/store/rest/ShopController.java | 14 +-- .../i8ai/training/store/rest/dto/LotDto.java | 25 +++++ .../training/store/rest/dto/OfferDto.java | 14 ++- .../i8ai/training/store/rest/dto/PackDto.java | 25 +++++ .../training/store/service/LotService.java | 3 +- .../training/store/service/PackService.java | 3 +- .../training/store/service/SaleService.java | 2 + .../store/service/impl/LotServiceImpl.java | 18 +++- .../store/service/impl/OfferServiceImpl.java | 2 +- .../store/service/impl/PackServiceImpl.java | 27 +++++- .../service/impl/ProductServiceImpl.java | 2 +- .../store/service/impl/SaleServiceImpl.java | 11 ++- src/main/resources/db/changelog-master.xml | 2 +- src/main/resources/db/init-changelog.xml | 34 +++---- .../store/repository/RepositoryTest.java | 94 ++++++++---------- .../store/rest/BalanceControllerTest.java | 2 +- .../store/rest/LotControllerTest.java | 67 +++++++------ .../store/rest/PackControllerTest.java | 80 ++++++++++------ .../store/rest/ProductControllerTest.java | 36 +++---- .../store/rest/SaleControllerTest.java | 91 ++++++++++++------ .../store/rest/ShopControllerTest.java | 65 +++++-------- .../service/impl/BalanceServiceImplTest.java | 2 +- .../impl/ExistenceServiceImplTest.java | 2 +- .../service/impl/LotServiceImplTest.java | 16 +++- .../service/impl/PackServiceImplTest.java | 29 ++++-- .../service/impl/ProductServiceImplTest.java | 2 +- .../service/impl/SaleServiceImplTest.java | 2 +- .../service/impl/ShopServiceImplTest.java | 2 +- .../{TestUtils.java => TestConstants.java} | 36 ++++--- .../i8ai/training/store/util/TestHelper.java | 95 ++++++++++++++++++- 42 files changed, 585 insertions(+), 335 deletions(-) create mode 100644 src/main/java/com/i8ai/training/store/rest/dto/LotDto.java create mode 100644 src/main/java/com/i8ai/training/store/rest/dto/PackDto.java rename src/test/java/com/i8ai/training/store/util/{TestUtils.java => TestConstants.java} (87%) diff --git a/src/main/java/com/i8ai/training/store/model/Lot.java b/src/main/java/com/i8ai/training/store/model/Lot.java index 0a9cc47..715b423 100644 --- a/src/main/java/com/i8ai/training/store/model/Lot.java +++ b/src/main/java/com/i8ai/training/store/model/Lot.java @@ -20,11 +20,11 @@ public class Lot { @NotNull @Column(nullable = false) - private Double amount; + private Double acquiredAmount; @NotNull @Column(nullable = false) - private Double cost; + private Double costPerUnit; @NotNull @Column(nullable = false) @@ -38,7 +38,7 @@ public class Lot { private Product product; public Double getCurrentAmount() { - if (deliveredAmount == null) return amount; - return amount - deliveredAmount; + if (deliveredAmount == null) return acquiredAmount; + return acquiredAmount - deliveredAmount; } } diff --git a/src/main/java/com/i8ai/training/store/model/Pack.java b/src/main/java/com/i8ai/training/store/model/Pack.java index c73bed5..8fd43a0 100644 --- a/src/main/java/com/i8ai/training/store/model/Pack.java +++ b/src/main/java/com/i8ai/training/store/model/Pack.java @@ -20,7 +20,7 @@ public class Pack { @NotNull @Column(nullable = false) - private Double amount; + private Double receivedAmount; @NotNull @Column(nullable = false) @@ -38,7 +38,7 @@ public class Pack { private Shop shop; public Double getCurrentAmount() { - if (soldAmount == null) return amount; - return amount - soldAmount; + if (soldAmount == null) return receivedAmount; + return receivedAmount - soldAmount; } } diff --git a/src/main/java/com/i8ai/training/store/model/Product.java b/src/main/java/com/i8ai/training/store/model/Product.java index f8225c3..9450c7c 100644 --- a/src/main/java/com/i8ai/training/store/model/Product.java +++ b/src/main/java/com/i8ai/training/store/model/Product.java @@ -26,7 +26,7 @@ public class Product { @NotBlank @Column(nullable = false) - private String measure; + private String measureUnit; @Column private String description; diff --git a/src/main/java/com/i8ai/training/store/repository/LotRepository.java b/src/main/java/com/i8ai/training/store/repository/LotRepository.java index 479e86f..811cef6 100644 --- a/src/main/java/com/i8ai/training/store/repository/LotRepository.java +++ b/src/main/java/com/i8ai/training/store/repository/LotRepository.java @@ -15,10 +15,11 @@ public interface LotRepository extends JpaRepository { List findAllByReceivedAtBetweenAndProductId(Date start, Date end, Long productId); - @Query("select sum(l.amount) from Lot l where l.product.id = :productId") + @Query("select sum(l.acquiredAmount) from Lot l where l.product.id = :productId") Double getAmountArrivedByProductId(Long productId); @Modifying - @Query("update Lot o set o.deliveredAmount = (select sum(p.amount) from Pack p where p.lot.id = :lotId)") + @Query("update Lot o set o.deliveredAmount = (select sum(p.receivedAmount) from Pack p where p.lot.id = :lotId) " + + "where o.id = :lotId") void updateDeliveredAmountById(Long lotId); } diff --git a/src/main/java/com/i8ai/training/store/repository/OfferRepository.java b/src/main/java/com/i8ai/training/store/repository/OfferRepository.java index 01e5006..bcae5b4 100644 --- a/src/main/java/com/i8ai/training/store/repository/OfferRepository.java +++ b/src/main/java/com/i8ai/training/store/repository/OfferRepository.java @@ -11,19 +11,19 @@ @Repository public interface OfferRepository extends JpaRepository { - @Query("select o from Offer o where o.pack.soldAmount = null or o.pack.amount - o.pack.soldAmount > 0 " + + @Query("select o from Offer o where (o.pack.soldAmount is null or o.pack.receivedAmount - o.pack.soldAmount > 0) " + "order by o.createdAt desc") List findAllAvailable(); - @Query("select o from Offer o where (o.pack.soldAmount = null or o.pack.amount - o.pack.soldAmount > 0) " + + @Query("select o from Offer o where (o.pack.soldAmount is null or o.pack.receivedAmount - o.pack.soldAmount > 0) " + "and o.pack.shop.id = :shopId order by o.createdAt desc") List findAllAvailableByShopId(Long shopId); - @Query("select o from Offer o where (o.pack.soldAmount = null or o.pack.amount - o.pack.soldAmount > 0) " + + @Query("select o from Offer o where (o.pack.soldAmount is null or o.pack.receivedAmount - o.pack.soldAmount > 0) " + "and o.pack.lot.product.id = :productId order by o.createdAt desc") List findAllAvailableByProductId(Long productId); - @Query("select o from Offer o where (o.pack.soldAmount = null or o.pack.amount - o.pack.soldAmount > 0) " + + @Query("select o from Offer o where (o.pack.soldAmount is null or o.pack.receivedAmount - o.pack.soldAmount > 0) " + "and o.pack.shop.id = :shopId and o.pack.lot.product.id = :productId order by o.createdAt desc") List findAllAvailableByShopIdAndProductId(Long shopId, Long productId); diff --git a/src/main/java/com/i8ai/training/store/repository/PackRepository.java b/src/main/java/com/i8ai/training/store/repository/PackRepository.java index 4e9da3c..4bd2906 100644 --- a/src/main/java/com/i8ai/training/store/repository/PackRepository.java +++ b/src/main/java/com/i8ai/training/store/repository/PackRepository.java @@ -21,20 +21,21 @@ public interface PackRepository extends JpaRepository { List findAllByDeliveredAtBetweenAndLotProductIdAndShopId(Date start, Date end, Long productId, Long shopId); - @Query("select p from Pack p where (p.soldAmount is null or p.amount - p.soldAmount > 0) " + + @Query("select p from Pack p where (p.soldAmount is null or p.receivedAmount - p.soldAmount > 0) " + "and p.shop.id = :shopId and p.lot.product.id = :productId order by p.deliveredAt limit 1") Optional findAvailableByShopIdAndProductId(Long shopId, Long productId); - @Query("select sum(d.amount) from Pack d where d.lot.id = ?1") + @Query("select sum(d.receivedAmount) from Pack d where d.lot.id = ?1") Double getDeliveredAmountByLotId(Long lotId); - @Query("select sum(d.amount) from Pack d where d.lot.product.id = ?1") + @Query("select sum(d.receivedAmount) from Pack d where d.lot.product.id = ?1") Double getDeliveredAmountByProductId(Long productId); - @Query("select sum(d.amount) from Pack d where d.lot.product.id = ?1 and d.shop.id = ?2") + @Query("select sum(d.receivedAmount) from Pack d where d.lot.product.id = ?1 and d.shop.id = ?2") Double getDeliveredAmountByProductIdAndShopId(Long productId, Long shopId); @Modifying - @Query("update Pack a set a.soldAmount = (select sum(s.amount) from Sale s where s.offer.pack.id = :packId)") + @Query("update Pack p set p.soldAmount = (select sum(s.amount) from Sale s where s.offer.pack.id = :packId) " + + "where p.id = :packId") void updateSoldAmountById(Long packId); } diff --git a/src/main/java/com/i8ai/training/store/repository/SaleRepository.java b/src/main/java/com/i8ai/training/store/repository/SaleRepository.java index 2eb04e7..e2e22af 100644 --- a/src/main/java/com/i8ai/training/store/repository/SaleRepository.java +++ b/src/main/java/com/i8ai/training/store/repository/SaleRepository.java @@ -41,18 +41,18 @@ List findAllByRegisteredAtBetweenAndOfferPackLotProductIdAndOfferPackShopI "and s.offer.pack.shop.id = :shopId and s.registeredAt between :start and :end") Double getIncomeByProductIdAndShopId(Date start, Date end, Long productId, Long shopId); - @Query("select sum(s.amount * s.offer.pack.lot.cost) from Sale s where s.registeredAt between :start and :end") + @Query("select sum(s.amount * s.offer.pack.lot.costPerUnit) from Sale s where s.registeredAt between :start and :end") Double getNetSalesExpenses(Date start, Date end); - @Query("select sum(s.amount * s.offer.pack.lot.cost) from Sale s where s.offer.pack.lot.product.id = :productId " + + @Query("select sum(s.amount * s.offer.pack.lot.costPerUnit) from Sale s where s.offer.pack.lot.product.id = :productId " + "and s.registeredAt between :start and :end") Double getSaleExpensesByProductId(Date start, Date end, Long productId); - @Query("select sum(s.amount * s.offer.pack.lot.cost) from Sale s where s.offer.pack.shop.id = :shopId " + + @Query("select sum(s.amount * s.offer.pack.lot.costPerUnit) from Sale s where s.offer.pack.shop.id = :shopId " + "and s.registeredAt between :start and :end") Double getSaleExpensesByShopId(Date start, Date end, Long shopId); - @Query("select sum(s.amount * s.offer.pack.lot.cost) from Sale s where s.offer.pack.lot.product.id = :productId " + + @Query("select sum(s.amount * s.offer.pack.lot.costPerUnit) from Sale s where s.offer.pack.lot.product.id = :productId " + "and s.offer.pack.shop.id = :shopId and s.registeredAt between :start and :end") Double getSaleExpensesByProductIdAndShopId(Date start, Date end, Long productId, Long shopId); } diff --git a/src/main/java/com/i8ai/training/store/rest/LotController.java b/src/main/java/com/i8ai/training/store/rest/LotController.java index 93a6376..e1b12aa 100644 --- a/src/main/java/com/i8ai/training/store/rest/LotController.java +++ b/src/main/java/com/i8ai/training/store/rest/LotController.java @@ -1,6 +1,6 @@ package com.i8ai.training.store.rest; -import com.i8ai.training.store.model.Lot; +import com.i8ai.training.store.rest.dto.LotDto; import com.i8ai.training.store.service.LotService; import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; @@ -16,16 +16,16 @@ public class LotController { private final LotService lotService; + @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE) + public LotDto registerLot(@RequestBody LotDto newLot) { + return new LotDto(lotService.registerLot(newLot)); + } + @GetMapping - public List getLots(@RequestParam(required = false) Long productId, + public List getLots(@RequestParam(required = false) Long productId, @RequestParam(required = false) Date start, @RequestParam(required = false) Date end) { - return lotService.getLots(productId, start, end); - } - - @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE) - public Lot registerLot(@RequestBody Lot newLot) { - return lotService.registerLot(newLot); + return lotService.getLots(productId, start, end).stream().map(LotDto::new).toList(); } @DeleteMapping("{lotId}") diff --git a/src/main/java/com/i8ai/training/store/rest/OfferController.java b/src/main/java/com/i8ai/training/store/rest/OfferController.java index ecaf59d..6c9b220 100644 --- a/src/main/java/com/i8ai/training/store/rest/OfferController.java +++ b/src/main/java/com/i8ai/training/store/rest/OfferController.java @@ -1,6 +1,5 @@ package com.i8ai.training.store.rest; -import com.i8ai.training.store.model.Offer; import com.i8ai.training.store.rest.dto.OfferDto; import com.i8ai.training.store.service.OfferService; import lombok.RequiredArgsConstructor; @@ -19,21 +18,21 @@ public class OfferController { private final OfferService offerService; @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE) - public Offer createOffer(@RequestBody OfferDto offerDto) { - return offerService.createOffer(offerDto); + public OfferDto createOffer(@RequestBody OfferDto offerDto) { + return new OfferDto(offerService.createOffer(offerDto)); } @GetMapping - public List getCurrentOffers(@RequestParam(required = false) Long shopId, + public List getCurrentOffers(@RequestParam(required = false) Long shopId, @RequestParam(required = false) Long productId) { - return offerService.getCurrentOffers(shopId, productId); + return offerService.getCurrentOffers(shopId, productId).stream().map(OfferDto::new).toList(); } @GetMapping("history") - public List getOffersHistory(@RequestParam(required = false) Long shopId, + public List getOffersHistory(@RequestParam(required = false) Long shopId, @RequestParam(required = false) Long productId, @RequestParam(required = false) Date start, @RequestParam(required = false) Date end) { - return offerService.getOffersHistory(shopId, productId, start, end); + return offerService.getOffersHistory(shopId, productId, start, end).stream().map(OfferDto::new).toList(); } } diff --git a/src/main/java/com/i8ai/training/store/rest/PackController.java b/src/main/java/com/i8ai/training/store/rest/PackController.java index 9a4d51e..7696bbd 100644 --- a/src/main/java/com/i8ai/training/store/rest/PackController.java +++ b/src/main/java/com/i8ai/training/store/rest/PackController.java @@ -1,6 +1,6 @@ package com.i8ai.training.store.rest; -import com.i8ai.training.store.model.Pack; +import com.i8ai.training.store.rest.dto.PackDto; import com.i8ai.training.store.service.PackService; import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; @@ -15,17 +15,17 @@ public class PackController { private final PackService packService; + @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE) + public PackDto registerPack(@RequestBody PackDto packDto) { + return new PackDto(packService.registerPack(packDto)); + } + @GetMapping - public List getPacks(@RequestParam(required = false) Long productId, + public List getPacks(@RequestParam(required = false) Long productId, @RequestParam(required = false) Long shopId, @RequestParam(required = false) Date start, @RequestParam(required = false) Date end) { - return packService.getPacks(productId, shopId, start, end); - } - - @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE) - public Pack registerPack(@RequestBody Pack newPack) { - return packService.registerPack(newPack); + return packService.getPacks(productId, shopId, start, end).stream().map(PackDto::new).toList(); } @DeleteMapping(value = "{packId}") diff --git a/src/main/java/com/i8ai/training/store/rest/ProductController.java b/src/main/java/com/i8ai/training/store/rest/ProductController.java index 6b95544..e7a3d46 100644 --- a/src/main/java/com/i8ai/training/store/rest/ProductController.java +++ b/src/main/java/com/i8ai/training/store/rest/ProductController.java @@ -16,16 +16,16 @@ public class ProductController { private final ProductService productService; + @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE) + public Product createProduct(@Valid @RequestBody Product newProduct) { + return productService.createProduct(newProduct); + } + @GetMapping public List getAllProducts() { return productService.getAllProducts(); } - @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE) - public Product addProduct(@Valid @RequestBody Product newProduct) { - return productService.createProduct(newProduct); - } - @GetMapping("{productId}") public Product getProduct(@PathVariable Long productId) { return productService.getProduct(productId); diff --git a/src/main/java/com/i8ai/training/store/rest/SaleController.java b/src/main/java/com/i8ai/training/store/rest/SaleController.java index f2186e3..f669eb3 100644 --- a/src/main/java/com/i8ai/training/store/rest/SaleController.java +++ b/src/main/java/com/i8ai/training/store/rest/SaleController.java @@ -1,6 +1,5 @@ package com.i8ai.training.store.rest; -import com.i8ai.training.store.model.Sale; import com.i8ai.training.store.rest.dto.SaleDto; import com.i8ai.training.store.service.SaleService; import lombok.RequiredArgsConstructor; @@ -17,15 +16,20 @@ public class SaleController { private final SaleService saleService; @PostMapping - public Sale registerSale(@RequestBody SaleDto saleDto) { - return saleService.registerSale(saleDto); + public SaleDto registerSale(@RequestBody SaleDto saleDto) { + return new SaleDto(saleService.registerSale(saleDto)); } @GetMapping - public List getSales(@RequestParam(required = false) Date start, + public List getSales(@RequestParam(required = false) Date start, @RequestParam(required = false) Date end, @RequestParam(required = false) Long productId, @RequestParam(required = false) Long shopId) { - return saleService.getSales(start, end, productId, shopId); + return saleService.getSales(start, end, productId, shopId).stream().map(SaleDto::new).toList(); + } + + @DeleteMapping("{saleId}") + public void deleteSale(@PathVariable Long saleId) { + saleService.deleteSale(saleId); } } diff --git a/src/main/java/com/i8ai/training/store/rest/ShopController.java b/src/main/java/com/i8ai/training/store/rest/ShopController.java index 174e11e..57494fd 100644 --- a/src/main/java/com/i8ai/training/store/rest/ShopController.java +++ b/src/main/java/com/i8ai/training/store/rest/ShopController.java @@ -4,21 +4,22 @@ import com.i8ai.training.store.model.Shop; import com.i8ai.training.store.service.ShopService; import jakarta.validation.Valid; -import org.springframework.beans.factory.annotation.Autowired; +import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController +@RequiredArgsConstructor @RequestMapping("shops") public class ShopController { private final ShopService shopService; - @Autowired - public ShopController(ShopService shopService) { - this.shopService = shopService; + @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE) + public Shop createShop(@Valid @RequestBody Shop newShop) { + return shopService.createShop(newShop); } @GetMapping @@ -26,11 +27,6 @@ public List getAllShops() { return shopService.getAllShops(); } - @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE) - public Shop addShop(@Valid @RequestBody Shop newShop) { - return shopService.createShop(newShop); - } - @GetMapping("{shopId}") public Shop getShop(@PathVariable Long shopId) { return shopService.getShop(shopId); diff --git a/src/main/java/com/i8ai/training/store/rest/dto/LotDto.java b/src/main/java/com/i8ai/training/store/rest/dto/LotDto.java new file mode 100644 index 0000000..e969b1a --- /dev/null +++ b/src/main/java/com/i8ai/training/store/rest/dto/LotDto.java @@ -0,0 +1,25 @@ +package com.i8ai.training.store.rest.dto; + +import com.i8ai.training.store.model.Lot; + +import java.util.Date; + +public record LotDto( + Long id, + Long productId, + Double acquiredAmount, + Double costPerUnit, + Double currentAmount, + Date receivedAt +) { + public LotDto(Lot lot) { + this( + lot.getId(), + lot.getProduct().getId(), + lot.getAcquiredAmount(), + lot.getCostPerUnit(), + lot.getCurrentAmount(), + lot.getReceivedAt() + ); + } +} diff --git a/src/main/java/com/i8ai/training/store/rest/dto/OfferDto.java b/src/main/java/com/i8ai/training/store/rest/dto/OfferDto.java index d7ecbc9..5aa4ddd 100644 --- a/src/main/java/com/i8ai/training/store/rest/dto/OfferDto.java +++ b/src/main/java/com/i8ai/training/store/rest/dto/OfferDto.java @@ -1,5 +1,7 @@ package com.i8ai.training.store.rest.dto; +import com.i8ai.training.store.model.Offer; + import java.util.Date; public record OfferDto( @@ -8,6 +10,16 @@ public record OfferDto( Long productId, Double price, Double discount, - Date created + Date createdAt ) { + public OfferDto(Offer offer) { + this( + offer.getId(), + offer.getPack().getShop().getId(), + offer.getPack().getLot().getProduct().getId(), + offer.getPrice(), + offer.getDiscount(), + offer.getCreatedAt() + ); + } } diff --git a/src/main/java/com/i8ai/training/store/rest/dto/PackDto.java b/src/main/java/com/i8ai/training/store/rest/dto/PackDto.java new file mode 100644 index 0000000..6b3854e --- /dev/null +++ b/src/main/java/com/i8ai/training/store/rest/dto/PackDto.java @@ -0,0 +1,25 @@ +package com.i8ai.training.store.rest.dto; + +import com.i8ai.training.store.model.Pack; + +import java.util.Date; + +public record PackDto( + Long id, + Long lotId, + Long shopId, + Double amount, + Double currentAmount, + Date deliveredAt +) { + public PackDto(Pack pack) { + this( + pack.getId(), + pack.getLot().getId(), + pack.getShop().getId(), + pack.getReceivedAmount(), + pack.getCurrentAmount(), + pack.getDeliveredAt() + ); + } +} diff --git a/src/main/java/com/i8ai/training/store/service/LotService.java b/src/main/java/com/i8ai/training/store/service/LotService.java index 28fe19c..b997536 100644 --- a/src/main/java/com/i8ai/training/store/service/LotService.java +++ b/src/main/java/com/i8ai/training/store/service/LotService.java @@ -1,13 +1,14 @@ package com.i8ai.training.store.service; import com.i8ai.training.store.model.Lot; +import com.i8ai.training.store.rest.dto.LotDto; import java.util.Date; import java.util.List; public interface LotService { - Lot registerLot(Lot newLot); + Lot registerLot(LotDto newLot); Lot getLot(Long lotId); diff --git a/src/main/java/com/i8ai/training/store/service/PackService.java b/src/main/java/com/i8ai/training/store/service/PackService.java index a11f42d..f6e179a 100644 --- a/src/main/java/com/i8ai/training/store/service/PackService.java +++ b/src/main/java/com/i8ai/training/store/service/PackService.java @@ -1,13 +1,14 @@ package com.i8ai.training.store.service; import com.i8ai.training.store.model.Pack; +import com.i8ai.training.store.rest.dto.PackDto; import java.util.Date; import java.util.List; public interface PackService { - Pack registerPack(Pack newPack); + Pack registerPack(PackDto packDto); Pack getPack(Long packId); diff --git a/src/main/java/com/i8ai/training/store/service/SaleService.java b/src/main/java/com/i8ai/training/store/service/SaleService.java index fdffd57..33a4209 100644 --- a/src/main/java/com/i8ai/training/store/service/SaleService.java +++ b/src/main/java/com/i8ai/training/store/service/SaleService.java @@ -29,4 +29,6 @@ public interface SaleService { Double getSalesExpensesByShop(Long shopId, Date start, Date end); Double getSalesExpensesByProductAndShop(Long productId, Long shopId, Date start, Date end); + + void deleteSale(Long saleId); } diff --git a/src/main/java/com/i8ai/training/store/service/impl/LotServiceImpl.java b/src/main/java/com/i8ai/training/store/service/impl/LotServiceImpl.java index 9afeb66..1c116d9 100644 --- a/src/main/java/com/i8ai/training/store/service/impl/LotServiceImpl.java +++ b/src/main/java/com/i8ai/training/store/service/impl/LotServiceImpl.java @@ -2,8 +2,11 @@ import com.i8ai.training.store.error.ElementNotFoundException; import com.i8ai.training.store.model.Lot; +import com.i8ai.training.store.model.Product; import com.i8ai.training.store.repository.LotRepository; +import com.i8ai.training.store.rest.dto.LotDto; import com.i8ai.training.store.service.LotService; +import com.i8ai.training.store.service.ProductService; import com.i8ai.training.store.util.DateTimeUtils; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -16,6 +19,8 @@ @RequiredArgsConstructor public class LotServiceImpl implements LotService { + private final ProductService productService; + private final LotRepository lotRepository; @Override @@ -30,8 +35,17 @@ public List getLots(Long productId, Date start, Date end) { } @Override - public Lot registerLot(Lot newLot) { - return lotRepository.save(newLot); + public Lot registerLot(LotDto lotDto) { + Product product = productService.getProduct(lotDto.productId()); + + Lot lot = Lot.builder() + .product(product) + .acquiredAmount(lotDto.acquiredAmount()) + .costPerUnit(lotDto.costPerUnit()) + .receivedAt(DateTimeUtils.dateOrNow(lotDto.receivedAt())) + .build(); + + return lotRepository.save(lot); } @Override diff --git a/src/main/java/com/i8ai/training/store/service/impl/OfferServiceImpl.java b/src/main/java/com/i8ai/training/store/service/impl/OfferServiceImpl.java index 8200f40..01d6b3d 100644 --- a/src/main/java/com/i8ai/training/store/service/impl/OfferServiceImpl.java +++ b/src/main/java/com/i8ai/training/store/service/impl/OfferServiceImpl.java @@ -33,7 +33,7 @@ public Offer createOffer(OfferDto offerDto) { .pack(pack) .price(offerDto.price()) .discount(offerDto.discount()) - .createdAt(DateTimeUtils.dateOrNow(offerDto.created())).build(); + .createdAt(DateTimeUtils.dateOrNow(offerDto.createdAt())).build(); return offerRepository.save(offer); } diff --git a/src/main/java/com/i8ai/training/store/service/impl/PackServiceImpl.java b/src/main/java/com/i8ai/training/store/service/impl/PackServiceImpl.java index 077e1d1..8b09c0e 100644 --- a/src/main/java/com/i8ai/training/store/service/impl/PackServiceImpl.java +++ b/src/main/java/com/i8ai/training/store/service/impl/PackServiceImpl.java @@ -2,11 +2,16 @@ import com.i8ai.training.store.error.ElementNotFoundException; import com.i8ai.training.store.error.NotValidAmountException; +import com.i8ai.training.store.model.Lot; import com.i8ai.training.store.model.Pack; +import com.i8ai.training.store.model.Shop; import com.i8ai.training.store.repository.PackRepository; +import com.i8ai.training.store.rest.dto.PackDto; import com.i8ai.training.store.service.LotService; import com.i8ai.training.store.service.PackService; +import com.i8ai.training.store.service.ShopService; import com.i8ai.training.store.util.DateTimeUtils; +import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -20,17 +25,29 @@ public class PackServiceImpl implements PackService { private final LotService lotService; + private final ShopService shopService; + private final PackRepository packRepository; @Override - public Pack registerPack(Pack newPack) { - if (newPack.getAmount() <= 0.0 || newPack.getAmount() > newPack.getLot().getCurrentAmount()) { + @Transactional + public Pack registerPack(PackDto packDto) { + Lot lot = lotService.getLot(packDto.lotId()); + if (packDto.amount() <= 0.0 || packDto.amount() > lot.getCurrentAmount()) { throw new NotValidAmountException(); } - lotService.updateDeliveredAmount(newPack.getLot().getId()); - - return packRepository.save(newPack); + Shop shop = shopService.getShop(packDto.shopId()); + Pack pack = Pack.builder() + .lot(lot) + .shop(shop) + .receivedAmount(packDto.amount()) + .deliveredAt(DateTimeUtils.dateOrNow(packDto.deliveredAt())) + .build(); + + packRepository.save(pack); + lotService.updateDeliveredAmount(lot.getId()); + return pack; } @Override diff --git a/src/main/java/com/i8ai/training/store/service/impl/ProductServiceImpl.java b/src/main/java/com/i8ai/training/store/service/impl/ProductServiceImpl.java index 28aa8e7..7227180 100644 --- a/src/main/java/com/i8ai/training/store/service/impl/ProductServiceImpl.java +++ b/src/main/java/com/i8ai/training/store/service/impl/ProductServiceImpl.java @@ -41,7 +41,7 @@ public Product replaceProduct(Long productId, Product modifiedProduct) { Product product = productRepository.findById(productId).orElseThrow(ElementNotFoundException::new); product.setCode(modifiedProduct.getCode()); product.setName(modifiedProduct.getName()); - product.setMeasure(modifiedProduct.getMeasure()); + product.setMeasureUnit(modifiedProduct.getMeasureUnit()); product.setDescription(modifiedProduct.getDescription()); try { productRepository.save(product); diff --git a/src/main/java/com/i8ai/training/store/service/impl/SaleServiceImpl.java b/src/main/java/com/i8ai/training/store/service/impl/SaleServiceImpl.java index 54b7033..e2e78cb 100644 --- a/src/main/java/com/i8ai/training/store/service/impl/SaleServiceImpl.java +++ b/src/main/java/com/i8ai/training/store/service/impl/SaleServiceImpl.java @@ -1,5 +1,6 @@ package com.i8ai.training.store.service.impl; +import com.i8ai.training.store.error.ElementNotFoundException; import com.i8ai.training.store.error.NotValidAmountException; import com.i8ai.training.store.model.Offer; import com.i8ai.training.store.model.Sale; @@ -8,6 +9,7 @@ import com.i8ai.training.store.service.OfferService; import com.i8ai.training.store.service.SaleService; import com.i8ai.training.store.util.DateTimeUtils; +import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -23,6 +25,7 @@ public class SaleServiceImpl implements SaleService { private final SaleRepository saleRepository; @Override + @Transactional public Sale registerSale(SaleDto saleDto) { Offer offer = offerService.getOffer(saleDto.offerId()); if (saleDto.amount() <= 0.0 || saleDto.amount() > offer.getPack().getCurrentAmount()) { @@ -35,8 +38,9 @@ public Sale registerSale(SaleDto saleDto) { .registeredAt(DateTimeUtils.dateOrNow(saleDto.registeredAt())) .build(); + saleRepository.save(sale); offerService.updateOfferPack(offer.getPack().getId()); - return saleRepository.save(sale); + return sale; } @Override @@ -117,4 +121,9 @@ public Double getSalesExpensesByProductAndShop(Long productId, Long shopId, Date DateTimeUtils.dateOrMin(start), DateTimeUtils.dateOrNow(end), productId, shopId ); } + + @Override + public void deleteSale(Long saleId) { + saleRepository.delete(saleRepository.findById(saleId).orElseThrow(ElementNotFoundException::new)); + } } diff --git a/src/main/resources/db/changelog-master.xml b/src/main/resources/db/changelog-master.xml index 5eea9e5..b09bfd9 100644 --- a/src/main/resources/db/changelog-master.xml +++ b/src/main/resources/db/changelog-master.xml @@ -5,6 +5,6 @@ xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.27.xsd"> - + \ No newline at end of file diff --git a/src/main/resources/db/init-changelog.xml b/src/main/resources/db/init-changelog.xml index 1d6c1b3..716afaa 100644 --- a/src/main/resources/db/init-changelog.xml +++ b/src/main/resources/db/init-changelog.xml @@ -1,19 +1,19 @@ - + - + - + @@ -25,7 +25,7 @@ - + @@ -42,12 +42,12 @@ - + - + @@ -62,7 +62,7 @@ - + @@ -73,13 +73,13 @@ - + - + @@ -95,7 +95,7 @@ - + @@ -109,26 +109,26 @@ - + - + - + - + - + - + diff --git a/src/test/java/com/i8ai/training/store/repository/RepositoryTest.java b/src/test/java/com/i8ai/training/store/repository/RepositoryTest.java index aa0de8d..badff20 100644 --- a/src/test/java/com/i8ai/training/store/repository/RepositoryTest.java +++ b/src/test/java/com/i8ai/training/store/repository/RepositoryTest.java @@ -1,41 +1,40 @@ package com.i8ai.training.store.repository; import com.i8ai.training.store.model.*; +import com.i8ai.training.store.util.TestHelper; import lombok.RequiredArgsConstructor; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.context.annotation.Import; import java.util.Date; import java.util.List; -import static com.i8ai.training.store.util.TestUtils.*; +import static com.i8ai.training.store.util.TestConstants.*; import static org.junit.jupiter.api.Assertions.assertEquals; +@Import(TestHelper.class) @DataJpaTest(showSql = false) -@RequiredArgsConstructor +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) class RepositoryTest { - @Autowired - private ProductRepository productRepository; + private final ProductRepository productRepository; - @Autowired - private ShopRepository shopRepository; + private final ShopRepository shopRepository; - @Autowired - private LotRepository lotRepository; + private final LotRepository lotRepository; - @Autowired - private PackRepository packRepository; + private final PackRepository packRepository; - @Autowired - private OfferRepository offerRepository; + private final OfferRepository offerRepository; - @Autowired - private SaleRepository saleRepository; + private final SaleRepository saleRepository; + + private final TestHelper helper; private Long idProductA; private Long idProductB; @@ -49,55 +48,43 @@ class RepositoryTest { @BeforeEach void setUp() { - Product productA = productRepository.save( - Product.builder().code(PRODUCT_A_CODE).name(PRODUCT_A_NAME).measure(PRODUCT_A_MEASURE).build() - ); - Product productB = productRepository.save( - Product.builder().code(PRODUCT_B_CODE).name(PRODUCT_B_NAME).measure(PRODUCT_B_MEASURE).build() - ); + Product productA = helper.createProductA(); + Product productB = helper.createProductB(); idProductA = productA.getId(); idProductB = productB.getId(); - Shop shop1 = shopRepository.save(Shop.builder().name(SHOP1_NAME).address(SHOP1_ADDRESS).build()); - Shop shop2 = shopRepository.save(Shop.builder().name(SHOP2_NAME).address(SHOP2_ADDRESS).build()); + Shop shop1 = helper.createShop1(); + Shop shop2 = helper.createShop2(); idShop1 = shop1.getId(); idShop2 = shop2.getId(); - Lot lotA = lotRepository.save( - Lot.builder().receivedAt(new Date(5)).amount(LOT_A_AMOUNT).cost(PRODUCT_A_COST).product(productA).build() - ); - Lot lotB = lotRepository.save( - Lot.builder().receivedAt(new Date(10)).amount(LOT_B_AMOUNT).cost(PRODUCT_B_COST).product(productB).build() - ); + Lot lotA = helper.createLotA(productA); + Lot lotB = helper.createLotB(productB); idLotA = lotA.getId(); - Pack pack1A = packRepository.save( - Pack.builder().deliveredAt(new Date(15)).amount(PACK1A_AMOUNT).lot(lotA).shop(shop1).build()); - Pack pack1B = packRepository.save( - Pack.builder().deliveredAt(new Date(20)).amount(PACK1B_AMOUNT).lot(lotB).shop(shop1).build()); - Pack pack2A = packRepository.save( - Pack.builder().deliveredAt(new Date(25)).amount(PACK2A_AMOUNT).lot(lotA).shop(shop2).build()); - Pack pack2B = packRepository.save( - Pack.builder().deliveredAt(new Date(30)).amount(PACK2B_AMOUNT).lot(lotB).shop(shop2).build()); + Pack pack1A = helper.createPack1A(lotA, shop1); + Pack pack1B = helper.createPack1B(lotB, shop1); + Pack pack2A = helper.createPack2A(lotA, shop2); + Pack pack2B = helper.createPack2B(lotB, shop2); idPack2B = pack2B.getId(); - offerRepository.save(Offer.builder().createdAt(new Date(10)).price(PRODUCT_A_PRICE + 10).pack(pack1A).build()); - Offer offer1A = offerRepository.save(Offer.builder().createdAt(new Date(15)).price(PRODUCT_A_PRICE).pack(pack1A).build()); - offerRepository.save(Offer.builder().createdAt(new Date(15)).price(PRODUCT_B_PRICE + 10).pack(pack1B).build()); - Offer offer1B = offerRepository.save(Offer.builder().createdAt(new Date(20)).price(PRODUCT_B_PRICE).pack(pack1B).build()); - offerRepository.save(Offer.builder().createdAt(new Date(20)).price(PRODUCT_A_PRICE + 10).pack(pack2A).build()); - Offer offer2A = offerRepository.save(Offer.builder().createdAt(new Date(25)).price(PRODUCT_A_PRICE).pack(pack2A).build()); - offerRepository.save(Offer.builder().createdAt(new Date(25)).price(PRODUCT_B_PRICE + 10).pack(pack2B).build()); - Offer offer2B = offerRepository.save(Offer.builder().createdAt(new Date(30)).price(PRODUCT_B_PRICE).pack(pack2B).build()); - - saleRepository.save(Sale.builder().registeredAt(new Date(35)).amount(SALE_1A35_AMOUNT).offer(offer1A).build()); - saleRepository.save(Sale.builder().registeredAt(new Date(40)).amount(SALE_1A40_AMOUNT).offer(offer1A).build()); - saleRepository.save(Sale.builder().registeredAt(new Date(45)).amount(SALE_1B45_AMOUNT).offer(offer1B).build()); - saleRepository.save(Sale.builder().registeredAt(new Date(50)).amount(SALE_1B50_AMOUNT).offer(offer1B).build()); - saleRepository.save(Sale.builder().registeredAt(new Date(55)).amount(SALE_2A55_AMOUNT).offer(offer2A).build()); - saleRepository.save(Sale.builder().registeredAt(new Date(60)).amount(SALE_2A60_AMOUNT).offer(offer2A).build()); - saleRepository.save(Sale.builder().registeredAt(new Date(65)).amount(SALE_2B65_AMOUNT).offer(offer2B).build()); - saleRepository.save(Sale.builder().registeredAt(new Date(70)).amount(SALE_2B70_AMOUNT).offer(offer2B).build()); + helper.createOffer(pack1A, PRODUCT_A_PRICE + 10); + Offer offer1A = helper.createOffer(pack1A, PRODUCT_A_PRICE); + helper.createOffer(pack1B, PRODUCT_B_PRICE + 10); + Offer offer1B = helper.createOffer(pack1B, PRODUCT_B_PRICE); + helper.createOffer(pack2A, PRODUCT_A_PRICE + 10); + Offer offer2A = helper.createOffer(pack2A, PRODUCT_A_PRICE); + helper.createOffer(pack2B, PRODUCT_B_PRICE + 10); + Offer offer2B = helper.createOffer(pack2B, PRODUCT_B_PRICE); + + helper.createSale(offer1A, SALE_1A35_AMOUNT); + helper.createSale(offer1A, SALE_1A40_AMOUNT); + helper.createSale(offer1B, SALE_1B45_AMOUNT); + helper.createSale(offer1B, SALE_1B50_AMOUNT); + helper.createSale(offer2A, SALE_2A55_AMOUNT); + helper.createSale(offer2A, SALE_2A60_AMOUNT); + helper.createSale(offer2B, SALE_2B65_AMOUNT); + helper.createSale(offer2B, SALE_2B70_AMOUNT); } @AfterEach @@ -109,7 +96,6 @@ void tearDown() { shopRepository.deleteAll(); } - @Test void findAllLotsByReceivedBetween() { List lots = lotRepository.findAllByReceivedAtBetween(new Date(0), new Date()); diff --git a/src/test/java/com/i8ai/training/store/rest/BalanceControllerTest.java b/src/test/java/com/i8ai/training/store/rest/BalanceControllerTest.java index 47d53eb..892fbeb 100644 --- a/src/test/java/com/i8ai/training/store/rest/BalanceControllerTest.java +++ b/src/test/java/com/i8ai/training/store/rest/BalanceControllerTest.java @@ -11,7 +11,7 @@ import java.util.List; -import static com.i8ai.training.store.util.TestUtils.*; +import static com.i8ai.training.store.util.TestConstants.*; import static org.mockito.BDDMockito.given; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; diff --git a/src/test/java/com/i8ai/training/store/rest/LotControllerTest.java b/src/test/java/com/i8ai/training/store/rest/LotControllerTest.java index b8a8045..576015a 100644 --- a/src/test/java/com/i8ai/training/store/rest/LotControllerTest.java +++ b/src/test/java/com/i8ai/training/store/rest/LotControllerTest.java @@ -1,69 +1,74 @@ package com.i8ai.training.store.rest; import com.i8ai.training.store.model.Lot; -import com.i8ai.training.store.service.LotService; -import com.i8ai.training.store.util.TestUtils; +import com.i8ai.training.store.model.Product; +import com.i8ai.training.store.rest.dto.LotDto; +import com.i8ai.training.store.util.TestHelper; +import lombok.RequiredArgsConstructor; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; -import java.util.Arrays; -import java.util.List; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.doNothing; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @SpringBootTest @AutoConfigureMockMvc +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) class LotControllerTest { - @Autowired - private MockMvc mockMvc; + private final MockMvc mockMvc; - @MockBean - private LotService lotService; + private final TestHelper helper; - @Test - void testGetLots() throws Exception { - List lots = Arrays.asList(Lot.builder().build(), Lot.builder().build()); + private Product productA; + private Product productB; - given(lotService.getLots(null, null, null)).willReturn(lots); + @BeforeEach + void setUp() { + productA = helper.createProductA(); + productB = helper.createProductB(); + } - mockMvc.perform(get("/lots")) - .andExpect(status().isOk()) - .andExpect(content().contentType(MediaType.APPLICATION_JSON)) - .andExpect(jsonPath("$").isArray()) - .andExpect(jsonPath("$[0]").exists()) - .andExpect(jsonPath("$[1]").exists()); + @AfterEach + void tearDown() { + helper.deleteAllLots(); + helper.deleteAllProducts(); } @Test void testRegisterLot() throws Exception { - Lot newLot = Lot.builder().build(); - Lot savedLot = Lot.builder().build(); - given(lotService.registerLot(any(Lot.class))).willReturn(savedLot); - mockMvc.perform(post("/lots") .contentType(MediaType.APPLICATION_JSON) - .content(TestUtils.asJsonString(newLot))) + .content(helper.asJsonString(new LotDto(helper.createLotA(productA))))) .andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) .andExpect(jsonPath("$").exists()); } + @Test + void testGetLots() throws Exception { + helper.createLotA(productA); + helper.createLotA(productB); + + mockMvc.perform(get("/lots")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$[0]").exists()) + .andExpect(jsonPath("$[1]").exists()); + } + @Test void testDeleteLot() throws Exception { - doNothing().when(lotService).deleteLot(anyLong()); + Lot lot = helper.createLotB(productB); - mockMvc.perform(delete("/lots/1")) + mockMvc.perform(delete("/lots/{lotId}", lot.getId())) .andExpect(status().isOk()); } } diff --git a/src/test/java/com/i8ai/training/store/rest/PackControllerTest.java b/src/test/java/com/i8ai/training/store/rest/PackControllerTest.java index 2200506..42cb011 100644 --- a/src/test/java/com/i8ai/training/store/rest/PackControllerTest.java +++ b/src/test/java/com/i8ai/training/store/rest/PackControllerTest.java @@ -1,68 +1,88 @@ package com.i8ai.training.store.rest; +import com.i8ai.training.store.model.Lot; import com.i8ai.training.store.model.Pack; -import com.i8ai.training.store.service.PackService; -import com.i8ai.training.store.util.TestUtils; +import com.i8ai.training.store.model.Shop; +import com.i8ai.training.store.rest.dto.PackDto; +import com.i8ai.training.store.util.TestConstants; +import com.i8ai.training.store.util.TestHelper; +import lombok.RequiredArgsConstructor; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; -import java.util.Arrays; -import java.util.List; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.doNothing; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @SpringBootTest @AutoConfigureMockMvc +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) class PackControllerTest { - @Autowired - private MockMvc mockMvc; + private final MockMvc mockMvc; - @MockBean - private PackService packService; + private final TestHelper helper; - @Test - void testGetPacks() throws Exception { - List packs = Arrays.asList(Pack.builder().build(), Pack.builder().build()); - given(packService.getPacks(null, null, null, null)).willReturn(packs); + private Shop shop1; + private Shop shop2; + private Lot lotA; + private Lot lotB; - mockMvc.perform(get("/packs")) - .andExpect(status().isOk()) - .andExpect(content().contentType(MediaType.APPLICATION_JSON)) - .andExpect(jsonPath("$").isArray()) - .andExpect(jsonPath("$[0]").exists()) - .andExpect(jsonPath("$[1]").exists()); + @BeforeEach + void setUp() { + shop1 = helper.createShop1(); + shop2 = helper.createShop2(); + lotA = helper.createLotA(helper.createProductA()); + lotB = helper.createLotB(helper.createProductB()); + } + + @AfterEach + void tearDown() { + helper.deleteAllPacks(); + helper.deleteAllShops(); + helper.deleteAllLots(); + helper.deleteAllProducts(); } @Test void testRegisterPack() throws Exception { - Pack newPack = Pack.builder().build(); - Pack savedPack = Pack.builder().build(); - given(packService.registerPack(any(Pack.class))).willReturn(savedPack); + Pack pack = Pack.builder().lot(lotA).shop(shop1).receivedAmount(TestConstants.PACK1A_AMOUNT).build(); mockMvc.perform(post("/packs") .contentType(MediaType.APPLICATION_JSON) - .content(TestUtils.asJsonString(newPack))) + .content(helper.asJsonString(new PackDto(pack)))) .andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) .andExpect(jsonPath("$").exists()); } + @Test + void testGetPacks() throws Exception { + helper.createPack1A(lotA, shop1); + helper.createPack1B(lotB, shop1); + helper.createPack2A(lotA, shop2); + helper.createPack2B(lotB, shop2); + + mockMvc.perform(get("/packs")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$[0]").exists()) + .andExpect(jsonPath("$[1]").exists()) + .andExpect(jsonPath("$[2]").exists()) + .andExpect(jsonPath("$[3]").exists()); + } + @Test void testDeletePack() throws Exception { - doNothing().when(packService).deletePack(anyLong()); + Pack pack = helper.createPack2B(lotB, shop2); - mockMvc.perform(delete("/packs/1")) + mockMvc.perform(delete("/packs/{packId}", pack.getId())) .andExpect(status().isOk()); } } diff --git a/src/test/java/com/i8ai/training/store/rest/ProductControllerTest.java b/src/test/java/com/i8ai/training/store/rest/ProductControllerTest.java index f73fc2b..a92f1cf 100644 --- a/src/test/java/com/i8ai/training/store/rest/ProductControllerTest.java +++ b/src/test/java/com/i8ai/training/store/rest/ProductControllerTest.java @@ -1,8 +1,9 @@ package com.i8ai.training.store.rest; import com.i8ai.training.store.model.Product; +import com.i8ai.training.store.util.TestConstants; import com.i8ai.training.store.util.TestHelper; -import com.i8ai.training.store.util.TestUtils; +import lombok.RequiredArgsConstructor; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -16,19 +17,28 @@ @SpringBootTest @AutoConfigureMockMvc +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) class ProductControllerTest { - @Autowired - private MockMvc mockMvc; + private final MockMvc mockMvc; - @Autowired - private TestHelper helper; + private final TestHelper helper; @AfterEach void tearDown() { helper.deleteAllProducts(); } + @Test + void testCreateProduct() throws Exception { + mockMvc.perform(post("/products") + .contentType(MediaType.APPLICATION_JSON) + .content(helper.asJsonString(TestConstants.PRODUCT_A))) + .andExpect(status().isOk()) + .andExpect(content().contentType("application/json")) + .andExpect(jsonPath("$").exists()); + } + @Test void testGetAllProducts() throws Exception { helper.createProductA(); @@ -42,19 +52,9 @@ void testGetAllProducts() throws Exception { .andExpect(jsonPath("$[1]").exists()); } - @Test - void testAddProduct() throws Exception { - mockMvc.perform(post("/products") - .contentType(MediaType.APPLICATION_JSON) - .content(TestUtils.asJsonString(helper.createProductB()))) - .andExpect(status().isOk()) - .andExpect(content().contentType("application/json")) - .andExpect(jsonPath("$").exists()); - } - @Test void testGetProduct() throws Exception { - Long productId = helper.createProductA().getId(); + Long productId = helper.createProductB().getId(); mockMvc.perform(get("/products/{productId}", productId)) .andExpect(status().isOk()) @@ -65,11 +65,11 @@ void testGetProduct() throws Exception { @Test void testReplaceProduct() throws Exception { Product product = helper.createProductA(); - product.setName(TestUtils.PRODUCT_B_NAME); + product.setDescription("New description for product A"); mockMvc.perform(put("/products/{productId}", product.getId()) .contentType(MediaType.APPLICATION_JSON) - .content(TestUtils.asJsonString(product))) + .content(helper.asJsonString(product))) .andExpect(status().isOk()) .andExpect(content().contentType("application/json")) .andExpect(jsonPath("$").exists()); diff --git a/src/test/java/com/i8ai/training/store/rest/SaleControllerTest.java b/src/test/java/com/i8ai/training/store/rest/SaleControllerTest.java index 3bf19ef..8bc3f28 100644 --- a/src/test/java/com/i8ai/training/store/rest/SaleControllerTest.java +++ b/src/test/java/com/i8ai/training/store/rest/SaleControllerTest.java @@ -1,60 +1,97 @@ package com.i8ai.training.store.rest; +import com.i8ai.training.store.model.Lot; +import com.i8ai.training.store.model.Offer; import com.i8ai.training.store.model.Sale; +import com.i8ai.training.store.model.Shop; import com.i8ai.training.store.rest.dto.SaleDto; -import com.i8ai.training.store.service.SaleService; -import com.i8ai.training.store.util.TestUtils; +import com.i8ai.training.store.util.TestConstants; +import com.i8ai.training.store.util.TestHelper; +import lombok.RequiredArgsConstructor; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; -import java.util.Arrays; -import java.util.List; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.given; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @SpringBootTest @AutoConfigureMockMvc +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) class SaleControllerTest { - @Autowired - private MockMvc mockMvc; + private final MockMvc mockMvc; + + private final TestHelper helper; + + private Offer offer1A; + private Offer offer1B; + private Offer offer2A; + private Offer offer2B; + + @BeforeEach + void setUp() { + Shop shop1 = helper.createShop1(); + Shop shop2 = helper.createShop2(); + + Lot lotA = helper.createLotA(helper.createProductA()); + Lot lotB = helper.createLotB(helper.createProductB()); + + offer1A = helper.createOffer(helper.createPack1A(lotA, shop1), TestConstants.PRODUCT_A_PRICE); + offer1B = helper.createOffer(helper.createPack1B(lotB, shop1), TestConstants.PRODUCT_B_PRICE); + offer2A = helper.createOffer(helper.createPack2A(lotA, shop2), TestConstants.PRODUCT_A_PRICE); + offer2B = helper.createOffer(helper.createPack2B(lotB, shop2), TestConstants.PRODUCT_B_PRICE); + } + + @AfterEach + void tearDown() { + helper.deleteAllSales(); + helper.deleteAllOffers(); + helper.deleteAllPacks(); + helper.deleteAllLots(); + helper.deleteAllProducts(); + helper.deleteAllShops(); + } + + @Test + void testRegisterSale() throws Exception { + Sale sale = Sale.builder().offer(offer1A).amount(TestConstants.SALE_1A40_AMOUNT).build(); - @MockBean - private SaleService saleService; + mockMvc.perform(post("/sales") + .contentType(MediaType.APPLICATION_JSON) + .content(helper.asJsonString(new SaleDto(sale)))) + .andExpect(status().isOk()) + .andExpect(content().contentType("application/json")) + .andExpect(jsonPath("$").exists()); + } @Test void testGetSales() throws Exception { - List sales = Arrays.asList(Sale.builder().build(), Sale.builder().build()); - given(saleService.getSales(null, null, null, null)).willReturn(sales); + helper.createSale(offer1A, TestConstants.SALE_1A35_AMOUNT); + helper.createSale(offer1B, TestConstants.SALE_1B45_AMOUNT); + helper.createSale(offer2A, TestConstants.SALE_2A55_AMOUNT); + helper.createSale(offer2B, TestConstants.SALE_2B65_AMOUNT); mockMvc.perform(get("/sales")) .andExpect(status().isOk()) .andExpect(content().contentType("application/json")) .andExpect(jsonPath("$").isArray()) .andExpect(jsonPath("$[0]").exists()) - .andExpect(jsonPath("$[1]").exists()); + .andExpect(jsonPath("$[1]").exists()) + .andExpect(jsonPath("$[2]").exists()) + .andExpect(jsonPath("$[3]").exists()); } @Test - void testRegisterSale() throws Exception { - Sale newSale = Sale.builder().build(); - Sale savedSale = Sale.builder().build(); - given(saleService.registerSale(any(SaleDto.class))).willReturn(savedSale); + void testDeleteSale() throws Exception { + Sale sale2B = helper.createSale(offer2B, TestConstants.SALE_2B70_AMOUNT); - mockMvc.perform(post("/sales") - .contentType(MediaType.APPLICATION_JSON) - .content(TestUtils.asJsonString(newSale))) - .andExpect(status().isOk()) - .andExpect(content().contentType("application/json")) - .andExpect(jsonPath("$").exists()); + mockMvc.perform(delete("/sales/{saleId}", sale2B.getId())) + .andExpect(status().isOk()); } } diff --git a/src/test/java/com/i8ai/training/store/rest/ShopControllerTest.java b/src/test/java/com/i8ai/training/store/rest/ShopControllerTest.java index 096df8c..e630602 100644 --- a/src/test/java/com/i8ai/training/store/rest/ShopControllerTest.java +++ b/src/test/java/com/i8ai/training/store/rest/ShopControllerTest.java @@ -1,69 +1,56 @@ package com.i8ai.training.store.rest; import com.i8ai.training.store.model.Shop; -import com.i8ai.training.store.service.ShopService; -import com.i8ai.training.store.util.TestUtils; +import com.i8ai.training.store.util.TestConstants; +import com.i8ai.training.store.util.TestHelper; +import lombok.RequiredArgsConstructor; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; -import java.util.Arrays; -import java.util.List; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.doNothing; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @SpringBootTest @AutoConfigureMockMvc +@RequiredArgsConstructor(onConstructor = @__(@Autowired)) class ShopControllerTest { - @Autowired - private MockMvc mockMvc; + private final MockMvc mockMvc; - @MockBean - private ShopService shopService; + private final TestHelper helper; @Test - void testGetAllShops() throws Exception { - List shops = Arrays.asList(Shop.builder().build(), Shop.builder().build()); - given(shopService.getAllShops()).willReturn(shops); - - mockMvc.perform(get("/shops")) + void testCreateShop() throws Exception { + mockMvc.perform(post("/shops") + .contentType(MediaType.APPLICATION_JSON) + .content(helper.asJsonString(TestConstants.SHOP1))) .andExpect(status().isOk()) .andExpect(content().contentType("application/json")) - .andExpect(jsonPath("$").isArray()) - .andExpect(jsonPath("$[0]").exists()) - .andExpect(jsonPath("$[1]").exists()); + .andExpect(jsonPath("$").exists()); } @Test - void testAddShop() throws Exception { - Shop newShop = Shop.builder().build(); - Shop savedShop = Shop.builder().build(); - given(shopService.createShop(any(Shop.class))).willReturn(savedShop); + void testGetAllShops() throws Exception { + helper.createShop1(); + helper.createShop2(); - mockMvc.perform(post("/shops") - .contentType(MediaType.APPLICATION_JSON) - .content(TestUtils.asJsonString(newShop))) + mockMvc.perform(get("/shops")) .andExpect(status().isOk()) .andExpect(content().contentType("application/json")) - .andExpect(jsonPath("$").exists()); + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$[0]").exists()) + .andExpect(jsonPath("$[1]").exists()); } @Test void testGetShop() throws Exception { - Shop shop = Shop.builder().build(); - given(shopService.getShop(anyLong())).willReturn(shop); + Shop shop1 = helper.createShop1(); - mockMvc.perform(get("/shops/1")) + mockMvc.perform(get("/shops/{shopId}", shop1.getId())) .andExpect(status().isOk()) .andExpect(content().contentType("application/json")) .andExpect(jsonPath("$").exists()); @@ -71,12 +58,12 @@ void testGetShop() throws Exception { @Test void testReplaceShop() throws Exception { - Shop modifiedShop = Shop.builder().build(); - given(shopService.replaceShop(anyLong(), any(Shop.class))).willReturn(modifiedShop); + Shop shop2 = helper.createShop2(); + shop2.setDescription("New description for shop 2"); - mockMvc.perform(put("/shops/1") + mockMvc.perform(put("/shops/{shopId}", shop2.getId()) .contentType(MediaType.APPLICATION_JSON) - .content(TestUtils.asJsonString(modifiedShop))) + .content(helper.asJsonString(shop2))) .andExpect(status().isOk()) .andExpect(content().contentType("application/json")) .andExpect(jsonPath("$").exists()); @@ -84,9 +71,9 @@ void testReplaceShop() throws Exception { @Test void testDeleteShop() throws Exception { - doNothing().when(shopService).deleteShop(anyLong()); + Shop shop1 = helper.createShop1(); - mockMvc.perform(delete("/shops/1")) + mockMvc.perform(delete("/shops/{shopId}", shop1.getId())) .andExpect(status().isOk()); } } diff --git a/src/test/java/com/i8ai/training/store/service/impl/BalanceServiceImplTest.java b/src/test/java/com/i8ai/training/store/service/impl/BalanceServiceImplTest.java index 9353e4c..0b5e1d8 100644 --- a/src/test/java/com/i8ai/training/store/service/impl/BalanceServiceImplTest.java +++ b/src/test/java/com/i8ai/training/store/service/impl/BalanceServiceImplTest.java @@ -12,7 +12,7 @@ import java.util.List; -import static com.i8ai.training.store.util.TestUtils.*; +import static com.i8ai.training.store.util.TestConstants.*; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.Mockito.when; diff --git a/src/test/java/com/i8ai/training/store/service/impl/ExistenceServiceImplTest.java b/src/test/java/com/i8ai/training/store/service/impl/ExistenceServiceImplTest.java index 8f4dc51..34adaaf 100644 --- a/src/test/java/com/i8ai/training/store/service/impl/ExistenceServiceImplTest.java +++ b/src/test/java/com/i8ai/training/store/service/impl/ExistenceServiceImplTest.java @@ -10,7 +10,7 @@ import java.util.List; -import static com.i8ai.training.store.util.TestUtils.*; +import static com.i8ai.training.store.util.TestConstants.*; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.Mockito.when; diff --git a/src/test/java/com/i8ai/training/store/service/impl/LotServiceImplTest.java b/src/test/java/com/i8ai/training/store/service/impl/LotServiceImplTest.java index d56f1fd..688b7b7 100644 --- a/src/test/java/com/i8ai/training/store/service/impl/LotServiceImplTest.java +++ b/src/test/java/com/i8ai/training/store/service/impl/LotServiceImplTest.java @@ -3,6 +3,8 @@ import com.i8ai.training.store.error.ElementNotFoundException; import com.i8ai.training.store.model.Lot; import com.i8ai.training.store.repository.LotRepository; +import com.i8ai.training.store.rest.dto.LotDto; +import com.i8ai.training.store.service.ProductService; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; @@ -13,11 +15,10 @@ import java.util.List; import java.util.Optional; -import static com.i8ai.training.store.util.TestUtils.*; +import static com.i8ai.training.store.util.TestConstants.*; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.notNull; +import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -27,6 +28,9 @@ class LotServiceImplTest { @Mock private LotRepository lotRepositoryMock; + @Mock + private ProductService productServiceMock; + @InjectMocks private LotServiceImpl lotService; @@ -104,9 +108,11 @@ void getLot() { @Test void registerLot() { - lotService.registerLot(LOT_A); + when(productServiceMock.getProduct(PRODUCT_A_ID)).thenReturn(PRODUCT_A); + + lotService.registerLot(new LotDto(LOT_A)); - verify(lotRepositoryMock).save(LOT_A); + verify(lotRepositoryMock).save(argThat(lot -> lot.getProduct().getId().equals(PRODUCT_A_ID))); } @Test diff --git a/src/test/java/com/i8ai/training/store/service/impl/PackServiceImplTest.java b/src/test/java/com/i8ai/training/store/service/impl/PackServiceImplTest.java index bf0d8a4..5f0c41b 100644 --- a/src/test/java/com/i8ai/training/store/service/impl/PackServiceImplTest.java +++ b/src/test/java/com/i8ai/training/store/service/impl/PackServiceImplTest.java @@ -4,6 +4,9 @@ import com.i8ai.training.store.error.NotValidAmountException; import com.i8ai.training.store.model.Pack; import com.i8ai.training.store.repository.PackRepository; +import com.i8ai.training.store.rest.dto.PackDto; +import com.i8ai.training.store.service.LotService; +import com.i8ai.training.store.service.ShopService; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; @@ -14,7 +17,7 @@ import java.util.List; import java.util.Optional; -import static com.i8ai.training.store.util.TestUtils.*; +import static com.i8ai.training.store.util.TestConstants.*; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -26,6 +29,12 @@ class PackServiceImplTest { @Mock private PackRepository packRepositoryMock; + @Mock + private LotService lotServiceMock; + + @Mock + private ShopService shopServiceMock; + @InjectMocks private PackServiceImpl packService; @@ -89,21 +98,29 @@ void getPack() { @Test void registerPackWithNotValidAmount() { - Pack pack = Pack.builder().deliveredAt(new Date()).amount(-10.0).lot(LOT_A).shop(SHOP1).build(); + when(lotServiceMock.getLot(LOT_A_ID)).thenReturn(LOT_A); + Pack pack = Pack.builder().deliveredAt(new Date()).receivedAmount(-10.0).lot(LOT_A).shop(SHOP1).build(); + PackDto packDto = new PackDto(pack); - assertThrows(NotValidAmountException.class, () -> packService.registerPack(pack)); + assertThrows(NotValidAmountException.class, () -> packService.registerPack(packDto)); } @Test void registerPackWithNotAvailableAmount() { - Pack pack = Pack.builder().deliveredAt(new Date()).amount(LOT_A_AMOUNT + 10).lot(LOT_A).shop(SHOP1).build(); + when(lotServiceMock.getLot(LOT_A_ID)).thenReturn(LOT_A); + Pack pack = Pack.builder().deliveredAt(new Date()).receivedAmount(LOT_A_AMOUNT + 10).lot(LOT_A).shop(SHOP1).build(); + PackDto packDto = new PackDto(pack); - assertThrows(NotValidAmountException.class, () -> packService.registerPack(pack)); + assertThrows(NotValidAmountException.class, () -> packService.registerPack(packDto)); } @Test void registerPack() { - assertDoesNotThrow(() -> packService.registerPack(PACK2B)); + when(lotServiceMock.getLot(LOT_B_ID)).thenReturn(LOT_B); + when(shopServiceMock.getShop(SHOP2_ID)).thenReturn(SHOP2); + PackDto packDto = new PackDto(PACK2B); + + assertDoesNotThrow(() -> packService.registerPack(packDto)); } @Test diff --git a/src/test/java/com/i8ai/training/store/service/impl/ProductServiceImplTest.java b/src/test/java/com/i8ai/training/store/service/impl/ProductServiceImplTest.java index 218e3e5..406c41f 100644 --- a/src/test/java/com/i8ai/training/store/service/impl/ProductServiceImplTest.java +++ b/src/test/java/com/i8ai/training/store/service/impl/ProductServiceImplTest.java @@ -14,7 +14,7 @@ import java.util.List; import java.util.Optional; -import static com.i8ai.training.store.util.TestUtils.*; +import static com.i8ai.training.store.util.TestConstants.*; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; diff --git a/src/test/java/com/i8ai/training/store/service/impl/SaleServiceImplTest.java b/src/test/java/com/i8ai/training/store/service/impl/SaleServiceImplTest.java index 6ece539..c5535a8 100644 --- a/src/test/java/com/i8ai/training/store/service/impl/SaleServiceImplTest.java +++ b/src/test/java/com/i8ai/training/store/service/impl/SaleServiceImplTest.java @@ -14,7 +14,7 @@ import java.util.Date; import java.util.List; -import static com.i8ai.training.store.util.TestUtils.*; +import static com.i8ai.training.store.util.TestConstants.*; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; diff --git a/src/test/java/com/i8ai/training/store/service/impl/ShopServiceImplTest.java b/src/test/java/com/i8ai/training/store/service/impl/ShopServiceImplTest.java index 6883f14..604f189 100644 --- a/src/test/java/com/i8ai/training/store/service/impl/ShopServiceImplTest.java +++ b/src/test/java/com/i8ai/training/store/service/impl/ShopServiceImplTest.java @@ -11,7 +11,7 @@ import java.util.List; import java.util.Optional; -import static com.i8ai.training.store.util.TestUtils.*; +import static com.i8ai.training.store.util.TestConstants.*; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.mock; diff --git a/src/test/java/com/i8ai/training/store/util/TestUtils.java b/src/test/java/com/i8ai/training/store/util/TestConstants.java similarity index 87% rename from src/test/java/com/i8ai/training/store/util/TestUtils.java rename to src/test/java/com/i8ai/training/store/util/TestConstants.java index 6b50fc6..19ded95 100644 --- a/src/test/java/com/i8ai/training/store/util/TestUtils.java +++ b/src/test/java/com/i8ai/training/store/util/TestConstants.java @@ -1,11 +1,10 @@ package com.i8ai.training.store.util; -import com.fasterxml.jackson.databind.ObjectMapper; import com.i8ai.training.store.model.*; import java.util.Date; -public class TestUtils { +public class TestConstants { public static final Long PRODUCT_A_ID = 0x0AL; public static final String PRODUCT_A_CODE = "a_product_code"; @@ -83,16 +82,24 @@ public class TestUtils { public static final Double NET_SALES_INCOME = PRODUCT_A_INCOME + PRODUCT_B_INCOME; public static final Double SHOP2_INCOME = PACK2A_SALES_INCOME + PACK2B_SALES_INCOME; public static final Product PRODUCT_A = Product.builder() - .id(PRODUCT_A_ID).code(PRODUCT_A_CODE).name(PRODUCT_A_NAME).measure(PRODUCT_A_MEASURE).build(); + .id(PRODUCT_A_ID).code(PRODUCT_A_CODE).name(PRODUCT_A_NAME).measureUnit(PRODUCT_A_MEASURE).build(); public static final Lot LOT_A = Lot.builder() - .id(LOT_A_ID).receivedAt(new Date(5)).amount(LOT_A_AMOUNT).cost(PRODUCT_A_COST).product(PRODUCT_A).build(); + .id(LOT_A_ID).receivedAt(new Date(5)) + .acquiredAmount(LOT_A_AMOUNT) + .costPerUnit(PRODUCT_A_COST) + .product(PRODUCT_A) + .build(); public static final Product PRODUCT_B = Product.builder() - .id(PRODUCT_B_ID).code(PRODUCT_B_CODE).name(PRODUCT_B_NAME).measure(PRODUCT_B_MEASURE).build(); + .id(PRODUCT_B_ID).code(PRODUCT_B_CODE).name(PRODUCT_B_NAME).measureUnit(PRODUCT_B_MEASURE).build(); public static final Lot LOT_B = Lot.builder() - .id(LOT_B_ID).receivedAt(new Date(10)).amount(LOT_B_AMOUNT).cost(PRODUCT_B_COST).product(PRODUCT_B).build(); + .id(LOT_B_ID).receivedAt(new Date(10)) + .acquiredAmount(LOT_B_AMOUNT) + .costPerUnit(PRODUCT_B_COST) + .product(PRODUCT_B) + .build(); public static final Shop SHOP1 = Shop.builder().id(SHOP1_ID).name(SHOP1_NAME).address(SHOP1_ADDRESS).build(); public static final Pack PACK1A = Pack.builder() - .id(PACK1A_ID).deliveredAt(new Date(15)).amount(PACK1A_AMOUNT).lot(LOT_A).shop(SHOP1).build(); + .id(PACK1A_ID).deliveredAt(new Date(15)).receivedAmount(PACK1A_AMOUNT).lot(LOT_A).shop(SHOP1).build(); public static final Offer OFFER1A = Offer.builder() .id(OFFER1A_ID).price(PRODUCT_A_PRICE).createdAt(new Date(15)).pack(PACK1A).build(); public static final Sale SALE_1A35 = Sale.builder() @@ -100,7 +107,7 @@ public class TestUtils { public static final Sale SALE_1A40 = Sale.builder() .id(0x1A35L).registeredAt(new Date(40)).amount(SALE_1A40_AMOUNT).offer(OFFER1A).build(); public static final Pack PACK1B = Pack.builder() - .id(PACK1B_ID).deliveredAt(new Date(20)).amount(PACK1B_AMOUNT).lot(LOT_B).shop(SHOP1).build(); + .id(PACK1B_ID).deliveredAt(new Date(20)).receivedAmount(PACK1B_AMOUNT).lot(LOT_B).shop(SHOP1).build(); public static final Offer OFFER1B = Offer.builder() .id(OFFER1B_ID).price(PRODUCT_B_PRICE).createdAt(new Date(20)).pack(PACK1B).build(); public static final Sale SALE_1B45 = Sale.builder() @@ -109,7 +116,7 @@ public class TestUtils { .id(0x1A35L).registeredAt(new Date(50)).amount(SALE_1B50_AMOUNT).offer(OFFER1B).build(); public static final Shop SHOP2 = Shop.builder().id(SHOP2_ID).name(SHOP2_NAME).address(SHOP2_ADDRESS).build(); public static final Pack PACK2A = Pack.builder() - .id(PACK2A_ID).deliveredAt(new Date(25)).amount(PACK2A_AMOUNT).lot(LOT_A).shop(SHOP2).build(); + .id(PACK2A_ID).deliveredAt(new Date(25)).receivedAmount(PACK2A_AMOUNT).lot(LOT_A).shop(SHOP2).build(); public static final Offer OFFER2A = Offer.builder() .id(OFFER2A_ID).price(PRODUCT_A_PRICE).createdAt(new Date(25)).pack(PACK2A).build(); public static final Sale SALE_2A55 = Sale.builder() @@ -117,20 +124,11 @@ public class TestUtils { public static final Sale SALE_2A60 = Sale.builder() .id(0x1A35L).registeredAt(new Date(60)).amount(SALE_2A60_AMOUNT).offer(OFFER2A).build(); public static final Pack PACK2B = Pack.builder() - .id(PACK2B_ID).deliveredAt(new Date(30)).amount(PACK2B_AMOUNT).lot(LOT_B).shop(SHOP2).build(); + .id(PACK2B_ID).deliveredAt(new Date(30)).receivedAmount(PACK2B_AMOUNT).lot(LOT_B).shop(SHOP2).build(); public static final Offer OFFER2B = Offer.builder() .id(OFFER2B_ID).price(PRODUCT_B_PRICE).createdAt(new Date(30)).pack(PACK2B).build(); public static final Sale SALE_2B65 = Sale.builder() .id(0x1A35L).registeredAt(new Date(65)).amount(SALE_2B65_AMOUNT).offer(OFFER2B).build(); public static final Sale SALE_2B70 = Sale.builder() .id(0x1A35L).registeredAt(new Date(70)).amount(SALE_2B70_AMOUNT).offer(OFFER2B).build(); - - - public static String asJsonString(final Object obj) { - try { - return new ObjectMapper().writeValueAsString(obj); - } catch (Exception e) { - throw new RuntimeException(e); - } - } } diff --git a/src/test/java/com/i8ai/training/store/util/TestHelper.java b/src/test/java/com/i8ai/training/store/util/TestHelper.java index 800e44a..55848f7 100644 --- a/src/test/java/com/i8ai/training/store/util/TestHelper.java +++ b/src/test/java/com/i8ai/training/store/util/TestHelper.java @@ -1,11 +1,14 @@ package com.i8ai.training.store.util; -import com.i8ai.training.store.model.Product; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.i8ai.training.store.model.*; import com.i8ai.training.store.repository.*; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; -import static com.i8ai.training.store.util.TestUtils.*; +import java.util.Date; + +import static com.i8ai.training.store.util.TestConstants.*; @Component @RequiredArgsConstructor @@ -23,21 +26,105 @@ public class TestHelper { private final SaleRepository saleRepository; + public Shop createShop1() { + return shopRepository.save(Shop.builder().name(SHOP1_NAME).address(SHOP1_ADDRESS).build()); + } + + public Shop createShop2() { + return shopRepository.save(Shop.builder().name(SHOP2_NAME).address(SHOP2_ADDRESS).build()); + } + public Product createProductA() { return productRepository.save( - Product.builder().code(PRODUCT_A_CODE).name(PRODUCT_A_NAME).measure(PRODUCT_A_MEASURE).build() + Product.builder().code(PRODUCT_A_CODE).name(PRODUCT_A_NAME).measureUnit(PRODUCT_A_MEASURE).build() ); } public Product createProductB() { return productRepository.save( - Product.builder().code(PRODUCT_B_CODE).name(PRODUCT_B_NAME).measure(PRODUCT_B_MEASURE).build() + Product.builder().code(PRODUCT_B_CODE).name(PRODUCT_B_NAME).measureUnit(PRODUCT_B_MEASURE).build() + ); + } + + public Lot createLotA(Product productA) { + return lotRepository.save(Lot.builder() + .product(productA) + .acquiredAmount(LOT_A_AMOUNT) + .costPerUnit(PRODUCT_A_COST) + .receivedAt(new Date(5)) + .build() + ); + } + + public Lot createLotB(Product productB) { + return lotRepository.save(Lot.builder() + .receivedAt(new Date(10)) + .acquiredAmount(LOT_B_AMOUNT) + .costPerUnit(PRODUCT_B_COST) + .product(productB) + .build() + ); + } + + public Pack createPack1A(Lot lotA, Shop shop1) { + return packRepository.save( + Pack.builder().deliveredAt(new Date(15)).receivedAmount(PACK1A_AMOUNT).lot(lotA).shop(shop1).build()); + } + + public Pack createPack1B(Lot lotB, Shop shop1) { + return packRepository.save( + Pack.builder().deliveredAt(new Date(20)).receivedAmount(PACK1B_AMOUNT).lot(lotB).shop(shop1).build()); + } + + public Pack createPack2A(Lot lotA, Shop shop2) { + return packRepository.save( + Pack.builder().deliveredAt(new Date(25)).receivedAmount(PACK2A_AMOUNT).lot(lotA).shop(shop2).build()); + } + + public Pack createPack2B(Lot lotB, Shop shop2) { + return packRepository.save( + Pack.builder().deliveredAt(new Date(30)).receivedAmount(PACK2B_AMOUNT).lot(lotB).shop(shop2).build()); + } + + public Offer createOffer(Pack pack1A, Double productAPrice) { + return offerRepository.save(Offer.builder().createdAt(new Date()).price(productAPrice).pack(pack1A).build()); + } + + public Sale createSale(Offer offer1A, Double sale1a35Amount) { + return saleRepository.save( + Sale.builder().registeredAt(new Date()).amount(sale1a35Amount).offer(offer1A).build() ); } + public void deleteAllShops() { + shopRepository.deleteAll(); + } + public void deleteAllProducts() { productRepository.deleteAll(); } + public void deleteAllLots() { + lotRepository.deleteAll(); + } + + public void deleteAllPacks() { + packRepository.deleteAll(); + } + + public void deleteAllOffers() { + offerRepository.deleteAll(); + } + + public void deleteAllSales() { + saleRepository.deleteAll(); + } + public String asJsonString(final Object obj) { + try { + return new ObjectMapper().writeValueAsString(obj); + } catch (Exception e) { + throw new RuntimeException(e); + } + } }