polishing the workspace migration

This commit is contained in:
2026-06-22 13:40:58 +02:00
parent caf4e4bc89
commit 598287b0cc
43 changed files with 730 additions and 167 deletions

View File

@@ -17,6 +17,8 @@ import java.math.BigDecimal;
import java.util.Optional;
import java.util.UUID;
import static java.util.UUID.randomUUID;
import static org.junit.jupiter.api.Assertions.*;
@DataJpaTest
@@ -29,13 +31,14 @@ class TransactionRepositoryTest {
@Test
@DisplayName("Should save and find transaction by ID")
void shouldSaveAndFindById() {
Transaction transaction = createTestTransaction();
UUID wsId = randomUUID();
Transaction transaction = createTestTransaction(wsId);
Transaction saved = transactionRepository.save(transaction);
Optional<Transaction> found = transactionRepository.findById(saved.getId());
assertTrue(found.isPresent());
assertEquals("user-1", found.get().getUserId());
assertEquals(wsId, found.get().getWorkspaceId());
assertEquals(new BigDecimal("100.00"), found.get().getAmount());
}
@@ -48,19 +51,21 @@ class TransactionRepositoryTest {
}
@Test
@DisplayName("Should find transactions by userId")
void shouldFindByUserId() {
@DisplayName("Should find transactions by workspaceId")
void shouldFindByWorkspaceId() {
UUID ws1 = randomUUID();
UUID ws2 = randomUUID();
Transaction tx1 = createTestTransaction();
tx1.setUserId("user-1");
tx1.setWorkspaceId(ws1);
Transaction tx2 = createTestTransaction();
tx2.setUserId("user-2");
tx2.setWorkspaceId(ws2);
transactionRepository.save(tx1);
transactionRepository.save(tx2);
var results = transactionRepository.findAllByUserId("user-1");
var results = transactionRepository.findAllByWorkspaceId(ws1);
assertEquals(1, results.size());
assertEquals("user-1", results.get(0).getUserId());
assertEquals(ws1, results.get(0).getWorkspaceId());
}
@Test
@@ -68,7 +73,7 @@ class TransactionRepositoryTest {
void shouldReturnPaginatedResults() {
for (int i = 0; i < 5; i++) {
Transaction tx = createTestTransaction();
tx.setUserId("user-" + i);
tx.setWorkspaceId(randomUUID());
transactionRepository.save(tx);
}
@@ -97,7 +102,7 @@ class TransactionRepositoryTest {
@DisplayName("Should persist all transaction fields correctly")
void shouldPersistAllFields() {
Transaction transaction = Transaction.builder()
.userId("user-1")
.workspaceId(randomUUID())
.trace("TRACE-123")
.region("ZW")
.amount(new BigDecimal("150.00"))
@@ -134,7 +139,7 @@ class TransactionRepositoryTest {
Optional<Transaction> found = transactionRepository.findById(saved.getId());
assertTrue(found.isPresent());
assertEquals("user-1", found.get().getUserId());
assertNotNull(found.get().getWorkspaceId());
assertEquals(new BigDecimal("150.00"), found.get().getAmount());
assertEquals(new BigDecimal("5.00"), found.get().getCharge());
assertEquals(new BigDecimal("158.50"), found.get().getTotalAmount());
@@ -146,8 +151,12 @@ class TransactionRepositoryTest {
}
private Transaction createTestTransaction() {
return createTestTransaction(randomUUID());
}
private Transaction createTestTransaction(UUID workspaceId) {
return Transaction.builder()
.userId("user-1")
.workspaceId(workspaceId)
.amount(new BigDecimal("100.00"))
.debitCurrency(CurrencyType.USD)
.build();

View File

@@ -26,6 +26,8 @@ import java.util.List;
import java.util.Optional;
import java.util.UUID;
import static java.util.UUID.randomUUID;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;
@@ -55,7 +57,7 @@ class TransactionServiceTest {
void setUp() {
transaction = new Transaction();
transaction.setId(txId);
transaction.setUserId("user-1");
transaction.setWorkspaceId(randomUUID());
transaction.setAmount(new BigDecimal("100.00"));
transaction.setDebitCurrency(CurrencyType.USD);
transaction.setCreditCurrency(CurrencyType.ZWL);
@@ -142,15 +144,17 @@ class TransactionServiceTest {
}
@Test
@DisplayName("Should reassign transactions from old user to new user")
@DisplayName("Should reassign transactions from old workspace to new workspace")
void shouldReassignTransactions() {
UUID oldWs = randomUUID();
UUID newWs = randomUUID();
List<Transaction> transactions = List.of(transaction);
when(transactionRepository.findAllByUserId("old-user")).thenReturn(transactions);
when(transactionRepository.findAllByWorkspaceId(oldWs)).thenReturn(transactions);
when(transactionRepository.save(any(Transaction.class))).thenReturn(transaction);
transactionService.reassignTransactions("old-user", "new-user");
transactionService.reassignTransactions(oldWs, newWs);
assertEquals("new-user", transaction.getUserId());
assertEquals(newWs, transaction.getWorkspaceId());
verify(transactionRepository).save(transaction);
}

View File

@@ -13,6 +13,9 @@ import zw.qantra.tm.domain.models.Transaction;
import zw.qantra.tm.domain.services.RecipientService;
import java.util.List;
import java.util.UUID;
import static java.util.UUID.randomUUID;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.any;
@@ -34,7 +37,7 @@ class RecipientsUpdateHandlerTest {
transaction = new Transaction();
transaction.setStatus(Status.SUCCESS);
transaction.setCreditAccount("ACC-123");
transaction.setUserId("user-1");
transaction.setWorkspaceId(randomUUID());
transaction.setProviderLabel("econet");
transaction.setCreditName("John Doe");
transaction.setCreditEmail("john@example.com");
@@ -47,10 +50,10 @@ class RecipientsUpdateHandlerTest {
void shouldUpdateExistingRecipient() {
Recipient existingRecipient = new Recipient();
existingRecipient.setAccount("ACC-123");
existingRecipient.setUserId("user-1");
existingRecipient.setWorkspaceId(randomUUID());
existingRecipient.setName("Old Name");
when(recipientService.getRecipient("ACC-123", "user-1"))
when(recipientService.getRecipient("ACC-123", transaction.getWorkspaceId()))
.thenReturn(List.of(existingRecipient));
when(recipientService.save(any(Recipient.class))).thenReturn(existingRecipient);
@@ -68,7 +71,7 @@ class RecipientsUpdateHandlerTest {
@Test
@DisplayName("Should create new recipient when not found")
void shouldCreateNewRecipient() {
when(recipientService.getRecipient("ACC-123", "user-1"))
when(recipientService.getRecipient("ACC-123", transaction.getWorkspaceId()))
.thenReturn(List.of());
when(recipientService.save(any(Recipient.class))).thenAnswer(i -> i.getArgument(0));
@@ -94,7 +97,7 @@ class RecipientsUpdateHandlerTest {
void shouldUseBillNameForInitials() {
transaction.setCreditName(null);
when(recipientService.getRecipient("ACC-123", "user-1"))
when(recipientService.getRecipient("ACC-123", transaction.getWorkspaceId()))
.thenReturn(List.of());
when(recipientService.save(any(Recipient.class))).thenAnswer(i -> i.getArgument(0));
@@ -106,7 +109,7 @@ class RecipientsUpdateHandlerTest {
@Test
@DisplayName("Should handle exception gracefully without throwing")
void shouldHandleExceptionGracefully() {
when(recipientService.getRecipient("ACC-123", "user-1"))
when(recipientService.getRecipient("ACC-123", transaction.getWorkspaceId()))
.thenThrow(new RuntimeException("DB error"));
assertDoesNotThrow(() -> handler.process(transaction));
@@ -121,9 +124,9 @@ class RecipientsUpdateHandlerTest {
Recipient existingRecipient = new Recipient();
existingRecipient.setAccount("ACC-123");
existingRecipient.setUserId("user-1");
existingRecipient.setWorkspaceId(randomUUID());
when(recipientService.getRecipient("ACC-123", "user-1"))
when(recipientService.getRecipient("ACC-123", transaction.getWorkspaceId()))
.thenReturn(List.of(existingRecipient));
when(recipientService.save(any(Recipient.class))).thenReturn(existingRecipient);