package net.rrm.ehour.backup.service.restore; import net.rrm.ehour.backup.common.BackupConfig; import net.rrm.ehour.backup.common.BackupEntityType; import net.rrm.ehour.backup.domain.ImportException; import net.rrm.ehour.backup.domain.ParseSession; import net.rrm.ehour.domain.*; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import java.io.Serializable; import java.io.StringReader; import java.util.List; import java.util.Map; import static org.junit.Assert.*; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; /** * @author thies (Thies Edeling - thies@te-con.nl) * Created on: Nov 16, 2010 - 11:54:54 PM */ @SuppressWarnings("unchecked") @RunWith(MockitoJUnitRunner.class) public class EntityParserTest { private EntityParserDaoTestValidator daoValidator; private PrimaryKeyCache keyCache; private ParseSession status; @Mock private BackupConfig backupConfig; @Before public void setUp() { keyCache = new PrimaryKeyCache(); status = new ParseSession(); } private EntityParser createParser(String xmlData, DomainObject<Integer, ?> returnOnFind, Integer onFind) throws XMLStreamException { XMLInputFactory inputFactory = XMLInputFactory.newInstance(); XMLEventReader eventReader = inputFactory.createXMLEventReader(new StringReader(xmlData)); // skip the startdoc eventReader.nextTag(); daoValidator = (EntityParserDaoTestValidator) (returnOnFind == null ? new EntityParserDaoValidatorImpl() : new EntityParserDaoTestValidator(returnOnFind, onFind)); return new EntityParser(eventReader, daoValidator, keyCache, backupConfig); } @Test public void shouldParseTwoTimesheetEntries() throws XMLStreamException, InstantiationException, IllegalAccessException, ImportException { EntityParser parser = createParser("<TIMESHEET_ENTRIES CLASS=\"net.rrm.ehour.domain.TimesheetEntry\">\n<TIMESHEET_ENTRY>\n<ASSIGNMENT_ID>1</ASSIGNMENT_ID>\n<ENTRY_DATE>2007-03-26</ENTRY_DATE>\n<HOURS>8.0</HOURS>\n <COMMENT>jaja</COMMENT>\n </TIMESHEET_ENTRY>\n <TIMESHEET_ENTRY>\n <ASSIGNMENT_ID>2</ASSIGNMENT_ID>\n <ENTRY_DATE>2007-03-26</ENTRY_DATE>\n <HOURS>0.0</HOURS>\n </TIMESHEET_ENTRY>\n </TIMESHEET_ENTRIES>\n", ProjectAssignmentObjectMother.createProjectAssignment(1), 1); keyCache.putKey(ProjectAssignment.class, 1, 1); keyCache.putKey(ProjectAssignment.class, 2, 2); List<TimesheetEntry> result = parser.parse(TimesheetEntry.class, new JoinTables(), status); assertEquals(2, result.size()); assertNotNull(result.get(0).getEntryId().getEntryDate()); assertNotNull(result.get(0).getEntryId().getProjectAssignment()); assertEquals(8.0, result.get(0).getHours(), 0); assertEquals("jaja", result.get(0).getComment()); assertEquals(2, daoValidator.getTotalPersistCount()); } @Test public void shouldParseUserAndStoreNewKeyInCacheMap() throws XMLStreamException, InstantiationException, IllegalAccessException, ImportException { UserDepartment department = UserDepartmentObjectMother.createUserDepartment(); EntityParser parser = createParser("<USERLIST>\n <USERS>\n <USER_ID>1</USER_ID>\n <USERNAME>admin</USERNAME>\n <PASSWORD>1d798ca9dba7df61bf399a02695f9f50034bad66</PASSWORD>\n <FIRST_NAME>eHour</FIRST_NAME>\n <LAST_NAME>Admin</LAST_NAME>\n <EMAIL>t@t.net</EMAIL>\n <ACTIVE>Y</ACTIVE>\n </USERS>\n <USERS>\n <USER_ID>3</USER_ID>\n <USERNAME>thies</USERNAME>\n <PASSWORD>e2e90187007d55ae40678e11e0c9581cb7bb9928</PASSWORD>\n <FIRST_NAME>Thies</FIRST_NAME>\n <LAST_NAME>Edeling</LAST_NAME>\n <EMAIL>thies@te-con.nl</EMAIL>\n <ACTIVE>Y</ACTIVE>\n <SALT>6367</SALT>\n </USERS>\n </USERLIST>\n", department, 1); keyCache.putKey(UserDepartment.class, 1, 1); List<User> result = parser.parse(User.class, new JoinTables(), status); assertEquals(2, result.size()); User user = result.get(0); assertEquals("admin", user.getUsername()); assertEquals("1d798ca9dba7df61bf399a02695f9f50034bad66", user.getPassword()); assertEquals("eHour", user.getFirstName()); assertEquals("Admin", user.getLastName()); assertEquals("t@t.net", user.getEmail()); assertTrue(user.isActive()); PrimaryKeyCache keyCache = parser.getKeyCache(); assertFalse(keyCache.isEmpty()); Map<Serializable, Serializable> map = keyCache.keyMap.get(User.class); assertEquals(2, map.entrySet().size()); } @Test public void shouldParseEnum() throws IllegalAccessException, XMLStreamException, InstantiationException, ImportException { EntityParser parser = createParser(" <AUDITS CLASS=\"net.rrm.ehour.domain.Audit\"><AUDIT>\n <AUDIT_ID>173</AUDIT_ID>\n <USER_ID>2</USER_ID>\n <USER_FULLNAME>Edeling, Thies</USER_FULLNAME>\n <AUDIT_DATE>2010-01-12 16:20:51.0</AUDIT_DATE>\n <SUCCESS>Y</SUCCESS>\n <AUDIT_ACTION_TYPE>LOGIN</AUDIT_ACTION_TYPE>\n </AUDIT></AUDITS>\n", UserObjectMother.createUser(), 2); when(backupConfig.entityForClass(Audit.class)).thenReturn(mock(BackupEntityType.class)); List<Audit> result = parser.parse(Audit.class, new JoinTables(), status); assertEquals(1, result.size()); assertEquals(AuditActionType.LOGIN, result.get(0).getAuditActionType()); } @Test public void shouldRetrieveManyToOne() throws IllegalAccessException, XMLStreamException, InstantiationException, ImportException { User user = UserObjectMother.createUser(); EntityParser parser = createParser("<AUDITS CLASS=\"net.rrm.ehour.domain.Audit\"><AUDIT>\n <AUDIT_ID>173</AUDIT_ID>\n <USER_ID>2</USER_ID>\n <USER_FULLNAME>Edeling, Thies</USER_FULLNAME>\n <AUDIT_DATE>2010-01-12 16:20:51.0</AUDIT_DATE>\n <SUCCESS>Y</SUCCESS>\n <AUDIT_ACTION_TYPE>LOGIN</AUDIT_ACTION_TYPE>\n </AUDIT></AUDITS>\n", user, 2); when(backupConfig.entityForClass(Audit.class)).thenReturn(mock(BackupEntityType.class)); keyCache.putKey(User.class, 2, 2); List<Audit> result = parser.parse(Audit.class, new JoinTables(), status); assertEquals(1, result.size()); assertEquals(AuditActionType.LOGIN, result.get(0).getAuditActionType()); assertEquals(1, daoValidator.getTotalPersistCount()); assertEquals(user, result.get(0).getUser()); } @Test @Ignore public void shouldImportManyToMany() throws XMLStreamException, InstantiationException, IllegalAccessException, ImportException { UserDepartment department = UserDepartmentObjectMother.createUserDepartment(); EntityParser parser = createParser("<USERLIST>\n <USERS>\n <USER_ID>1</USER_ID>\n <USERNAME>admin</USERNAME>\n <PASSWORD>1d798ca9dba7df61bf399a02695f9f50034bad66</PASSWORD>\n <FIRST_NAME>eHour</FIRST_NAME>\n <LAST_NAME>Admin</LAST_NAME>\n <EMAIL>t@t.net</EMAIL>\n <ACTIVE>Y</ACTIVE>\n </USERS>\n <USERS>\n <USER_ID>3</USER_ID>\n <USERNAME>thies</USERNAME>\n <PASSWORD>e2e90187007d55ae40678e11e0c9581cb7bb9928</PASSWORD>\n <FIRST_NAME>Thies</FIRST_NAME>\n <LAST_NAME>Edeling</LAST_NAME>\n <EMAIL>thies@te-con.nl</EMAIL>\n <ACTIVE>Y</ACTIVE>\n <SALT>6367</SALT>\n </USERS>\n </USERLIST>\n", department, 1); JoinTables joinTables = new JoinTables(); joinTables.put("USER_TO_DEPARTMENT", "1", "2"); joinTables.put("USER_TO_USERROLE", "1", "ADMIN"); List<User> result = parser.parse(User.class, joinTables, status); User user = result.get(0); assertEquals(1, user.getUserRoles().size()); } private class EntityParserDaoTestValidator<T extends Serializable> extends EntityParserDaoValidatorImpl { public EntityParserDaoTestValidator(T returnObject, Serializable primaryKey) { this.primaryKey = primaryKey; this.returnObject = returnObject; } @Override public <W extends Serializable> W find(Serializable primaryKey, Class<W> type) { if (this.primaryKey == primaryKey && returnObject.getClass() == type) { return (W) returnObject; } else { return null; } } private T returnObject; private Serializable primaryKey; } }