From b16d9b1264d72c6e9c4811c4cffa8ea499ee976f Mon Sep 17 00:00:00 2001
From: xsedlac9 <xsedlac9@muni.cz>
Date: Sun, 21 Apr 2024 12:48:39 +0200
Subject: [PATCH] IT for account and user implemented

---
 .../application/service/AccountService.java   |  30 +++--
 .../application/service/UserService.java      |   2 +-
 .../user/repository/UserRepository.java       |  19 ---
 .../controller/AccountControllerIT.java       | 119 +++++++++++++++---
 .../controller/AccountControllerTest.java     |   8 +-
 .../controller/UserControllerIT.java          |  77 +++++++++++-
 .../controller/UserControllerTest.java        |   4 +-
 .../application/facade/AccountFacadeTest.java |   6 +-
 .../application/facade/UserFacadeTest.java    |   4 +-
 .../service/AccountServiceTest.java           |  42 +++++--
 .../application/service/UserServiceTest.java  |   6 +-
 11 files changed, 247 insertions(+), 70 deletions(-)

diff --git a/account-management/src/main/java/cz/muni/pa165/banking/application/service/AccountService.java b/account-management/src/main/java/cz/muni/pa165/banking/application/service/AccountService.java
index 9c5c179..da8127b 100644
--- a/account-management/src/main/java/cz/muni/pa165/banking/application/service/AccountService.java
+++ b/account-management/src/main/java/cz/muni/pa165/banking/application/service/AccountService.java
@@ -8,6 +8,7 @@ import cz.muni.pa165.banking.domain.scheduled.ScheduledPaymentProjection;
 import cz.muni.pa165.banking.domain.scheduled.recurrence.Recurrence;
 import cz.muni.pa165.banking.domain.scheduled.recurrence.RecurrenceType;
 import cz.muni.pa165.banking.domain.scheduled.repository.ScheduledPaymentRepository;
+import cz.muni.pa165.banking.domain.user.repository.UserRepository;
 import cz.muni.pa165.banking.exception.EntityNotFoundException;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -19,34 +20,47 @@ import java.util.stream.Collectors;
 
 @Service
 public class AccountService {
-    
+
     private final SystemServiceApi balanceApi;
-    
+
     private final AccountRepository accountRepository;
-    
+
+    private final UserRepository userRepository;
+
     private final ScheduledPaymentRepository scheduledPaymentsRepository;
 
-    public AccountService(SystemServiceApi balanceApi, AccountRepository accountRepository, ScheduledPaymentRepository scheduledPaymentsRepository){
+    public AccountService(SystemServiceApi balanceApi, AccountRepository accountRepository, UserRepository userRepository, ScheduledPaymentRepository scheduledPaymentsRepository){
         this.balanceApi = balanceApi;
         this.accountRepository = accountRepository;
+        this.userRepository = userRepository;
         this.scheduledPaymentsRepository = scheduledPaymentsRepository;
     }
-    
-    public Account createAccount(Account newAccount){
+
+    public Account createAccount(Account newAccount) {
+        if (!userRepository.existsById(newAccount.getUserId())) {
+            throw new EntityNotFoundException("User with id: " + newAccount.getUserId() + " was not found.");
+        }
+        balanceApi.createBalance(newAccount.getAccountNumber());
         return accountRepository.save(newAccount);
     }
 
-    public Account findById(Long accountId) throws EntityNotFoundException {
+    public Account findById(Long accountId){
         return accountRepository.findById(accountId)
                 .orElseThrow(() -> new EntityNotFoundException("Account with id: " + accountId + " was not found."));
     }
     
-    public Account findByNumber(String accountNumber) throws EntityNotFoundException {
+    public Account findByNumber(String accountNumber){
         return accountRepository.findByAccountNumber(accountNumber)
                 .orElseThrow(() -> new EntityNotFoundException("Account with number: " + accountNumber + " was not found."));
     }
 
     public ScheduledPayment schedulePayment(ScheduledPayment newScheduledPayment) {
+        if (!accountRepository.existsById(newScheduledPayment.getSourceAccountId())){
+            throw new EntityNotFoundException("Account with id: " + newScheduledPayment.getSourceAccountId() + " was not found." +" id1: "+ newScheduledPayment.getId());
+        }
+        if (!accountRepository.existsById(newScheduledPayment.getTargetAccountId())){
+            throw new EntityNotFoundException("Account with id: " + newScheduledPayment.getTargetAccountId() + " was not found." +" id2: "+ newScheduledPayment.getId());
+        }
         return scheduledPaymentsRepository.save(newScheduledPayment);
     }
 
diff --git a/account-management/src/main/java/cz/muni/pa165/banking/application/service/UserService.java b/account-management/src/main/java/cz/muni/pa165/banking/application/service/UserService.java
index e1d56ce..7c80563 100644
--- a/account-management/src/main/java/cz/muni/pa165/banking/application/service/UserService.java
+++ b/account-management/src/main/java/cz/muni/pa165/banking/application/service/UserService.java
@@ -15,7 +15,7 @@ public class UserService {
     }
 
     public User createUser(User user){
-        return userRepository.addUser(user);
+        return userRepository.save(user);
     }
 
     public User findById(Long userId) throws EntityNotFoundException {
diff --git a/account-management/src/main/java/cz/muni/pa165/banking/domain/user/repository/UserRepository.java b/account-management/src/main/java/cz/muni/pa165/banking/domain/user/repository/UserRepository.java
index 88b2df0..8d2db82 100644
--- a/account-management/src/main/java/cz/muni/pa165/banking/domain/user/repository/UserRepository.java
+++ b/account-management/src/main/java/cz/muni/pa165/banking/domain/user/repository/UserRepository.java
@@ -10,23 +10,4 @@ import java.util.Optional;
 @Repository
 public interface UserRepository extends JpaRepository<User, Long> {
     
-    /**
-     * Adds a new user to the repository.
-     *
-     * @param user the user to add
-     * @return newly created user
-     */
-    default User addUser(User user){
-        return saveAndFlush(user);
-    }
-
-    /**
-     * Retrieves a user by their ID.
-     *
-     * @param id the ID of the user to retrieve
-     * @return the user with the specified ID, or null if no such user exists
-     */
-    @Query("SELECT u FROM User u where u.id = :id")
-    Optional<User> findById(Long id);
-    
 }
diff --git a/account-management/src/test/java/cz/muni/pa165/banking/application/controller/AccountControllerIT.java b/account-management/src/test/java/cz/muni/pa165/banking/application/controller/AccountControllerIT.java
index 340278b..2199537 100644
--- a/account-management/src/test/java/cz/muni/pa165/banking/application/controller/AccountControllerIT.java
+++ b/account-management/src/test/java/cz/muni/pa165/banking/application/controller/AccountControllerIT.java
@@ -7,6 +7,8 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.PropertyNamingStrategies;
 import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
 
+import cz.muni.pa165.banking.domain.account.Account;
+import cz.muni.pa165.banking.domain.account.AccountType;
 import cz.muni.pa165.banking.domain.account.repository.AccountRepository;
 import cz.muni.pa165.banking.domain.scheduled.repository.ScheduledPaymentRepository;
 import cz.muni.pa165.banking.domain.user.User;
@@ -20,8 +22,10 @@ import org.springframework.http.MediaType;
 import org.springframework.test.web.servlet.MockMvc;
 
 import java.nio.charset.StandardCharsets;
+import java.util.Currency;
 
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
 
 
@@ -37,15 +41,12 @@ class AccountControllerIT {
     
     @Autowired
     private AccountRepository accountRepository;
-    
-    @Autowired
-    private ScheduledPaymentRepository scheduledPaymentRepository;
+
     
     @BeforeAll
     public static void initDb(
             @Autowired UserRepository userRepository,
-            @Autowired AccountRepository accountRepository,
-            @Autowired ScheduledPaymentRepository scheduledPaymentRepository
+            @Autowired AccountRepository accountRepository
     ) {
         User user = new User();
         user.setId(1L);
@@ -54,21 +55,111 @@ class AccountControllerIT {
         user.setFirstName("Jozko");
         user.setLastName("Mrkvicka");
         userRepository.save(user);
-    }
-    
-    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper()
-            .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
-            .registerModule(new JavaTimeModule())
-            .setPropertyNamingStrategy(new PropertyNamingStrategies.SnakeCaseStrategy())
-            .setSerializationInclusion(JsonInclude.Include.NON_NULL);
 
+        User user2 = new User();
+        user2.setId(2L);
+        user2.setEmail("123@eemail.cz");
+        user2.setPassword("pass123");
+        user2.setFirstName("Jozko");
+        user2.setLastName("Mrkvicka");
+        userRepository.save(user2);
+
+        Account account = new Account();
+        account.setId(1L);
+        account.setUserId(1L);
+        account.setAccountNumber("1");
+        account.setType(AccountType.CREDIT);
+        account.setCurrency(Currency.getInstance("CZK"));
+        accountRepository.save(account);
+
+        Account account2 = new Account();
+        account2.setId(2L);
+        account2.setUserId(2L);
+        account2.setAccountNumber("2");
+        account2.setType(AccountType.CREDIT);
+        account2.setCurrency(Currency.getInstance("CZK"));
+        accountRepository.save(account2);
+    }
 
     @Test
-    void createAccount_returnsCreated() throws Exception {
+    void createAccount_userExists_returnsCreated() throws Exception {
         mockMvc.perform(post("/account")
                 .contentType(MediaType.APPLICATION_JSON)
                 .content("{\"userId\":1,\"type\":\"SAVING\",\"maxSpendingLimit\":1000, \"currency\": \"CZK\"}"))
-                .andExpect(status().is(201))
+                .andExpect(status().isCreated())
+                .andReturn()
+                .getResponse()
+                .getContentAsString(StandardCharsets.UTF_8);
+    }
+
+    @Test
+    void createAccount_userNotExist_returnsNotFound() throws Exception {
+        mockMvc.perform(post("/account")
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content("{\"userId\":3,\"type\":\"SAVING\",\"maxSpendingLimit\":1000, \"currency\": \"CZK\"}"))
+                .andExpect(status().isNotFound())
+                .andReturn()
+                .getResponse()
+                .getContentAsString(StandardCharsets.UTF_8);
+    }
+
+    @Test
+    void findAccountById_accountFound_returnsOk() throws Exception {
+        mockMvc.perform(get("/account?accountId=1")
+                        .contentType(MediaType.APPLICATION_JSON))
+                .andExpect(status().isOk())
+                .andReturn()
+                .getResponse()
+                .getContentAsString(StandardCharsets.UTF_8);
+    }
+
+    @Test
+    void findAccountById_accountNotFound_returnsNotFound() throws Exception {
+        mockMvc.perform(get("/account?accountId=3")
+                        .contentType(MediaType.APPLICATION_JSON))
+                .andExpect(status().isNotFound())
+                .andReturn()
+                .getResponse()
+                .getContentAsString(StandardCharsets.UTF_8);
+    }
+
+    @Test
+    void getScheduledPayments_accountFound_returnsOk() throws Exception {
+        mockMvc.perform(get("/account/scheduled?accountNumber=1")
+                        .contentType(MediaType.APPLICATION_JSON))
+                .andExpect(status().isOk())
+                .andReturn()
+                .getResponse()
+                .getContentAsString(StandardCharsets.UTF_8);
+    }
+
+    @Test
+    void getScheduledPayments_accountNotFound_returnsNotFound() throws Exception {
+        mockMvc.perform(get("/account/scheduled?accountNumber=3")
+                        .contentType(MediaType.APPLICATION_JSON))
+                .andExpect(status().isNotFound())
+                .andReturn()
+                .getResponse()
+                .getContentAsString(StandardCharsets.UTF_8);
+    }
+
+    @Test
+    void schedulePayment_accountFound_returnsCreated() throws Exception {
+        mockMvc.perform(post("/account/scheduled")
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content("{\"id\":1,\"senderAccountId\":1, \"receiverAccountId\":2, \"amount\":1}"))
+                .andExpect(status().isCreated())
+                .andReturn()
+                .getResponse()
+                .getContentAsString(StandardCharsets.UTF_8);
+    }
+
+    @Test
+    void schedulePayment_accountNotFound_returnsNotFound() throws Exception {
+        mockMvc.perform(post("/account/scheduled")
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content("{\"id\":1,\"senderAccountId\":1, \"receiverAccountId\":3, \"amount\":1}"))
+                .andExpect(status().isNotFound())
                 .andReturn()
                 .getResponse()
                 .getContentAsString(StandardCharsets.UTF_8);
diff --git a/account-management/src/test/java/cz/muni/pa165/banking/application/controller/AccountControllerTest.java b/account-management/src/test/java/cz/muni/pa165/banking/application/controller/AccountControllerTest.java
index 41a970e..2280276 100644
--- a/account-management/src/test/java/cz/muni/pa165/banking/application/controller/AccountControllerTest.java
+++ b/account-management/src/test/java/cz/muni/pa165/banking/application/controller/AccountControllerTest.java
@@ -40,7 +40,7 @@ class AccountControllerTest {
     }
 
     @Test
-    void getAccount_ValidAccountNumber_ReturnsAccount() throws Exception {
+    void getAccount_ValidAccountNumber_ReturnsAccount(){
         // Arrange
         Long accountId = 123456789L;
         AccountDto accountDto = new AccountDto();
@@ -55,7 +55,7 @@ class AccountControllerTest {
     }
 
     @Test
-    void getAccount_InvalidAccountNumber_ReturnsNull() throws Exception {
+    void getAccount_InvalidAccountNumber_ReturnsNull() {
         // Arrange
         Long invalidId = 123456789L;
         when(accountFacade.findById(invalidId)).thenReturn(null);
@@ -69,7 +69,7 @@ class AccountControllerTest {
     }
 
     @Test
-    void getScheduledPayments_ValidAccountNumber_ReturnsPayments() throws Exception {
+    void getScheduledPayments_ValidAccountNumber_ReturnsPayments(){
         // Arrange
         String accountNumber = "123456789";
         ScheduledPaymentsDto scheduledPaymentsDto = new ScheduledPaymentsDto();
@@ -84,7 +84,7 @@ class AccountControllerTest {
     }
 
     @Test
-    void getScheduledPayments_InvalidAccountNumber_ReturnsNull() throws Exception {
+    void getScheduledPayments_InvalidAccountNumber_ReturnsNull(){
         // Arrange
         String invalidAccountNumber = "123456789";
         when(accountFacade.findScheduledPaymentsByNumber(invalidAccountNumber)).thenReturn(null);
diff --git a/account-management/src/test/java/cz/muni/pa165/banking/application/controller/UserControllerIT.java b/account-management/src/test/java/cz/muni/pa165/banking/application/controller/UserControllerIT.java
index f793f1c..26b9d80 100644
--- a/account-management/src/test/java/cz/muni/pa165/banking/application/controller/UserControllerIT.java
+++ b/account-management/src/test/java/cz/muni/pa165/banking/application/controller/UserControllerIT.java
@@ -1,10 +1,85 @@
 package cz.muni.pa165.banking.application.controller;
 
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.PropertyNamingStrategies;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+
+import cz.muni.pa165.banking.domain.account.Account;
+import cz.muni.pa165.banking.domain.account.AccountType;
+import cz.muni.pa165.banking.domain.account.repository.AccountRepository;
+import cz.muni.pa165.banking.domain.scheduled.repository.ScheduledPaymentRepository;
+import cz.muni.pa165.banking.domain.user.User;
+import cz.muni.pa165.banking.domain.user.repository.UserRepository;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.MediaType;
+import org.springframework.test.web.servlet.MockMvc;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Currency;
+
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
 
 @SpringBootTest
 @AutoConfigureMockMvc
 class UserControllerIT {
 
-}
\ No newline at end of file
+    @Autowired
+    private MockMvc mockMvc;
+
+    @Autowired
+    private UserRepository userRepository;
+
+    @BeforeAll
+    public static void initDb(
+            @Autowired UserRepository userRepository
+    ) {
+        User user = new User();
+        user.setId(1L);
+        user.setEmail("email@example.org");
+        user.setPassword("pass123");
+        user.setFirstName("Jozko");
+        user.setLastName("Mrkvicka");
+        userRepository.save(user);
+    }
+
+    @Test
+    void createUser_returnsCreated() throws Exception {
+        mockMvc.perform(post("/user")
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content("{\"email\":\"123@email.cz\",\"password\":\"passwd123\",\"firstName\":\"Joe\", \"lastName\": \"Mama\", \"userType\": \"REGULAR\"}"))
+                .andExpect(status().isCreated())
+                .andReturn()
+                .getResponse()
+                .getContentAsString(StandardCharsets.UTF_8);
+    }
+
+    @Test
+    void findUserById_userFound_returnsOk() throws Exception {
+        mockMvc.perform(get("/user?userId=1")
+                        .contentType(MediaType.APPLICATION_JSON))
+                .andExpect(status().isOk())
+                .andReturn()
+                .getResponse()
+                .getContentAsString(StandardCharsets.UTF_8);
+    }
+
+    @Test
+    void findUserById_userNotFound_returnsNotFound() throws Exception {
+        mockMvc.perform(get("/user?userId=3")
+                        .contentType(MediaType.APPLICATION_JSON))
+                .andExpect(status().isNotFound())
+                .andReturn()
+                .getResponse()
+                .getContentAsString(StandardCharsets.UTF_8);
+    }
+}
diff --git a/account-management/src/test/java/cz/muni/pa165/banking/application/controller/UserControllerTest.java b/account-management/src/test/java/cz/muni/pa165/banking/application/controller/UserControllerTest.java
index 52c421b..a2f8ad9 100644
--- a/account-management/src/test/java/cz/muni/pa165/banking/application/controller/UserControllerTest.java
+++ b/account-management/src/test/java/cz/muni/pa165/banking/application/controller/UserControllerTest.java
@@ -37,7 +37,7 @@ class UserControllerTest {
     }
 
     @Test
-    void getUser_ValidUserId_ReturnsUser() throws Exception {
+    void getUser_ValidUserId_ReturnsUser(){
         // Arrange
         Long userId = 1L;
         UserDto userDto = new UserDto();
@@ -52,7 +52,7 @@ class UserControllerTest {
     }
 
     @Test
-    void getUser_InvalidUserId_ReturnsNull() throws Exception {
+    void getUser_InvalidUserId_ReturnsNull() {
         // Arrange
         Long userId = 123L;
         when(userFacade.findById(userId)).thenReturn(null);
diff --git a/account-management/src/test/java/cz/muni/pa165/banking/application/facade/AccountFacadeTest.java b/account-management/src/test/java/cz/muni/pa165/banking/application/facade/AccountFacadeTest.java
index 8f868fe..e17ced8 100644
--- a/account-management/src/test/java/cz/muni/pa165/banking/application/facade/AccountFacadeTest.java
+++ b/account-management/src/test/java/cz/muni/pa165/banking/application/facade/AccountFacadeTest.java
@@ -64,7 +64,7 @@ class AccountFacadeTest {
     }
 
     @Test
-    void getAccount_ValidAccountNumber_ReturnsAccountDto() throws Exception {
+    void getAccount_ValidAccountNumber_ReturnsAccountDto(){
         // Arrange
         Long accountId = 123456789L;
         AccountDto accountDto = new AccountDto();
@@ -81,7 +81,7 @@ class AccountFacadeTest {
     }
 
     @Test
-    void getAccount_InvalidAccountNumber_ReturnsNull() throws Exception {
+    void getAccount_InvalidAccountNumber_ReturnsNull(){
         // Arrange
         Long invalidId = 123456789L;
         when(accountService.findById(invalidId)).thenReturn(null);
@@ -106,7 +106,7 @@ class AccountFacadeTest {
     }
 
     @Test
-    void getScheduledPaymentsOfAccount_ValidAccountNumber_ReturnsPayments() throws Exception {
+    void getScheduledPaymentsOfAccount_ValidAccountNumber_ReturnsPayments() {
         // Arrange
         String validAccountNumber = "123456789";
         ScheduledPaymentsDto scheduledPaymentsDto = new ScheduledPaymentsDto();
diff --git a/account-management/src/test/java/cz/muni/pa165/banking/application/facade/UserFacadeTest.java b/account-management/src/test/java/cz/muni/pa165/banking/application/facade/UserFacadeTest.java
index 13e8a8e..1ed9d32 100644
--- a/account-management/src/test/java/cz/muni/pa165/banking/application/facade/UserFacadeTest.java
+++ b/account-management/src/test/java/cz/muni/pa165/banking/application/facade/UserFacadeTest.java
@@ -48,7 +48,7 @@ class UserFacadeTest {
     }
 
     @Test
-    void getUser_ValidUserId_ReturnsUserDto() throws Exception {
+    void getUser_ValidUserId_ReturnsUserDto(){
         // Arrange
         Long userId = 1L;
         UserDto userDto = new UserDto();
@@ -65,7 +65,7 @@ class UserFacadeTest {
     }
 
     @Test
-    void getUser_InvalidUserId_ReturnsNull() throws Exception {
+    void getUser_InvalidUserId_ReturnsNull(){
         // Arrange
         Long invalidUserId = 123L;
         when(userService.findById(invalidUserId)).thenReturn(null);
diff --git a/account-management/src/test/java/cz/muni/pa165/banking/application/service/AccountServiceTest.java b/account-management/src/test/java/cz/muni/pa165/banking/application/service/AccountServiceTest.java
index a17558a..2a33198 100644
--- a/account-management/src/test/java/cz/muni/pa165/banking/application/service/AccountServiceTest.java
+++ b/account-management/src/test/java/cz/muni/pa165/banking/application/service/AccountServiceTest.java
@@ -5,6 +5,10 @@ import cz.muni.pa165.banking.domain.account.repository.AccountRepository;
 import cz.muni.pa165.banking.domain.scheduled.ScheduledPayment;
 import cz.muni.pa165.banking.domain.scheduled.ScheduledPaymentProjection;
 import cz.muni.pa165.banking.domain.scheduled.repository.ScheduledPaymentRepository;
+import cz.muni.pa165.banking.domain.user.User;
+import cz.muni.pa165.banking.domain.user.repository.UserRepository;
+import cz.muni.pa165.banking.exception.EntityNotFoundException;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.InjectMocks;
@@ -15,8 +19,7 @@ import java.util.List;
 import java.util.Optional;
 
 import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.*;
 
 @ExtendWith(MockitoExtension.class)
 class AccountServiceTest {
@@ -24,6 +27,9 @@ class AccountServiceTest {
     @Mock
     private AccountRepository accountRepository;
 
+    @Mock
+    private UserRepository userRepository;
+
     @Mock
     private ScheduledPaymentRepository scheduledPaymentRepository;
 
@@ -34,6 +40,11 @@ class AccountServiceTest {
     void createAccount_ValidAccount_ReturnsAccount() {
         // Arrange
         Account account = new Account();
+        account.setId(1L);
+        account.setAccountNumber("123");
+        account.setUserId(1L);
+
+        when(userRepository.existsById(anyLong())).thenReturn(true);
         when(accountRepository.save(account)).thenReturn(account);
 
         // Act
@@ -45,7 +56,7 @@ class AccountServiceTest {
     }
 
     @Test
-    void getAccount_ValidAccountId_ReturnsAccount() throws Exception {
+    void getAccount_ValidAccountId_ReturnsAccount(){
         // Arrange
         Long accountId = 1L;
         Account account = new Account();
@@ -60,13 +71,13 @@ class AccountServiceTest {
     }
 
     @Test
-    void getAccountById_InvalidAccountId_ThrowsException() throws Exception {
+    void getAccountById_InvalidAccountId_ThrowsException(){
         // Arrange
         Long accountId = 1L;
         when(accountRepository.findById(accountId)).thenReturn(Optional.empty());
 
         // Act & Assert
-        assertThrows(Exception.class, () -> {
+        assertThrows(EntityNotFoundException.class, () -> {
             accountService.findById(accountId);
         });
 
@@ -74,7 +85,7 @@ class AccountServiceTest {
     }
 
     @Test
-    void getAccountByNumber_ValidAccountNumber_ReturnsAccount() throws Exception {
+    void getAccountByNumber_ValidAccountNumber_ReturnsAccount(){
         // Arrange
         String accountNumber = "123456789";
         Account account = new Account();
@@ -89,13 +100,13 @@ class AccountServiceTest {
     }
 
     @Test
-    void getAccountByNumber_InvalidAccountNumber_ThrowsException() throws Exception {
+    void getAccountByNumber_InvalidAccountNumber_ThrowsException(){
         // Arrange
         String accountNumber = "123456789";
         when(accountRepository.findByAccountNumber(accountNumber)).thenReturn(Optional.empty());
 
         // Act & Assert
-        assertThrows(Exception.class, () -> {
+        assertThrows(EntityNotFoundException.class, () -> {
             accountService.findByNumber(accountNumber);
         });
         verify(accountRepository).findByAccountNumber(accountNumber);
@@ -105,6 +116,11 @@ class AccountServiceTest {
     void schedulePayment_ValidScheduledPayment_ReturnsScheduledPayment() {
         // Arrange
         ScheduledPayment scheduledPayment = new ScheduledPayment();
+        scheduledPayment.setId(1L);
+        scheduledPayment.setSourceAccountId(1L);
+        scheduledPayment.setTargetAccountId(2L);
+
+        when(accountRepository.existsById(anyLong())).thenReturn(true);
         when(scheduledPaymentRepository.save(scheduledPayment)).thenReturn(scheduledPayment);
 
         // Act
@@ -116,14 +132,14 @@ class AccountServiceTest {
     }
 
     @Test
-    void schedulePayment_InvalidScheduledPayment_ReturnsNull() {
+    void schedulePayment_InvalidScheduledPayment_ThrowsException(){
         // Arrange
         ScheduledPayment scheduledPayment = new ScheduledPayment();
-        when(scheduledPaymentRepository.save(scheduledPayment)).thenReturn(null);
 
         // Act & Assert
-        assertNull(accountService.schedulePayment(scheduledPayment));
-        verify(scheduledPaymentRepository).save(scheduledPayment);
+        assertThrows(EntityNotFoundException.class, () -> {
+            accountService.schedulePayment(scheduledPayment);
+        });
     }
 
     @Test
@@ -140,4 +156,4 @@ class AccountServiceTest {
         // Assert
         assertEquals(scheduledPayments, result);
     }
-}
+}
\ No newline at end of file
diff --git a/account-management/src/test/java/cz/muni/pa165/banking/application/service/UserServiceTest.java b/account-management/src/test/java/cz/muni/pa165/banking/application/service/UserServiceTest.java
index 01e65e7..eb88965 100644
--- a/account-management/src/test/java/cz/muni/pa165/banking/application/service/UserServiceTest.java
+++ b/account-management/src/test/java/cz/muni/pa165/banking/application/service/UserServiceTest.java
@@ -27,18 +27,18 @@ class UserServiceTest {
     void createUser_ValidUser_ReturnsUser() {
         // Arrange
         User user = new User();
-        when(userRepository.addUser(user)).thenReturn(user);
+        when(userRepository.save(user)).thenReturn(user);
 
         // Act
         User result = userService.createUser(user);
 
         // Assert
         assertEquals(user, result);
-        verify(userRepository).addUser(user);
+        verify(userRepository).save(user);
     }
 
     @Test
-    void getUser_ValidUserId_ReturnsUser() throws Exception {
+    void getUser_ValidUserId_ReturnsUser(){
         // Arrange
         Long userId = 1L;
         User user = new User();
-- 
GitLab