package com.github.gaborfeher.grantmaster.logic.wrappers;
import com.github.gaborfeher.grantmaster.framework.base.RowEditState;
import com.github.gaborfeher.grantmaster.framework.utils.DatabaseSingleton;
import com.github.gaborfeher.grantmaster.logic.entities.BudgetCategory;
import com.github.gaborfeher.grantmaster.logic.entities.Currency;
import com.github.gaborfeher.grantmaster.logic.entities.Project;
import com.github.gaborfeher.grantmaster.logic.entities.ProjectReport;
import java.sql.Timestamp;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import org.junit.After;
import org.junit.AfterClass;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class ProjectWrapperTest extends TestBase {
Currency HUF;
Currency USD;
Currency EUR;
BudgetCategory SOME_GRANT;
BudgetCategory SOME_EXPENSE;
public ProjectWrapperTest() {
}
@BeforeClass
public static void setUpClass() {
}
@AfterClass
public static void tearDownClass() {
}
@Before
public void setUp() {
assertTrue(DatabaseSingleton.INSTANCE.connectToMemoryFileForTesting());
assertTrue(DatabaseSingleton.INSTANCE.transaction((EntityManager em) -> {
HUF = TestUtils.createCurrency(em, "HUF");
USD = TestUtils.createCurrency(em, "USD");
EUR = TestUtils.createCurrency(em, "EUR");
SOME_GRANT = new BudgetCategory(
BudgetCategory.Direction.INCOME, "i.stuff", "Some kind of project grant");
em.persist(SOME_GRANT);
SOME_EXPENSE = new BudgetCategory(
BudgetCategory.Direction.PAYMENT, "p.stuff", "Some kind of expense");
return true;
}));
}
@After
public void tearDown() {
DatabaseSingleton.INSTANCE.close();
}
@Test
public void testCreateProject() {
final ProjectWrapper newWrapper = ProjectWrapper.createNew();
newWrapper.setState(RowEditState.EDITING_NEW);
newWrapper.setProperty("name", "testProject", String.class);
newWrapper.setProperty("grantCurrency", USD, Currency.class);
newWrapper.setProperty("accountCurrency", HUF, Currency.class);
newWrapper.setProperty("incomeType", SOME_GRANT, BudgetCategory.class);
assertTrue(DatabaseSingleton.INSTANCE.transaction(newWrapper::save));
assertEquals(RowEditState.SAVED, newWrapper.getState());
DatabaseSingleton.INSTANCE.query((EntityManager em) -> {
Project project = em.find(Project.class, newWrapper.getId());
assertEquals("testProject", project.getName());
assertEquals("USD", project.getGrantCurrency().getCode());
assertEquals("HUF", project.getAccountCurrency().getCode());
assertEquals(SOME_GRANT.getId(), project.getIncomeType().getId());
return true;
});
}
@Test
public void testDeleteProject() {
// Create projects for testing.
assertTrue(DatabaseSingleton.INSTANCE.transaction((EntityManager em) -> {
Project project1 = TestUtils.createProject(
em, "P1", USD, HUF, SOME_GRANT, Project.ExpenseMode.NORMAL_AUTO_BY_SOURCE);
ProjectReport report1 = TestUtils.createProjectReport(em, project1, LocalDate.of(2015, 5, 18));
TestUtils.createProjectSource(em, project1, LocalDate.of(2014, 1, 1), report1, "100", "1000");
TestUtils.createProjectExpense(em, project1, SOME_EXPENSE, LocalDate.of(2014, 6, 4), report1, "1000", HUF, "1000");
TestUtils.createProjectNote(em, project1, new Timestamp(1234), "hello, world");
TestUtils.createProjectBudgetLimit(em, project1, SOME_EXPENSE, null, "1000");
TestUtils.createProject(
em, "P2", USD, HUF, SOME_GRANT, Project.ExpenseMode.NORMAL_AUTO_BY_SOURCE);
return true;
}));
// Query projects into a list, to simulate real use case, when the wrappers
// have detached objects.
final List<ProjectWrapper> projects = new ArrayList<>();
assertTrue(DatabaseSingleton.INSTANCE.transaction((EntityManager em) -> {
projects.addAll(ProjectWrapper.getProjects(em));
return true;
}));
// Projects in list get detached now.
assertTrue(DatabaseSingleton.INSTANCE.transaction((EntityManager em) -> {
ProjectWrapper projectToDelete = TestUtils.findProjectByName(em, "P1");
projectToDelete.delete(em);
return true;
}));
// Verify effect.
assertTrue(DatabaseSingleton.INSTANCE.query((EntityManager em) -> {
List<ProjectWrapper> list = ProjectWrapper.getProjects(em);
assertEquals(1, list.size());
assertEquals("P2", list.get(0).getEntity().getName());
return true;
}));
}
}