diff --git a/account-query/README.md b/account-query/README.md index 8f57dbafcd238cd9a2db225b32b15af9901e7dda..e4e8e26cf2283c40cd11927c0d8ce4860151424a 100644 --- a/account-query/README.md +++ b/account-query/README.md @@ -1,11 +1,12 @@ # Balance Service -<p>The Balance Service, allows to view current balance of an account and +<p>The Balance Service allows to view current balance of an account and transaction history of an account from some date range. It also provides bank employees an ability to monitor all customers bank transactions. The service also provides a statistical module (for employees), which can report total and average (per account) transactions (deposits, withdrawals, outgoing and incoming payments) in a selected date range.</p> + <p>This service is composed of classes as can be seen on the diagram, in repository there are balances of accounts stored. Every balance class has current balance stored in itself together with a list of transactions which diff --git a/account-query/pom.xml b/account-query/pom.xml index 963d8c52e60df45bf45dba4a2bdbc0eed42a7f43..27127910434a754cf61decd95efc1a07b0173c0c 100644 --- a/account-query/pom.xml +++ b/account-query/pom.xml @@ -166,6 +166,13 @@ <version>${org.mapstruct.version}</version> </dependency> + <dependency> + <groupId>com.h2database</groupId> + <artifactId>h2</artifactId> + <scope>test</scope> + </dependency> + + <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> diff --git a/account-query/src/main/java/cz/muni/pa165/banking/application/service/BalanceServiceImpl.java b/account-query/src/main/java/cz/muni/pa165/banking/application/service/BalanceServiceImpl.java index ebc683d26bf4c2d3b1317529553df46c5c044f47..e2cf4010783432712cfc7e87051a9541af3d130f 100644 --- a/account-query/src/main/java/cz/muni/pa165/banking/application/service/BalanceServiceImpl.java +++ b/account-query/src/main/java/cz/muni/pa165/banking/application/service/BalanceServiceImpl.java @@ -2,7 +2,7 @@ package cz.muni.pa165.banking.application.service; import cz.muni.pa165.banking.domain.balance.Balance; import cz.muni.pa165.banking.domain.balance.repository.BalancesRepository; -import cz.muni.pa165.banking.domain.balance.repository.TransactionRepository; +import cz.muni.pa165.banking.domain.transaction.repository.TransactionRepository; import cz.muni.pa165.banking.domain.balance.service.BalanceService; import cz.muni.pa165.banking.domain.report.StatisticalReport; import cz.muni.pa165.banking.domain.transaction.Transaction; @@ -41,7 +41,7 @@ public class BalanceServiceImpl implements BalanceService { @Override @Transactional public void addNewBalance(String id) { - balanceRepository.addBalance(id); + balanceRepository.save(new Balance(id)); } @Override @@ -74,7 +74,7 @@ public class BalanceServiceImpl implements BalanceService { throws EntityNotFoundException { Balance balance = findById(id); Transaction t = balance.addTransaction(amount, type, processID); - balanceRepository.save(balance); + //balanceRepository.save(balance); transactionRepository.save(t); } diff --git a/account-query/src/main/java/cz/muni/pa165/banking/domain/balance/Balance.java b/account-query/src/main/java/cz/muni/pa165/banking/domain/balance/Balance.java index 869ccdd0fe0837c311910aa4f2b5a6b5d98d1f2d..7396304aed293050c57941704ca5f36ebfb34321 100644 --- a/account-query/src/main/java/cz/muni/pa165/banking/domain/balance/Balance.java +++ b/account-query/src/main/java/cz/muni/pa165/banking/domain/balance/Balance.java @@ -28,7 +28,6 @@ public class Balance { private BigDecimal amount; @OneToMany(mappedBy = "balance") - //@JoinColumn(name="balance_id") private List<Transaction> transactionList = new ArrayList<>(); public Balance(String accountId) { @@ -109,10 +108,6 @@ public class Balance { this.amount = amount; } - public void setAccountId(String accountId) { - this.accountId = accountId; - } - @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/account-query/src/main/java/cz/muni/pa165/banking/domain/balance/repository/BalancesRepository.java b/account-query/src/main/java/cz/muni/pa165/banking/domain/balance/repository/BalancesRepository.java index ae38e10cd376adda72a3cf52f0c84434cdfebdac..257238de6075b0e2bc86dec4663408f4c344dfff 100644 --- a/account-query/src/main/java/cz/muni/pa165/banking/domain/balance/repository/BalancesRepository.java +++ b/account-query/src/main/java/cz/muni/pa165/banking/domain/balance/repository/BalancesRepository.java @@ -1,9 +1,7 @@ package cz.muni.pa165.banking.domain.balance.repository; import cz.muni.pa165.banking.domain.balance.Balance; -import cz.muni.pa165.banking.domain.transaction.Transaction; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; @@ -19,10 +17,6 @@ public interface BalancesRepository extends JpaRepository<Balance, String> { @Query("SELECT u FROM Balance u where u.accountId = :id") Optional<Balance> findById(String id); - default void addBalance(String id) { - this.save(new Balance(id)); - } - @Query("SELECT u.accountId FROM Balance u") List<String> getAllIds(); } diff --git a/account-query/src/main/java/cz/muni/pa165/banking/domain/transaction/Transaction.java b/account-query/src/main/java/cz/muni/pa165/banking/domain/transaction/Transaction.java index fd2fa6221377a15505b4fbb09ee5d521b15052b4..4ff753058478ba939430d637cd85ec086f9033fb 100644 --- a/account-query/src/main/java/cz/muni/pa165/banking/domain/transaction/Transaction.java +++ b/account-query/src/main/java/cz/muni/pa165/banking/domain/transaction/Transaction.java @@ -3,7 +3,6 @@ package cz.muni.pa165.banking.domain.transaction; import cz.muni.pa165.banking.domain.balance.Balance; import jakarta.persistence.*; import jakarta.validation.constraints.NotNull; -import org.hibernate.annotations.Type; import java.math.BigDecimal; import java.time.OffsetDateTime; @@ -80,10 +79,6 @@ public class Transaction { this.balance = balance; } - public void setProcessId(UUID processId) { - this.processId = processId; - } - public void setDate(OffsetDateTime date) { this.date = date; } diff --git a/account-query/src/main/java/cz/muni/pa165/banking/domain/balance/repository/TransactionRepository.java b/account-query/src/main/java/cz/muni/pa165/banking/domain/transaction/repository/TransactionRepository.java similarity index 51% rename from account-query/src/main/java/cz/muni/pa165/banking/domain/balance/repository/TransactionRepository.java rename to account-query/src/main/java/cz/muni/pa165/banking/domain/transaction/repository/TransactionRepository.java index 9d771349cc99e013c1f1a665413c1053940b90bf..cb200d9b39df660228a202127294557202f6a319 100644 --- a/account-query/src/main/java/cz/muni/pa165/banking/domain/balance/repository/TransactionRepository.java +++ b/account-query/src/main/java/cz/muni/pa165/banking/domain/transaction/repository/TransactionRepository.java @@ -1,30 +1,18 @@ -package cz.muni.pa165.banking.domain.balance.repository; +package cz.muni.pa165.banking.domain.transaction.repository; import cz.muni.pa165.banking.domain.balance.Balance; import cz.muni.pa165.banking.domain.transaction.Transaction; -import cz.muni.pa165.banking.domain.transaction.TransactionType; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; -import java.math.BigDecimal; -import java.time.OffsetDateTime; import java.util.Collection; -import java.util.Optional; -import java.util.UUID; /** * @author Martin Mojzis */ @Repository public interface TransactionRepository extends JpaRepository<Transaction, Long> { - default void addTransaction(BigDecimal amount, TransactionType type, UUID processId, Balance balance) { - Transaction tr = new Transaction(type, amount, - OffsetDateTime.now(), processId, balance); - this.save(tr); - } - @Query("SELECT u FROM Transaction u where u.balance = :balance") Collection<Transaction> findByBalance(Balance balance); } diff --git a/account-query/src/test/java/cz/muni/pa165/banking/application/controller/BalanceControllerEmployeeTest.java b/account-query/src/test/java/cz/muni/pa165/banking/application/controller/BalanceControllerEmployeeTest.java index c93f262fcc971a07544cfa0e0d3dfcf1170eb2ee..2c61cb2e2985ec4fb82fd4c9c5b5d703e1cafcf5 100644 --- a/account-query/src/test/java/cz/muni/pa165/banking/application/controller/BalanceControllerEmployeeTest.java +++ b/account-query/src/test/java/cz/muni/pa165/banking/application/controller/BalanceControllerEmployeeTest.java @@ -4,7 +4,6 @@ import cz.muni.pa165.banking.account.query.dto.Transaction; import cz.muni.pa165.banking.account.query.dto.TransactionType; import cz.muni.pa165.banking.account.query.dto.TransactionsReport; import cz.muni.pa165.banking.application.facade.BalanceFacade; -import cz.muni.pa165.banking.domain.report.StatisticalReport; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; diff --git a/account-query/src/test/java/cz/muni/pa165/banking/application/controller/BalanceControllerIT.java b/account-query/src/test/java/cz/muni/pa165/banking/application/controller/BalanceControllerIT.java index 69e9cf5f81d13c735b6c7f554ce375a86071aee3..1ff667f02d4fd7f16c9248c4c5c2c9cc5f8a4748 100644 --- a/account-query/src/test/java/cz/muni/pa165/banking/application/controller/BalanceControllerIT.java +++ b/account-query/src/test/java/cz/muni/pa165/banking/application/controller/BalanceControllerIT.java @@ -11,7 +11,7 @@ import cz.muni.pa165.banking.application.mapper.BalanceMapperImpl; import cz.muni.pa165.banking.application.service.BalanceServiceImpl; import cz.muni.pa165.banking.domain.balance.Balance; import cz.muni.pa165.banking.domain.balance.repository.BalancesRepository; -import cz.muni.pa165.banking.domain.balance.repository.TransactionRepository; +import cz.muni.pa165.banking.domain.transaction.repository.TransactionRepository; import cz.muni.pa165.banking.domain.balance.service.BalanceService; import cz.muni.pa165.banking.domain.transaction.TransactionType; import cz.muni.pa165.banking.exception.CustomExceptionHandler; diff --git a/account-query/src/test/java/cz/muni/pa165/banking/application/controller/BalanceControllerTest.java b/account-query/src/test/java/cz/muni/pa165/banking/application/controller/BalanceControllerTest.java index 455aa3963ff2d1592d8f607454905ed90051ac05..0c65de106d2f180e5ab372b18262331d7c0f170f 100644 --- a/account-query/src/test/java/cz/muni/pa165/banking/application/controller/BalanceControllerTest.java +++ b/account-query/src/test/java/cz/muni/pa165/banking/application/controller/BalanceControllerTest.java @@ -9,23 +9,17 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import java.math.BigDecimal; import java.time.LocalDate; -import java.time.OffsetDateTime; import java.util.ArrayList; import java.util.List; -import java.util.Optional; import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; - - @ExtendWith(MockitoExtension.class) class BalanceControllerTest { @Mock diff --git a/account-query/src/test/java/cz/muni/pa165/banking/application/mapper/BalanceMapperTest.java b/account-query/src/test/java/cz/muni/pa165/banking/application/mapper/BalanceMapperTest.java index 6c1f6df24e5889677b309c0feb5cee7a9d84ab30..0d931bbede57180bf53441d5a7a78ad4613e101c 100644 --- a/account-query/src/test/java/cz/muni/pa165/banking/application/mapper/BalanceMapperTest.java +++ b/account-query/src/test/java/cz/muni/pa165/banking/application/mapper/BalanceMapperTest.java @@ -1,14 +1,9 @@ package cz.muni.pa165.banking.application.mapper; -import cz.muni.pa165.banking.account.query.dto.Transaction; import cz.muni.pa165.banking.domain.transaction.TransactionType; import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; - - class BalanceMapperTest { BalanceMapper balanceMapper = new BalanceMapperImpl(); @Test diff --git a/account-query/src/test/java/cz/muni/pa165/banking/application/service/BalanceServiceImplTest.java b/account-query/src/test/java/cz/muni/pa165/banking/application/service/BalanceServiceImplTest.java index 6902f9478701b409ef4056dff576e97a7ceb29be..6c0141c1c9dc19726cae16d27f1d1a27bd2173db 100644 --- a/account-query/src/test/java/cz/muni/pa165/banking/application/service/BalanceServiceImplTest.java +++ b/account-query/src/test/java/cz/muni/pa165/banking/application/service/BalanceServiceImplTest.java @@ -5,7 +5,7 @@ import cz.muni.pa165.banking.domain.balance.repository.BalancesRepository; import static org.junit.jupiter.api.Assertions.*; -import cz.muni.pa165.banking.domain.balance.repository.TransactionRepository; +import cz.muni.pa165.banking.domain.transaction.repository.TransactionRepository; import cz.muni.pa165.banking.domain.report.StatisticalReport; import cz.muni.pa165.banking.domain.transaction.Transaction; import cz.muni.pa165.banking.domain.transaction.TransactionType; @@ -24,7 +24,6 @@ import java.util.List; import java.util.Optional; import java.util.UUID; -import static org.junit.jupiter.api.Assertions.*; import static org.assertj.core.api.Assertions.assertThat; @@ -84,13 +83,13 @@ class BalanceServiceImplTest { void addNewBalance_createsBalance() { // Arrange String id = "id"; - Mockito.doNothing().when(balanceRepository).addBalance(id); + Mockito.when(balanceRepository.save(new Balance(id))).thenReturn(new Balance(id)); // Act balanceService.addNewBalance(id); // Assert - Mockito.verify(balanceRepository, Mockito.times(1)).addBalance(id); + Mockito.verify(balanceRepository, Mockito.times(1)).save(new Balance(id)); } @Test diff --git a/account-query/src/test/java/cz/muni/pa165/banking/domain/balance/BalanceTest.java b/account-query/src/test/java/cz/muni/pa165/banking/domain/balance/BalanceTest.java index 950ace70522c07e4b49b7f798e67a6c73d4d3b18..136a078e2d2ddbb8fe820a29b810426e3aebd543 100644 --- a/account-query/src/test/java/cz/muni/pa165/banking/domain/balance/BalanceTest.java +++ b/account-query/src/test/java/cz/muni/pa165/banking/domain/balance/BalanceTest.java @@ -6,8 +6,6 @@ import cz.muni.pa165.banking.domain.transaction.TransactionType; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertThrows; - import java.math.BigDecimal; import java.time.OffsetDateTime; diff --git a/account-query/src/test/java/cz/muni/pa165/banking/domain/balance/repository/BalancesRepositoryTest.java b/account-query/src/test/java/cz/muni/pa165/banking/domain/balance/repository/BalancesRepositoryTest.java new file mode 100644 index 0000000000000000000000000000000000000000..c2eb8bd896a896d76552a369d38e1077efe1f40e --- /dev/null +++ b/account-query/src/test/java/cz/muni/pa165/banking/domain/balance/repository/BalancesRepositoryTest.java @@ -0,0 +1,54 @@ +package cz.muni.pa165.banking.domain.balance.repository; + +import cz.muni.pa165.banking.domain.balance.Balance; +import cz.muni.pa165.banking.domain.transaction.TransactionType; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import java.math.BigDecimal; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * @author Martin Mojzis + */ +@ExtendWith(SpringExtension.class) +@DataJpaTest +class BalancesRepositoryTest { + + @Autowired + private BalancesRepository repository; + + @BeforeAll + public static void initDb(@Autowired BalancesRepository repository) { + Balance balance = new Balance("id1"); + + balance.addTransaction(BigDecimal.TEN, TransactionType.CREDIT, new UUID(2,2)); + repository.save(balance); + + repository.save(balance); + repository.save(new Balance("id2")); + + } + + @Test + void findById_exists_returnsBalance() { + Optional<Balance> balance = repository.findById("id1"); + assertEquals(balance.get().getAccountId(), "id1"); + assertEquals(balance.get().getAmount().byteValueExact(), BigDecimal.TEN.byteValueExact()); + } + + @Test + void getAllIds_returnsAddIds() { + List<String> result = repository.getAllIds(); + assertTrue(result.contains("id1")); + assertTrue(result.contains("id2")); + } +} \ No newline at end of file diff --git a/account-query/src/test/java/cz/muni/pa165/banking/domain/report/TransactionStatisticsTest.java b/account-query/src/test/java/cz/muni/pa165/banking/domain/report/TransactionStatisticsTest.java index 965676f2cc55c1aad2390df2a30c862569b7d72b..8a2d115b32b2cb9beb276f19f52faa0729d20a52 100644 --- a/account-query/src/test/java/cz/muni/pa165/banking/domain/report/TransactionStatisticsTest.java +++ b/account-query/src/test/java/cz/muni/pa165/banking/domain/report/TransactionStatisticsTest.java @@ -1,16 +1,10 @@ package cz.muni.pa165.banking.domain.report; -import cz.muni.pa165.banking.domain.transaction.Transaction; -import cz.muni.pa165.banking.domain.transaction.TransactionType; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.math.BigDecimal; -import java.time.OffsetDateTime; -import java.util.List; - import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; class TransactionStatisticsTest { TransactionStatistics statistics; diff --git a/account-query/src/test/java/cz/muni/pa165/banking/domain/transaction/repository/TransactionRepositoryTest.java b/account-query/src/test/java/cz/muni/pa165/banking/domain/transaction/repository/TransactionRepositoryTest.java new file mode 100644 index 0000000000000000000000000000000000000000..019c69e0e8ad9a2119ddde9c80001024f0c16be8 --- /dev/null +++ b/account-query/src/test/java/cz/muni/pa165/banking/domain/transaction/repository/TransactionRepositoryTest.java @@ -0,0 +1,56 @@ +package cz.muni.pa165.banking.domain.transaction.repository; + +import cz.muni.pa165.banking.domain.balance.Balance; +import cz.muni.pa165.banking.domain.balance.repository.BalancesRepository; +import cz.muni.pa165.banking.domain.transaction.Transaction; +import cz.muni.pa165.banking.domain.transaction.TransactionType; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import java.math.BigDecimal; +import java.util.Collection; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * @author Martin Mojzis + */ +@ExtendWith(SpringExtension.class) +@DataJpaTest +class TransactionRepositoryTest { + + @Autowired + private TransactionRepository repository; + @Autowired + private BalancesRepository balancesRepository; + + @BeforeAll + public static void initDb(@Autowired TransactionRepository repository, @Autowired BalancesRepository balancesRepository) { + balancesRepository.save(new Balance("id1")); + balancesRepository.save(new Balance("id2")); + } + + @Test + void findByBalance_called_returnsExpectedTransactions(){ + //Arrange + Balance balance = balancesRepository.findById("id1").get(); + Transaction tr = balance.addTransaction(BigDecimal.TEN, TransactionType.CREDIT, new UUID(2,2)); + balancesRepository.save(balance); + repository.save(tr); + Balance balance2 = balancesRepository.findById("id2").get(); + + //Act + Collection<Transaction> result = repository.findByBalance(balance); + Collection<Transaction> result2 = repository.findByBalance(balance2); + + //Assert + assertTrue(result.contains(tr)); + assertTrue(result.size() == 1); + assertTrue(result2.isEmpty()); + } +} \ No newline at end of file diff --git a/account-query/src/test/resources/application.properties b/account-query/src/test/resources/application.properties new file mode 100644 index 0000000000000000000000000000000000000000..bd1356e101086203c0a54b2b14c0cedd7cc3ebd6 --- /dev/null +++ b/account-query/src/test/resources/application.properties @@ -0,0 +1,6 @@ +spring.h2.console.enabled=true +spring.datasource.url=jdbc:h2:mem:testdb +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.username=user +spring.datasource.password=password +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect