package com.processpuzzle.party.domain;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.hamcrest.core.IsNull.notNullValue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.sql.Timestamp;
import java.util.List;
import org.junit.Test;
import com.processpuzzle.commons.persistence.RepositoryResultSet;
import com.processpuzzle.commons.rdbms.NoDataAvailableException;
import com.processpuzzle.fundamental_types.domain.TimePeriod;
import com.processpuzzle.fundamental_types.domain.TimePoint;
import com.processpuzzle.litest.template.RepositoryTestTemplate;
import com.processpuzzle.party.partytype.domain.PartyType;
import com.processpuzzle.persistence.domain.DefaultUnitOfWork;
import com.processpuzzle.sharedfixtures.domaintier.DomainTierTestConfiguration;
//Tests Party aggregation root's persistence related functionality.
//Doesn't deal with transient, domain logic specific stuff.
public class PartyRepositoryTest extends RepositoryTestTemplate<PartyRepository, PartyRepositoryTestFixture, Party<?>> {
public PartyRepositoryTest() {
super( DomainTierTestConfiguration.FIXTURE_CONTAINER_DEFINITION_PATH );
}
@Override
@Test
public void testAdd_ForOwnedAttributesAndComponents() {
assertThat( databaseSpy.retrieveColumnFromRow( "T_PARTY_NAME", root.getPartyName().getId(), String.class, "name" ), equalTo( root.getPartyName().getName() ) );
}
@Override
@Test
public void testAdd_ForReferencedAggregateRoots() {}
@Override
@Test
public void testDelete_ForOwnedAttributesAndComponents() {
Party<?> testParty = fixture.createTestPerson();
Integer partyNameForeignKey = testParty.getPartyName().getId();
DefaultUnitOfWork deleteWork = new DefaultUnitOfWork( true );
repository.delete( deleteWork, testParty );
deleteWork.finish();
try{
databaseSpy.retrieveColumnFromRow( "T_PARTY_NAME", partyNameForeignKey, String.class, "name" );
fail();
}catch( NoDataAvailableException e ){
assertTrue( "Party name is deleted", true );
}
}
@Test
public void findPartyByPartySummary() {
// SETUP :
PartySummary partySummary = fixture.getPartySummaryFactory().createPartySummary( root );
// EXERCISE
Party<?> party = repository.findPartyByPartySummary( partySummary );
// VERIFY
assertThat( party, notNullValue() );
// TEARDOWN
}
@Test
public void findPartiesByPartyName() {
findPersonByPartyName();
findCompanyByPartyName();
findCompanyByShort();
}
private void findCompanyByPartyName() {
String companyShortName = "IT K�dex Kft.";
String organisationName = "IT K�dex Sz�m�t�stechnikai Tan�csad� �s Szolg�ltat� Kft.";
Party<?> createdCompany = fixture.createTestCompany( organisationName, companyShortName );
DefaultUnitOfWork work = new DefaultUnitOfWork( true );
List<Party> parties = repository.findPartiesByPartyName( work, organisationName );
assertThat( parties, notNullValue() );
assertThat( parties.size(), is( 1 ) );
Party<?> foundCompanyAsParty = parties.get( 0 );
assertThat( foundCompanyAsParty, notNullValue() );
assertThat( foundCompanyAsParty.getName(), equalTo( organisationName ) );
work.finish();
work = new DefaultUnitOfWork( true );
repository.delete( work, createdCompany );
work.finish();
}
private void findCompanyByShort() {
String companyShortName = "IT Kódex Kft.";
String organisationName = "IT Kódex Számítástechnikai Tanácsadó és Szolgáltató Kft.";
Party<?> createdCompany = fixture.createTestCompany( organisationName, companyShortName );
DefaultUnitOfWork work = new DefaultUnitOfWork( true );
List<Company> companies = fixture.getCompanyRepository().findCompaniesByShortName( work, companyShortName );
Company foundCompanyAsCompany = (companies != null && companies.size() > 0) ? companies.get( 0 ) : null;
assertThat( foundCompanyAsCompany, notNullValue() );
assertThat( foundCompanyAsCompany.getPartyName().getName(), equalTo( organisationName ) );
assertThat( foundCompanyAsCompany.getShortName(), equalTo( companyShortName ) );
work.finish();
work = new DefaultUnitOfWork( true );
repository.delete( work, createdCompany );
work.finish();
}
private void findPersonByPartyName() {
DefaultUnitOfWork work = new DefaultUnitOfWork( true );
String expectedPartyName = "B�rczi Ben�";
List<Party> parties = repository.findPartiesByPartyName( work, expectedPartyName );
work.finish();
assertThat( parties, notNullValue() );
assertThat( parties.size(), is( 1 ) );
}
@Test
public void testFindByPartyTypeName() {
DefaultUnitOfWork work = new DefaultUnitOfWork( true );
String partyTypeName = root.getType().getName();
RepositoryResultSet<Person> result = fixture.getPersonRepository().findByPartyTypeName( work, partyTypeName );
Person p = (Person) result.iterator().next();
assertEquals( "Person found by PartyType name", root.getId(), p.getId() );
work.finish();
}
@Override
@Test
public void testFindAll_ForResultCount() {
assertEquals( 1, repository.findAll( testWork ).size() );
}
@Override
@Test
public void testFindById() {
DefaultUnitOfWork work = new DefaultUnitOfWork( true );
Person savedPerson = fixture.getPersonRepository().findById( work, root.getId() );
assertThat( savedPerson.getId(), equalTo( root.getId() ) );
assertThat( savedPerson.getPartyName(), notNullValue() );
assertThat( savedPerson.getPersonName().getName(), equalTo( root.getPartyName().getName() ) );
work.finish();
}
@Override
public void testFindById_ForEagerLoadedComponents() {
// TODO Auto-generated method stub
}
@Override
public void testFindById_ForLazyLoadedComponents() {
// TODO Auto-generated method stub
}
@Override
@Test
public void testFindByQuery_ForComponentAttributes() {}
@Override
public void testFindByQuery_ForDirectAttributes() {
// TODO Auto-generated method stub
}
@Override
public void testUpdate_ForOwnedAttributesAndComponents() {
root.renameName( "newname" );
root.setValid( new TimePeriod( new TimePoint( 2008, 1, 1 ), new TimePoint( 2008, 12, 31 ) ) );
DefaultUnitOfWork work = new DefaultUnitOfWork( true );
repository.update( work, root );
assertEquals( "New name is updated", root.getName(), repository.findById( work, root.getId() ).getName() );
work.finish();
assertThat( "Valid TimePeriod is updated", databaseSpy.retrieveColumnFromRow( "T_PARTY", root.getId(), Timestamp.class, "validBegin" ),
equalTo( new Timestamp( root.getValid().getBegin().getValue().getTime() ) ) );
assertThat( "Valid TimePeriod is updated", databaseSpy.retrieveColumnFromRow( "T_PARTY", root.getId(), Timestamp.class, "validEnd" ),
equalTo( new Timestamp( root.getValid().getEnd().getValue().getTime() ) ) );
}
@Override
@Test
public void testUpdate_ForReferencedAggregateRoots() {
// SETUP
DefaultUnitOfWork work = new DefaultUnitOfWork( true );
PartyType type = new PartyType( "OtherType" );
fixture.getPartyTypeRepository().add( work, type );
// EXERCISE
// root.setPartyType( type );
repository.update( work, root );
work.finish();
// VERIFY
assertEquals( "PartyType is updated", root.getType().getName(), databaseSpy.retrieveColumnFromRow( "T_PARTY_TYPE", root.getType().getId(), String.class, "name" ) );
// TEARDOWN
DefaultUnitOfWork work2 = new DefaultUnitOfWork( true );
// root.setPartyType( partyType );
repository.update( work2, root );
fixture.getPartyTypeRepository().delete( work2, type );
work2.finish();
}
// private static PartyRepository partyRep;
// private Person person;
// private static ZipCodeRepository zipCodeRepository;
// private static CountryRepository countryRepository;
// private static SettlementRepository settlementRepository;
//
// static {
// ProcessPuzzleContext config = ProcessPuzzleContext.getInstance();
// try {
// config.setUp( ConfigurationConstants.CONFIGURATION_PROPERTY_FILE );
// } catch (ConfigurationSetUpException e) {
// e.printStackTrace();
// }
// settlementRepository = (SettlementRepository)
// ObjectPuzzleConfiguration.getInstance().getRepository(SettlementRepository.class);
// zipCodeRepository = (ZipCodeRepository)
// ObjectPuzzleConfiguration.getInstance().getRepository(ZipCodeRepository.class);
// countryRepository = (CountryRepository)
// ObjectPuzzleConfiguration.getInstance().getRepository(CountryRepository.class);
// partyRep = (PartyRepository)
// ObjectPuzzleConfiguration.getInstance().getRepository(PartyRepository.class);
// }
// @Before
// public void setUp() throws Exception {
// UnitOfWork work = new UnitOfWork(true);
// person = new Person();
// PersonName name = new PersonName("Pista", "Kiss");
// EmailAddress address = new EmailAddress("pista.kiss@gmail.com");
// person.setPartyName(name);
// person.getAddresses().add(address);
// partyRep.addPerson(work, person);
// work.finish();
// }
//
// @After
// public void tearDown() throws Exception {
// UnitOfWork work = new UnitOfWork(true);
// partyRep.deletePerson(work, person.getId().toString());
// work.finish();
// }
//
// @Test
// // Person
// public void testAddPerson() {
// UnitOfWork work = new UnitOfWork(true);
// assertEquals("The person's name is Kiss Pista.",
// partyRep.findPersonById(work, person.getId()).getPartyName().getName(),
// "Kiss Pista");
// work.finish();
// }
// @Test
// public void testUpdatePerson() {
// UnitOfWork work = new UnitOfWork(true);
// EmailAddress address = new EmailAddress("pista.kiss@gmail.com1");
// person.getAddresses().add(address);
// partyRep.updatePerson(work, person);
// assertEquals("The person's name is Kiss Pista.",
// partyRep.findPersonById(work, person.getId()).getAddresses().size(), 2);
// work.finish();
// }
//
// @Test
// public void testGetPerson() {
// UnitOfWork work = new UnitOfWork(true);
// Person person1 = partyRep.findPersonById(work, person.getId().toString());
// assertNotNull("shouldn't be null", person1);
// assertEquals("this person is the same, as the one saved in
// testAddPerson()", person.getPartyName().getName(), person1.getPartyName()
// .getName());
// assertTrue("address association was cascaded. person(with lazy loading set
// to false) should contain it", !person1.getAddresses()
// .isEmpty());
// Iterator it = person1.getAddresses().iterator();
// Address address = (Address) it.next();
// assertTrue("polimorfism should work", address instanceof EmailAddress);
// work.finish();
// }
// @Ignore
// @Test
// public void testUpdatePerson1() {
// UnitOfWork work = new UnitOfWork(true);
// PersonName name = new PersonName("Istv�n", "Kiss");
// person.setPartyName(name);
// partyRep.updatePerson(work, person);
//
// Person person1 = partyRep.findPersonById(work, person.getId().toString());
// assertEquals("person now has a different name",
// person1.getPartyName().getName(), " Istv�n");
// work.finish();
// }
// @Ignore
// @Test
// public void testDeletePerson() {
// UnitOfWork work = new UnitOfWork(true);
// partyRep.deletePerson(work, person.getId().toString());
// Person person1 = partyRep.findPersonById(work, person.getId().toString());
// assertNull("there is no such id in the database", person1);
// Iterator it = person.getAddresses().iterator();
// Address address = (Address) it.next();
// //Address address1 = partyRep.findAddressById(work, new
// Integer(address.getId().toString()));
// //assertNull("cascaded delete should work, so database integrity is ok",
// address1);
// work.finish();
// }
// Division
/*
* public void testAddDivision() { OrganizationName name = new OrganizationName("The Division"); WebPageAddress address = new
* WebPageAddress("www.thedepartment.com"); Set otherNames = new HashSet(); otherNames.add("The Division2"); otherNames.add("The Division3"); Division
* division = new Division(); division.setOrganizationName(name); division.setOtherNames(otherNames); division.getAddresses().add(address);
* partyRep.addDivision(division); }
*/
// Company
/*
* public void testAddCompany() { OrganizationName name = new OrganizationName("The Company"); Set softwareSystems = new HashSet();
* softwareSystems.add("SoftwareSystem1"); softwareSystems.add("SoftwareSyetem2"); Company company = new Company(); company.setOrganizationName(name);
* company.setSoftwareSystems(softwareSystems); partyRep.addCompany(company); }
*/
/*
* public void testGetCompany() { Company company1 = partyRep.findCompanyById(company.getId().toString()); assertEquals("it must be the same Company",
* company1.getName(), company.getName()); assertNotNull("softwareSystems collection is not lazy loaded", company1.getSoftwareSystems());
* assertEquals("it contains two systems", company1.getSoftwareSystems().size(), 2); } public void testUpdateCompany() { company.setOrganizationName(new
* OrganizationName("Different Name")); Set softwareSystems = company.getSoftwareSystems(); softwareSystems.remove("SoftwareSystem2");
* partyRep.updateCompany(company); Company company1 = partyRep.findCompanyById(company.getId().toString()); assertEquals("Company has a different name",
* company1.getPartyName().getName(), "Different Name"); assertEquals("1 softwareSystem left", company1.getSoftwareSystems().size(), 2); } public void
* testDeleteCompany() { partyRep.deleteCompany(company); Company company1 = partyRep.findCompanyById(company.getId().toString());
* assertNull("it was deleted", company1); //Ilyenkor marad a softwaresystem? }
*/
// @Ignore
// @Test
// public void testGeographicAddress() {
// UnitOfWork work = new UnitOfWork(true);
// Settlement settlement = SettlementFactory.createSettlement("settlement");
// settlementRepository.addSettlement(work, settlement);
// Country country = CountryFactory.createCountry("country");
// country.addSettlement(settlement);
// countryRepository.addCountry(work, country);
// ZipCode zipCode = new ZipCode(new Integer(1));
// settlement.addZipCode(zipCode);
// zipCodeRepository.addZipCode(work, zipCode);
// settlementRepository.updateSettlement(work, settlement);
// GeographicAddress geographicAddress =
// AddressFactory.createGeographicAddress("street", "1", zipCode,
// settlement);
// //partyRep.addGeographicAddress(work, geographicAddress);
// assertNotNull(geographicAddress.getId());
// //GeographicAddress ga1 = (GeographicAddress)
// partyRep.findAddressById(work, geographicAddress.getId());
// //assertNotNull(ga1);
// //assertEquals(ga1.getZipCode().getId(), zipCode.getId());
// //assertEquals(ga1.getSettlement().getId(),
// zipCode.getSettlement().getId());
// //assertEquals(ga1.getStreet(), "street");
// //assertEquals(ga1.getBuildingNumber(), "1");
// //partyRep.deleteAddress(work, geographicAddress.getId());
// settlement.setCountry(null);
// settlement.setZipCodes(null);
// settlementRepository.updateSettlement(work, settlement);
// countryRepository.deleteCountry(work, country);
// zipCode.setSettlement(null);
// zipCodeRepository.deleteZipCode(work, zipCode);
// settlementRepository.deleteSettlement(work, settlement);
// work.finish();
// }
}