mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-07-31 17:39:05 +00:00
RM-3074: Integration Tests, including BDT test helpers to simplify code
This commit is contained in:
@@ -1,188 +0,0 @@
|
||||
/*
|
||||
* #%L
|
||||
* Alfresco Records Management Module
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* -
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
* the paid license agreement will prevail. Otherwise, the software is
|
||||
* provided under the following open source license terms:
|
||||
* -
|
||||
* Alfresco is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
* -
|
||||
* Alfresco 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 Lesser General Public License for more details.
|
||||
* -
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
* #L%
|
||||
*/
|
||||
|
||||
package org.alfresco.module.org_alfresco_module_rm.test.integration.record;
|
||||
|
||||
import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel;
|
||||
import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase;
|
||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||
import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
|
||||
import org.alfresco.service.cmr.model.FileExistsException;
|
||||
import org.alfresco.service.cmr.model.FileNotFoundException;
|
||||
import org.alfresco.service.cmr.security.AccessStatus;
|
||||
|
||||
/**
|
||||
* Create Inplace Record Test
|
||||
*
|
||||
* @author Roy Wetherall
|
||||
*/
|
||||
public class CreateInplaceRecordTest extends BaseRMTestCase
|
||||
{
|
||||
@Override
|
||||
protected boolean isCollaborationSiteTest()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a document in a collaboration site
|
||||
* When the document is declared by a site collaborator
|
||||
* Then the document becomes a record
|
||||
* And the site users have the appropriate in-place permissions on the record
|
||||
*/
|
||||
public void testCreateInplaceRecordFromCollabSite()
|
||||
{
|
||||
doBehaviourDrivenTest(new BehaviourDrivenTest()
|
||||
{
|
||||
public void given()
|
||||
{
|
||||
// Check that the document is not a record
|
||||
assertFalse("The document should not be a record", recordService.isRecord(dmDocument));
|
||||
}
|
||||
|
||||
public void when()
|
||||
{
|
||||
// Declare the document as a record
|
||||
AuthenticationUtil.runAs(new RunAsWork<Void>()
|
||||
{
|
||||
public Void doWork() throws Exception
|
||||
{
|
||||
// Declare record
|
||||
recordService.createRecord(filePlan, dmDocument);
|
||||
|
||||
return null;
|
||||
}
|
||||
}, dmCollaborator);
|
||||
}
|
||||
|
||||
public void then()
|
||||
{
|
||||
// Check that the document is a record now
|
||||
assertTrue("The document should now be a record", recordService.isRecord(dmDocument));
|
||||
|
||||
// Check that the record is in the unfiled container
|
||||
|
||||
// Check that the record is still a child of the collaboration folder
|
||||
|
||||
// Check that the collaborator has filling permissions on the record
|
||||
AuthenticationUtil.runAs(new RunAsWork<Void>()
|
||||
{
|
||||
public Void doWork() throws Exception
|
||||
{
|
||||
assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(dmDocument, RMPermissionModel.FILING));
|
||||
assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(dmDocument, RMPermissionModel.READ_RECORDS));
|
||||
return null;
|
||||
}
|
||||
}, dmCollaborator);
|
||||
|
||||
|
||||
// Check that the consumer has read permissions on the record
|
||||
AuthenticationUtil.runAs(new RunAsWork<Void>()
|
||||
{
|
||||
public Void doWork() throws Exception
|
||||
{
|
||||
assertEquals(AccessStatus.DENIED, permissionService.hasPermission(dmDocument, RMPermissionModel.FILING));
|
||||
assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(dmDocument, RMPermissionModel.READ_RECORDS));
|
||||
return null;
|
||||
}
|
||||
}, dmConsumer);
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void testFileInplaceRecordFromCollabSite()
|
||||
{
|
||||
doBehaviourDrivenTest(new BehaviourDrivenTest()
|
||||
{
|
||||
public void given()
|
||||
{
|
||||
// Check that the document is not a record
|
||||
assertFalse("The document should not be a record", recordService.isRecord(dmDocument));
|
||||
|
||||
// Declare the document as a record
|
||||
AuthenticationUtil.runAs(new RunAsWork<Void>()
|
||||
{
|
||||
public Void doWork() throws Exception
|
||||
{
|
||||
// Declare record
|
||||
recordService.createRecord(filePlan, dmDocument);
|
||||
|
||||
return null;
|
||||
}
|
||||
}, dmCollaborator);
|
||||
|
||||
// Check that the document is a record
|
||||
assertTrue("The document should be a record", recordService.isRecord(dmDocument));
|
||||
assertFalse("The record should not be filed", recordService.isFiled(dmDocument));
|
||||
}
|
||||
|
||||
public void when() throws FileExistsException, FileNotFoundException
|
||||
{
|
||||
// file the document to a location in the file plan
|
||||
fileFolderService.move(dmDocument, rmFolder, null);
|
||||
}
|
||||
|
||||
public void then()
|
||||
{
|
||||
// Check that the document is a record now
|
||||
assertTrue("The document should be a record", recordService.isRecord(dmDocument));
|
||||
assertTrue("The record hsould be filed", recordService.isFiled(dmDocument));
|
||||
|
||||
// Check that the record is in the unfiled container
|
||||
// TODO
|
||||
|
||||
// Check that the record is still a child of the collaboration folder
|
||||
// TODO
|
||||
|
||||
// Check that the collaborator has filling permissions on the record
|
||||
AuthenticationUtil.runAs(new RunAsWork<Void>()
|
||||
{
|
||||
public Void doWork() throws Exception
|
||||
{
|
||||
assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(dmDocument, RMPermissionModel.FILING));
|
||||
assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(dmDocument, RMPermissionModel.READ_RECORDS));
|
||||
return null;
|
||||
}
|
||||
}, dmCollaborator);
|
||||
|
||||
|
||||
// Check that the consumer has read permissions on the record
|
||||
AuthenticationUtil.runAs(new RunAsWork<Void>()
|
||||
{
|
||||
public Void doWork() throws Exception
|
||||
{
|
||||
assertEquals(AccessStatus.DENIED, permissionService.hasPermission(dmDocument, RMPermissionModel.FILING));
|
||||
assertEquals(AccessStatus.ALLOWED, permissionService.hasPermission(dmDocument, RMPermissionModel.READ_RECORDS));
|
||||
return null;
|
||||
}
|
||||
}, dmConsumer);
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@@ -0,0 +1,347 @@
|
||||
/*
|
||||
* #%L
|
||||
* Alfresco Records Management Module
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* -
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
* the paid license agreement will prevail. Otherwise, the software is
|
||||
* provided under the following open source license terms:
|
||||
* -
|
||||
* Alfresco is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
* -
|
||||
* Alfresco 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 Lesser General Public License for more details.
|
||||
* -
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
* #L%
|
||||
*/
|
||||
|
||||
package org.alfresco.module.org_alfresco_module_rm.test.integration.record;
|
||||
|
||||
import static org.alfresco.module.org_alfresco_module_rm.test.util.bdt.BehaviourTest.test;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import org.alfresco.module.org_alfresco_module_rm.action.impl.DeclareRecordAction;
|
||||
import org.alfresco.module.org_alfresco_module_rm.capability.Capability;
|
||||
import org.alfresco.module.org_alfresco_module_rm.capability.RMPermissionModel;
|
||||
import org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase;
|
||||
import org.alfresco.module.org_alfresco_module_rm.test.util.bdt.BehaviourTest;
|
||||
import org.alfresco.repo.security.permissions.AccessDeniedException;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.security.AccessStatus;
|
||||
import org.alfresco.service.cmr.security.PermissionService;
|
||||
|
||||
/**
|
||||
* In-place record permission integration test.
|
||||
*
|
||||
* @author Roy Wetherall
|
||||
* @since 2.5
|
||||
*/
|
||||
public class InplaceRecordPermissionTest extends BaseRMTestCase
|
||||
{
|
||||
/** capability list */
|
||||
private static final List<String> CAPABILITIES = Stream
|
||||
.of(RMPermissionModel.VIEW_RECORDS,
|
||||
RMPermissionModel.EDIT_NON_RECORD_METADATA,
|
||||
RMPermissionModel.EDIT_RECORD_METADATA)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
/** capabilities */
|
||||
private Capability viewRecordsCapability;
|
||||
private Capability editNonRecordMetadataCapability;
|
||||
private Capability editRecordMetadataCapability;
|
||||
|
||||
/** test characteristics */
|
||||
@Override protected boolean isCollaborationSiteTest() { return true; }
|
||||
@Override protected boolean isUserTest() { return true; }
|
||||
|
||||
/**
|
||||
* @see org.alfresco.module.org_alfresco_module_rm.test.util.BaseRMTestCase#initServices()
|
||||
*/
|
||||
@Override
|
||||
protected void initServices()
|
||||
{
|
||||
super.initServices();
|
||||
|
||||
// initialise behaviour tests
|
||||
BehaviourTest.initBehaviourTests(retryingTransactionHelper);
|
||||
|
||||
// get capability references
|
||||
viewRecordsCapability = capabilityService.getCapability(RMPermissionModel.VIEW_RECORDS);
|
||||
editNonRecordMetadataCapability = capabilityService.getCapability(RMPermissionModel.EDIT_NON_RECORD_METADATA);
|
||||
editRecordMetadataCapability = capabilityService.getCapability(RMPermissionModel.EDIT_RECORD_METADATA);
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a document in a collaboration site
|
||||
* When a user without write permissions on the document tries to declare it as a record
|
||||
* Then the declaration fails
|
||||
* And the document does not become a record
|
||||
*/
|
||||
public void testUserWithOutWriteCantDeclareInPlaceRecord()
|
||||
{
|
||||
test()
|
||||
.given()
|
||||
|
||||
// Given a document in a collaboration site that is not a record
|
||||
.expect(false)
|
||||
.from(() -> recordService.isRecord(dmDocument))
|
||||
.because("The document is not a record.")
|
||||
|
||||
// And a user with no write permission on the document
|
||||
.as(userName)
|
||||
.expect(AccessStatus.DENIED.toString())
|
||||
.from(() -> permissionService.hasPermission(dmDocument, PermissionService.WRITE).toString())
|
||||
.because("User does not have write access to document.")
|
||||
|
||||
// When the user tries to declare the record
|
||||
// Then we expect this to fail
|
||||
.when()
|
||||
.as(userName)
|
||||
.expectException(AccessDeniedException.class)
|
||||
.from(() -> recordService.createRecord(filePlan, dmDocument))
|
||||
.because("The user does not have write permission on the document.");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Given a document in a collaboration site is not a record
|
||||
* When the document is declared by a site collaborator
|
||||
* Then the document becomes a record
|
||||
* And the site users have the appropriate in-place permissions on the record
|
||||
*/
|
||||
public void testCreateInplaceRecordFromCollabSite()
|
||||
{
|
||||
test()
|
||||
|
||||
// Given that a document in a collaboration site is not a record
|
||||
.given()
|
||||
.asAdmin()
|
||||
.expect(false)
|
||||
.from(() -> recordService.isRecord(dmDocument))
|
||||
.because("The document is not a record")
|
||||
|
||||
// When it is declared as an inplace record
|
||||
.when()
|
||||
.as(dmCollaborator)
|
||||
.perform(() -> recordService.createRecord(filePlan, dmDocument))
|
||||
|
||||
.then()
|
||||
.asAdmin()
|
||||
// Then it becomes a record
|
||||
.expect(true)
|
||||
.from(() -> recordService.isRecord(dmDocument))
|
||||
.because("The document is a record")
|
||||
|
||||
// And it isn't filed
|
||||
.expect(false)
|
||||
.from(() -> recordService.isFiled(dmDocument))
|
||||
.because("The record is not filed")
|
||||
|
||||
// And a site collaborator has filling permissions and filling capability on the record
|
||||
.as(dmCollaborator)
|
||||
.perform(() ->
|
||||
checkInPlaceAccess(dmDocument,
|
||||
AccessStatus.ALLOWED, // read record permission
|
||||
AccessStatus.ALLOWED, // filing permission
|
||||
AccessStatus.ALLOWED, // view record capability
|
||||
AccessStatus.ALLOWED, // edit non record metadata capability
|
||||
AccessStatus.DENIED)) // edit record metadata capability
|
||||
|
||||
// And a site consumer has read permissions and view record capability on the record
|
||||
.as(dmConsumer)
|
||||
.perform(() ->
|
||||
checkInPlaceAccess(dmDocument,
|
||||
AccessStatus.ALLOWED, // read record permission
|
||||
AccessStatus.DENIED, // filing permission
|
||||
AccessStatus.ALLOWED, // view record capability
|
||||
AccessStatus.DENIED, // edit non record metadata capability
|
||||
AccessStatus.DENIED)) // edit record metadata capability
|
||||
|
||||
// And a user that is not a member of the site has no access to the inplace record
|
||||
.as(userName)
|
||||
.perform(() ->
|
||||
checkInPlaceAccess(dmDocument,
|
||||
AccessStatus.DENIED, // read record permission
|
||||
AccessStatus.DENIED, // filing permission
|
||||
AccessStatus.DENIED, // view record capability
|
||||
AccessStatus.DENIED, // edit non record metadata capability
|
||||
AccessStatus.DENIED)); // edit record metadata capability
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper method to check in place access for a user on a record.
|
||||
*/
|
||||
private void checkInPlaceAccess(NodeRef nodeRef, AccessStatus ... accessStatus)
|
||||
{
|
||||
// check permission access
|
||||
assertEquals(accessStatus[0], permissionService.hasPermission(nodeRef, RMPermissionModel.READ_RECORDS));
|
||||
assertEquals(accessStatus[1], permissionService.hasPermission(nodeRef, RMPermissionModel.FILING));
|
||||
|
||||
// check capability access
|
||||
Map<Capability, AccessStatus> access = capabilityService.getCapabilitiesAccessState(nodeRef, CAPABILITIES);
|
||||
assertEquals(accessStatus[2], access.get(viewRecordsCapability));
|
||||
assertEquals(accessStatus[3], access.get(editNonRecordMetadataCapability));
|
||||
assertEquals(accessStatus[4], access.get(editRecordMetadataCapability));
|
||||
}
|
||||
|
||||
/**
|
||||
* Given an unfiled in-place record
|
||||
* When the record is moved to the file plan (ie filed)
|
||||
* Then the site users still have the appropriate in-place permissions on the record
|
||||
*/
|
||||
public void testFileInplaceRecordFromCollabSite() throws Exception
|
||||
{
|
||||
test()
|
||||
|
||||
// Given an unfiled inplace record
|
||||
.given()
|
||||
.as(dmCollaborator)
|
||||
.perform(() -> recordService.createRecord(filePlan, dmDocument))
|
||||
.expect(true)
|
||||
.from(() -> recordService.isRecord(dmDocument))
|
||||
.because("The document is a record.")
|
||||
.expect(false)
|
||||
.from(() -> recordService.isFiled(dmDocument))
|
||||
.because("The record is not filed")
|
||||
|
||||
// When the record is filed
|
||||
.when()
|
||||
.asAdmin()
|
||||
.perform(() -> fileFolderService.move(dmDocument, rmFolder, null))
|
||||
|
||||
.then()
|
||||
|
||||
// Then the record is filed
|
||||
.asAdmin()
|
||||
.expect(true)
|
||||
.from(() -> recordService.isFiled(dmDocument))
|
||||
.because("The record is filed.")
|
||||
|
||||
// And the collaborator has filling permissions and filling capability on the record
|
||||
.as(dmCollaborator)
|
||||
.perform(() ->
|
||||
checkInPlaceAccess(dmDocument,
|
||||
AccessStatus.ALLOWED, // read record permission
|
||||
AccessStatus.ALLOWED, // filing permission
|
||||
AccessStatus.ALLOWED, // view record capability
|
||||
AccessStatus.ALLOWED, // edit non record metadata capability
|
||||
AccessStatus.DENIED)) // edit record metadata capability
|
||||
|
||||
// And the consumer has read permissions and view record capability on the record
|
||||
.as(dmConsumer)
|
||||
.perform(() ->
|
||||
checkInPlaceAccess(dmDocument,
|
||||
AccessStatus.ALLOWED, // read record permission
|
||||
AccessStatus.DENIED, // filing permission
|
||||
AccessStatus.ALLOWED, // view record capability
|
||||
AccessStatus.DENIED, // edit non record metadata capability
|
||||
AccessStatus.DENIED)) // edit record metadata capability
|
||||
|
||||
// And a user that is not in the site has no permissions on the record
|
||||
.as(userName)
|
||||
.perform(() ->
|
||||
checkInPlaceAccess(dmDocument,
|
||||
AccessStatus.DENIED, // read record permission
|
||||
AccessStatus.DENIED, // filing permission
|
||||
AccessStatus.DENIED, // view record capability
|
||||
AccessStatus.DENIED, // edit non record metadata capability
|
||||
AccessStatus.DENIED)); // edit record metadata capability
|
||||
}
|
||||
|
||||
/**
|
||||
* Given an incomplete inplace record
|
||||
* When it is completed
|
||||
* Then the inplace users still have access to the record
|
||||
* And can't edit the records meta-data
|
||||
*/
|
||||
public void testCompletedInPlaceRecord()
|
||||
{
|
||||
test()
|
||||
|
||||
// Given an incomplete record
|
||||
.given()
|
||||
.as(dmCollaborator)
|
||||
.perform(() -> recordService.createRecord(filePlan, dmDocument))
|
||||
.expect(false)
|
||||
.from(() -> recordService.isDeclared(dmDocument))
|
||||
.because("Record is not complete.")
|
||||
|
||||
// When it is completed
|
||||
.when()
|
||||
.asAdmin()
|
||||
.perform(() -> rmActionService.executeRecordsManagementAction(dmDocument, DeclareRecordAction.NAME))
|
||||
.expect(true)
|
||||
.from(() -> recordService.isDeclared(dmDocument))
|
||||
.because("Record is complete.")
|
||||
|
||||
.then()
|
||||
|
||||
// Then the collaborator has filling permissions, view record capability, but not edit non-record metadata
|
||||
.as(dmCollaborator)
|
||||
.perform(() ->
|
||||
checkInPlaceAccess(dmDocument,
|
||||
AccessStatus.ALLOWED, // read record permission
|
||||
AccessStatus.ALLOWED, // filing permission
|
||||
AccessStatus.ALLOWED, // view record capability
|
||||
AccessStatus.DENIED, // edit non record metadata capability
|
||||
AccessStatus.DENIED)) // edit record metadata capability
|
||||
|
||||
// And the consumer has read permissions and view record capability on the record
|
||||
.as(dmConsumer)
|
||||
.perform(() ->
|
||||
checkInPlaceAccess(dmDocument,
|
||||
AccessStatus.ALLOWED, // read record permission
|
||||
AccessStatus.DENIED, // filing permission
|
||||
AccessStatus.ALLOWED, // view record capability
|
||||
AccessStatus.DENIED, // edit non record metadata capability
|
||||
AccessStatus.DENIED)) // edit record metadata capability
|
||||
|
||||
// And a user that is not in the site has no permissions on the record
|
||||
.as(userName)
|
||||
.perform(() ->
|
||||
checkInPlaceAccess(dmDocument,
|
||||
AccessStatus.DENIED, // read record permission
|
||||
AccessStatus.DENIED, // filing permission
|
||||
AccessStatus.DENIED, // view record capability
|
||||
AccessStatus.DENIED, // edit non record metadata capability
|
||||
AccessStatus.DENIED)); // edit record metadata capability
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a record
|
||||
* When it is destroyed
|
||||
* And it's metadata is maintained
|
||||
* Then the inplace users still have access to the meta-data stub
|
||||
*/
|
||||
// TODO
|
||||
|
||||
/**
|
||||
* Given an inplace user with write access
|
||||
* When a role is added to the inplace writers role
|
||||
* Then then they receive that additional capability on the inplace record
|
||||
*/
|
||||
// TODO
|
||||
|
||||
// hide?
|
||||
// TODO
|
||||
|
||||
// reject?
|
||||
// TODO
|
||||
|
||||
// user added to group ?
|
||||
// TODO
|
||||
}
|
@@ -0,0 +1,258 @@
|
||||
/*
|
||||
* #%L
|
||||
* Alfresco Records Management Module
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* -
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
* the paid license agreement will prevail. Otherwise, the software is
|
||||
* provided under the following open source license terms:
|
||||
* -
|
||||
* Alfresco is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
* -
|
||||
* Alfresco 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 Lesser General Public License for more details.
|
||||
* -
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
* #L%
|
||||
*/
|
||||
package org.alfresco.module.org_alfresco_module_rm.test.util.bdt;
|
||||
|
||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||
import org.alfresco.repo.transaction.RetryingTransactionHelper;
|
||||
|
||||
/**
|
||||
* Helper class that provides an simple way to write behaviour integration tests.
|
||||
* <p>
|
||||
* Note that initBehaviourTest() must be called before given() is called.
|
||||
*
|
||||
* @author Roy Wetherall
|
||||
* @since 2.5
|
||||
*/
|
||||
public class BehaviourTest
|
||||
{
|
||||
/** retrying transaction helper */
|
||||
private static RetryingTransactionHelper retryingTransactionHelper;
|
||||
|
||||
/** current execution user */
|
||||
private String asUser = AuthenticationUtil.getAdminUserName();
|
||||
|
||||
/**
|
||||
* Initialise behaviour tests for execution with retrying transaction helper
|
||||
*
|
||||
* @param retryingTransactionHelper retrying transaction helper
|
||||
*/
|
||||
public static void initBehaviourTests(RetryingTransactionHelper retryingTransactionHelper)
|
||||
{
|
||||
BehaviourTest.retryingTransactionHelper = retryingTransactionHelper;
|
||||
}
|
||||
|
||||
/**
|
||||
* Start a test
|
||||
*
|
||||
* @return BehaviourTest new test instance
|
||||
*/
|
||||
public static BehaviourTest test()
|
||||
{
|
||||
return new BehaviourTest();
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper method to get the retrying transaction helper
|
||||
*
|
||||
* @return RetryingTransactionHelper retrying transaction helper
|
||||
*/
|
||||
/*package*/ RetryingTransactionHelper getRetryingTransactionHelper()
|
||||
{
|
||||
return retryingTransactionHelper;
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper method to get the execution user
|
||||
*
|
||||
* @return String execution user
|
||||
*/
|
||||
/* package*/ String getAsUser()
|
||||
{
|
||||
return asUser;
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper method to switch the current execution user to admin.
|
||||
*
|
||||
* @return BehaviourTest test instance
|
||||
*/
|
||||
public BehaviourTest asAdmin()
|
||||
{
|
||||
return as(AuthenticationUtil.getAdminUserName());
|
||||
}
|
||||
|
||||
/**
|
||||
* Set execution user
|
||||
*
|
||||
* @param asUser execution user
|
||||
* @return BehaviourTest test instance
|
||||
*/
|
||||
public BehaviourTest as(String asUser)
|
||||
{
|
||||
this.asUser = asUser;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Given.
|
||||
* <p>
|
||||
* Used to group together given conditions.
|
||||
*
|
||||
* @return BehaviourTest test instance
|
||||
*/
|
||||
public BehaviourTest given()
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Given.
|
||||
* <p>
|
||||
* Performs work.
|
||||
*
|
||||
* @param given work to do
|
||||
* @return BehaviourTest test instance
|
||||
*/
|
||||
public BehaviourTest given(Work given)
|
||||
{
|
||||
return perform(given);
|
||||
}
|
||||
|
||||
/**
|
||||
* When.
|
||||
* <p>
|
||||
* Used to group together when actions.
|
||||
*
|
||||
* @return BehaviourTest test instance
|
||||
*/
|
||||
public BehaviourTest when()
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* When.
|
||||
* <p>
|
||||
* Performs work.
|
||||
*
|
||||
* @param when work to do
|
||||
* @return BehaviourTest test instance
|
||||
*/
|
||||
public BehaviourTest when(Work when)
|
||||
{
|
||||
return perform(when);
|
||||
}
|
||||
|
||||
/**
|
||||
* Then.
|
||||
* <p>
|
||||
* Used to group together then actions.
|
||||
*
|
||||
* @return BehaviourTest test instance
|
||||
*/
|
||||
public BehaviourTest then()
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Then.
|
||||
* <p>
|
||||
* Performs work.
|
||||
*
|
||||
* @param then work to do
|
||||
* @return BehaviourTest test instance
|
||||
*/
|
||||
public BehaviourTest then(Work then)
|
||||
{
|
||||
return perform(then);
|
||||
}
|
||||
|
||||
/**
|
||||
* Expect a value.
|
||||
*
|
||||
* @param value value
|
||||
* @return ExpectedValue expected value evaluator
|
||||
*/
|
||||
public ExpectedValue<Boolean> expect(boolean value)
|
||||
{
|
||||
return new ExpectedValue<Boolean>(this, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Expect a value.
|
||||
*
|
||||
* @param value value
|
||||
* @return ExpectedValue expected value evaluator
|
||||
*/
|
||||
public ExpectedValue<String> expect(String value)
|
||||
{
|
||||
return new ExpectedValue<String>(this, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Expect a value.
|
||||
*
|
||||
* @param value value
|
||||
* @return ExpectedValue expected value evaluator
|
||||
*/
|
||||
public ExpectedValue<Object> expect(Object value)
|
||||
{
|
||||
return new ExpectedValue<Object>(this, value);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Expect a failure.
|
||||
*
|
||||
* @param exceptionClass expected exception
|
||||
* @return ExpectedFailure expected failure evaluator
|
||||
*/
|
||||
public ExpectedFailure expectException(Class<? extends Exception> exceptionClass)
|
||||
{
|
||||
return new ExpectedFailure(this, exceptionClass);
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform work
|
||||
*
|
||||
* @param work work to perform
|
||||
* @return BehaviourTest test instance
|
||||
*/
|
||||
public BehaviourTest perform(Work work)
|
||||
{
|
||||
return retryingTransactionHelper.doInTransaction(() ->
|
||||
{
|
||||
return AuthenticationUtil.runAs(() ->
|
||||
{
|
||||
work.doIt();
|
||||
return this;
|
||||
}, this.asUser);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Work Interface
|
||||
*/
|
||||
public interface Work
|
||||
{
|
||||
/**
|
||||
* Do the work.
|
||||
*/
|
||||
void doIt() throws Exception;
|
||||
}
|
||||
}
|
@@ -0,0 +1,92 @@
|
||||
/*
|
||||
* #%L
|
||||
* Alfresco Records Management Module
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* -
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
* the paid license agreement will prevail. Otherwise, the software is
|
||||
* provided under the following open source license terms:
|
||||
* -
|
||||
* Alfresco is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
* -
|
||||
* Alfresco 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 Lesser General Public License for more details.
|
||||
* -
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
* #L%
|
||||
*/
|
||||
package org.alfresco.module.org_alfresco_module_rm.test.util.bdt;
|
||||
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
import java.util.Arrays;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.alfresco.module.org_alfresco_module_rm.test.util.bdt.BehaviourTest.Work;
|
||||
|
||||
/**
|
||||
* Expected failure.
|
||||
*
|
||||
* @author Roy Wetherall
|
||||
* @since 2.5
|
||||
*/
|
||||
public class ExpectedFailure
|
||||
{
|
||||
private static final String MESSAGE = "Expected failure \"{0}\" was not observed.";
|
||||
|
||||
private BehaviourTest test;
|
||||
private Set<Class<? extends Exception>> exceptionClasses;
|
||||
private Work work;
|
||||
|
||||
@SafeVarargs
|
||||
public ExpectedFailure(BehaviourTest test, Class<? extends Exception> ...exceptionClasses)
|
||||
{
|
||||
this.test = test;
|
||||
this.exceptionClasses = Arrays.stream(exceptionClasses).collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
public ExpectedFailure from(Work work)
|
||||
{
|
||||
this.work = work;
|
||||
return this;
|
||||
}
|
||||
|
||||
public BehaviourTest because(String message)
|
||||
{
|
||||
try
|
||||
{
|
||||
test.perform(work);
|
||||
}
|
||||
catch(Exception actualException)
|
||||
{
|
||||
boolean found = false;
|
||||
|
||||
for (Class<? extends Exception> exceptionClass : exceptionClasses)
|
||||
{
|
||||
if (exceptionClass.isAssignableFrom(actualException.getClass()))
|
||||
{
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found)
|
||||
{
|
||||
fail(MessageFormat.format(MESSAGE, message));
|
||||
}
|
||||
}
|
||||
|
||||
return test;
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,85 @@
|
||||
/*
|
||||
* #%L
|
||||
* Alfresco Records Management Module
|
||||
* %%
|
||||
* Copyright (C) 2005 - 2016 Alfresco Software Limited
|
||||
* %%
|
||||
* This file is part of the Alfresco software.
|
||||
* -
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
* the paid license agreement will prevail. Otherwise, the software is
|
||||
* provided under the following open source license terms:
|
||||
* -
|
||||
* Alfresco is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
* -
|
||||
* Alfresco 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 Lesser General Public License for more details.
|
||||
* -
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
* #L%
|
||||
*/
|
||||
package org.alfresco.module.org_alfresco_module_rm.test.util.bdt;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
|
||||
import org.alfresco.repo.security.authentication.AuthenticationUtil;
|
||||
|
||||
/**
|
||||
* Expected value.
|
||||
*
|
||||
* @author Roy Wetherall
|
||||
* @since 2.5
|
||||
*/
|
||||
public class ExpectedValue<T>
|
||||
{
|
||||
private static final String MESSAGE = "Expected value outcome \"{0}\" was not observed.";
|
||||
|
||||
private T expectedValue;
|
||||
private Evaluation<T> evaluation;
|
||||
private BehaviourTest test;
|
||||
|
||||
public ExpectedValue(BehaviourTest test, T value)
|
||||
{
|
||||
this.expectedValue = value;
|
||||
this.test = test;
|
||||
}
|
||||
|
||||
public ExpectedValue<T> from(Evaluation<T> evaluation)
|
||||
{
|
||||
this.evaluation = evaluation;
|
||||
return this;
|
||||
}
|
||||
|
||||
public BehaviourTest because(String message)
|
||||
{
|
||||
T actualValue = (T)test.getRetryingTransactionHelper().doInTransaction(() ->
|
||||
{
|
||||
return AuthenticationUtil.runAs(() ->
|
||||
{
|
||||
return evaluation.eval();
|
||||
}, test.getAsUser());
|
||||
});
|
||||
|
||||
if (message != null)
|
||||
{
|
||||
message = MessageFormat.format(MESSAGE, message);
|
||||
}
|
||||
|
||||
assertEquals(message, expectedValue, actualValue);
|
||||
|
||||
return test;
|
||||
}
|
||||
|
||||
public interface Evaluation<T>
|
||||
{
|
||||
T eval() throws Exception;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user