From c0771d3216356b0f8cd8fd8c91e9e60c82799ae3 Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sun, 9 May 2021 11:25:48 +0200
Subject: [PATCH] #608 - transactions from hidden accounts should not show up
 in search

---
 .../TransactionSearchSpecifications.java      |  9 ++++++--
 .../TransactionSearchSpecificationsTest.java  | 23 +++++++++++++++++++
 2 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionSearchSpecifications.java b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionSearchSpecifications.java
index 4da6e8dab..ed3afbb43 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionSearchSpecifications.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/transactions/TransactionSearchSpecifications.java
@@ -1,5 +1,6 @@
 package de.deadlocker8.budgetmaster.transactions;
 
+import de.deadlocker8.budgetmaster.accounts.AccountState;
 import de.deadlocker8.budgetmaster.categories.Category;
 import de.deadlocker8.budgetmaster.search.Search;
 import de.deadlocker8.budgetmaster.tags.Tag;
@@ -47,9 +48,13 @@ public class TransactionSearchSpecifications
 				predicates.add(builder.like(builder.lower(tagJoin.get(Tag_.name).as(String.class)), pattern));
 			}
 
-			query.orderBy(builder.desc(transaction.get(Transaction_.date)));
 			Predicate[] predicatesArray = new Predicate[predicates.size()];
-			return builder.or(predicates.toArray(predicatesArray));
+			Predicate predicatesCombined = builder.or(predicates.toArray(predicatesArray));
+
+			Predicate accountStatePredicate = transaction.get(Transaction_.account).get("accountState").in(List.of(AccountState.FULL_ACCESS, AccountState.READ_ONLY));
+
+			query.orderBy(builder.desc(transaction.get(Transaction_.date)));
+			return builder.and(accountStatePredicate, predicatesCombined);
 		};
 	}
 }
diff --git a/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionSearchSpecificationsTest.java b/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionSearchSpecificationsTest.java
index 40e281d69..3443d6025 100644
--- a/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionSearchSpecificationsTest.java
+++ b/src/test/java/de/deadlocker8/budgetmaster/unit/TransactionSearchSpecificationsTest.java
@@ -2,6 +2,7 @@ package de.deadlocker8.budgetmaster.unit;
 
 import de.deadlocker8.budgetmaster.accounts.Account;
 import de.deadlocker8.budgetmaster.accounts.AccountRepository;
+import de.deadlocker8.budgetmaster.accounts.AccountState;
 import de.deadlocker8.budgetmaster.accounts.AccountType;
 import de.deadlocker8.budgetmaster.categories.Category;
 import de.deadlocker8.budgetmaster.categories.CategoryRepository;
@@ -41,6 +42,7 @@ public class TransactionSearchSpecificationsTest
 	private Transaction transaction2;
 	private Transaction repeatingTransaction;
 	private Transaction transferTransaction;
+	private Transaction transactionFromHiddenAccount;
 
 	@Autowired
 	private CategoryRepository categoryRepository;
@@ -51,6 +53,7 @@ public class TransactionSearchSpecificationsTest
 	private AccountRepository accountRepository;
 	private Account account;
 	private Account account2;
+	private Account accountHidden;
 
 	@Autowired
 	private TagRepository tagRepository;
@@ -66,6 +69,8 @@ public class TransactionSearchSpecificationsTest
 	{
 		account = accountRepository.save(new Account("TestAccount", AccountType.CUSTOM));
 		account2 = accountRepository.save(new Account("TestAccount2", AccountType.CUSTOM));
+		accountHidden = accountRepository.save(new Account("Hidden account", AccountType.CUSTOM));
+		accountHidden.setAccountState(AccountState.HIDDEN);
 
 		category1 = categoryRepository.save(new Category("Category1", "#ff0000", CategoryType.CUSTOM));
 		category2 = categoryRepository.save(new Category("xxx", "#ff0000", CategoryType.CUSTOM));
@@ -121,6 +126,14 @@ public class TransactionSearchSpecificationsTest
 		transferTransaction.setAccount(account);
 		transferTransaction.setTransferAccount(account2);
 		transferTransaction = transactionRepository.save(transferTransaction);
+
+		transactionFromHiddenAccount = new Transaction();
+		transactionFromHiddenAccount.setName("inside hidden account");
+		transactionFromHiddenAccount.setAmount(-525);
+		transactionFromHiddenAccount.setDate(new DateTime(2018, 11, 3, 12, 0, 0, 0));
+		transactionFromHiddenAccount.setCategory(category2);
+		transactionFromHiddenAccount.setAccount(accountHidden);
+		transactionFromHiddenAccount = transactionRepository.save(transactionFromHiddenAccount);
 	}
 
 	@Test
@@ -247,4 +260,14 @@ public class TransactionSearchSpecificationsTest
 		assertThat(results).hasSize(1)
 				.contains(transaction1);
 	}
+
+	@Test
+	public void getMatches_IgnoreTransactionsFromHiddenAccounts()
+	{
+		Search search = new Search("hidden", true, false, false, false, 0);
+		Specification spec = TransactionSearchSpecifications.withDynamicQuery(search);
+
+		List<Transaction> results = transactionRepository.findAll(spec);
+		assertThat(results).isEmpty();
+	}
 }
\ No newline at end of file
-- 
GitLab