From 0edd4059e6689edaac3445ccce864bc143cee7fa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Martin=20Moj=C5=BEi=C5=A1?= <xmojzis1@fi.muni.cz>
Date: Wed, 24 Apr 2024 10:04:41 +0200
Subject: [PATCH] feat: repository tests, unneeded code removed, fixes

---
 account-query/README.md                       |  3 +-
 account-query/pom.xml                         |  7 +++
 .../service/BalanceServiceImpl.java           |  6 +-
 .../pa165/banking/domain/balance/Balance.java |  5 --
 .../repository/BalancesRepository.java        |  6 --
 .../domain/transaction/Transaction.java       |  5 --
 .../repository/TransactionRepository.java     | 14 +----
 .../BalanceControllerEmployeeTest.java        |  1 -
 .../controller/BalanceControllerIT.java       |  2 +-
 .../controller/BalanceControllerTest.java     |  6 --
 .../application/mapper/BalanceMapperTest.java |  5 --
 .../service/BalanceServiceImplTest.java       |  7 +--
 .../banking/domain/balance/BalanceTest.java   |  2 -
 .../repository/BalancesRepositoryTest.java    | 54 ++++++++++++++++++
 .../report/TransactionStatisticsTest.java     |  6 --
 .../repository/TransactionRepositoryTest.java | 56 +++++++++++++++++++
 .../src/test/resources/application.properties |  6 ++
 17 files changed, 133 insertions(+), 58 deletions(-)
 rename account-query/src/main/java/cz/muni/pa165/banking/domain/{balance => transaction}/repository/TransactionRepository.java (51%)
 create mode 100644 account-query/src/test/java/cz/muni/pa165/banking/domain/balance/repository/BalancesRepositoryTest.java
 create mode 100644 account-query/src/test/java/cz/muni/pa165/banking/domain/transaction/repository/TransactionRepositoryTest.java
 create mode 100644 account-query/src/test/resources/application.properties

diff --git a/account-query/README.md b/account-query/README.md
index 8f57dba..e4e8e26 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 963d8c5..2712791 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 ebc683d..e2cf401 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 869ccdd..7396304 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 ae38e10..257238d 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 fd2fa62..4ff7530 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 9d77134..cb200d9 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 c93f262..2c61cb2 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 69e9cf5..1ff667f 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 455aa39..0c65de1 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 6c1f6df..0d931bb 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 6902f94..6c0141c 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 950ace7..136a078 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 0000000..c2eb8bd
--- /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 965676f..8a2d115 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 0000000..019c69e
--- /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 0000000..bd1356e
--- /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
-- 
GitLab