diff --git a/core/src/main/java/com/localeat/core/commons/NotificationService.java b/core/src/main/java/com/localeat/core/commons/NotificationService.java new file mode 100644 index 0000000..0133f77 --- /dev/null +++ b/core/src/main/java/com/localeat/core/commons/NotificationService.java @@ -0,0 +1,57 @@ +package com.localeat.core.commons; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.mail.MessagingException; +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.stream.Collectors; + +public interface NotificationService { + + static final Logger LOGGER = LoggerFactory.getLogger(NotificationService.class); + + String getSubject(T object); + + String getRecipient(T object); + + Object[] getTemplateValues(T object); + + EmailService getEmailService(); + + String getBodyTemplatePath(); + + default public void notify(T object) { + String recipient = getRecipient(object); + String subject = getSubject(object); + String body = getBody(object); + sendMail(recipient, subject, body); + }; + + default String getBody(T object){ + String bodyTemplate = getBodyTemplate(); + Object[] bodyTemplateVariables = getTemplateValues(object); + String body = String.format(bodyTemplate, bodyTemplateVariables); + return body; + } + + default String getBodyTemplate() { + try { + return Files.lines(Paths.get(getClass().getClassLoader().getResource(getBodyTemplatePath()).toURI())).collect(Collectors.joining()); + } catch (IOException | URISyntaxException composingMailException) { + LOGGER.error("An exception occured while composing an email.", composingMailException); + return null; + } + } + + default void sendMail(String recipient, String subject, String body) { + try { + getEmailService().sendMail(recipient, subject, body); + } catch (MessagingException messagingException) { + LOGGER.error("An exception occured while sending an email.", messagingException); + } + } +} diff --git a/core/src/main/java/com/localeat/core/domains/delivery/Address.java b/core/src/main/java/com/localeat/core/domains/delivery/Address.java index 32b0bd2..4323b09 100644 --- a/core/src/main/java/com/localeat/core/domains/delivery/Address.java +++ b/core/src/main/java/com/localeat/core/domains/delivery/Address.java @@ -4,7 +4,7 @@ @Entity @Table(name = "addresses") -class Address { +public class Address { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "address_id_generator") diff --git a/core/src/main/java/com/localeat/core/domains/order/Order.java b/core/src/main/java/com/localeat/core/domains/order/Order.java index 437dbf7..8fea874 100644 --- a/core/src/main/java/com/localeat/core/domains/order/Order.java +++ b/core/src/main/java/com/localeat/core/domains/order/Order.java @@ -72,4 +72,5 @@ public OrderStatus getStatus() { public void setStatus(OrderStatus status) { this.status = status; } + } diff --git a/core/src/main/java/com/localeat/core/domains/order/OrderController.java b/core/src/main/java/com/localeat/core/domains/order/OrderController.java index e83ec2d..f81df3e 100644 --- a/core/src/main/java/com/localeat/core/domains/order/OrderController.java +++ b/core/src/main/java/com/localeat/core/domains/order/OrderController.java @@ -28,7 +28,10 @@ public class OrderController { private DeliveryController deliveryController; @Autowired - private OrderNotificationService orderNotificationService; + private OrderNotificationToCustomerService orderNotificationToCustomerService; + + @Autowired + private OrderNotificationToBreederService orderNotificationToBreederService; @PostMapping(path = "/accounts/{account}/orders") public Order createOrder(@PathParam("account") Account account, @RequestBody Order order){ @@ -37,7 +40,8 @@ public Order createOrder(@PathParam("account") Account account, @RequestBody Ord Delivery delivery = deliveryRepository.findById(order.getDelivery().getId()).orElseThrow(); deliveryController.updateQuantitySoldInBatches(delivery); Order orderSaved = orderRepository.save(order); - orderNotificationService.notifyByMail(orderSaved); + orderNotificationToBreederService.notify(orderSaved); + orderNotificationToCustomerService.notify(orderSaved); return orderSaved; } diff --git a/core/src/main/java/com/localeat/core/domains/order/OrderNotificationService.java b/core/src/main/java/com/localeat/core/domains/order/OrderNotificationService.java deleted file mode 100644 index d61bbe4..0000000 --- a/core/src/main/java/com/localeat/core/domains/order/OrderNotificationService.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.localeat.core.domains.order; - -import com.localeat.core.commons.EmailService; -import com.localeat.core.domains.actor.Breeder; -import com.localeat.core.domains.actor.BreederRepository; -import com.localeat.core.domains.product.Batch; -import com.localeat.core.domains.product.BatchRepository; -import com.localeat.core.domains.slaughter.Slaughter; -import com.localeat.core.domains.slaughter.SlaughterRepository; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import javax.mail.MessagingException; -import java.util.stream.Collectors; -import java.util.stream.StreamSupport; - -@Service -public class OrderNotificationService { - - private static final Logger LOGGER = LoggerFactory.getLogger(OrderNotificationService.class); - - @Autowired - private BatchRepository batchRepository; - - @Autowired - private SlaughterRepository slaughterRepository; - - @Autowired - private BreederRepository breederRepository; - - @Autowired - private OrderItemRepository orderItemRepository; - - @Autowired - private EmailService emailService; - - public void notifyByMail(Order order) { - Slaughter slaughter = slaughterRepository.findByDelivery(order.getDelivery()); - Iterable breeders = breederRepository.findBreedersByFarm(slaughter.getAnimal().getFinalFarm()); - String recipient = StreamSupport.stream(breeders.spliterator(), false).map(Breeder::getEmail).collect(Collectors.joining(",")); - String subject = "nouvelle commande !"; - String body = String.format( - "
La commande n° %s a été enregistrée
" + - "
" + - "
    " + - "
  • Client :" + - "
      " + - "
    • Nom : %s %s
    • " + - "
    • Email : %s
    • " + - "
    • Téléphone : %s
    • " + - "
    " + - "
  • " + - "
  • Montant de la commande : %s €TTC
  • " + - "
  • Quantité commandée : %s kg
  • " + - "
" + - "
", - order.getId(), - order.getCustomer().getFirstName(), - order.getCustomer().getName(), - order.getCustomer().getEmail(), - order.getCustomer().getPhoneNumber(), - order.getOrderedItems().stream() - .mapToDouble(item -> { - Batch batch = batchRepository.findById(item.getBatch().getId()).orElseThrow(); - return item.getQuantity() * batch.getProduct().getUnitPrice() * batch.getProduct().getNetWeight(); - }) - .sum(), - order.getOrderedItems().stream().mapToDouble(item -> { - Batch batch = batchRepository.findById(item.getBatch().getId()).orElseThrow(); - return item.getQuantity() * batch.getProduct().getNetWeight(); - }).sum()); - sendMail(recipient, subject, body); - } - - void sendMail(String recipient, String subject, String body) { - try { - emailService.sendMail(recipient, subject, body); - } catch (MessagingException messagingException) { - LOGGER.error("An exception occured while sending an email.", messagingException); - } - } -} diff --git a/core/src/main/java/com/localeat/core/domains/order/OrderNotificationToBreederService.java b/core/src/main/java/com/localeat/core/domains/order/OrderNotificationToBreederService.java new file mode 100644 index 0000000..eb21f1f --- /dev/null +++ b/core/src/main/java/com/localeat/core/domains/order/OrderNotificationToBreederService.java @@ -0,0 +1,97 @@ +package com.localeat.core.domains.order; + +import com.localeat.core.commons.EmailService; +import com.localeat.core.commons.NotificationService; +import com.localeat.core.config.http.HttpConfig; +import com.localeat.core.domains.actor.Breeder; +import com.localeat.core.domains.actor.BreederRepository; +import com.localeat.core.domains.product.Batch; +import com.localeat.core.domains.product.BatchRepository; +import com.localeat.core.domains.slaughter.Slaughter; +import com.localeat.core.domains.slaughter.SlaughterRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.mail.MessagingException; +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +@Service +public class OrderNotificationToBreederService implements NotificationService { + + private static final Logger LOGGER = LoggerFactory.getLogger(OrderNotificationToBreederService.class); + + @Autowired + private BatchRepository batchRepository; + + @Autowired + private SlaughterRepository slaughterRepository; + + @Autowired + private BreederRepository breederRepository; + + @Autowired + private EmailService emailService; + + @Autowired + HttpConfig httpConfig; + + @Override + public String getSubject(Order object) { + return "Nouvelle commande sur ViandeEnDirect.eu"; + } + + @Override + public String getRecipient(Order order) { + Slaughter slaughter = slaughterRepository.findByDelivery(order.getDelivery()); + Iterable breeders = breederRepository.findBreedersByFarm(slaughter.getAnimal().getFinalFarm()); + return StreamSupport.stream(breeders.spliterator(), false).map(Breeder::getEmail).collect(Collectors.joining(",")); + } + + @Override + public String getBodyTemplatePath() { + return "html/notification/notification_to_breeder_body_template.html"; + } + + @Override + public EmailService getEmailService() { + return emailService; + } + + @Override + public Object[] getTemplateValues(Order order) { + Object[] templateValues = { + order.getId(), + httpConfig.getUserInterfaceUrl(), + order.getCustomer().getFirstName(), + order.getCustomer().getName(), + order.getCustomer().getEmail(), + order.getCustomer().getPhoneNumber(), + getTotalPrice(order), + getTotalWeight(order) + }; + return templateValues; + } + + private double getTotalPrice(Order order) { + return order.getOrderedItems().stream() + .mapToDouble(item -> { + Batch batch = batchRepository.findById(item.getBatch().getId()).orElseThrow(); + return item.getQuantity() * batch.getProduct().getUnitPrice() * batch.getProduct().getNetWeight(); + }) + .sum(); + } + + private double getTotalWeight(Order order) { + return order.getOrderedItems().stream().mapToDouble(item -> { + Batch batch = batchRepository.findById(item.getBatch().getId()).orElseThrow(); + return item.getQuantity() * batch.getProduct().getNetWeight(); + }).sum(); + } +} diff --git a/core/src/main/java/com/localeat/core/domains/order/OrderNotificationToCustomerService.java b/core/src/main/java/com/localeat/core/domains/order/OrderNotificationToCustomerService.java new file mode 100644 index 0000000..de41573 --- /dev/null +++ b/core/src/main/java/com/localeat/core/domains/order/OrderNotificationToCustomerService.java @@ -0,0 +1,100 @@ +package com.localeat.core.domains.order; + +import com.localeat.core.commons.EmailService; +import com.localeat.core.commons.NotificationService; +import com.localeat.core.config.http.HttpConfig; +import com.localeat.core.domains.actor.BreederRepository; +import com.localeat.core.domains.delivery.Delivery; +import com.localeat.core.domains.delivery.DeliveryRepository; +import com.localeat.core.domains.product.Batch; +import com.localeat.core.domains.product.BatchRepository; +import com.localeat.core.domains.slaughter.Slaughter; +import com.localeat.core.domains.slaughter.SlaughterRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import static java.util.Optional.ofNullable; + +@Service +public class OrderNotificationToCustomerService implements NotificationService { + + private static final Logger LOGGER = LoggerFactory.getLogger(OrderNotificationToCustomerService.class); + + @Autowired + private BatchRepository batchRepository; + + @Autowired + private SlaughterRepository slaughterRepository; + + @Autowired + private DeliveryRepository deliveryRepository; + + @Autowired + private BreederRepository breederRepository; + + @Autowired + private EmailService emailService; + + @Autowired + HttpConfig httpConfig; + + @Override + public EmailService getEmailService() { + return emailService; + } + + @Override + public String getSubject(Order order) { + return "Confirmation de votre commande sur ViandeEnDirect.eu"; + } + + @Override + public String getRecipient(Order order) { + return order.getCustomer().getEmail(); + } + + @Override + public String getBodyTemplatePath() { + return "html/notification/notification_to_customer_body_template.html"; + } + + @Override + public Object[] getTemplateValues(Order order) { + Slaughter slaughter = slaughterRepository.findByDelivery(order.getDelivery()); + Delivery delivery = deliveryRepository.findById(slaughter.getDelivery().getId()).orElseThrow(); + Object[] bodyTemplateValues = { + order.getId(), + httpConfig.getUserInterfaceUrl(), + getTotalPrice(order), + getTotalWeight(order), + delivery.getDeliveryStart(), + delivery.getDeliveryEnd(), + delivery.getDeliveryAddress().getName(), + ofNullable(delivery.getDeliveryAddress().getAddressLine1()).orElse(""), + ofNullable(delivery.getDeliveryAddress().getAddressLine2()).orElse(""), + ofNullable(delivery.getDeliveryAddress().getAddressLine3()).orElse(""), + ofNullable(delivery.getDeliveryAddress().getAddressLine4()).orElse(""), + delivery.getDeliveryAddress().getZipCode(), + delivery.getDeliveryAddress().getCity() + }; + return bodyTemplateValues; + } + + private double getTotalPrice(Order order) { + return order.getOrderedItems().stream() + .mapToDouble(item -> { + Batch batch = batchRepository.findById(item.getBatch().getId()).orElseThrow(); + return item.getQuantity() * batch.getProduct().getUnitPrice() * batch.getProduct().getNetWeight(); + }) + .sum(); + } + + private double getTotalWeight(Order order) { + return order.getOrderedItems().stream().mapToDouble(item -> { + Batch batch = batchRepository.findById(item.getBatch().getId()).orElseThrow(); + return item.getQuantity() * batch.getProduct().getNetWeight(); + }).sum(); + } +} diff --git a/core/src/main/resources/html/notification/notification_to_breeder_body_template.html b/core/src/main/resources/html/notification/notification_to_breeder_body_template.html new file mode 100644 index 0000000..cbe3fe9 --- /dev/null +++ b/core/src/main/resources/html/notification/notification_to_breeder_body_template.html @@ -0,0 +1,15 @@ + +
La commande n° %s a été enregistrée sur ViandeEnDirect.eu.
+
+
    +
  • Client : +
      +
    • Nom : %s %s
    • +
    • Email : %s
    • +
    • Téléphone : %s
    • +
    +
  • +
  • Montant de la commande : %s €TTC
  • +
  • Quantité commandée : %s kg
  • +
+
\ No newline at end of file diff --git a/core/src/main/resources/html/notification/notification_to_customer_body_template.html b/core/src/main/resources/html/notification/notification_to_customer_body_template.html new file mode 100644 index 0000000..6d7aaf0 --- /dev/null +++ b/core/src/main/resources/html/notification/notification_to_customer_body_template.html @@ -0,0 +1,18 @@ + +
La commande n° %1$s a été enregistrée sur ViandeEnDirect.eu.
+
+
    +
  • Montant de la commande : %3$s €TTC
  • +
  • Quantité commandée : %4$s kg
  • +
  • Date et heure de la livraison : le %5$td/%5$tm/%5$tY entre %5$tR et %6$tR
  • +
  • Adresse de la livraison :
    + %7$s
    + %8$s
    + %9$s
    + %10$s
    + %11$s
    + %12$s
    + %13$s
    +
  • +
+
\ No newline at end of file diff --git a/core/src/test/java/com/localeat/core/domains/delivery/TestAndDocDeliveryController.java b/core/src/test/java/com/localeat/core/domains/delivery/TestAndDocDeliveryController.java index bf97baf..ab6fee7 100644 --- a/core/src/test/java/com/localeat/core/domains/delivery/TestAndDocDeliveryController.java +++ b/core/src/test/java/com/localeat/core/domains/delivery/TestAndDocDeliveryController.java @@ -124,13 +124,13 @@ public void getOrdersByDelivery() throws Exception { " \"name\" : \"Chez Bob\",\n" + " \"city\" : \"Atlantic\",\n" + " \"zipCode\" : \"10000\",\n" + - " \"addressLine1\" : \"2 rue des pommier\",\n" + + " \"addressLine1\" : \"2 rue des pommiers\",\n" + " \"addressLine2\" : null,\n" + " \"addressLine3\" : null,\n" + " \"addressLine4\" : null\n" + " },\n" + - " \"deliveryStart\" : \"2020-01-01T20:00:00\",\n" + - " \"deliveryEnd\" : \"2020-01-01T18:00:00\",\n" + + " \"deliveryStart\" : \"2020-01-01T18:00:00\",\n" + + " \"deliveryEnd\" : \"2020-01-01T20:00:00\",\n" + " \"availableBatches\" : [ {\n" + " \"id\" : 1,\n" + " \"quantity\" : 50,\n" + @@ -191,13 +191,13 @@ public void getOrdersByDelivery() throws Exception { " \"name\" : \"Chez Bob\",\n" + " \"city\" : \"Atlantic\",\n" + " \"zipCode\" : \"10000\",\n" + - " \"addressLine1\" : \"2 rue des pommier\",\n" + + " \"addressLine1\" : \"2 rue des pommiers\",\n" + " \"addressLine2\" : null,\n" + " \"addressLine3\" : null,\n" + " \"addressLine4\" : null\n" + " },\n" + - " \"deliveryStart\" : \"2020-01-01T20:00:00\",\n" + - " \"deliveryEnd\" : \"2020-01-01T18:00:00\",\n" + + " \"deliveryStart\" : \"2020-01-01T18:00:00\",\n" + + " \"deliveryEnd\" : \"2020-01-01T20:00:00\",\n" + " \"availableBatches\" : [ {\n" + " \"id\" : 1,\n" + " \"quantity\" : 50,\n" + diff --git a/core/src/test/java/com/localeat/core/domains/order/TestAndDocOrderController.java b/core/src/test/java/com/localeat/core/domains/order/TestAndDocOrderController.java index 2fb4f43..8db9269 100644 --- a/core/src/test/java/com/localeat/core/domains/order/TestAndDocOrderController.java +++ b/core/src/test/java/com/localeat/core/domains/order/TestAndDocOrderController.java @@ -137,13 +137,13 @@ public void getOrderByCustomer() throws Exception { " \"name\" : \"Chez Bob\",\n" + " \"city\" : \"Atlantic\",\n" + " \"zipCode\" : \"10000\",\n" + - " \"addressLine1\" : \"2 rue des pommier\",\n" + + " \"addressLine1\" : \"2 rue des pommiers\",\n" + " \"addressLine2\" : null,\n" + " \"addressLine3\" : null,\n" + " \"addressLine4\" : null\n" + " },\n" + - " \"deliveryStart\" : \"2020-01-01T20:00:00\",\n" + - " \"deliveryEnd\" : \"2020-01-01T18:00:00\",\n" + + " \"deliveryStart\" : \"2020-01-01T18:00:00\",\n" + + " \"deliveryEnd\" : \"2020-01-01T20:00:00\",\n" + " \"availableBatches\" : [ {\n" + " \"id\" : 1,\n" + " \"quantity\" : 50,\n" + @@ -204,13 +204,13 @@ public void getOrderByCustomer() throws Exception { " \"name\" : \"Chez Bob\",\n" + " \"city\" : \"Atlantic\",\n" + " \"zipCode\" : \"10000\",\n" + - " \"addressLine1\" : \"2 rue des pommier\",\n" + + " \"addressLine1\" : \"2 rue des pommiers\",\n" + " \"addressLine2\" : null,\n" + " \"addressLine3\" : null,\n" + " \"addressLine4\" : null\n" + " },\n" + - " \"deliveryStart\" : \"2020-01-08T20:00:00\",\n" + - " \"deliveryEnd\" : \"2020-01-08T18:00:00\",\n" + + " \"deliveryStart\" : \"2020-01-08T18:00:00\",\n" + + " \"deliveryEnd\" : \"2020-01-08T20:00:00\",\n" + " \"availableBatches\" : [ {\n" + " \"id\" : 1,\n" + " \"quantity\" : 50,\n" + diff --git a/core/src/test/java/com/localeat/core/domains/order/TestOrderNotificationService.java b/core/src/test/java/com/localeat/core/domains/order/TestOrderNotificationService_notifyOrderByMailToBreeder.java similarity index 57% rename from core/src/test/java/com/localeat/core/domains/order/TestOrderNotificationService.java rename to core/src/test/java/com/localeat/core/domains/order/TestOrderNotificationService_notifyOrderByMailToBreeder.java index a924a16..7b76690 100644 --- a/core/src/test/java/com/localeat/core/domains/order/TestOrderNotificationService.java +++ b/core/src/test/java/com/localeat/core/domains/order/TestOrderNotificationService_notifyOrderByMailToBreeder.java @@ -1,6 +1,9 @@ package com.localeat.core.domains.order; +import com.localeat.core.config.http.HttpConfig; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.jdbc.Sql; @@ -28,41 +31,49 @@ "/sql/delete/com/localeat/domains/farm/test_data.sql", "/sql/delete/com/localeat/domains/security/test_data.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) -public class TestOrderNotificationService { +public class TestOrderNotificationService_notifyOrderByMailToBreeder { @Autowired OrderRepository orderRepository; @Autowired - OrderNotificationService service; + OrderNotificationToBreederService service; + + @Autowired + HttpConfig httpConfig; @Test - public void notifyByMail_should_format_a_mail_correctly() { + public void should_format_a_mail_correctly() { // given - OrderNotificationService spyedService = spy(service); + OrderNotificationToBreederService spyedService = spy(service); doNothing().when(spyedService).sendMail(anyString(), anyString(), anyString()); Order order = orderRepository.findById(1L).orElseThrow(); // when - spyedService.notifyByMail(order); + spyedService.notify(order); // then + ArgumentCaptor mailBodyCaptor = ArgumentCaptor.forClass(String.class); verify(spyedService).sendMail( eq("benjamin@ferme-du-ruisseau.fr"), - eq("nouvelle commande !"), - eq("
La commande n° 1 a été enregistrée
" + - "
" + + eq("Nouvelle commande sur ViandeEnDirect.eu"), + mailBodyCaptor.capture()); + String mailBody = mailBodyCaptor.getValue(); + String cleanMailBody = mailBody.replaceAll("( {4})*", ""); + Assertions.assertThat(cleanMailBody).isEqualTo(String.format("" + + "
La commande n° 1 a été enregistrée sur ViandeEnDirect.eu.
" + + "
" + + "
    " + + "
  • Client :" + "
      " + - "
    • Client :" + - "
        " + - "
      • Nom : Virginie WALTER
      • " + - "
      • Email : virginie@mail.fr
      • " + - "
      • Téléphone : 04 32 10 98 87
      • " + - "
      " + - "
    • " + - "
    • Montant de la commande : 1350.0 €TTC
    • " + - "
    • Quantité commandée : 100.0 kg
    • " + + "
    • Nom : Virginie WALTER
    • " + + "
    • Email : virginie@mail.fr
    • " + + "
    • Téléphone : 04 32 10 98 87
    • " + "
    " + - "
")); + "" + + "
  • Montant de la commande : 1350.0 €TTC
  • " + + "
  • Quantité commandée : 100.0 kg
  • " + + "" + + "
    ", httpConfig.getUserInterfaceUrl())); } -} +} \ No newline at end of file diff --git a/core/src/test/java/com/localeat/core/domains/order/TestOrderNotificationService_notifyOrderByMailToCustomer.java b/core/src/test/java/com/localeat/core/domains/order/TestOrderNotificationService_notifyOrderByMailToCustomer.java new file mode 100644 index 0000000..fe84ecc --- /dev/null +++ b/core/src/test/java/com/localeat/core/domains/order/TestOrderNotificationService_notifyOrderByMailToCustomer.java @@ -0,0 +1,82 @@ +package com.localeat.core.domains.order; + +import com.localeat.core.config.http.HttpConfig; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.jdbc.Sql; + +import static org.mockito.Mockito.*; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@Sql(value = { + "/sql/create/com/localeat/domains/security/schema.sql", + "/sql/create/com/localeat/domains/security/security_test_data.sql", + "/sql/create/com/localeat/domains/farm/farm_test_data.sql", + "/sql/create/com/localeat/domains/actor/customer_test_data.sql", + "/sql/create/com/localeat/domains/actor/breeder_test_data.sql", + "/sql/create/com/localeat/domains/delivery/address_test_data.sql", + "/sql/create/com/localeat/domains/product/product_test_data.sql", + "/sql/create/com/localeat/domains/slaughter/slaughter_test_data.sql", + "/sql/create/com/localeat/domains/delivery/delivery_test_data.sql", + "/sql/create/com/localeat/domains/order/order_test_data.sql", +}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) +@Sql(value = { + "/sql/delete/com/localeat/domains/order/test_data.sql", + "/sql/delete/com/localeat/domains/delivery/test_data.sql", + "/sql/delete/com/localeat/domains/slaughter/test_data.sql", + "/sql/delete/com/localeat/domains/actor/test_data.sql", + "/sql/delete/com/localeat/domains/farm/test_data.sql", + "/sql/delete/com/localeat/domains/security/test_data.sql" +}, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) +public class TestOrderNotificationService_notifyOrderByMailToCustomer { + + @Autowired + OrderRepository orderRepository; + + @Autowired + OrderNotificationToCustomerService service; + + @Autowired + HttpConfig httpConfig; + + @Test + public void should_format_a_mail_correctly() { + // given + OrderNotificationToCustomerService spyedService = spy(service); + doNothing().when(spyedService).sendMail(anyString(), anyString(), anyString()); + Order order = orderRepository.findById(1L).orElseThrow(); + + // when + spyedService.notify(order); + + // then + ArgumentCaptor mailBodyCaptor = ArgumentCaptor.forClass(String.class); + verify(spyedService).sendMail( + eq("virginie@mail.fr"), + eq("Confirmation de votre commande sur ViandeEnDirect.eu"), + mailBodyCaptor.capture()); + String mailBody = mailBodyCaptor.getValue(); + String cleanMailBody = mailBody.replaceAll("( {4})*", ""); + Assertions.assertThat(cleanMailBody).isEqualTo(String.format("" + + "
    La commande n° 1 a été enregistrée sur ViandeEnDirect.eu.
    " + + "
    " + + "
      " + + "
    • Montant de la commande : 1350.0 €TTC
    • " + + "
    • Quantité commandée : 100.0 kg
    • " + + "
    • Date et heure de la livraison : le 01/01/2020 entre 18:00 et 20:00
    • " + + "
    • Adresse de la livraison :
      " + + "Chez Bob
      " + + "2 rue des pommiers
      " + + "
      " + + "
      " + + "
      " + + "10000
      " + + "Atlantic
      " + + "
    • " + + "
    " + + "
    ", httpConfig.getUserInterfaceUrl())); + } +} \ No newline at end of file diff --git a/core/src/test/java/com/localeat/core/domains/product/TestAndDocProductController.java b/core/src/test/java/com/localeat/core/domains/product/TestAndDocProductController.java index 4847cf8..515e0a1 100644 --- a/core/src/test/java/com/localeat/core/domains/product/TestAndDocProductController.java +++ b/core/src/test/java/com/localeat/core/domains/product/TestAndDocProductController.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.MockitoAnnotations; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.restdocs.RestDocumentationContextProvider; diff --git a/core/src/test/resources/sql/create/com/localeat/domains/delivery/address_test_data.sql b/core/src/test/resources/sql/create/com/localeat/domains/delivery/address_test_data.sql index 0748ad9..93aa0bd 100644 --- a/core/src/test/resources/sql/create/com/localeat/domains/delivery/address_test_data.sql +++ b/core/src/test/resources/sql/create/com/localeat/domains/delivery/address_test_data.sql @@ -9,7 +9,7 @@ insert into addresses ( zip_code) values ( 1, - '2 rue des pommier', + '2 rue des pommiers', null, null, null, diff --git a/core/src/test/resources/sql/create/com/localeat/domains/delivery/delivery_test_data.sql b/core/src/test/resources/sql/create/com/localeat/domains/delivery/delivery_test_data.sql index 96896ab..b2315cd 100644 --- a/core/src/test/resources/sql/create/com/localeat/domains/delivery/delivery_test_data.sql +++ b/core/src/test/resources/sql/create/com/localeat/domains/delivery/delivery_test_data.sql @@ -1,8 +1,8 @@ insert into deliveries ( id, delivery_address_id, - delivery_end, - delivery_start) + delivery_start, + delivery_end) values ( 1, 1, @@ -13,8 +13,8 @@ values ( insert into deliveries ( id, delivery_address_id, - delivery_end, - delivery_start) + delivery_start, + delivery_end) values ( 2, 1,