Skip to content
Snippets Groups Projects
Commit 50785d23 authored by Robert Goldmann's avatar Robert Goldmann
Browse files

#293 - added transaction metaclass and basic test

parent 69468af2
No related branches found
No related tags found
No related merge requests found
package de.deadlocker8.budgetmaster.entities.transaction;
import org.springframework.data.jpa.domain.Specification;
import javax.persistence.criteria.Predicate;
import java.util.ArrayList;
import java.util.List;
public class TransactionSpecifications
{
public static Specification<Transaction> withDynamicQuery(final Integer amount, final String name)
{
return (transaction, query, builder) -> {
if(amount == null && name == null)
{
throw new IllegalStateException("At least one parameter should be provided to construct complex query");
}
List<Predicate> predicates = new ArrayList<>();
if(amount != null)
{
predicates.add(builder.and(builder.equal(transaction.get(Transaction_.amount), amount)));
}
if(name != null)
{
predicates.add(builder.and(builder.equal(transaction.get(Transaction_.name), name)));
}
Predicate[] predicatesArray = new Predicate[predicates.size()];
return builder.and(predicates.toArray(predicatesArray));
};
}
}
......@@ -4,12 +4,13 @@ import de.deadlocker8.budgetmaster.entities.account.Account;
import de.deadlocker8.budgetmaster.entities.transaction.Transaction;
import org.joda.time.DateTime;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
public interface TransactionRepository extends JpaRepository<Transaction, Integer>
public interface TransactionRepository extends JpaRepository<Transaction, Integer>, JpaSpecificationExecutor<Transaction>
{
List<Transaction> findAllByAccountAndDateBetweenOrderByDateDesc(Account account, DateTime startDate, DateTime endDate);
......
package de.deadlocker8.budgetmaster;
import de.deadlocker8.budgetmaster.entities.account.Account;
import de.deadlocker8.budgetmaster.entities.account.AccountType;
import de.deadlocker8.budgetmaster.entities.category.Category;
import de.deadlocker8.budgetmaster.entities.category.CategoryType;
import de.deadlocker8.budgetmaster.entities.transaction.Transaction;
import de.deadlocker8.budgetmaster.entities.transaction.TransactionSpecifications;
import de.deadlocker8.budgetmaster.repositories.AccountRepository;
import de.deadlocker8.budgetmaster.repositories.CategoryRepository;
import de.deadlocker8.budgetmaster.repositories.TransactionRepository;
import org.joda.time.DateTime;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.List;
import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@DataJpaTest
public class TransactionRepositoryTest
{
@Autowired
private TransactionRepository transactionRepository;
private Transaction transaction1;
private Transaction transaction2;
@Autowired
private CategoryRepository categoryRepository;
private Category category1;
private Category category2;
@Autowired
private AccountRepository accountRepository;
private Account account;
@Before
public void init()
{
account = accountRepository.save(new Account("TestAccount", AccountType.CUSTOM));
category1 = categoryRepository.save(new Category("Category1", "#ff0000", CategoryType.CUSTOM));
category2 = categoryRepository.save(new Category("Category2", "#ff0000", CategoryType.CUSTOM));
transaction1 = new Transaction();
transaction1.setName("Test");
transaction1.setAmount(200);
transaction1.setDate(new DateTime(2018, 10, 3, 12, 0, 0, 0));
transaction1.setCategory(category1);
transaction1.setAccount(account);
transactionRepository.save(transaction1);
transaction2 = new Transaction();
transaction2.setName("Test_2");
transaction2.setAmount(-525);
transaction2.setDate(new DateTime(2018, 10, 3, 12, 0, 0, 0));
transaction2.setCategory(category2);
transaction2.setAccount(account);
transactionRepository.save(transaction2);
}
@Test
public void getSpecificTransaction()
{
Specification spec = TransactionSpecifications.withDynamicQuery(200, "Test");
List<Transaction> results = transactionRepository.findAll(spec);
assertTrue(results.contains(transaction1));
assertFalse(results.contains(transaction2));
}
@Test
public void oneCriteria()
{
Specification spec = TransactionSpecifications.withDynamicQuery(-525, null);
List<Transaction> results = transactionRepository.findAll(spec);
System.out.println(results);
assertTrue(results.contains(transaction2));
assertFalse(results.contains(transaction1));
}
@Test
public void noMatch()
{
Specification spec = TransactionSpecifications.withDynamicQuery(855, "eimer");
List<Transaction> results = transactionRepository.findAll(spec);
assertEquals(0, results.size());
}
}
\ No newline at end of file
......@@ -20,6 +20,7 @@ import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.ArrayList;
......@@ -213,6 +214,36 @@ public class DatabaseImportTest
{
return new TransactionRepository()
{
@Override
public Transaction findOne(Specification<Transaction> specification)
{
return null;
}
@Override
public List<Transaction> findAll(Specification<Transaction> specification)
{
return null;
}
@Override
public Page<Transaction> findAll(Specification<Transaction> specification, Pageable pageable)
{
return null;
}
@Override
public List<Transaction> findAll(Specification<Transaction> specification, Sort sort)
{
return null;
}
@Override
public long count(Specification<Transaction> specification)
{
return 0;
}
@Override
public List<Transaction> findAllByAccountAndDateBetweenOrderByDateDesc(Account account, DateTime startDate, DateTime endDate)
{
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment