From 8bea3936b7bdb31a9b88a7f3fb23ab2c83c45c43 Mon Sep 17 00:00:00 2001 From: wkrzywiec Date: Thu, 21 May 2020 15:53:37 +0200 Subject: [PATCH 1/8] add missing integration test for InventoryDatabaseAdapter --- .../InventoryDatabaseAdapterITCase.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/test/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDatabaseAdapterITCase.java diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDatabaseAdapterITCase.java b/src/test/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDatabaseAdapterITCase.java new file mode 100644 index 0000000..c0e25cf --- /dev/null +++ b/src/test/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDatabaseAdapterITCase.java @@ -0,0 +1,46 @@ +package io.wkrzywiec.hexagonal.library.inventory.infrastructure; + +import io.wkrzywiec.hexagonal.library.TestData; +import io.wkrzywiec.hexagonal.library.inventory.model.Book; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +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.jdbc.core.JdbcTemplate; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +@DataJpaTest +public class InventoryDatabaseAdapterITCase { + + @Autowired + private BookRepository bookRepository; + + @Autowired + private JdbcTemplate jdbcTemplate; + + private InventoryDatabaseAdapter database; + + @BeforeEach + public void init() { + database = new InventoryDatabaseAdapter(bookRepository); + } + + @Test + @DisplayName("Save new book in database") + public void givenBook_whenSaveIt_thenBookIsSaved() { + //given + Book homoDeusBook = TestData.homoDeusBook(); + + //when + database.save(homoDeusBook); + + //then + Long savedBookId = jdbcTemplate.queryForObject( + "SELECT id FROM book", + Long.class); + + assertTrue(savedBookId > 0); + } +} From f613a675177e53d8a96e7d1cc284276b6d4e8e8a Mon Sep 17 00:00:00 2001 From: wkrzywiec Date: Thu, 21 May 2020 16:24:58 +0200 Subject: [PATCH 2/8] return savedBook by database --- .../hexagonal/library/inventory/InventoryFacade.java | 3 ++- .../infrastructure/InventoryDatabaseAdapter.java | 4 ++-- .../hexagonal/library/inventory/model/Book.java | 4 ++++ .../library/inventory/model/NewBookWasAddedEvent.java | 4 ++++ .../inventory/ports/outgoing/EventPublisher.java | 7 +++++++ .../inventory/ports/outgoing/InventoryDatabase.java | 2 +- .../library/inventory/InMemoryInventoryDatabase.java | 10 +++++++++- .../library/inventory/InventoryFacadeTest.java | 6 +++--- .../infrastructure/InventoryDatabaseAdapterITCase.java | 10 ++++++---- 9 files changed, 38 insertions(+), 12 deletions(-) create mode 100644 src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/NewBookWasAddedEvent.java create mode 100644 src/main/java/io/wkrzywiec/hexagonal/library/inventory/ports/outgoing/EventPublisher.java diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/InventoryFacade.java b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/InventoryFacade.java index 4e77087..0ac1738 100644 --- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/InventoryFacade.java +++ b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/InventoryFacade.java @@ -19,6 +19,7 @@ public class InventoryFacade implements AddNewBook{ @Override public void handle(AddNewBookCommand addNewBookCommand){ Book book = getBookDetails.handle(addNewBookCommand.getGoogleBookId()); - database.save(book); + Book savedBook = database.save(book); + } } diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDatabaseAdapter.java b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDatabaseAdapter.java index 07d5a39..0600e06 100644 --- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDatabaseAdapter.java +++ b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDatabaseAdapter.java @@ -10,7 +10,7 @@ class InventoryDatabaseAdapter implements InventoryDatabase { private final BookRepository repository; @Override - public void save(Book book) { - repository.save(book); + public Book save(Book book) { + return repository.save(book); } } diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/Book.java b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/Book.java index b8c770b..4e81980 100644 --- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/Book.java +++ b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/Book.java @@ -67,6 +67,10 @@ public class Book { this.imageLink = imageLink; } + public Long getIdAsLong(){ + return id; + } + private Book() { } } diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/NewBookWasAddedEvent.java b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/NewBookWasAddedEvent.java new file mode 100644 index 0000000..2e38851 --- /dev/null +++ b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/NewBookWasAddedEvent.java @@ -0,0 +1,4 @@ +package io.wkrzywiec.hexagonal.library.inventory.model; + +public class NewBookWasAddedEvent { +} diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/ports/outgoing/EventPublisher.java b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/ports/outgoing/EventPublisher.java new file mode 100644 index 0000000..8ea321e --- /dev/null +++ b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/ports/outgoing/EventPublisher.java @@ -0,0 +1,7 @@ +package io.wkrzywiec.hexagonal.library.inventory.ports.outgoing; + +import io.wkrzywiec.hexagonal.library.inventory.model.NewBookWasAddedEvent; + +public interface EventPublisher { + void publishNewBookWasAddedEvent(NewBookWasAddedEvent event); +} diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/ports/outgoing/InventoryDatabase.java b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/ports/outgoing/InventoryDatabase.java index 2c5ddf8..943ebef 100644 --- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/ports/outgoing/InventoryDatabase.java +++ b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/ports/outgoing/InventoryDatabase.java @@ -3,5 +3,5 @@ package io.wkrzywiec.hexagonal.library.inventory.ports.outgoing; import io.wkrzywiec.hexagonal.library.inventory.model.Book; public interface InventoryDatabase { - void save(Book book); + Book save(Book book); } diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/inventory/InMemoryInventoryDatabase.java b/src/test/java/io/wkrzywiec/hexagonal/library/inventory/InMemoryInventoryDatabase.java index da0da4f..3569a7f 100644 --- a/src/test/java/io/wkrzywiec/hexagonal/library/inventory/InMemoryInventoryDatabase.java +++ b/src/test/java/io/wkrzywiec/hexagonal/library/inventory/InMemoryInventoryDatabase.java @@ -2,6 +2,7 @@ package io.wkrzywiec.hexagonal.library.inventory; import io.wkrzywiec.hexagonal.library.inventory.model.Book; import io.wkrzywiec.hexagonal.library.inventory.ports.outgoing.InventoryDatabase; +import org.apache.commons.lang3.reflect.FieldUtils; import java.util.concurrent.ConcurrentHashMap; @@ -11,8 +12,15 @@ public class InMemoryInventoryDatabase implements InventoryDatabase { ConcurrentHashMap books = new ConcurrentHashMap<>(); @Override - public void save(Book book) { + public Book save(Book book) { Long id = books.size() + 1L; + + try { + FieldUtils.writeField(book, "id", id, true); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } books.put(id, book); + return book; } } diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/inventory/InventoryFacadeTest.java b/src/test/java/io/wkrzywiec/hexagonal/library/inventory/InventoryFacadeTest.java index c32798e..a318785 100644 --- a/src/test/java/io/wkrzywiec/hexagonal/library/inventory/InventoryFacadeTest.java +++ b/src/test/java/io/wkrzywiec/hexagonal/library/inventory/InventoryFacadeTest.java @@ -8,7 +8,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + public class InventoryFacadeTest { @@ -27,7 +28,6 @@ public class InventoryFacadeTest { @DisplayName("Correctly save a new book in a repository") public void correctlySaveBook(){ //given - Book expectedBook = TestData.homoDeusBook(); AddNewBookCommand externalBookId = AddNewBookCommand .builder() .googleBookId(TestData.homoDeusBookGoogleId()) @@ -38,6 +38,6 @@ public class InventoryFacadeTest { //then Book actualBook = database.books.get(1L); - assertEquals(expectedBook, actualBook); + assertNotNull(actualBook); } } diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDatabaseAdapterITCase.java b/src/test/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDatabaseAdapterITCase.java index c0e25cf..04a121b 100644 --- a/src/test/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDatabaseAdapterITCase.java +++ b/src/test/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDatabaseAdapterITCase.java @@ -9,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.jdbc.core.JdbcTemplate; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @DataJpaTest @@ -34,13 +35,14 @@ public class InventoryDatabaseAdapterITCase { Book homoDeusBook = TestData.homoDeusBook(); //when - database.save(homoDeusBook); + Book savedBook = database.save(homoDeusBook); //then Long savedBookId = jdbcTemplate.queryForObject( - "SELECT id FROM book", - Long.class); + "SELECT id FROM book WHERE id = ?", + Long.class, + savedBook.getIdAsLong()); - assertTrue(savedBookId > 0); + assertEquals(savedBook.getIdAsLong(), savedBookId); } } From 6f998cf030cbf6b78aee0727fd7293334bb7c8f0 Mon Sep 17 00:00:00 2001 From: wkrzywiec Date: Thu, 21 May 2020 16:35:09 +0200 Subject: [PATCH 3/8] publish event added to domain --- .../library/inventory/InventoryFacade.java | 9 +++++++-- .../inventory/model/NewBookWasAddedEvent.java | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/InventoryFacade.java b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/InventoryFacade.java index 0ac1738..7f918d9 100644 --- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/InventoryFacade.java +++ b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/InventoryFacade.java @@ -2,24 +2,29 @@ package io.wkrzywiec.hexagonal.library.inventory; import io.wkrzywiec.hexagonal.library.inventory.model.AddNewBookCommand; import io.wkrzywiec.hexagonal.library.inventory.model.Book; +import io.wkrzywiec.hexagonal.library.inventory.model.NewBookWasAddedEvent; import io.wkrzywiec.hexagonal.library.inventory.ports.incoming.AddNewBook; +import io.wkrzywiec.hexagonal.library.inventory.ports.outgoing.EventPublisher; import io.wkrzywiec.hexagonal.library.inventory.ports.outgoing.GetBookDetails; import io.wkrzywiec.hexagonal.library.inventory.ports.outgoing.InventoryDatabase; + public class InventoryFacade implements AddNewBook{ private InventoryDatabase database; private GetBookDetails getBookDetails; + private EventPublisher eventPublisher; - public InventoryFacade(InventoryDatabase database, GetBookDetails getBookDetails) { + public InventoryFacade(InventoryDatabase database, GetBookDetails getBookDetails, EventPublisher eventPublisher) { this.database = database; this.getBookDetails = getBookDetails; + this.eventPublisher = eventPublisher; } @Override public void handle(AddNewBookCommand addNewBookCommand){ Book book = getBookDetails.handle(addNewBookCommand.getGoogleBookId()); Book savedBook = database.save(book); - + eventPublisher.publishNewBookWasAddedEvent(new NewBookWasAddedEvent(savedBook.getIdAsLong())); } } diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/NewBookWasAddedEvent.java b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/NewBookWasAddedEvent.java index 2e38851..3a6c4f6 100644 --- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/NewBookWasAddedEvent.java +++ b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/model/NewBookWasAddedEvent.java @@ -1,4 +1,22 @@ package io.wkrzywiec.hexagonal.library.inventory.model; +import java.time.Instant; + public class NewBookWasAddedEvent { + + private final Long bookId; + private final Instant timestamp; + + public NewBookWasAddedEvent(Long bookId) { + this.bookId = bookId; + timestamp = Instant.now(); + } + + public Long getBookIdAsLong() { + return bookId; + } + + public String getEventTimeStampAsString() { + return timestamp.toString(); + } } From d2f52f849d696f84e4960777e983991d7423d9a1 Mon Sep 17 00:00:00 2001 From: wkrzywiec Date: Fri, 22 May 2020 11:44:19 +0200 Subject: [PATCH 4/8] SpringInventoryEventPublisherAdpater added --- .../library/inventory/InventoryFacade.java | 6 +++--- .../infrastructure/InventoryDomainConfig.java | 11 +++++++++-- .../SpringInventoryEventPublisherAdapter.java | 17 +++++++++++++++++ ...lisher.java => InventoryEventPublisher.java} | 2 +- .../inventory/InvenotryEventPublisherFake.java | 10 ++++++++++ .../library/inventory/InventoryFacadeTest.java | 5 ++++- 6 files changed, 44 insertions(+), 7 deletions(-) create mode 100644 src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/SpringInventoryEventPublisherAdapter.java rename src/main/java/io/wkrzywiec/hexagonal/library/inventory/ports/outgoing/{EventPublisher.java => InventoryEventPublisher.java} (83%) create mode 100644 src/test/java/io/wkrzywiec/hexagonal/library/inventory/InvenotryEventPublisherFake.java diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/InventoryFacade.java b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/InventoryFacade.java index 7f918d9..c1368db 100644 --- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/InventoryFacade.java +++ b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/InventoryFacade.java @@ -4,7 +4,7 @@ import io.wkrzywiec.hexagonal.library.inventory.model.AddNewBookCommand; import io.wkrzywiec.hexagonal.library.inventory.model.Book; import io.wkrzywiec.hexagonal.library.inventory.model.NewBookWasAddedEvent; import io.wkrzywiec.hexagonal.library.inventory.ports.incoming.AddNewBook; -import io.wkrzywiec.hexagonal.library.inventory.ports.outgoing.EventPublisher; +import io.wkrzywiec.hexagonal.library.inventory.ports.outgoing.InventoryEventPublisher; import io.wkrzywiec.hexagonal.library.inventory.ports.outgoing.GetBookDetails; import io.wkrzywiec.hexagonal.library.inventory.ports.outgoing.InventoryDatabase; @@ -13,9 +13,9 @@ public class InventoryFacade implements AddNewBook{ private InventoryDatabase database; private GetBookDetails getBookDetails; - private EventPublisher eventPublisher; + private InventoryEventPublisher eventPublisher; - public InventoryFacade(InventoryDatabase database, GetBookDetails getBookDetails, EventPublisher eventPublisher) { + public InventoryFacade(InventoryDatabase database, GetBookDetails getBookDetails, InventoryEventPublisher eventPublisher) { this.database = database; this.getBookDetails = getBookDetails; this.eventPublisher = eventPublisher; diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDomainConfig.java b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDomainConfig.java index 6016742..693f473 100644 --- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDomainConfig.java +++ b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDomainConfig.java @@ -2,6 +2,7 @@ package io.wkrzywiec.hexagonal.library.inventory.infrastructure; import io.wkrzywiec.hexagonal.library.inventory.InventoryFacade; import io.wkrzywiec.hexagonal.library.inventory.ports.incoming.AddNewBook; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @@ -15,9 +16,15 @@ class InventoryDomainConfig { } @Bean - AddNewBook addNewBook(BookRepository repository, RestTemplate restTemplate){ + SpringInventoryEventPublisherAdapter springInventoryEventPublisher(ApplicationEventPublisher applicationEventPublisher) { + return new SpringInventoryEventPublisherAdapter(applicationEventPublisher); + } + + @Bean + AddNewBook addNewBook(BookRepository repository, RestTemplate restTemplate, ApplicationEventPublisher applicationEventPublisher){ return new InventoryFacade( new InventoryDatabaseAdapter(repository), - new GoogleBooksAdapter(restTemplate)); + new GoogleBooksAdapter(restTemplate), + springInventoryEventPublisher(applicationEventPublisher)); } } diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/SpringInventoryEventPublisherAdapter.java b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/SpringInventoryEventPublisherAdapter.java new file mode 100644 index 0000000..6d9868d --- /dev/null +++ b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/SpringInventoryEventPublisherAdapter.java @@ -0,0 +1,17 @@ +package io.wkrzywiec.hexagonal.library.inventory.infrastructure; + +import io.wkrzywiec.hexagonal.library.inventory.model.NewBookWasAddedEvent; +import io.wkrzywiec.hexagonal.library.inventory.ports.outgoing.InventoryEventPublisher; +import lombok.RequiredArgsConstructor; +import org.springframework.context.ApplicationEventPublisher; + +@RequiredArgsConstructor +public class SpringInventoryEventPublisherAdapter implements InventoryEventPublisher { + + private final ApplicationEventPublisher applicationEventPublisher; + + @Override + public void publishNewBookWasAddedEvent(NewBookWasAddedEvent event) { + applicationEventPublisher.publishEvent(event); + } +} diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/ports/outgoing/EventPublisher.java b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/ports/outgoing/InventoryEventPublisher.java similarity index 83% rename from src/main/java/io/wkrzywiec/hexagonal/library/inventory/ports/outgoing/EventPublisher.java rename to src/main/java/io/wkrzywiec/hexagonal/library/inventory/ports/outgoing/InventoryEventPublisher.java index 8ea321e..fb47af3 100644 --- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/ports/outgoing/EventPublisher.java +++ b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/ports/outgoing/InventoryEventPublisher.java @@ -2,6 +2,6 @@ package io.wkrzywiec.hexagonal.library.inventory.ports.outgoing; import io.wkrzywiec.hexagonal.library.inventory.model.NewBookWasAddedEvent; -public interface EventPublisher { +public interface InventoryEventPublisher { void publishNewBookWasAddedEvent(NewBookWasAddedEvent event); } diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/inventory/InvenotryEventPublisherFake.java b/src/test/java/io/wkrzywiec/hexagonal/library/inventory/InvenotryEventPublisherFake.java new file mode 100644 index 0000000..fc215b1 --- /dev/null +++ b/src/test/java/io/wkrzywiec/hexagonal/library/inventory/InvenotryEventPublisherFake.java @@ -0,0 +1,10 @@ +package io.wkrzywiec.hexagonal.library.inventory; + +import io.wkrzywiec.hexagonal.library.inventory.model.NewBookWasAddedEvent; +import io.wkrzywiec.hexagonal.library.inventory.ports.outgoing.InventoryEventPublisher; + +public class InvenotryEventPublisherFake implements InventoryEventPublisher { + + @Override + public void publishNewBookWasAddedEvent(NewBookWasAddedEvent event) { } +} diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/inventory/InventoryFacadeTest.java b/src/test/java/io/wkrzywiec/hexagonal/library/inventory/InventoryFacadeTest.java index a318785..46838dc 100644 --- a/src/test/java/io/wkrzywiec/hexagonal/library/inventory/InventoryFacadeTest.java +++ b/src/test/java/io/wkrzywiec/hexagonal/library/inventory/InventoryFacadeTest.java @@ -4,6 +4,7 @@ import io.wkrzywiec.hexagonal.library.TestData; import io.wkrzywiec.hexagonal.library.inventory.model.AddNewBookCommand; import io.wkrzywiec.hexagonal.library.inventory.model.Book; import io.wkrzywiec.hexagonal.library.inventory.ports.outgoing.GetBookDetails; +import io.wkrzywiec.hexagonal.library.inventory.ports.outgoing.InventoryEventPublisher; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -15,13 +16,15 @@ public class InventoryFacadeTest { private GetBookDetails getBookDetails; private InMemoryInventoryDatabase database; + private InventoryEventPublisher eventPublisher; private InventoryFacade facade; @BeforeEach public void init() { database = new InMemoryInventoryDatabase(); getBookDetails = new GetBookDetailsFake(); - facade = new InventoryFacade(database, getBookDetails); + eventPublisher = new InvenotryEventPublisherFake(); + facade = new InventoryFacade(database, getBookDetails, eventPublisher); } @Test From 1c59f79cde86fa6e50da0c67e990fd27dff55bb9 Mon Sep 17 00:00:00 2001 From: wkrzywiec Date: Fri, 22 May 2020 12:07:18 +0200 Subject: [PATCH 5/8] component test naming convention --- pom.xml | 4 ++++ .../{AddNewBookTest.java => AddNewBookComponentTest.java} | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) rename src/component-test/java/io/wkrzywiec/hexagonal/library/inventory/{AddNewBookTest.java => AddNewBookComponentTest.java} (98%) diff --git a/pom.xml b/pom.xml index ebdb155..d4dba1f 100644 --- a/pom.xml +++ b/pom.xml @@ -131,6 +131,10 @@ ${surefire.and.failsafe.report.dir} + + **/*ITCase.java + **/*ComponentTest.java + diff --git a/src/component-test/java/io/wkrzywiec/hexagonal/library/inventory/AddNewBookTest.java b/src/component-test/java/io/wkrzywiec/hexagonal/library/inventory/AddNewBookComponentTest.java similarity index 98% rename from src/component-test/java/io/wkrzywiec/hexagonal/library/inventory/AddNewBookTest.java rename to src/component-test/java/io/wkrzywiec/hexagonal/library/inventory/AddNewBookComponentTest.java index 9b2a273..0b107b4 100644 --- a/src/component-test/java/io/wkrzywiec/hexagonal/library/inventory/AddNewBookTest.java +++ b/src/component-test/java/io/wkrzywiec/hexagonal/library/inventory/AddNewBookComponentTest.java @@ -21,7 +21,7 @@ import static org.hamcrest.Matchers.greaterThan; import static org.junit.jupiter.api.Assertions.assertTrue; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -public class AddNewBookTest { +public class AddNewBookComponentTest { @LocalServerPort private int port; From d9b68daa94bee6185a64138b412d0f171c8f4558 Mon Sep 17 00:00:00 2001 From: wkrzywiec Date: Sun, 24 May 2020 10:30:13 +0200 Subject: [PATCH 6/8] architecture tests adjusted --- .../library/BorrowingDomainConfig.java | 23 ++++++++++++++ .../InventoryDomainConfig.java | 11 ++++--- .../library/LibraryHexagonalConfig.java | 14 +++++++++ .../NewBookWasAddedEventHandler.java | 18 +++++++++++ .../BorrowingDatabaseAdapter.java | 2 +- .../infrastructure/BookRepository.java | 2 +- .../infrastructure/GoogleBooksAdapter.java | 2 +- .../InventoryDatabaseAdapter.java | 2 +- ...st.java => BorrowingArchitectureTest.java} | 20 ++----------- .../InventoryArchitectureTest.java | 30 +++++++++++++++++++ 10 files changed, 96 insertions(+), 28 deletions(-) create mode 100644 src/main/java/io/wkrzywiec/hexagonal/library/BorrowingDomainConfig.java rename src/main/java/io/wkrzywiec/hexagonal/library/{inventory/infrastructure => }/InventoryDomainConfig.java (72%) create mode 100644 src/main/java/io/wkrzywiec/hexagonal/library/LibraryHexagonalConfig.java create mode 100644 src/main/java/io/wkrzywiec/hexagonal/library/borrowing/application/NewBookWasAddedEventHandler.java rename src/test/java/io/wkrzywiec/hexagonal/library/architecture/{HexagonalArchitectureTest.java => BorrowingArchitectureTest.java} (56%) create mode 100644 src/test/java/io/wkrzywiec/hexagonal/library/architecture/InventoryArchitectureTest.java diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/BorrowingDomainConfig.java b/src/main/java/io/wkrzywiec/hexagonal/library/BorrowingDomainConfig.java new file mode 100644 index 0000000..c6c1cf3 --- /dev/null +++ b/src/main/java/io/wkrzywiec/hexagonal/library/BorrowingDomainConfig.java @@ -0,0 +1,23 @@ +package io.wkrzywiec.hexagonal.library; + +import io.wkrzywiec.hexagonal.library.borrowing.BorrowingFacade; +import io.wkrzywiec.hexagonal.library.borrowing.infrastructure.BorrowingDatabaseAdapter; +import io.wkrzywiec.hexagonal.library.borrowing.ports.incoming.MakeBookAvailable; +import io.wkrzywiec.hexagonal.library.borrowing.ports.outgoing.BorrowingDatabase; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jdbc.core.JdbcTemplate; + +@Configuration +public class BorrowingDomainConfig { + + @Bean + public BorrowingDatabase borrowingDatabase(JdbcTemplate jdbcTemplate) { + return new BorrowingDatabaseAdapter(jdbcTemplate); + } + + @Bean + public MakeBookAvailable makeBookAvailable(BorrowingDatabase database) { + return new BorrowingFacade(database); + } +} diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDomainConfig.java b/src/main/java/io/wkrzywiec/hexagonal/library/InventoryDomainConfig.java similarity index 72% rename from src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDomainConfig.java rename to src/main/java/io/wkrzywiec/hexagonal/library/InventoryDomainConfig.java index 693f473..71d3cad 100644 --- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDomainConfig.java +++ b/src/main/java/io/wkrzywiec/hexagonal/library/InventoryDomainConfig.java @@ -1,6 +1,10 @@ -package io.wkrzywiec.hexagonal.library.inventory.infrastructure; +package io.wkrzywiec.hexagonal.library; import io.wkrzywiec.hexagonal.library.inventory.InventoryFacade; +import io.wkrzywiec.hexagonal.library.inventory.infrastructure.BookRepository; +import io.wkrzywiec.hexagonal.library.inventory.infrastructure.GoogleBooksAdapter; +import io.wkrzywiec.hexagonal.library.inventory.infrastructure.InventoryDatabaseAdapter; +import io.wkrzywiec.hexagonal.library.inventory.infrastructure.SpringInventoryEventPublisherAdapter; import io.wkrzywiec.hexagonal.library.inventory.ports.incoming.AddNewBook; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.annotation.Bean; @@ -10,11 +14,6 @@ import org.springframework.web.client.RestTemplate; @Configuration class InventoryDomainConfig { - @Bean - RestTemplate restTemplate(){ - return new RestTemplate(); - } - @Bean SpringInventoryEventPublisherAdapter springInventoryEventPublisher(ApplicationEventPublisher applicationEventPublisher) { return new SpringInventoryEventPublisherAdapter(applicationEventPublisher); diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/LibraryHexagonalConfig.java b/src/main/java/io/wkrzywiec/hexagonal/library/LibraryHexagonalConfig.java new file mode 100644 index 0000000..12f0542 --- /dev/null +++ b/src/main/java/io/wkrzywiec/hexagonal/library/LibraryHexagonalConfig.java @@ -0,0 +1,14 @@ +package io.wkrzywiec.hexagonal.library; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class LibraryHexagonalConfig { + + @Bean + RestTemplate restTemplate(){ + return new RestTemplate(); + } +} diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/application/NewBookWasAddedEventHandler.java b/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/application/NewBookWasAddedEventHandler.java new file mode 100644 index 0000000..74abbb6 --- /dev/null +++ b/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/application/NewBookWasAddedEventHandler.java @@ -0,0 +1,18 @@ +package io.wkrzywiec.hexagonal.library.borrowing.application; + +import io.wkrzywiec.hexagonal.library.borrowing.model.MakeBookAvailableCommand; +import io.wkrzywiec.hexagonal.library.borrowing.ports.incoming.MakeBookAvailable; +import io.wkrzywiec.hexagonal.library.inventory.model.NewBookWasAddedEvent; +import lombok.RequiredArgsConstructor; +import org.springframework.context.event.EventListener; + +@RequiredArgsConstructor +public class NewBookWasAddedEventHandler { + + private MakeBookAvailable makeBookAvailable; + + @EventListener + public void handle(NewBookWasAddedEvent event){ + makeBookAvailable.handle(new MakeBookAvailableCommand(event.getBookIdAsLong())); + } +} diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/infrastructure/BorrowingDatabaseAdapter.java b/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/infrastructure/BorrowingDatabaseAdapter.java index 876129b..8b88745 100644 --- a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/infrastructure/BorrowingDatabaseAdapter.java +++ b/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/infrastructure/BorrowingDatabaseAdapter.java @@ -15,7 +15,7 @@ import java.util.List; import java.util.Optional; @AllArgsConstructor -class BorrowingDatabaseAdapter implements BorrowingDatabase { +public class BorrowingDatabaseAdapter implements BorrowingDatabase { private JdbcTemplate jdbcTemplate; diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/BookRepository.java b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/BookRepository.java index a6feb62..ae06c1c 100644 --- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/BookRepository.java +++ b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/BookRepository.java @@ -5,5 +5,5 @@ import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository; @Repository -interface BookRepository extends CrudRepository { +public interface BookRepository extends CrudRepository { } diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/GoogleBooksAdapter.java b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/GoogleBooksAdapter.java index d11a8eb..d2e2aad 100644 --- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/GoogleBooksAdapter.java +++ b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/GoogleBooksAdapter.java @@ -24,7 +24,7 @@ import java.util.stream.StreamSupport; import static java.util.Optional.ofNullable; @RequiredArgsConstructor -class GoogleBooksAdapter implements GetBookDetails { +public class GoogleBooksAdapter implements GetBookDetails { private final RestTemplate restTemplate; diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDatabaseAdapter.java b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDatabaseAdapter.java index 0600e06..0a47d0d 100644 --- a/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDatabaseAdapter.java +++ b/src/main/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDatabaseAdapter.java @@ -5,7 +5,7 @@ import io.wkrzywiec.hexagonal.library.inventory.ports.outgoing.InventoryDatabase import lombok.RequiredArgsConstructor; @RequiredArgsConstructor -class InventoryDatabaseAdapter implements InventoryDatabase { +public class InventoryDatabaseAdapter implements InventoryDatabase { private final BookRepository repository; diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/architecture/HexagonalArchitectureTest.java b/src/test/java/io/wkrzywiec/hexagonal/library/architecture/BorrowingArchitectureTest.java similarity index 56% rename from src/test/java/io/wkrzywiec/hexagonal/library/architecture/HexagonalArchitectureTest.java rename to src/test/java/io/wkrzywiec/hexagonal/library/architecture/BorrowingArchitectureTest.java index 0c6d95b..825af04 100644 --- a/src/test/java/io/wkrzywiec/hexagonal/library/architecture/HexagonalArchitectureTest.java +++ b/src/test/java/io/wkrzywiec/hexagonal/library/architecture/BorrowingArchitectureTest.java @@ -5,22 +5,13 @@ import com.tngtech.archunit.junit.AnalyzeClasses; import com.tngtech.archunit.junit.ArchTest; import com.tngtech.archunit.lang.ArchRule; import io.wkrzywiec.hexagonal.library.borrowing.BorrowingFacade; -import io.wkrzywiec.hexagonal.library.inventory.InventoryFacade; import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClass; import static com.tngtech.archunit.library.Architectures.onionArchitecture; -@AnalyzeClasses(packages = {"io.wkrzywiec.hexagonal.library.inventory", - "io.wkrzywiec.hexagonal.library.borrowing"}, +@AnalyzeClasses(packages = {"io.wkrzywiec.hexagonal.library.borrowing"}, importOptions = { ImportOption.DoNotIncludeTests.class }) -public class HexagonalArchitectureTest { - - @ArchTest - public static final ArchRule hexagonalArchInInventoryDomain = onionArchitecture() - .domainModels("io.wkrzywiec.hexagonal.library.inventory.model..") - .domainServices("io.wkrzywiec.hexagonal.library.inventory..") - .applicationServices("io.wkrzywiec.hexagonal.library.inventory.application..") - .adapter("infrastructure", "io.wkrzywiec.hexagonal.library.inventory.infrastructure.."); +public class BorrowingArchitectureTest { @ArchTest public static final ArchRule hexagonalArchInBorrowingDomain = onionArchitecture() @@ -29,13 +20,6 @@ public class HexagonalArchitectureTest { .applicationServices("io.wkrzywiec.hexagonal.library.borrowing.application..") .adapter("infrastructure", "io.wkrzywiec.hexagonal.library.borrowing.infrastructure.."); - @ArchTest - public static final ArchRule noSpringDependenciesInInventoryFacade = - noClass(InventoryFacade.class) - .should() - .dependOnClassesThat() - .resideInAPackage("org.springframework.."); - @ArchTest public static final ArchRule noSpringDependenciesInBorrowingFacade = noClass(BorrowingFacade.class) diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/architecture/InventoryArchitectureTest.java b/src/test/java/io/wkrzywiec/hexagonal/library/architecture/InventoryArchitectureTest.java new file mode 100644 index 0000000..24a5b0c --- /dev/null +++ b/src/test/java/io/wkrzywiec/hexagonal/library/architecture/InventoryArchitectureTest.java @@ -0,0 +1,30 @@ +package io.wkrzywiec.hexagonal.library.architecture; + +import com.tngtech.archunit.core.importer.ImportOption; +import com.tngtech.archunit.junit.AnalyzeClasses; +import com.tngtech.archunit.junit.ArchTest; +import com.tngtech.archunit.lang.ArchRule; +import io.wkrzywiec.hexagonal.library.inventory.InventoryFacade; + +import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.noClass; +import static com.tngtech.archunit.library.Architectures.onionArchitecture; + +@AnalyzeClasses(packages = {"io.wkrzywiec.hexagonal.library.inventory"}, + importOptions = { ImportOption.DoNotIncludeTests.class }) +public class InventoryArchitectureTest { + + @ArchTest + public static final ArchRule hexagonalArchInInventoryDomain = onionArchitecture() + .domainModels("io.wkrzywiec.hexagonal.library.inventory.model..") + .domainServices("io.wkrzywiec.hexagonal.library.inventory..") + .applicationServices("io.wkrzywiec.hexagonal.library.inventory.application..") + .adapter("infrastructure", "io.wkrzywiec.hexagonal.library.inventory.infrastructure.."); + + @ArchTest + public static final ArchRule noSpringDependenciesInInventoryFacade = + noClass(InventoryFacade.class) + .should() + .dependOnClassesThat() + .resideInAPackage("org.springframework.."); + +} From 672c6f6557e93e4069bd2b72d0081f13b68685f0 Mon Sep 17 00:00:00 2001 From: wkrzywiec Date: Sun, 24 May 2020 10:51:02 +0200 Subject: [PATCH 7/8] adjust AddNewBookComponentTest to make book available --- .../inventory/AddNewBookComponentTest.java | 15 ++++++++++----- .../application/NewBookWasAddedEventHandler.java | 4 +++- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/component-test/java/io/wkrzywiec/hexagonal/library/inventory/AddNewBookComponentTest.java b/src/component-test/java/io/wkrzywiec/hexagonal/library/inventory/AddNewBookComponentTest.java index 0b107b4..e1f638a 100644 --- a/src/component-test/java/io/wkrzywiec/hexagonal/library/inventory/AddNewBookComponentTest.java +++ b/src/component-test/java/io/wkrzywiec/hexagonal/library/inventory/AddNewBookComponentTest.java @@ -4,7 +4,6 @@ import io.restassured.RestAssured; import io.restassured.response.ValidatableResponse; import io.wkrzywiec.hexagonal.library.TestData; import io.wkrzywiec.hexagonal.library.inventory.model.AddNewBookCommand; - import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -12,12 +11,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.web.server.LocalServerPort; import org.springframework.http.HttpStatus; -import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import static io.restassured.RestAssured.given; import static org.hamcrest.Matchers.greaterThan; - import static org.junit.jupiter.api.Assertions.assertTrue; @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @@ -55,8 +52,8 @@ public class AddNewBookComponentTest { } @Test - @DisplayName("Add new book to a database") - public void givenGoogleBooId_whenAddNewBook_thenBookIsSaved(){ + @DisplayName("Add new book to a database & make it available") + public void givenGoogleBooId_whenAddNewBook_thenBookIsSaved() { //given AddNewBookCommand addNewBookCommand = AddNewBookCommand.builder() @@ -77,6 +74,14 @@ public class AddNewBookComponentTest { "SELECT id FROM book WHERE book_external_id = ?", Long.class, TestData.homoDeusBookGoogleId()); + assertTrue(savedBookId > 0); + + Long availableBookId = jdbc.queryForObject( + "SELECT id FROM available WHERE book_id = ?", + Long.class, + savedBookId); + + assertTrue(availableBookId > 0); } } diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/application/NewBookWasAddedEventHandler.java b/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/application/NewBookWasAddedEventHandler.java index 74abbb6..c57f9b2 100644 --- a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/application/NewBookWasAddedEventHandler.java +++ b/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/application/NewBookWasAddedEventHandler.java @@ -5,11 +5,13 @@ import io.wkrzywiec.hexagonal.library.borrowing.ports.incoming.MakeBookAvailable import io.wkrzywiec.hexagonal.library.inventory.model.NewBookWasAddedEvent; import lombok.RequiredArgsConstructor; import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; @RequiredArgsConstructor +@Component public class NewBookWasAddedEventHandler { - private MakeBookAvailable makeBookAvailable; + private final MakeBookAvailable makeBookAvailable; @EventListener public void handle(NewBookWasAddedEvent event){ From fa0c0fe4f42cb3928687fe0182f8e5b17a6cc4a0 Mon Sep 17 00:00:00 2001 From: wkrzywiec Date: Sun, 24 May 2020 11:38:05 +0200 Subject: [PATCH 8/8] reservation REST endpoint added --- .../MakeReservationComponentTest.java | 85 +++++++++++++++++++ .../application/BorrowingController.java | 4 - .../application/ReservationController.java | 25 ++++++ .../InventoryDatabaseAdapterITCase.java | 1 - 4 files changed, 110 insertions(+), 5 deletions(-) create mode 100644 src/component-test/java/io/wkrzywiec/hexagonal/library/borrowing/MakeReservationComponentTest.java delete mode 100644 src/main/java/io/wkrzywiec/hexagonal/library/borrowing/application/BorrowingController.java create mode 100644 src/main/java/io/wkrzywiec/hexagonal/library/borrowing/application/ReservationController.java diff --git a/src/component-test/java/io/wkrzywiec/hexagonal/library/borrowing/MakeReservationComponentTest.java b/src/component-test/java/io/wkrzywiec/hexagonal/library/borrowing/MakeReservationComponentTest.java new file mode 100644 index 0000000..6fe28cb --- /dev/null +++ b/src/component-test/java/io/wkrzywiec/hexagonal/library/borrowing/MakeReservationComponentTest.java @@ -0,0 +1,85 @@ +package io.wkrzywiec.hexagonal.library.borrowing; + +import io.wkrzywiec.hexagonal.library.TestData; +import io.wkrzywiec.hexagonal.library.borrowing.model.BookReservationCommand; +import io.wkrzywiec.hexagonal.library.inventory.infrastructure.BookRepository; +import io.wkrzywiec.hexagonal.library.inventory.model.Book; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.jdbc.core.JdbcTemplate; + +import static io.restassured.RestAssured.given; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class MakeReservationComponentTest { + + @LocalServerPort + private int port; + + @Autowired + private BookRepository bookRepository; + + @Autowired + private JdbcTemplate jdbcTemplate; + + private String baseURL; + + @BeforeEach + public void init() { + this.baseURL = "http://localhost:" + port; + + Book book = bookRepository.save(TestData.homoDeusBook()); + jdbcTemplate.update( + "INSERT INTO available (book_id) VALUES (?)", + book.getIdAsLong()); + + jdbcTemplate.update( + "INSERT INTO user (first_name, last_name, email) VALUES (?, ?, ?)", + "John", + "Doe", + "john.doe@test.com"); + } + + @Test + @DisplayName("Reserve available book") + public void givenBookIsAvailable_thenMakeReservation_thenBookIsReserved() { + //given + Long homoDeusBookId = jdbcTemplate.queryForObject( + "SELECT id FROM book WHERE title = ?", + Long.class, + TestData.homoDeusBookTitle()); + + Long activeUserId = jdbcTemplate.queryForObject( + "SELECT id FROM user WHERE email = ?", + Long.class, + "john.doe@test.com"); + + + BookReservationCommand reservationCommand = + BookReservationCommand.builder() + .bookId(homoDeusBookId ) + .userId(activeUserId) + .build(); + + //when + given() + .contentType("application/json") + .body(reservationCommand) + .when() + .post( baseURL + "/reservations") + .prettyPeek() + .then(); + + Long reservationId = jdbcTemplate.queryForObject( + "SELECT id FROM reserved WHERE book_id = ?", + Long.class, + homoDeusBookId); + + assertTrue(reservationId > 0); + } +} diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/application/BorrowingController.java b/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/application/BorrowingController.java deleted file mode 100644 index 4ee2eb3..0000000 --- a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/application/BorrowingController.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.wkrzywiec.hexagonal.library.borrowing.application; - -public class BorrowingController { -} diff --git a/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/application/ReservationController.java b/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/application/ReservationController.java new file mode 100644 index 0000000..3875333 --- /dev/null +++ b/src/main/java/io/wkrzywiec/hexagonal/library/borrowing/application/ReservationController.java @@ -0,0 +1,25 @@ +package io.wkrzywiec.hexagonal.library.borrowing.application; + +import io.wkrzywiec.hexagonal.library.borrowing.model.BookReservationCommand; +import io.wkrzywiec.hexagonal.library.borrowing.ports.incoming.ReserveBook; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/reservations") +@RequiredArgsConstructor +public class ReservationController { + + private final ReserveBook reserveBook; + + @PostMapping("") + public ResponseEntity makeReservation(@RequestBody BookReservationCommand reservationCommand){ + Long reservationId = reserveBook.handle(reservationCommand); + return new ResponseEntity<>("Reservation has been made with an id " + reservationId, HttpStatus.CREATED); + } +} diff --git a/src/test/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDatabaseAdapterITCase.java b/src/test/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDatabaseAdapterITCase.java index 04a121b..17ff4c0 100644 --- a/src/test/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDatabaseAdapterITCase.java +++ b/src/test/java/io/wkrzywiec/hexagonal/library/inventory/infrastructure/InventoryDatabaseAdapterITCase.java @@ -10,7 +10,6 @@ import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.jdbc.core.JdbcTemplate; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; @DataJpaTest public class InventoryDatabaseAdapterITCase {