/*
* Tanaguru - Automated webpage assessment
* Copyright (C) 2008-2015 Tanaguru.org
*
* This file is part of Tanaguru.
*
* Tanaguru is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Contact us by mail: tanaguru AT tanaguru DOT org
*/
package org.tanaguru.webapp.controller;
import java.util.*;
import junit.framework.TestCase;
import static org.easymock.EasyMock.*;
import org.tanaguru.entity.parameterization.Parameter;
import org.tanaguru.entity.parameterization.ParameterElement;
import org.tanaguru.entity.service.parameterization.ParameterElementDataService;
import org.tanaguru.webapp.command.factory.AuditSetUpCommandFactory;
import org.tanaguru.webapp.entity.contract.Contract;
import org.tanaguru.webapp.entity.contract.ScopeEnum;
import org.tanaguru.webapp.entity.decorator.tanaguru.parameterization.ParameterDataServiceDecorator;
import org.tanaguru.webapp.entity.functionality.Functionality;
import org.tanaguru.webapp.entity.option.Option;
import org.tanaguru.webapp.entity.option.OptionElement;
import org.tanaguru.webapp.entity.referential.Referential;
import org.tanaguru.webapp.entity.service.contract.ActDataService;
import org.tanaguru.webapp.entity.service.contract.ContractDataService;
import org.tanaguru.webapp.entity.service.user.UserDataService;
import org.tanaguru.webapp.entity.user.User;
import org.tanaguru.webapp.exception.ForbiddenPageException;
import org.tanaguru.webapp.form.FormField;
import org.tanaguru.webapp.form.builder.*;
import org.tanaguru.webapp.form.parameterization.builder.AuditSetUpFormFieldBuilderImpl;
import org.tanaguru.webapp.security.userdetails.TgolUserDetails;
import org.tanaguru.webapp.util.TgolKeyStore;
import org.springframework.security.authentication.AuthenticationDetails;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.context.SecurityContextImpl;
import org.springframework.ui.ExtendedModelMap;
import org.springframework.ui.Model;
/**
*
* @author jkowalczyk
*/
public class AuditSetUpControllerTest extends TestCase {
private AuditSetUpController instance;
Authentication mockAuthentication;
AuthenticationDetails mockAuthenticationDetails;
ActDataService mockActDataService;
User mockUser;
UserDataService mockUserDataService;
Contract mockContract;
ContractDataService mockContractDataService;
Functionality mockFunctionality;
Referential mockReferential;
Option mockOption;
OptionElement mockOptionElement;
ParameterElementDataService mockParameterElementDataService;
ParameterElement mockParameterElementLevel;
ParameterElement mockParameterElementTextualFormField;
Parameter mockParameter1;
Parameter mockParameter2;
ParameterDataServiceDecorator mockParameterDataService;
public AuditSetUpControllerTest(String testName) {
super(testName);
}
@Override
protected void setUp() throws Exception {
super.setUp();
instance = new AuditSetUpController();
setUpMockActDataService();
setUpFormFieldBuilder();
}
@Override
protected void tearDown() throws Exception {
if (mockAuthentication != null) {
verify(mockAuthentication);
mockAuthentication = null;
}
if (mockAuthenticationDetails != null) {
verify(mockAuthenticationDetails);
mockAuthenticationDetails = null;
}
verify(mockActDataService);
mockActDataService=null;
if (mockUser != null) {
verify(mockUser);
mockUser=null;
}
if (mockUserDataService != null) {
verify(mockUserDataService);
mockUserDataService=null;
}
verify(mockContract);
mockContract = null;
verify(mockContractDataService);
mockContractDataService=null;
if (mockFunctionality != null) {
verify(mockFunctionality);
mockFunctionality=null;
}
if (mockReferential != null) {
verify(mockReferential);
mockReferential=null;
}
if (mockOption != null) {
verify(mockOption);
mockOption=null;
}
if (mockOptionElement != null) {
verify(mockOptionElement);
mockOptionElement=null;
}
verify(mockParameterElementDataService);
mockParameterElementDataService=null;
verify(mockParameterElementLevel);
mockParameterElementLevel=null;
verify(mockParameterElementTextualFormField);
mockParameterElementTextualFormField=null;
if (mockParameterDataService != null) {
verify(mockParameterDataService);
mockParameterDataService=null;
}
if (mockParameter1 != null) {
verify(mockParameter1);
mockParameter1=null;
}
if (mockParameter2 != null) {
verify(mockParameter2);
mockParameter2=null;
}
}
public void testDisplayPageAuditPageSetUp() {
System.out.println("testDisplayPageAuditPageSetUp");
// set-up
setUpMockUserDataServiceAndUser();
setUpMockAuthenticationContext();
setUpMockContractDataService(1,"Contract1");
setUpViewFunctionalityBindingMap();
setUpAuditSetUpCommandFactory();
Model model = new ExtendedModelMap();
// test
String returnedView = instance.displayPageAuditSetUp("1", null, null, model);
// assertions
assertEquals(TgolKeyStore.AUDIT_PAGE_SET_UP_VIEW_NAME, returnedView);
assertEquals("http://www.test1.com", model.asMap().get(TgolKeyStore.URL_KEY));
assertEquals(false, model.asMap().get(TgolKeyStore.DEFAULT_PARAM_SET_KEY));
// TO DO : write test to control the integrity of data of the AuditSetUpCommand
// regarding the option/functionality rules
}
public void testDisplayPageAuditSiteSetUp() {
System.out.println("testDisplayPageAuditSiteSetUp");
// Set-up
setUpMockUserDataServiceAndUser();
setUpMockAuthenticationContext();
setUpMockContractDataService(1,"Contract1");
setUpViewFunctionalityBindingMap();
setUpAuditSetUpCommandFactory();
Model model = new ExtendedModelMap();
String returnedView = instance.displaySiteAuditSetUp("1", null, null, model);
// assertions
assertEquals(TgolKeyStore.AUDIT_SITE_SET_UP_VIEW_NAME, returnedView);
assertEquals("http://www.test1.com", model.asMap().get(TgolKeyStore.URL_KEY));
assertEquals(true, model.asMap().get(TgolKeyStore.DEFAULT_PARAM_SET_KEY));
}
public void testDisplayPageAuditUploadSetUp() {
System.out.println("testDisplayPageAuditUploadSetUp");
// Set-up
setUpMockUserDataServiceAndUser();
setUpMockAuthenticationContext();
setUpMockContractDataService(1,"Contract1");
setUpViewFunctionalityBindingMap();
setUpAuditSetUpCommandFactory();
Model model = new ExtendedModelMap();
// test
String returnedView = instance.displayUploadAuditSetUp("1", null, null, model);
// assertions
assertEquals(TgolKeyStore.AUDIT_UPLOAD_SET_UP_VIEW_NAME, returnedView);
assertEquals("http://www.test1.com", model.asMap().get(TgolKeyStore.URL_KEY));
assertEquals(false, model.asMap().get(TgolKeyStore.DEFAULT_PARAM_SET_KEY));
}
public void testDisplayPageAuditPageSetUpWithWrongContractId() {
System.out.println("testDisplayPageAuditPageSetUpWithWrongContractId");
// set-up
setUpMockUserDataServiceAndUser();
setUpMockAuthenticationContext();
setUpMockContractDataService(1,"Contract1");
// the contract Id cannot be converted as a Long. An exception is caught
try {
instance.displayPageAuditSetUp("Not a number", null, null, new ExtendedModelMap());
assertTrue(false);
} catch (ForbiddenPageException fue) {
assertTrue(true);
}
}
public void testDisplayPageAuditUploadSetUpWithWrongContractId() {
System.out.println("testDisplayPageAuditUploadSetUpWithWrongContractId");
// set-up
setUpMockUserDataServiceAndUser();
setUpMockAuthenticationContext();
setUpMockContractDataService(1,"Contract1");
// the contract Id cannot be converted as a Long. An exception is caught
try {
instance.displayUploadAuditSetUp("Not a number", null, null, new ExtendedModelMap());
assertTrue(false);
} catch (ForbiddenPageException fue) {
assertTrue(true);
}
}
public void testDisplayPageAuditSiteSetUpWithWrongContractId() {
System.out.println("testDisplayPageAuditSiteSetUpWithWrongContractId");
// set-up
setUpMockUserDataServiceAndUser();
setUpMockAuthenticationContext();
setUpMockContractDataService(1,"Contract1");
// the contract Id cannot be converted as a Long. An exception is caught
try {
instance.displaySiteAuditSetUp("Not a number", null, null, new ExtendedModelMap());
assertTrue(false);
} catch (ForbiddenPageException fue) {
assertTrue(true);
}
}
public void testDisplayPageAuditPageSetUpWithUnauthorisedFunctionality() {
System.out.println("testDisplayPageAuditPageSetUpWithUnauthorisedFunctionality");
setUpMockUserDataServiceAndUser();
setUpMockAuthenticationContext();
setUpMockContractDataService(2,"Contract1");
setUpEmptyViewFunctionalityBindingMap();
// the functionality associated with the contract is not allowed
// regarding the viewFunctionalityBindingMap. An exception is caught
try {
instance.displayPageAuditSetUp("2", null, null, new ExtendedModelMap());
assertTrue(false);
} catch (ForbiddenPageException fue) {
assertTrue(true);
}
}
public void testDisplayPageAuditSiteSetUpWithUnauthorisedFunctionality() {
System.out.println("testDisplayPageAuditSiteSetUpWithUnauthorisedFunctionality");
setUpMockUserDataServiceAndUser();
setUpMockAuthenticationContext();
setUpMockContractDataService(2,"Contract1");
setUpEmptyViewFunctionalityBindingMap();
// the functionality associated with the contract is not allowed
// regarding the viewFunctionalityBindingMap. An exception is caught
try {
instance.displaySiteAuditSetUp("2", null, null, new ExtendedModelMap());
assertTrue(false);
} catch (ForbiddenPageException fue) {
assertTrue(true);
}
}
public void testDisplayPageAuditUploadSetUpWithUnauthorisedFunctionality() {
System.out.println("testDisplayPageAuditUploadSetUpWithUnauthorisedFunctionality");
setUpMockUserDataServiceAndUser();
setUpMockAuthenticationContext();
setUpMockContractDataService(2,"Contract1");
setUpEmptyViewFunctionalityBindingMap();
// the functionality associated with the contract is not allowed
// regarding the viewFunctionalityBindingMap. An exception is caught
try {
instance.displayUploadAuditSetUp("2", null, null, new ExtendedModelMap());
assertTrue(false);
} catch (ForbiddenPageException fue) {
assertTrue(true);
}
}
private void setUpMockAuthenticationContext(){
// initialise the context with the user identified by the email
// "test1@test.com" seen as authenticated
Collection<GrantedAuthority> gac = new ArrayList<GrantedAuthority>();
TgolUserDetails tud = new TgolUserDetails("test1@test.com", "", true, false, true, true, gac, mockUser);
mockAuthentication = createMock(Authentication.class);
SecurityContextImpl securityContextImpl = new SecurityContextImpl();
securityContextImpl.setAuthentication(mockAuthentication);
SecurityContextHolder.setContext(securityContextImpl);
expect(mockAuthentication.getName()).andReturn("test1@test.com").anyTimes();
expect(mockAuthentication.getPrincipal()).andReturn(tud).anyTimes();
expect(mockAuthentication.getAuthorities()).andReturn(null).anyTimes();
replay(mockAuthentication);
mockAuthenticationDetails = createMock(AuthenticationDetails.class);
expect(mockAuthenticationDetails.getContext()).andReturn("test1@test.com").anyTimes();
replay(mockAuthenticationDetails);
}
private void setUpMockActDataService(){
mockActDataService = createMock(ActDataService.class);
instance.setActDataService(mockActDataService);
replay(mockActDataService);
}
private void setUpMockUserDataServiceAndUser() {
mockUser = createMock(User.class);
expect(mockUser.getId()).andReturn(Long.valueOf(1)).anyTimes();
expect(mockUser.getEmail1()).andReturn("test1@test.com").anyTimes();
expect(mockUser.getName()).andReturn("").anyTimes();
expect(mockUser.getFirstName()).andReturn("").anyTimes();
mockUserDataService = createMock(UserDataService.class);
replay(mockUser);
replay(mockUserDataService);
instance.setUserDataService(mockUserDataService);
}
/**
*
* @param contractId
* @param contractLabel
*/
private void setUpMockContractDataService(
int contractId,
String contractLabel) {
mockContract = createMock(Contract.class);
expect(mockContract.getUser()).andReturn(mockUser).anyTimes();
expect(mockContract.getId()).andReturn(Long.valueOf(contractId)).anyTimes();
expect(mockContract.getLabel()).andReturn(contractLabel).anyTimes();
expect(mockContract.getFunctionalitySet()).andReturn(setUpMockFunctionalitySet()).anyTimes();
expect(mockContract.getReferentialSet()).andReturn(setUpMockReferentialSet()).anyTimes();
expect(mockContract.getOptionElementSet()).andReturn(setUpMockOptionElementSet()).anyTimes();
mockContractDataService = createMock(ContractDataService.class);
expect(mockContractDataService.read(Long.valueOf(contractId))).andReturn(mockContract).anyTimes();
expect(mockContractDataService.getUrlFromContractOption(mockContract)).andReturn("http://www.test1.com").anyTimes();
expect(mockContractDataService.getMaxPagesAuditControlFromContractOption(mockContract)).andReturn(10).anyTimes();
replay(mockContract);
replay(mockContractDataService);
instance.setContractDataService(mockContractDataService);
}
private Set<Functionality> setUpMockFunctionalitySet() {
mockFunctionality = createMock(Functionality.class);
expect(mockFunctionality.getCode()).andReturn("FUNCTIONALITY1").anyTimes();
Set<Functionality> mockFunctionalitySet = new HashSet<Functionality>();
mockFunctionalitySet.add(mockFunctionality);
replay(mockFunctionality);
return mockFunctionalitySet;
}
private Set<Referential> setUpMockReferentialSet() {
mockReferential = createMock(Referential.class);
expect(mockReferential.getCode()).andReturn("").anyTimes();
Set<Referential> mockReferentialSet = new HashSet<Referential>();
mockReferentialSet.add(mockReferential);
replay(mockReferential);
return mockReferentialSet;
}
private Set<OptionElement> setUpMockOptionElementSet() {
mockOption = createMock(Option.class);
mockOptionElement = createMock(OptionElement.class);
expect(mockOptionElement.getOption()).andReturn(mockOption).anyTimes();
expect(mockOption.getCode()).andReturn("").anyTimes();
Set<OptionElement> mockOptionElementSet = new HashSet<OptionElement>();
mockOptionElementSet.add(mockOptionElement);
replay(mockOptionElement);
replay(mockOption);
return mockOptionElementSet;
}
/**
* the AuditSetUpController needs a map to be set-up to determine whether
* a user is allowed to display a set-up form regarding the functionalities
* of the contract
*/
private void setUpViewFunctionalityBindingMap() {
Map<String, String> viewFunctionalityBindingMap = new HashMap<String, String>();
// The contracts are initialised with a functionality whose code is
// FUNCTIONALITY1. We allow all the audit set-up forms for this
// functionality by populating the viewFunctionalityBindingMap
viewFunctionalityBindingMap.put("audit-upload-set-up", "FUNCTIONALITY1");
viewFunctionalityBindingMap.put("audit-site-set-up", "FUNCTIONALITY1");
viewFunctionalityBindingMap.put("audit-page-set-up", "FUNCTIONALITY1");
instance.setViewFunctionalityBindingMap(viewFunctionalityBindingMap);
}
/**
* the AuditSetUpController needs a map to be set-up to determine whether
* a user is allowed to display a set-up form regarding the functionalities
* of the contract
*/
private void setUpEmptyViewFunctionalityBindingMap() {
Map<String, String> viewFunctionalityBindingMap = new HashMap<String, String>();
instance.setViewFunctionalityBindingMap(viewFunctionalityBindingMap);
}
/**
* The Controller needs a list of AuditSetUpFormFieldBuilder that
* deal with the referential and level selection
*/
private void setUpFormFieldBuilder() {
instance.setReferentialAndLevelFormFieldBuilderList(buildMockRefAndLevelSelectFormFieldList());
instance.setPageOptionFormFieldBuilderMap(buildMockOptionAuditSetUpFormFieldList());
instance.setSiteOptionFormFieldBuilderMap(buildMockOptionAuditSetUpFormFieldList());
instance.setUploadOptionFormFieldBuilderMap(buildMockOptionAuditSetUpFormFieldList());
}
/**
* The AuditSetUpCommandFactory factory needs to be initialised with
* parameterDataService instance and contractDataService
*/
private void setUpAuditSetUpCommandFactory() {
AuditSetUpCommandFactory.getInstance().setParameterDataService(getParameterDataService());
AuditSetUpCommandFactory.getInstance().setParameterElementDataService(getParameterElementDataService());
AuditSetUpCommandFactory.getInstance().setContractDataService(mockContractDataService);
}
/**
*
* @return
*/
private Map<String, List<AuditSetUpFormFieldBuilderImpl>> buildMockOptionAuditSetUpFormFieldList() {
AbstractGenericFormFieldBuilder<? extends FormField> mockFormFieldBuilder =
new TextualFormFieldBuilderImpl();
AuditSetUpFormFieldBuilderImpl mockAuditSetUpFormFieldBuilder =
new AuditSetUpFormFieldBuilderImpl();
mockAuditSetUpFormFieldBuilder.setFormFieldBuilder(mockFormFieldBuilder);
ParameterElementDataService parameterElementDataService =
getParameterElementDataService();
mockAuditSetUpFormFieldBuilder.setParameterElementDataService(
parameterElementDataService);
// to fit with the mock of the ParameterElementDataService
mockAuditSetUpFormFieldBuilder.setParameterCode("TEXTUAL_FORMFIELD");
List<AuditSetUpFormFieldBuilderImpl> mockAuditSetUpFormFieldBuilderList =
new ArrayList<AuditSetUpFormFieldBuilderImpl>();
mockAuditSetUpFormFieldBuilderList.add(mockAuditSetUpFormFieldBuilder);
Map<String, List<AuditSetUpFormFieldBuilderImpl>> mockOptionAuditSetUpFormFieldList =
new HashMap<String, List<AuditSetUpFormFieldBuilderImpl>>();
mockOptionAuditSetUpFormFieldList.put("Option1", mockAuditSetUpFormFieldBuilderList);
return mockOptionAuditSetUpFormFieldList;
}
private ParameterElementDataService getParameterElementDataService() {
if (mockParameterElementDataService == null &&
mockParameterElementTextualFormField == null &&
mockParameterElementLevel == null) {
mockParameterElementDataService = createMock(ParameterElementDataService.class);
mockParameterElementTextualFormField = createMock(ParameterElement.class);
mockParameterElementLevel = createMock(ParameterElement.class);
expect(mockParameterElementDataService.getParameterElement("TEXTUAL_FORMFIELD")).andReturn(mockParameterElementTextualFormField).anyTimes();
expect(mockParameterElementDataService.getParameterElement("LEVEL")).andReturn(mockParameterElementLevel).anyTimes();
expect(mockParameterElementTextualFormField.getParameterElementCode()).andReturn("TEXTUAL_FORMFIELD").anyTimes();
expect(mockParameterElementLevel.getParameterElementCode()).andReturn("LEVEL").anyTimes();
replay(mockParameterElementDataService);
replay(mockParameterElementLevel);
replay(mockParameterElementTextualFormField);
}
return mockParameterElementDataService;
}
private ParameterDataServiceDecorator getParameterDataService() {
if (mockParameterDataService == null) {
mockParameter1 = createMock(Parameter.class);
mockParameter2 = createMock(Parameter.class);
expect(mockParameter1.getValue()).andReturn("PARAMETER1").anyTimes();
expect(mockParameter2.getValue()).andReturn("PARAMETER2").anyTimes();
Set<Parameter> paramSet = new HashSet<Parameter>();
paramSet.add(mockParameter1);
paramSet.add(mockParameter2);
replay(mockParameter1);
replay(mockParameter2);
mockParameterDataService = createMock(ParameterDataServiceDecorator.class);
expect(mockParameterDataService.getDefaultParameterSet()).andReturn(paramSet).anyTimes();
expect(mockParameterDataService.getDefaultParameter(mockParameterElementLevel)).andReturn(mockParameter1).anyTimes();
expect(mockParameterDataService.getDefaultParameter(mockParameterElementTextualFormField)).andReturn(mockParameter2).anyTimes();
expect(mockParameterDataService.getDefaultLevelParameter()).andReturn(mockParameter1).anyTimes();
expect(mockParameterDataService.getLastParameterValueFromUser(
Long.valueOf(1),
mockParameterElementLevel,
ScopeEnum.DOMAIN)).andReturn("PARAMETER1").anyTimes();
expect(mockParameterDataService.getLastParameterValueFromUser(
Long.valueOf(2),
mockParameterElementLevel,
ScopeEnum.DOMAIN)).andReturn("PARAMETER1").anyTimes();
expect(mockParameterDataService.getLastParameterValueFromUser(
Long.valueOf(1),
mockParameterElementTextualFormField,
ScopeEnum.DOMAIN)).andReturn("PARAMETER2").anyTimes();
expect(mockParameterDataService.getLastParameterValueFromUser(
Long.valueOf(2),
mockParameterElementTextualFormField,
ScopeEnum.DOMAIN)).andReturn("PARAMETER2").anyTimes();
replay(mockParameterDataService);
instance.setParameterDataService(mockParameterDataService);
}
return mockParameterDataService;
}
/**
* The auditSetUp view is set up with an element to select the referential
* and level. This element is enabled only if the contract is set up with
* this referential (code value for this referential is REFERENTIAL1)
*
* @return
*/
private List<SelectFormFieldBuilderImpl> buildMockRefAndLevelSelectFormFieldList(){
SelectElementBuilder mockSelectElementBuilder = new SelectElementBuilderImpl();
mockSelectElementBuilder.setValue("MockRef;MockLevel");
// the mock select Element list
List<SelectElementBuilder> selectElementBuilderList = new ArrayList<SelectElementBuilder>();
selectElementBuilderList.add(mockSelectElementBuilder);
Map<String,List<SelectElementBuilder>> selectElementBuilderMap =
new HashMap<String,List<SelectElementBuilder>>();
selectElementBuilderMap.put("REFERENTIAL1", selectElementBuilderList);
SelectFormFieldBuilderImpl selectFormFieldBuilder = new SelectFormFieldBuilderImpl();
selectFormFieldBuilder.setSelectElementBuilderMap(selectElementBuilderMap);
List<SelectFormFieldBuilderImpl> mockSelectRefFormFieldList =
new ArrayList<SelectFormFieldBuilderImpl>();
mockSelectRefFormFieldList.add(selectFormFieldBuilder);
return mockSelectRefFormFieldList;
}
}