package com.processpuzzle.application.security.domain;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import com.processpuzzle.application.configuration.domain.ApplicationContextFactory;
import com.processpuzzle.application.configuration.domain.ProcessPuzzleContext;
import com.processpuzzle.application.domain.Application;
import com.processpuzzle.sharedfixtures.domaintier.DomainTierTestConfiguration;
public class UserTest {
private static final String USER_NAME = "John.Smith";
private static final String USER_PASSWORD = "password";
private static Application application;
private static ProcessPuzzleContext applicationContext;
private static UserFactory userFactory;
private User user = null;
private AnAccessControlledObject aControlledObject;
private AnAccessControlledObject anotherControlledObject;
@BeforeClass
public static void beforeAllTest() {
application = mock( Application.class );
applicationContext = ApplicationContextFactory.create( application, DomainTierTestConfiguration.APPLICATION_CONFIGURATION_DESCRIPTOR_PATH );
when( application.getContext() ).thenReturn( applicationContext );
applicationContext.setUp( Application.Action.install );
userFactory = applicationContext.getEntityFactory( UserFactory.class );
}
@Before
public void beforeEachTests() throws Exception {
aControlledObject = new AnAccessControlledObject( new Integer( 1 ) );
aControlledObject.setName( "aControlledObject" );
anotherControlledObject = new AnAccessControlledObject( new Integer( 2 ) );
anotherControlledObject.setName( "anotherControlledObject" );
user = userFactory.createUser( USER_NAME, USER_PASSWORD );
}
@After
public void afterEachTests() throws Exception {
user = null;
}
@AfterClass
public static void afterAllTest() {
applicationContext.tearDown( Application.Action.uninstall );
}
@Test
public final void constructor_savesRequiredProperties() {
assertThat( user.getUserName(), equalTo( USER_NAME ));
assertThat( user.getPassword(), equalTo( USER_PASSWORD ));
}
@Test
public final void addRightFor() {
user.addRightFor( aControlledObject, true, false, true, false );
assertNotNull( "'johnSmith' has rights for 'aControlledObject'", user.getRightFor( aControlledObject ) );
user.addRightFor( anotherControlledObject, true, true, true, true );
assertNotNull( "'johnSmith' has rights for 'anotherControlledObject'", user.getRightFor( anotherControlledObject ) );
}
@Test( expected = AccessRightConstraintViolationException.class )
public final void testAddRightFor_ForDuplicateTrial() {
// Attempt to add duplicate right for the same controlled object throws an exception.
user.addRightFor( aControlledObject );
user.addRightFor( aControlledObject );
}
@Test
public final void getRightFor() {
assertNull( "'johnSmith' doesn't have right for 'aControlledObject'", user.getRightFor( aControlledObject ) );
user.addRightFor( aControlledObject );
assertNotNull( "But now, yes.", user.getRightFor( aControlledObject ) );
}
}