Moved packaging develop into its own directory

This commit is contained in:
Chris Shields
2020-07-21 10:44:26 +01:00
parent 66664d40de
commit cd847f8f80
627 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,134 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.alfresco.tas</groupId>
<artifactId>content-repository-community-integration-test</artifactId>
<name>content-repository-community-integration-test</name>
<version>6.2.2-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>org.alfresco</groupId>
<artifactId>content-repository-community-tas-tests-parent</artifactId>
<version>6.2.2-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<developers>
<developer>
<name>Paul Brodner</name>
<roles>
<role>Test Automation Architect</role>
</roles>
</developer>
</developers>
<properties>
<suiteXmlFile>${project.basedir}/src/test/resources/integration-suite.xml</suiteXmlFile>
<dependency.groovy.version>2.5.9</dependency.groovy.version>
<dependency.javax.mail.version>1.6.2</dependency.javax.mail.version>
</properties>
<dependencies>
<dependency>
<groupId>org.alfresco.tas</groupId>
<artifactId>utility</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>${dependency.javax.mail.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>${dependency.javax.mail.version}</version>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
<version>${dependency.groovy.version}</version>
</dependency>
<!-- FTP -->
<dependency>
<groupId>org.alfresco.tas</groupId>
<artifactId>ftp</artifactId>
<scope>test</scope>
</dependency>
<!-- REST API -->
<dependency>
<groupId>org.alfresco.tas</groupId>
<artifactId>restapi</artifactId>
<scope>test</scope>
</dependency>
<!-- CMIS -->
<dependency>
<groupId>org.alfresco.tas</groupId>
<artifactId>cmis</artifactId>
<scope>test</scope>
</dependency>
<!-- EMAIL: IMAP & SMTP -->
<dependency>
<groupId>org.alfresco.tas</groupId>
<artifactId>email</artifactId>
<scope>test</scope>
</dependency>
<!-- WebDAV -->
<dependency>
<groupId>org.alfresco.tas</groupId>
<artifactId>webdav</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.4.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>${suiteXmlFile}</suiteXmlFile>
</suiteXmlFiles>
<argLine>
--illegal-access=warn
</argLine>
</configuration>
</plugin>
<!-- Build only test jar -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@@ -0,0 +1,477 @@
package org.alfresco.tas.integration;
import static org.alfresco.utility.report.log.Step.STEP;
import io.restassured.RestAssured;
import java.util.HashMap;
import java.util.Map;
import org.alfresco.dataprep.SiteService.Visibility;
import org.alfresco.rest.core.RestRequest;
import org.alfresco.rest.core.RestResponse;
import org.alfresco.rest.model.RestSiteContainerModel;
import org.alfresco.rest.model.RestSiteContainerModelsCollection;
import org.alfresco.rest.model.RestSiteEntry;
import org.alfresco.rest.model.RestSiteMemberModelsCollection;
import org.alfresco.rest.model.RestSiteMembershipRequestModel;
import org.alfresco.rest.model.RestTagModel;
import org.alfresco.rest.model.RestTaskModel;
import org.alfresco.utility.Utility;
import org.alfresco.utility.constants.UserRole;
import org.alfresco.utility.data.RandomData;
import org.alfresco.utility.model.FileModel;
import org.alfresco.utility.model.FileType;
import org.alfresco.utility.model.FolderModel;
import org.alfresco.utility.model.GroupModel;
import org.alfresco.utility.model.SiteModel;
import org.alfresco.utility.model.TestGroup;
import org.alfresco.utility.model.UserModel;
import org.alfresco.utility.testrail.ExecutionType;
import org.alfresco.utility.testrail.annotation.TestRail;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.testng.Assert;
import org.testng.annotations.Test;
public class IntegrationFullTests1 extends IntegrationTest
{
UserModel testUser1, testUser2, testUser3;
SiteModel testSitePublic, testSiteModerated;
/**
* Scenario 87
* 1. Using RestApi Admin user creates a new group1
* 2. Using CMIS create test users: U1, U2 and U3
* 3. Using RestApi add users U2 and U3 to group1
* 4. U1 creates public test site1 using CMIS
* 5. U1 creates file1 using CMIS, WebDav, FTP
* 6. U1 apply Acl permission in the new documents for testGroup with role Site Consumer using CMIS
* 7. Get permissions for U2 using CMIS
* 8. U2 edits files created with CMIS, WebDav, FTP using WebDav
*/
@Test(groups = { TestGroup.INTEGRATION, TestGroup.FULL })
@TestRail(section = { TestGroup.INTEGRATION, TestGroup.CONTENT }, executionType = ExecutionType.REGRESSION,
description = "Verify document permissions are added for a group of users")
public void addDocumentPermissionsForGroupOfUsers() throws Exception
{
STEP("1. Using RestApi Admin user creates a new group1");
GroupModel group1 = dataGroup.createRandomGroup();
STEP("2. Using CMIS create test users: U1, U2 and U3");
testUser1 = dataUser.createRandomTestUser();
testUser2 = dataUser.createRandomTestUser();
testUser3 = dataUser.createRandomTestUser();
STEP("3. Using RestApi add users U2 and U3 to group1");
dataGroup.usingUser(testUser2).addUserToGroup(group1);
dataGroup.usingUser(testUser3).addUserToGroup(group1);
STEP("4. U1 creates public test site1 using CMIS");
testSitePublic = dataSite.usingUser(testUser1).createPublicRandomSite();
STEP("5. U1 creates file1 using CMIS, WebDav, FTP");
FileModel cmisFile = FileModel.getRandomFileModel(FileType.TEXT_PLAIN);
cmisAPI.authenticateUser(testUser1).usingSite(testSitePublic).createFile(cmisFile);
FileModel webDavFile = FileModel.getRandomFileModel(FileType.HTML);
webDavProtocol.authenticateUser(testUser1).usingSite(testSitePublic).createFile(webDavFile);
FileModel ftpFile = FileModel.getRandomFileModel(FileType.XML);
ftpProtocol.authenticateUser(testUser1).usingSite(testSitePublic).createFile(ftpFile);
STEP("6. U1 apply Acl permission in the new documents for testGroup with role Site Consumer using CMIS");
cmisAPI.usingResource(cmisFile).addAcl(group1, UserRole.SiteConsumer);
cmisAPI.usingResource(webDavFile).addAcl(group1, UserRole.SiteConsumer);
cmisAPI.usingResource(ftpFile).addAcl(group1, UserRole.SiteConsumer);
STEP("7. Get permissions for U2 using CMIS");
cmisAPI.usingResource(cmisFile).assertThat().permissionIsSetForGrup(group1, UserRole.SiteConsumer);
cmisAPI.usingResource(webDavFile).assertThat().permissionIsSetForGrup(group1, UserRole.SiteConsumer);
cmisAPI.usingResource(ftpFile).assertThat().permissionIsSetForGrup(group1, UserRole.SiteConsumer);
STEP("8. U2 edits files created with CMIS, WebDav, FTP using WebDav");
String newContent = "new content";
webDavProtocol.authenticateUser(testUser2)
.usingResource(cmisFile).update(newContent)
.assertThat().hasStatus(org.apache.commons.httpclient.HttpStatus.SC_FORBIDDEN)
.usingResource(webDavFile).update(newContent)
.assertThat().hasStatus(org.apache.commons.httpclient.HttpStatus.SC_FORBIDDEN)
.usingResource(ftpFile).update(newContent)
.assertThat().hasStatus(org.apache.commons.httpclient.HttpStatus.SC_FORBIDDEN);
}
/**
* Scenario 88
* 1. Using RestApi Admin user creates a new group1
* 2. Using CMIS create test users: U1, U2 and U3
* 3. Using RestApi add users U2 and U3 to group1
* 4. U1 creates public test site1 using CMIS
* 5. U1 creates folder1 using CMIS, WebDav, FTP
* 6. U1 apply Acl permission in the new folders for testGroup with role Site Consumer using CMIS
* 7. Get permissions for U2 using CMIS
* 8. U2 edits folders created with CMIS, WebDav, FTP using WebDav
*/
@Test(groups = { TestGroup.INTEGRATION, TestGroup.FULL })
@TestRail(section = { TestGroup.INTEGRATION, TestGroup.CONTENT }, executionType = ExecutionType.REGRESSION,
description = "Verify folder permissions are added for a group of users")
public void addFolderPermissionsForGroupOfUsers() throws Exception
{
STEP("1. Using RestApi Admin user creates a new group1");
GroupModel group1 = dataGroup.createRandomGroup();
STEP("2. Using CMIS create test users: U1, U2 and U3");
testUser1 = dataUser.createRandomTestUser();
testUser2 = dataUser.createRandomTestUser();
testUser3 = dataUser.createRandomTestUser();
STEP("3. Using RestApi add users U2 and U3 to group1");
dataGroup.usingUser(testUser2).addUserToGroup(group1);
dataGroup.usingUser(testUser3).addUserToGroup(group1);
STEP("4. U1 creates public test site1 using CMIS");
testSitePublic = dataSite.usingUser(testUser1).createPublicRandomSite();
STEP("5. U1 creates folders using CMIS, WebDav, FTP");
FolderModel cmisFolder = FolderModel.getRandomFolderModel();
cmisAPI.authenticateUser(testUser1).usingSite(testSitePublic).createFolder(cmisFolder);
FolderModel webDavFolder = FolderModel.getRandomFolderModel();
webDavProtocol.authenticateUser(testUser1).usingSite(testSitePublic).createFolder(webDavFolder);
FolderModel ftpFolder = FolderModel.getRandomFolderModel();
ftpProtocol.authenticateUser(testUser1).usingSite(testSitePublic).createFolder(ftpFolder);
STEP("6. U1 apply Acl permission in the new folders for testGroup with role Site Consumer using CMIS");
cmisAPI.usingResource(cmisFolder).addAcl(group1, UserRole.SiteConsumer);
cmisAPI.usingResource(webDavFolder).addAcl(group1, UserRole.SiteConsumer);
cmisAPI.usingResource(ftpFolder).addAcl(group1, UserRole.SiteConsumer);
STEP("7. Get permissions for U2 using CMIS");
cmisAPI.usingResource(cmisFolder).assertThat().permissionIsSetForGrup(group1, UserRole.SiteConsumer);
cmisAPI.usingResource(webDavFolder).assertThat().permissionIsSetForGrup(group1, UserRole.SiteConsumer);
cmisAPI.usingResource(ftpFolder).assertThat().permissionIsSetForGrup(group1, UserRole.SiteConsumer);
STEP("8. U2 edits folders created with CMIS, WebDav, FTP using WebDav");
String newName = "newName";
webDavProtocol.authenticateUser(testUser2)
.usingResource(cmisFolder).rename(newName)
.assertThat().hasStatus(org.apache.commons.httpclient.HttpStatus.SC_FORBIDDEN)
.usingResource(webDavFolder).rename(newName)
.assertThat().hasStatus(org.apache.commons.httpclient.HttpStatus.SC_FORBIDDEN)
.usingResource(ftpFolder).rename(newName)
.assertThat().hasStatus(org.apache.commons.httpclient.HttpStatus.SC_FORBIDDEN);
}
/**
* Scenario 102
* 1. Using CMIS create test users: U1 and U2
* 2. U1 creates moderated test site1 using CMIS
* 3. U2 creates site membership request to site1 with RestAPI
* 4. U2 gets site membership request, check new message using RestAPI
* 5. U2 updates site membership request with a new message using RestAPI
* 6. U2 gets site membership request, check new message using RestAPI
* 7. U1 changes site visibility to private site using RestAPI
* 8. U2 updates site membership request with a new message using RestAPI
* 9. U2 gets site membership request, check new message using RestAPI
* 10. U1 change site visibility to moderated site RestAPI
* 11. U2 gets site membership request, check new message using RestAPI
* 12. U2 updates site membership request with a new message using RestAPI
* 13. U2 get site membership request, check new message using RestAPI
* 14. U1 user1 changes site visibility to public using RestAPI
* 15. U2 updates site membership request with a new message with RestAPI
* 16. U2 gets site membership request, check new message using RestAPI
* 17. U1 changes site visibility to moderated site RestAPI");
* 18. U2 gets site membership request, check new message using RestAPI");
* 19. U2 updates new site membership request using RestAPI
* 20. U1 approves site membership using RestAPI
* 21. U2 gets site membership request - no request using RestAPI
*/
@Test(groups = { TestGroup.INTEGRATION, TestGroup.FULL })
@TestRail(section = { TestGroup.INTEGRATION, TestGroup.SITES }, executionType = ExecutionType.REGRESSION,
description = "Verify user can update or not site membership request when site visibility is updated")
public void updateSiteMembershipRequestWhenSiteVisibilityIsUpdated() throws Exception
{
STEP("1. Using CMIS create 2 test users: U1 and U2");
testUser1 = dataUser.createRandomTestUser();
testUser2 = dataUser.createRandomTestUser();
STEP("2. U1 creates moderated test site1 using CMIS");
testSiteModerated = dataSite.usingUser(testUser1).createModeratedRandomSite();
STEP("3. U2 creates site membership request to site1 with RestAPI");
restAPI.authenticateUser(testUser2).withCoreAPI().usingMe().addSiteMembershipRequest("Please add me 1", testSiteModerated, "Request1");
restAPI.assertStatusCodeIs(HttpStatus.CREATED);
STEP("4. U2 gets site membership request, check new message using RestAPI");
RestSiteMembershipRequestModel request = restAPI.withCoreAPI().usingMe().getSiteMembershipRequest(testSiteModerated);
restAPI.assertStatusCodeIs(HttpStatus.OK);
request.assertThat().field("message").is("Please add me 1");
STEP("5. U2 updates site membership request with a new message using RestAPI");
request = restAPI.withCoreAPI().usingMe().updateSiteMembershipRequest(testSiteModerated, "Please add me 2");
request.assertThat().field("message").is("Please add me 2");
STEP("6. U2 gets site membership request, check new message using RestAPI");
request = restAPI.withCoreAPI().usingMe().getSiteMembershipRequest(testSiteModerated);
restAPI.assertStatusCodeIs(HttpStatus.OK);
request.assertThat().field("message").is("Please add me 2");
STEP("7. U1 changes site visibility to private site using RestAPI");
dataSite.usingUser(testUser1).updateSiteVisibility(testSiteModerated, Visibility.PRIVATE);
STEP("8. U2 updates site membership request with a new message using RestAPI");
restAPI.withCoreAPI().usingMe().updateSiteMembershipRequest(testSiteModerated, "Please add me 2");
restAPI.assertStatusCodeIs(HttpStatus.NOT_FOUND);
STEP("9. U2 gets site membership request, check new message using RestAPI");
restAPI.withCoreAPI().usingMe().getSiteMembershipRequest(testSiteModerated);
restAPI.assertStatusCodeIs(HttpStatus.NOT_FOUND);
STEP("10. U1 change site visibility to moderated site RestAPI");
dataSite.usingUser(testUser1).updateSiteVisibility(testSiteModerated, Visibility.MODERATED);
STEP("11. U2 gets site membership request, check new message using RestAPI");
request = restAPI.withCoreAPI().usingMe().getSiteMembershipRequest(testSiteModerated);
restAPI.assertStatusCodeIs(HttpStatus.OK);
request.assertThat().field("message").is("Please add me 2");
STEP("12. U2 updates site membership request with a new message using RestAPI");
request = restAPI.withCoreAPI().usingMe().updateSiteMembershipRequest(testSiteModerated, "Please add me 3");
request.assertThat().field("message").is("Please add me 3");
STEP("13. U2 get site membership request, check new message using RestAPI");
request = restAPI.withCoreAPI().usingMe().getSiteMembershipRequest(testSiteModerated);
restAPI.assertStatusCodeIs(HttpStatus.OK);
request.assertThat().field("message").is("Please add me 3");
STEP("14. U1 user1 changes site visibility to public using RestAPI");
dataSite.usingUser(testUser1).updateSiteVisibility(testSiteModerated, Visibility.PUBLIC);
STEP("15. U2 updates site membership request with a new message with RestAPI");
restAPI.withCoreAPI().usingMe().updateSiteMembershipRequest(testSiteModerated, "Please add me 4");
restAPI.assertStatusCodeIs(HttpStatus.NOT_FOUND);
STEP("16. U2 gets site membership request, check new message using RestAPI");
restAPI.withCoreAPI().usingMe().getSiteMembershipRequest(testSiteModerated);
restAPI.assertStatusCodeIs(HttpStatus.NOT_FOUND);
STEP("17. U1 changes site visibility to moderated site RestAPI");
dataSite.usingUser(testUser1).updateSiteVisibility(testSiteModerated, Visibility.MODERATED);
STEP("18. U2 gets site membership request, check new message using RestAPI");
request = restAPI.withCoreAPI().usingMe().getSiteMembershipRequest(testSiteModerated);
restAPI.assertStatusCodeIs(HttpStatus.OK);
request.assertThat().field("message").is("Please add me 3");
STEP("19. U2 updates new site membership request using RestAPI");
request = restAPI.withCoreAPI().usingMe().updateSiteMembershipRequest(testSiteModerated, "Please add me 5");
restAPI.assertStatusCodeIs(HttpStatus.OK);
request.assertThat().field("message").is("Please add me 5");
STEP("20. U1 approves site membership using RestAPI");
RestTaskModel taskModel = restAPI.withWorkflowAPI().getTasks().getTaskModelByDescription(testSiteModerated);
workflow.approveSiteMembershipRequest(testUser1.getUsername(), testUser1.getPassword(), taskModel.getId(), true, "Approve");
STEP("21. U2 gets site membership request - no request using RestAPI");
restAPI.withCoreAPI().usingMe().getSiteMembershipRequest(testSiteModerated);
restAPI.assertStatusCodeIs(HttpStatus.NOT_FOUND);
RestSiteEntry site= restAPI.withCoreAPI().usingMe().getSiteMembership(testSiteModerated);
restAPI.assertStatusCodeIs(HttpStatus.OK);
site.assertThat().field("id").is(testSiteModerated.getId())
.and().field("role").isNotEmpty();
}
/**
* Scenario 104
* 1. Using CMIS create test user A1
* 2. A1 creates public test site1 using CMIS
* 3. Using CMIS create test user U1
* 4. A1 adds U1 to site1 as site manager using RestAPI
* 5. A1 get site members using RestAPI
* 6. Using CMIS create test user U2
* 7. A1 adds U2 to site1 as site collaborator using RestAPI
* 8. A1 get site members using RestAPI
* 9. Using CMIS create test user U3
* 10. A1 add U3 to site1 as site contributor using RestAPI
* 11. A1 get site members using RestAPI
* 12. Using CMIS create test user U4
* 13. A1 add U4 to site1 as site consumer using RestAPI
* 14. A1 get site members using RestAPI
* 15. Using CMIS delete test user U1
* 16. A1 get site members using RestAPI
* 17. Using CMIS delete test user U2
* 18. A1 get site members using RestAPI
* 19. Using CMIS delete test user U3
* 20. A1 get site members using RestAPI
* 21. Using CMIS delete test user U4
* 22. A1 get site members using RestAPI
*/
@Test(groups = { TestGroup.INTEGRATION, TestGroup.FULL })
@TestRail(section = { TestGroup.INTEGRATION, TestGroup.SITES }, executionType = ExecutionType.REGRESSION,
description = "Verify get site members when users are added to site or deleted")
public void getSiteMembersWhenUsersAreAddedOrDeleted() throws Exception
{
STEP("1. Using CMIS create test user A1");
UserModel testUser = dataUser.createRandomTestUser();
STEP("2. A1 creates public test site1 using CMIS");
testSitePublic = dataSite.usingUser(testUser).createPublicRandomSite();
STEP("3. Using CMIS create test user U1");
UserModel user1 = dataUser.createRandomTestUser();
STEP("4. A1 adds U1 to site1 as site manager using RestAPI");
user1.setUserRole(UserRole.SiteManager);
restAPI.authenticateUser(testUser).withCoreAPI().usingSite(testSitePublic).addPerson(user1);
restAPI.assertStatusCodeIs(HttpStatus.CREATED);
STEP("5. A1 get site members using RestAPI");
RestSiteMemberModelsCollection members = restAPI.authenticateUser(testUser).withCoreAPI().usingSite(testSitePublic).getSiteMembers();
restAPI.assertStatusCodeIs(HttpStatus.OK);
members.assertThat().paginationField("count").is("2");
members.assertThat().entriesListContains("id", user1.getUsername())
.and().entriesListContains("role", UserRole.SiteManager.toString());
STEP("6. Using CMIS create test user U2");
UserModel user2 = dataUser.createRandomTestUser();
STEP("7. A1 adds U2 to site1 as site collaborator using RestAPI");
user2.setUserRole(UserRole.SiteCollaborator);
restAPI.authenticateUser(testUser).withCoreAPI().usingSite(testSitePublic).addPerson(user2);
restAPI.assertStatusCodeIs(HttpStatus.CREATED);
STEP("8. A1 get site members using RestAPI");
members = restAPI.authenticateUser(testUser).withCoreAPI().usingSite(testSitePublic).getSiteMembers();
restAPI.assertStatusCodeIs(HttpStatus.OK);
members.assertThat().paginationField("count").is("3");
members.assertThat().entriesListContains("id", user2.getUsername())
.and().entriesListContains("role", UserRole.SiteCollaborator.toString());
STEP("9. Using CMIS create test user U3");
UserModel user3 = dataUser.createRandomTestUser();
STEP("10. A1 add U3 to site1 as site contributor using RestAPI");
user3.setUserRole(UserRole.SiteContributor);
restAPI.authenticateUser(testUser).withCoreAPI().usingSite(testSitePublic).addPerson(user3);
restAPI.assertStatusCodeIs(HttpStatus.CREATED);
STEP("11. A1 get site members using RestAPI");
members = restAPI.authenticateUser(testUser).withCoreAPI().usingSite(testSitePublic).getSiteMembers();
restAPI.assertStatusCodeIs(HttpStatus.OK);
members.assertThat().paginationField("count").is("4");
members.assertThat().entriesListContains("id", user3.getUsername())
.and().entriesListContains("role", UserRole.SiteContributor.toString());
STEP("12. Using CMIS create test user U4");
UserModel user4 = dataUser.createRandomTestUser();
STEP("13. A1 add U4 to site1 as site consumer using RestAPI");
user4.setUserRole(UserRole.SiteConsumer);
restAPI.authenticateUser(testUser).withCoreAPI().usingSite(testSitePublic).addPerson(user4);
restAPI.assertStatusCodeIs(HttpStatus.CREATED);
STEP("14. A1 get site members using RestAPI");
members = restAPI.authenticateUser(testUser).withCoreAPI().usingSite(testSitePublic).getSiteMembers();
restAPI.assertStatusCodeIs(HttpStatus.OK);
members.assertThat().paginationField("count").is("5");
members.assertThat().entriesListContains("id", user4.getUsername())
.and().entriesListContains("role", UserRole.SiteConsumer.toString());
STEP("15. Using CMIS delete test user U1");
dataUser.deleteUser(user1);
STEP("16. A1 get site members using RestAPI");
members = restAPI.authenticateUser(testUser).withCoreAPI().usingSite(testSitePublic).getSiteMembers();
restAPI.assertStatusCodeIs(HttpStatus.OK);
members.assertThat().paginationField("count").is("4");
members.assertThat().entriesListDoesNotContain("id", user1.getUsername());
STEP("17. Using CMIS delete test user U2");
dataUser.deleteUser(user2);
STEP("18. A1 get site members using RestAPI");
members = restAPI.authenticateUser(testUser).withCoreAPI().usingSite(testSitePublic).getSiteMembers();
restAPI.assertStatusCodeIs(HttpStatus.OK);
members.assertThat().paginationField("count").is("3");
members.assertThat().entriesListDoesNotContain("id", user2.getUsername());
STEP("19. Using CMIS delete test user U3");
dataUser.deleteUser(user3);
STEP("20. A1 get site members using RestAPI");
members = restAPI.authenticateUser(testUser).withCoreAPI().usingSite(testSitePublic).getSiteMembers();
restAPI.assertStatusCodeIs(HttpStatus.OK);
members.assertThat().paginationField("count").is("2");
members.assertThat().entriesListDoesNotContain("id", user3.getUsername());
STEP("21. Using CMIS delete test user U4");
dataUser.deleteUser(user4);
STEP("22. A1 get site members using RestAPI");
members = restAPI.authenticateUser(testUser).withCoreAPI().usingSite(testSitePublic).getSiteMembers();
restAPI.assertStatusCodeIs(HttpStatus.OK);
members.assertThat().paginationField("count").is("1");
members.assertThat().entriesListDoesNotContain("id", user4.getUsername());
}
/**
* Scenario 105
* 1. Using CMIS create test user U1
* 2. U1 creates public test site1 using CMIS
* 3. U1 creates file1 using Webdav
* 4. U1 updates file1 properties using CMIS
* 5. U1 gets file1 properties using CMIS
* 6. U1 renames file1 using Webdav
* 7. U1 updates file1 content using FTP
* 8. U1 adds tags to file1 using RestAPI
* 9. U1 updates file1 properties using CMIS
* 10. U1 gets file1 properties using CMIS
*/
@Test(groups = { TestGroup.INTEGRATION, TestGroup.FULL })
@TestRail(section = { TestGroup.INTEGRATION, TestGroup.CONTENT }, executionType = ExecutionType.REGRESSION,
description = "Verify file properties with file properties are updated")
public void checkFilePropertiesWhenFileIsUpdated() throws Exception
{
STEP("1. Using CMIS create test user U1");
UserModel testUser = dataUser.createRandomTestUser();
STEP("2. U1 creates public test site1 using CMIS");
testSitePublic = dataSite.usingUser(testUser).createPublicRandomSite();
STEP("3. U1 creates file1 using Webdav");
FileModel file1 = FileModel.getRandomFileModel(FileType.MSWORD2007);
file1.setContent("content1");
webDavProtocol.authenticateUser(testUser).usingSite(testSitePublic).createFile(file1);
STEP("4. U1 updates file1 properties using CMIS");
String newDescription = "New-" + file1.getDescription();
String newTitle = "New title-" +file1.getTitle();
cmisAPI.authenticateUser(testUser).usingSite(testSitePublic).usingResource(file1).updateProperty("cmis:description", newDescription)
.updateProperty("cm:title", newTitle);
STEP("5. U1 gets file1 properties using CMIS");
cmisAPI.authenticateUser(testUser).usingResource(file1).assertThat().contentPropertyHasValue("cmis:description", newDescription)
.assertThat().contentPropertyHasValue("cm:title", newTitle);
STEP("6. U1 renames file1 using Webdav");
String newName = "Edited-" + file1.getName();
webDavProtocol.authenticateUser(testUser).usingSite(testSitePublic).usingResource(file1).rename(newName);
STEP("7. U1 updates file1 content using FTP");
String newContent = "New " + file1.getContent();
ftpProtocol.authenticateUser(testUser).usingSite(testSitePublic).usingResource(file1).update(newContent)
.assertThat().contentIs(newContent);
STEP("8. U1 adds tags to file1 using RestAPI");
String newTag = RandomData.getRandomName("tag");
RestTagModel tag = restAPI.authenticateUser(testUser).withCoreAPI().usingResource(file1).addTag(newTag);
restAPI.assertStatusCodeIs(HttpStatus.CREATED);
STEP("9. U1 updates file1 properties using CMIS");
newTitle = "New title2-" + file1.getTitle();
cmisAPI.authenticateUser(testUser).usingSite(testSitePublic).usingResource(file1).updateProperty("cm:title", newTitle);
STEP("10. U1 gets file1 properties using CMIS");
cmisAPI.authenticateUser(testUser).usingResource(file1).assertThat().contentPropertyHasValue("cmis:description", newDescription)
.assertThat().contentPropertyHasValue("cm:title", newTitle)
.assertThat().contentPropertyHasValue("cmis:name", newName)
.assertThat().contentPropertyHasValue("cm:taggable", tag.getId())
.assertThat().contentIs(newContent);
}
}

View File

@@ -0,0 +1,490 @@
package org.alfresco.tas.integration;
import static org.alfresco.utility.report.log.Step.STEP;
import org.alfresco.rest.model.RestErrorModel;
import org.alfresco.rest.model.RestTagModel;
import org.alfresco.utility.constants.UserRole;
import org.alfresco.utility.data.DataUser.ListUserWithRoles;
import org.alfresco.utility.exception.DataPreparationException;
import org.alfresco.utility.model.*;
import org.alfresco.utility.testrail.ExecutionType;
import org.alfresco.utility.testrail.annotation.TestRail;
import org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException;
import org.springframework.http.HttpStatus;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class IntegrationFullTestsBulk2 extends IntegrationTest
{
private UserModel testUser1;
private SiteModel testSitePublic;
private FolderModel testFolder1, testFolder2;
private FileModel wordFile, testFile;
private ListUserWithRoles usersWithRoles;
@BeforeClass(alwaysRun = true)
public void dataPreparation() throws Exception
{
testUser1 = dataUser.createRandomTestUser();
wordFile = FileModel.getRandomFileModel(FileType.MSWORD2007, "tasTesting");
}
@BeforeMethod(alwaysRun = true)
public void setup() throws DataPreparationException {
testSitePublic = dataSite.usingUser(testUser1).createPublicRandomSite();
testFolder1 = FolderModel.getRandomFolderModel();
testFolder2 = FolderModel.getRandomFolderModel();
testFile = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, "testContent");
}
/**
* Scenario 73
* 1. Create file1 using ftp
* 2. Open document for edit using CMIS
* 3. Try to edit document using Webdav while checked-out with CMIS
* 4. Copy document to testFolder2 with ftp
* 5. Update document from folder2, check its content is updated with Webdav
* 6. Update document with WebDAV - should fail since document is checked out
*
* @throws Exception
*/
@Test(groups = { TestGroup.INTEGRATION, TestGroup.FULL })
@TestRail(section = { TestGroup.INTEGRATION, TestGroup.CONTENT }, executionType = ExecutionType.REGRESSION,
description = "Edit checked out document using several protocols")
public void updateFileUsingDifferentProtocolsWhileDocumentIsCheckedOut() throws Exception
{
STEP("1. Create testFile1 using ftp");
ftpProtocol.authenticateUser(testUser1).usingSite(testSitePublic).createFolder(testFolder1)
.usingResource(testFolder1).createFile(wordFile)
.assertThat().contentIs("tasTesting");
STEP("2. Open document for edit using CMIS");
cmisAPI.authenticateUser(testUser1).usingResource(wordFile).checkOut();
FileModel wordFilePWC = cmisAPI.usingResource(wordFile).withCMISUtil().getPWCFileModel();
STEP("3. Try to edit document using Webdav while checked-out with CMIS - content should be updated");
webDavProtocol.authenticateUser(testUser1).usingResource(wordFilePWC).update("update")
.and().assertThat().contentIs("update");
STEP("4. Copy document to testFolder2 with ftp");
FileModel copiedWordFile = new FileModel(wordFile);
ftpProtocol.usingSite(testSitePublic).createFolder(testFolder2)
.usingResource(wordFile).copyTo(testFolder2);
copiedWordFile.setCmisLocation(ftpProtocol.getLastResourceWithoutPrefix());
ftpProtocol.usingResource(testFolder1).assertThat().hasFiles(wordFile)
.and().usingResource(testFolder2).assertThat().hasFiles(copiedWordFile);
STEP("5. Update document from folder2, check its content is updated with Webdav");
webDavProtocol.usingResource(copiedWordFile).update("Step5")
.and().assertThat().contentIs("Step5");
STEP("6. Update document with WebDAV");
webDavProtocol.authenticateUser(testUser1).usingResource(wordFile).update("WebDAVUpdate");
}
/**
* Scenario 84
* 1. Create folder1 with webdav
* 2. Upload new file, file1 with ftp
* 3. Set content for file1 with cmis
* 4. CheckOut file1 with cmis
* 5. Try to edit file while checked-out with ftp
* 6. Cancel checkout with cmis
* 7. Try again to edit file with ftp
* 8. Edit file content using webDav
* 9. Get content using cmis, validate it
*/
@Test(groups = { TestGroup.INTEGRATION, TestGroup.FULL } )
@TestRail(section = { TestGroup.INTEGRATION, TestGroup.CONTENT }, executionType = ExecutionType.REGRESSION,
description = "Update checked out document")
public void updateCheckedOutFile() throws Exception
{
STEP("1. Create folder1 with webdav");
webDavProtocol.authenticateUser(testUser1).usingSite(testSitePublic).createFolder(testFolder1).and().assertThat().existsInRepo();
STEP("2. Upload new file, file1 with ftp");
ftpProtocol.authenticateUser(testUser1).usingResource(testFolder1).createFile(testFile)
.and().assertThat().existsInRepo().and().assertThat().existsInFtp();
STEP("3. Set content for file1 with cmis");
cmisAPI.authenticateUser(testUser1).usingResource(testFile).update("cmisUpdate")
.and().assertThat().contentIs("testContentcmisUpdate");
STEP("4. CheckOut file1 with cmis");
cmisAPI.usingResource(testFile).checkOut();
STEP("5. Try to edit file while checked-out with ftp - content should not be updated since file is checked out");
ftpProtocol.usingResource(testFile).update("ftpUpdate")
.and().assertThat().contentIs("testContentcmisUpdate");
STEP("6. Cancel checkout with cmis");
cmisAPI.usingResource(testFile).cancelCheckOut();
STEP("7. Try again to edit file with ftp");
ftpProtocol.usingResource(testFile).update("ftpUpdate")
.and().assertThat().contentIs("ftpUpdate");
STEP("8. Edit file content using webDav");
webDavProtocol.usingResource(testFile).update("webdavUpdate").and().assertThat().contentIs("webdavUpdate");
STEP("9. Get content using cmis, validate it");
cmisAPI.usingResource(testFile).assertThat().contentIs("webdavUpdate");
}
/**
* 1. Create folder1 with cmis
* 2. Add new file with webdav
* 3. Open file with Manager, add some content, save with webdav
* 4. Open file with Consumer, add some content, save with ftp
* 5. Open file with Contributor, delete some content, save with webdav
* 6. Open file with Collaborator, add some content, save with WebDAV
* 7. Open file with Consumer, delete some content, save with webdav
* 8. Open file with Manager, add new content, save with cmis
* 9. Open file with Collaborator, delete content that Manager added with ftp
* 10. Open file with Manager, add new content with webdav
* 11. Delete all content with admin using FTP
* 12. Delete file with cmis
* 13. Check file is deleted with WebDAV
*/
@Test(groups = { TestGroup.INTEGRATION, TestGroup.FULL })
@TestRail(section = { TestGroup.INTEGRATION, TestGroup.CONTENT }, executionType = ExecutionType.REGRESSION,
description = "Update file with different user roles and protocols")
public void updateFileWithDifferentRolesUsingDifferentProtocols() throws Exception
{
usersWithRoles = dataUser.addUsersWithRolesToSite(testSitePublic, UserRole.SiteManager, UserRole.SiteCollaborator, UserRole.SiteConsumer,
UserRole.SiteContributor);
STEP("1. Create folder1 with cmis");
cmisAPI.authenticateUser(testUser1).usingSite(testSitePublic).createFolder(testFolder1).and().assertThat().existsInRepo();
STEP("2. Add new file with webdav");
webDavProtocol.authenticateUser(testUser1).usingResource(testFolder1).createFile(testFile).and().assertThat().existsInRepo();
STEP("3. Open file with Manager, add some content, save with webdav");
webDavProtocol.authenticateUser(usersWithRoles.getOneUserWithRole(UserRole.SiteManager)).usingResource(testFile).update("webdavUpdate")
.and().assertThat().contentIs("webdavUpdate");
STEP("4. Open file with Consumer, add some content, save with ftp");
ftpProtocol.authenticateUser(usersWithRoles.getOneUserWithRole(UserRole.SiteConsumer))
.usingResource(testFile).update("ftpUpdate").and().assertThat().contentIs("webdavUpdate");
STEP("5. Open file with Contributor, delete some content, save with webdav");
webDavProtocol.authenticateUser(usersWithRoles.getOneUserWithRole(UserRole.SiteContributor))
.usingResource(testFile).update("webdavUpdate").and().assertThat().contentIs("webdavUpdate");
STEP("6. Open file with Collaborator, add some content, save with WebDAV");
webDavProtocol.authenticateUser(usersWithRoles.getOneUserWithRole(UserRole.SiteCollaborator))
.usingResource(testFile).update("webdavUpdate2").and().assertThat().contentIs("webdavUpdate2");
STEP("7. Open file with Consumer, delete some content, save with webdav");
webDavProtocol.authenticateUser(usersWithRoles.getOneUserWithRole(UserRole.SiteConsumer))
.usingResource(testFile).update("webdavUpdate3").and().assertThat().contentIs("webdavUpdate2");
STEP("8. Open file with Manager, add new content, save with cmis");
cmisAPI.authenticateUser(usersWithRoles.getOneUserWithRole(UserRole.SiteManager))
.usingResource(testFile).update("cmisUpdate").and().assertThat().contentIs("webdavUpdate2cmisUpdate");
STEP("9. Open file with Collaborator, delete content that Manager added with ftp");
ftpProtocol.authenticateUser(usersWithRoles.getOneUserWithRole(UserRole.SiteCollaborator))
.usingResource(testFile).update("ftpUpdate").and().assertThat().contentIs("ftpUpdate");
STEP("10. Open file with Contributor, add new page with webdav");
webDavProtocol.authenticateUser(usersWithRoles.getOneUserWithRole(UserRole.SiteManager))
.usingResource(testFile).update("webdavUpdate").and().assertThat().contentIs("webdavUpdate");
STEP("11. Delete all content with admin using FTP");
ftpProtocol.authenticateUser(dataUser.getAdminUser())
.usingResource(testFile).update("").and().assertThat().contentIs("");
STEP("12. Delete file with cmis");
cmisAPI.usingResource(testFile).delete().and().assertThat().doesNotExistInRepo();
STEP("13. Check file is deleted with WebDAV");
webDavProtocol.authenticateUser(testUser1).usingResource(testFile).assertThat().doesNotExistInWebdav();
}
/**
* 1. Add file1 to document library with ftp
* 2. Update file content with WebDAV
* 3. Add a minor change to a document with cmis
* 4. Add a change with webdav, check document version with cmis
* 5. Add a major change to a document with cmis
* 6. Delete document last version with cmis
* 7. Try to edit previous version with cmis
* 8. Update content with ftp, check version
* 9. Check document content with WebDAV
*/
@Test(groups = { TestGroup.INTEGRATION, TestGroup.FULL })
@TestRail(section = { TestGroup.INTEGRATION, TestGroup.CONTENT }, executionType = ExecutionType.REGRESSION,
description = "Check document versioning")
public void documentVersioningTest() throws Exception
{
STEP("1. Add file1 to document library with ftp");
ftpProtocol.authenticateUser(testUser1).usingSite(testSitePublic).createFile(testFile).and().assertThat().existsInRepo();
STEP("2. Update file content with WebDAV");
webDavProtocol.authenticateUser(testUser1).usingResource(testFile).update("WebDAVUpdate").and().assertThat().contentIs("WebDAVUpdate");
STEP("3. Add a minor change to a document with cmis");
cmisAPI.authenticateUser(testUser1).usingResource(testFile).update("cmisUpdate")
.then().assertThat().documentHasVersion(1.1).and().assertThat().contentIs("WebDAVUpdatecmisUpdate");
STEP("4. Check document version with webdav");
webDavProtocol.authenticateUser(testUser1).usingResource(testFile).update("webdavUpdate");
cmisAPI.assertThat().documentHasVersion(1.2);
STEP("5. Add a major change to a document with cmis");
cmisAPI.authenticateUser(testUser1).usingResource(testFile).checkOut().prepareDocumentForCheckIn().withMajorVersion().checkIn()
.and().assertThat().documentHasVersion(2.0);
STEP("6. Delete document last version with cmis");
cmisAPI.usingResource(testFile).deleteAllVersions(false).and().assertThat().documentHasVersion(1.2);
STEP("7. Try to edit previous version with cmis");
cmisAPI.authenticateUser(testUser1).usingResource(testFile).update("cmisUpdate")
.then().assertThat().documentHasVersion(1.3).and().assertThat().contentIs("webdavUpdatecmisUpdate");
STEP("8. Update content with ftp, check version");
ftpProtocol.usingResource(testFile).update("ftpUpdate");
cmisAPI.assertThat().documentHasVersion(1.4);
STEP("9. Check document content with WebDAV");
webDavProtocol.authenticateUser(testUser1).usingResource(testFile).assertThat().contentIs("ftpUpdate");
}
/**
* Scenario 82
* 1. Create user1, user2
* 2. User1 creates site1 and invites user2 as manager
* 3. User1 adds document1 and tag1 to doc
* 4. User2 gets tags and verifies tag1 appears
* 5. User2 delete tag1
* 6. User1 tries to update tag1
* 7. User1 add new tag tag2
* 8. User2 verifies tag2 appears and tag1 is not in the list
* 9. User2 deletes document1
* 10. User1 tries to delete tag2
*/
@Test(groups = { TestGroup.INTEGRATION, TestGroup.FULL })
@TestRail(section = { TestGroup.INTEGRATION, TestGroup.CONTENT, TestGroup.TAGS }, executionType = ExecutionType.REGRESSION, description = "Check negative scenarios for tags")
public void tagsNegativeScenariosTest() throws Exception
{
STEP("1. Create user1, user2");
UserModel user1 = dataUser.createRandomTestUser();
UserModel user2 = dataUser.createRandomTestUser();
user2.setUserRole(UserRole.SiteManager);
STEP("2. User1 creates site1 and invites user2 as manager");
SiteModel site = dataSite.usingUser(user1).createPublicRandomSite();
restAPI.authenticateUser(user1).withCoreAPI().usingSite(site).addPerson(user2);
STEP("3. User1 adds document1 and tag1 to doc");
dataContent.usingUser(user1).usingSite(site).createContent(testFile);
RestTagModel tag = restAPI.withCoreAPI().usingResource(testFile).addTag("tag1");
restAPI.withCoreAPI().usingResource(testFile).getNodeTags().assertThat().entriesListContains("tag", "tag1");
STEP("4. User2 gets tags and verifies tag1 appears");
restAPI.authenticateUser(user2).withCoreAPI().usingResource(testFile).getNodeTags().assertThat().entriesListContains("tag", "tag1");
STEP("5. User2 delete tag1");
restAPI.withCoreAPI().usingResource(testFile).deleteTag(tag);
restAPI.withCoreAPI().usingResource(testFile).getNodeTags().assertThat().entriesListDoesNotContain("tag", "tag1");
STEP("6. User1 tries to update tag1");
restAPI.authenticateUser(user2).withCoreAPI().usingTag(tag).update("updatedTag");
restAPI.assertStatusCodeIs(HttpStatus.FORBIDDEN)
.assertLastError().containsSummary(RestErrorModel.PERMISSION_WAS_DENIED)
.containsErrorKey(RestErrorModel.PERMISSION_DENIED_ERRORKEY);
STEP("7. User1 add new tag tag2");
tag = restAPI.authenticateUser(user1).withCoreAPI().usingResource(testFile).addTag("tag2");
restAPI.withCoreAPI().usingResource(testFile).getNodeTags().assertThat().entriesListContains("tag", "tag2");
STEP("8. User2 verifies tag2 appears and tag1 is not in the list");
restAPI.authenticateUser(user2).withCoreAPI().usingResource(testFile).getNodeTags()
.assertThat().entriesListDoesNotContain("tag", "tag1")
.assertThat().entriesListContains("tag", "tag2");
STEP("9. User2 deletes document1");
dataContent.usingUser(user2).usingResource(testFile).deleteContent();
STEP("10. User1 tries to delete tag2");
restAPI.authenticateUser(user1).withCoreAPI().usingResource(testFile).deleteTag(tag);
restAPI.assertStatusCodeIs(HttpStatus.NOT_FOUND)
.assertLastError().containsSummary(String.format(RestErrorModel.ENTITY_NOT_FOUND, testFile.getNodeRefWithoutVersion()))
.containsErrorKey(RestErrorModel.ENTITY_NOT_FOUND_ERRORKEY);
}
/**
* Scenario 83
* 1. Create user1, user2
* 2. User1 creates site1 and invites user2 as manager with rest api
* 3. User1 adds document1 with webdav
* 4. User2 reads the document1 with ftp
* 5. User1 update document1 with WebDAV
* 6. User2 update the document1 with WebDAV
* 7. User1 deletes the document1 with ftp
* 8. Verify user2 cannot update document1 with cmis
*/
@Test(groups = { TestGroup.INTEGRATION, TestGroup.FULL }, expectedExceptions = CmisObjectNotFoundException.class, expectedExceptionsMessageRegExp = ".*Object not found:.*")
@TestRail(section = { TestGroup.INTEGRATION, TestGroup.CONTENT }, executionType = ExecutionType.REGRESSION, description = "Negative scenarios for update document")
public void fileUpdateNegativeScenariosTest() throws Exception
{
STEP("1. Create user1, user2");
UserModel user1 = dataUser.createRandomTestUser();
UserModel user2 = dataUser.createRandomTestUser();
user2.setUserRole(UserRole.SiteManager);
STEP("2. User1 creates site1 and invites user2 as manager with rest api");
SiteModel site = dataSite.usingUser(user1).createPublicRandomSite();
restAPI.authenticateUser(user1).withCoreAPI().usingSite(site).addPerson(user2);
STEP("3. User1 adds document1 with webdav");
webDavProtocol.authenticateUser(user1).usingSite(site).createFile(testFile).and().assertThat().existsInRepo();
STEP("4. User2 reads the document1 with ftp");
ftpProtocol.authenticateUser(user2).usingResource(testFile).assertThat().contentIs("testContent");
STEP("5. User1 update document1 with WebDAV");
webDavProtocol.authenticateUser(user1).usingResource(testFile).update("WebDAVUpdate1").assertThat().contentIs("WebDAVUpdate1");
STEP("6. User2 update the document1 with WebDAV");
webDavProtocol.authenticateUser(user2).usingResource(testFile).update("WebDAVUpdate2").assertThat().contentIs("WebDAVUpdate2");
STEP("7. User1 deletes the document1 with ftp");
ftpProtocol.authenticateUser(user1).usingResource(testFile).delete().assertThat().doesNotExistInFtp().assertThat().doesNotExistInRepo();
STEP("8. Verify user2 cannot update document1 with cmis");
cmisAPI.authenticateUser(user2).usingResource(testFile).update("cmisUpdate");
}
/**
* Scenario 85
* 1. Upload file with CMIS
* 2. Add some content with ftp
* 3. Add a minor change to document, 1.2 with cmis
* 4. Add a major change to document, 2.0 with cmis
* 5. Add a minor change to document, 2.1 with cmis
* 6. Delete version 2.0 with cmis with cmis
* 7. Get document version with cmis
* 8. Try to edit version 2.0 with cmis
* 9. Delete version 2.1 with cmis
* 10. Get document version with cmis
* 11. Try to edit version 2.0 with cmis
* 12. Check document content with ftp
* 13. Check document version with cmis
*/
@Test(groups = { TestGroup.INTEGRATION, TestGroup.FULL })
@TestRail(section = { TestGroup.INTEGRATION, TestGroup.CONTENT }, executionType = ExecutionType.REGRESSION,
description = "File versioning test scenarios")
public void fileVersioningScenariosTest() throws Exception
{
STEP("1. Upload file with CMIS");
cmisAPI.authenticateUser(testUser1).usingSite(testSitePublic).createFile(testFile).and().assertThat().existsInRepo();
STEP("2. Add some content with ftp ");
ftpProtocol.authenticateUser(testUser1).usingResource(testFile).update("ftpUpdate").and().assertThat().contentIs("ftpUpdate");
STEP("3. Add a minor change to document, 1.1 with cmis");
cmisAPI.usingResource(testFile).checkOut().prepareDocumentForCheckIn().withContent("cmisUpdate")
.withMinorVersion().checkIn().refreshResource().and().assertThat().documentHasVersion(1.2);
STEP("4. Add a major change to document, 2.0 with cmis");
cmisAPI.usingResource(testFile).checkOut().prepareDocumentForCheckIn().withContent("cmisUpdate")
.withMajorVersion().checkIn().and().assertThat().documentHasVersion(2.0);
STEP("5. Add a minor change to document, 2.1 with cmis");
cmisAPI.usingResource(testFile).checkOut().prepareDocumentForCheckIn().withContent("cmisUpdate")
.withMinorVersion().checkIn().and().assertThat().documentHasVersion(2.1);
STEP("6. Delete version 2.0 with cmis with cmis");
cmisAPI.usingResource(testFile).deleteAllVersions(false);
STEP("7. Get document version with cmis");
cmisAPI.usingResource(testFile).assertThat().documentHasVersion(2.0);
STEP("8. Try to edit version 2.0 with cmis");
cmisAPI.usingResource(testFile).update("cmisUpdate").and().assertThat().contentIs("cmisUpdatecmisUpdate")
.and().assertThat().documentHasVersion(2.1);
STEP("9. Delete version 2.1 with cmis");
cmisAPI.usingResource(testFile).deleteAllVersions(false);
STEP("10. Get document version with cmis");
cmisAPI.usingResource(testFile).assertThat().documentHasVersion(2.0);
STEP("11. Try to edit version 2.0 with cmis");
cmisAPI.usingResource(testFile).update("cmisUpdate").and().assertThat().contentIs("cmisUpdatecmisUpdate")
.and().assertThat().documentHasVersion(2.1);
STEP("12. Update and check document content with ftp");
ftpProtocol.authenticateUser(testUser1).usingResource(testFile).update("ftpUpdate").assertThat().contentIs("ftpUpdate");
STEP("13. Check document version with cmis");
cmisAPI.usingResource(testFile).assertThat().documentHasVersion(2.2);
}
/**
* 1. Upload file with cmis
* 2. Add some content with WebDAV
* 3. Add a minor change to document, 1.2 with cmis
* 4. Add a major change to document, 2.0 with cmis
* 5. Add a minor change to document, 2.1 with cmis
* 6. Delete version 2.1 with cmis
* 7. Try to edit the last version (which is now 2.0) with webdav
* 8. Check version with CMIS
* 9. Add new major change, version 3.0 with cmis
* 10. Delete previous version with cmis
* 11. Delete document with ftp
* 12. Check document version with cmis
*/
@Test(groups = { TestGroup.INTEGRATION, TestGroup.FULL }, expectedExceptionsMessageRegExp = ".*Version Series not found.*",
expectedExceptions = CmisObjectNotFoundException.class)
@TestRail(section = { TestGroup.INTEGRATION, TestGroup.CONTENT }, executionType = ExecutionType.REGRESSION,
description = "File versioning additional test scenarios")
public void fileVersioningNegativeScenariosTest() throws Exception
{
STEP("1. Upload file with cmis");
cmisAPI.authenticateUser(testUser1).usingSite(testSitePublic).createFile(testFile).and().assertThat().existsInRepo();
STEP("2. Add some content with WebDAV");
webDavProtocol.authenticateUser(testUser1).usingResource(testFile).update("WebDAVUpdate").and().assertThat().contentIs("WebDAVUpdate");
STEP("3. Add a minor change to document, 1.2 with cmis");
cmisAPI.usingResource(testFile).checkOut().prepareDocumentForCheckIn().withContent("cmisUpdate")
.withMinorVersion().checkIn().refreshResource().and().assertThat().documentHasVersion(1.2);
STEP("4. Add a major change to document, 2.0 with cmis");
cmisAPI.usingResource(testFile).checkOut().prepareDocumentForCheckIn().withContent("cmisUpdate")
.withMajorVersion().checkIn().and().assertThat().documentHasVersion(2.0);
STEP("5. Add a minor change to document, 2.1 with cmis");
cmisAPI.usingResource(testFile).checkOut().prepareDocumentForCheckIn().withContent("cmisUpdate")
.withMinorVersion().checkIn().refreshResource().and().assertThat().documentHasVersion(2.1);
STEP("6. Delete version 2.1 with cmis");
cmisAPI.usingResource(testFile).deleteAllVersions(false).assertThat().documentHasVersion(2.0);
STEP("7. Try to edit the last version (which is now 2.0) with webdav");
webDavProtocol.authenticateUser(testUser1).usingResource(testFile).update("webdavUpdate");
STEP("8. Check version with CMIS");
cmisAPI.usingResource(testFile).assertThat().documentHasVersion(2.1);
STEP("9. Add new major change, version 3.0 with cmis");
cmisAPI.usingResource(testFile).checkOut().prepareDocumentForCheckIn().withContent("cmisUpdate")
.withMajorVersion().checkIn().and().assertThat().documentHasVersion(3.0);
STEP("10. Delete previous version with cmis");
cmisAPI.usingResource(testFile).deleteAllVersions(false).assertThat().documentHasVersion(2.1);
STEP("11. Delete document with ftp");
ftpProtocol.authenticateUser(testUser1).usingResource(testFile).delete().assertThat().doesNotExistInRepo();
STEP("12. Check document version with cmis - should fail");
cmisAPI.usingResource(testFile).assertThat().documentHasVersion(2.1);
}
}

View File

@@ -0,0 +1,433 @@
package org.alfresco.tas.integration;
import static org.alfresco.utility.report.log.Step.STEP;
import org.alfresco.rest.model.RestCommentModelsCollection;
import org.alfresco.rest.model.RestErrorModel;
import org.alfresco.utility.Utility;
import org.alfresco.utility.constants.UserRole;
import org.alfresco.utility.data.DataUser.ListUserWithRoles;
import org.alfresco.utility.model.FileModel;
import org.alfresco.utility.model.FileType;
import org.alfresco.utility.model.FolderModel;
import org.alfresco.utility.model.SiteModel;
import org.alfresco.utility.model.TestGroup;
import org.alfresco.utility.model.UserModel;
import org.alfresco.utility.testrail.ExecutionType;
import org.alfresco.utility.testrail.annotation.TestRail;
import org.springframework.http.HttpStatus;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
public class IntegrationFullTestsBulk3 extends IntegrationTest
{
private UserModel testUser1, testUser2;
private SiteModel publicSite, moderatedSite, privateSite;
private RestCommentModelsCollection comments;
private FileModel testFile1, testFile2, wordFile ;
private ListUserWithRoles usersWithRoles;
private FolderModel testFolder1;
@BeforeClass(alwaysRun = true)
public void dataPreparation() throws Exception
{
testUser1 = dataUser.createRandomTestUser();
testFolder1 = FolderModel.getRandomFolderModel();
publicSite = dataSite.usingUser(testUser1).createPublicRandomSite();
}
/**
* Scenario 64
* 1. Create folder1 with WEBDAV
* 2. Create wordFile inside folder1 with CMIS
* 3. Delete wordFile content with CMIS
* 4. Update content using Collaborator role with CMIS
* 5. Append content using Manager role with WebDAV
* 6. Delete content that Manager added using Collaborator role with CMIS
* 7. Rename wordFile with WebDAV
* 9. Delete wordFile with WEBDAV
*
* @throws Exception
*/
@Test(groups = { TestGroup.INTEGRATION, TestGroup.FULL })
@TestRail(section = { TestGroup.INTEGRATION, TestGroup.CONTENT }, executionType = ExecutionType.REGRESSION,
description = "File handling using several protocols")
public void fileHandlingWithCollaboratorRole() throws Exception
{
String contentCollaborator = "content added by Collaborator";
publicSite = dataSite.usingUser(testUser1).createPublicRandomSite();
usersWithRoles = dataUser.addUsersWithRolesToSite(publicSite, UserRole.SiteCollaborator);
wordFile = FileModel.getRandomFileModel(FileType.MSWORD2007, "tasTesting");
STEP("1. Create folder1 with webdav");
webDavProtocol.authenticateUser(testUser1).usingSite(publicSite).createFolder(testFolder1).and().assertThat().existsInRepo();
STEP("2. Create testFile1 inside folder1 using CMIS");
cmisAPI.authenticateUser(usersWithRoles.getOneUserWithRole(UserRole.SiteCollaborator)).usingSite(publicSite).usingResource(testFolder1).createFile(wordFile)
.assertThat().existsInRepo();
STEP("3. Delete wordFile content with WebDAV");
cmisAPI.authenticateUser(testUser1).usingResource(wordFile).deleteContent();
STEP("4. Update content using Collaborator role with CMIS");
cmisAPI.authenticateUser(usersWithRoles.getOneUserWithRole(UserRole.SiteCollaborator))
.usingResource(wordFile).update(contentCollaborator)
.assertThat().contentIs(contentCollaborator);
STEP("5. Append content using Manager role with WebDAV");
webDavProtocol.authenticateUser(testUser1).usingResource(wordFile).update("content added by Manager").assertThat().contentIs("content added by Manager");
STEP("6. Delete content that Manager added using Collaborator role with CMIS");
cmisAPI.authenticateUser(usersWithRoles.getOneUserWithRole(UserRole.SiteCollaborator))
.usingResource(wordFile).deleteAllVersions(false)
.and().assertThat().documentHasVersion(1.2);
STEP("7. Rename wordFile with FTP");
ftpProtocol.authenticateUser(testUser1).usingResource(wordFile).rename("renamedFile.docx");
STEP("8. Delete file with WEBDAV");
webDavProtocol.authenticateUser(testUser1).usingResource(wordFile).delete()
.assertThat().doesNotExistInRepo();
}
/**
* Scenario 65
* 1. Create folder1 with WEBDAV
* 2. Create wordFile inside folder1 with CMIS
* 3. Delete wordFile content with CMIS
* 4. Update content using Contributor role with CMIS
* 5. Append content using Manager role with WebDAV
* 6. Delete content that Manager added using Collaborator role with CMIS
* 7. Rename wordFile with WEBDAV
* 8. Delete wordFile with FTP
*
* @throws Exception
*/
@Test(groups = { TestGroup.INTEGRATION, TestGroup.FULL })
@TestRail(section = { TestGroup.INTEGRATION, TestGroup.CONTENT }, executionType = ExecutionType.REGRESSION,
description = "File handling using several protocols")
public void fileHandlingWithContributorRole() throws Exception
{
String contentContributor = "content added by Contributor";
publicSite = dataSite.usingUser(testUser1).createPublicRandomSite();
usersWithRoles = dataUser.addUsersWithRolesToSite(publicSite, UserRole.SiteContributor);
wordFile = FileModel.getRandomFileModel(FileType.MSWORD2007, "tasTesting");
STEP("1. Create folder1 with webdav");
webDavProtocol.authenticateUser(testUser1).usingSite(publicSite).createFolder(testFolder1).and().assertThat().existsInRepo();
STEP("2. Create testFile1 inside folder1 using CMIS");
cmisAPI.authenticateUser(usersWithRoles.getOneUserWithRole(UserRole.SiteContributor))
.usingResource(testFolder1).createFile(wordFile)
.assertThat().existsInRepo();
STEP("3. Delete wordFile content with CMIS");
cmisAPI.authenticateUser(testUser1).usingResource(wordFile).deleteContent();
STEP("4. Update content using Contributor role with CMIS");
cmisAPI.authenticateUser(usersWithRoles.getOneUserWithRole(UserRole.SiteContributor))
.usingResource(wordFile).update(contentContributor)
.assertThat().contentIs(contentContributor);
STEP("5. Append content using Manager role with WebDAV");
webDavProtocol.authenticateUser(testUser1)
.usingResource(wordFile).update("content added by Manager")
.assertThat().contentIs("content added by Manager");
STEP("6. Delete content that Manager added using Contributor role with CMIS");
cmisAPI.authenticateUser(usersWithRoles.getOneUserWithRole(UserRole.SiteContributor))
.usingResource(wordFile).deleteAllVersions(false)
.and().assertThat().documentHasVersion(1.2);
STEP("7. Rename wordFile with WebDAV");
webDavProtocol.authenticateUser(testUser1).usingResource(wordFile).rename("renamedFile.docx");
STEP("8. Delete file with FTP");
ftpProtocol.authenticateUser(testUser1).usingResource(wordFile).delete().assertThat().doesNotExistInRepo();
}
/**
* Scenario 76
* 1. Using CMIS create two users: u1 and u2
* 2. U1 creates a public site using CMIS
* 3. U1 creates testFile1 in public site's document library using FTP
* 4. U1 adds comment1 for testFile1 using REST API
* 5. U2 gets comment1 using REST API
* 6. U1 updates testFile1 using WEBDAV
* 7. U2 gets comment1 using REST API
* 8. U1 deletes testFile1 using WebDAV
* 9. U2 can not get comment1 using REST API
*/
@Test(groups = { TestGroup.INTEGRATION, TestGroup.FULL })
@TestRail(section = { TestGroup.INTEGRATION, TestGroup.CONTENT, TestGroup.COMMENTS }, executionType = ExecutionType.REGRESSION,
description = "Verify comment is deleted .")
public void negativeScenarioWithComments() throws Exception
{
STEP("* 1. Using CMIS create two users: u1 and u2");
testUser1 = dataUser.createRandomTestUser();
testUser2 = dataUser.createRandomTestUser();
STEP("* 2. U1 creates a public site using CMIS");
publicSite = dataSite.usingUser(testUser1).createPublicRandomSite();
STEP("* 3. U1 creates a file in public site's document library using FTP");
testFile1 = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, "file1 content");
ftpProtocol.authenticateUser(testUser1).usingSite(publicSite).createFile(testFile1).then().assertThat().existsInRepo();
STEP("* 4. U1 adds comment1 for testFile1 using REST API");
String newComment = "This is a new comment added by " + testUser1.getUsername();
restAPI.authenticateUser(testUser1).withCoreAPI().usingResource(testFile1).addComment(newComment).assertThat().field("content").isNotEmpty().and().field("content").is(newComment);
restAPI.assertStatusCodeIs(HttpStatus.CREATED);
STEP("* 5. U2 gets comment1 using REST API");
comments = restAPI.authenticateUser(testUser2).withCoreAPI().usingResource(testFile1).getNodeComments();
restAPI.assertStatusCodeIs(HttpStatus.OK);
comments.assertThat().entriesListContains("content", newComment);
STEP("* 6. U1 updates testFile1 using WEBDAV");
String newContent = "This is new content added by " + testUser1.getUsername();
webDavProtocol.authenticateUser(testUser1).usingResource(testFile1).update(newContent).and().assertThat().contentIs(newContent);
STEP("* 7. U2 gets comment1 using REST API");
comments = restAPI.authenticateUser(testUser2).withCoreAPI().usingResource(testFile1).getNodeComments();
restAPI.assertStatusCodeIs(HttpStatus.OK);
comments.assertThat().entriesListContains("content", newComment);
STEP("* 8. U1 deletes testFile1 using WebDAV");
webDavProtocol.authenticateUser(testUser1).usingResource(testFile1).delete().and().assertThat().doesNotExistInRepo();
STEP("* 9. U2 can not get comment1 using REST API");
comments = restAPI.authenticateUser(testUser2).withCoreAPI().usingResource(testFile1).getNodeComments();
restAPI.assertStatusCodeIs(HttpStatus.NOT_FOUND).assertLastError().containsSummary(String.format(RestErrorModel.ENTITY_NOT_FOUND, testFile1.getNodeRef()));
}
/**
* Scenario 77
* 1. Using CMIS create two users: u1 and u2
* 2. U1 creates a public site using CMIS
* 3. U1 creates a file in public site's document library using FTP
* 4. U1 applyAcl(permission) for U2 with role Site Manager to the document using CMIS
* 5. U2 edits the document using FTP
*/
@Test(groups = { TestGroup.INTEGRATION, TestGroup.FULL })
@TestRail(section = { TestGroup.INTEGRATION, TestGroup.CONTENT }, executionType = ExecutionType.REGRESSION,
description = "Verify manager permission to a document in a public site - is able to edit document.")
public void addManagerPermissionToADocumentFromPublicSite() throws Exception
{
STEP("* 1. Using CMIS create two users: u1 and u2");
testUser1 = dataUser.createRandomTestUser();
testUser2 = dataUser.createRandomTestUser();
STEP("* 2. U1 creates a public site using CMIS");
publicSite = dataSite.usingUser(testUser1).createPublicRandomSite();
STEP("* 3. U1 creates a file in public site's document library using FTP");
testFile1 = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, "file1 content");
ftpProtocol.authenticateUser(testUser1).usingSite(publicSite).createFile(testFile1).then().assertThat().existsInRepo();
STEP("* 4. U1 applyAcl(permission) for U2 with role Site Manager to the document using CMIS");
cmisAPI.authenticateUser(testUser1).usingResource(testFile1).addAcl(testUser2, UserRole.SiteManager).then().assertThat().permissionIsSetForUser(testUser2, UserRole.SiteManager);
STEP("* 5. U2 edits the document using FTP");
ftpProtocol.authenticateUser(testUser2).usingSite(publicSite).usingResource(testFile1).update("new Content").assertThat().contentIs("new Content");
}
/**
* Scenario 78
* 1. Using CMIS create two users: u1 and u2
* 2. U1 creates a public site using CMIS
* 3. U1 creates a file in public site's document library using FTP
* 4. U1 applyAcl(permission) for U2 with role Site Collaborator to the document using CMIS
* 5. U2 edits the document using FTP
*/
@Test(groups = { TestGroup.INTEGRATION, TestGroup.FULL })
@TestRail(section = { TestGroup.INTEGRATION, TestGroup.CONTENT }, executionType = ExecutionType.REGRESSION,
description = "Verify collaborator permission to a document in a public site - is able to edit document.")
public void addCollaboratorPermissionToADocumentFromPublicSite() throws Exception
{
STEP("* 1. Using CMIS create two users: u1 and u2");
testUser1 = dataUser.createRandomTestUser();
testUser2 = dataUser.createRandomTestUser();
STEP("* 2. U1 creates a public site using CMIS");
publicSite = dataSite.usingUser(testUser1).createPublicRandomSite();
STEP("* 3. U1 creates a file in public site's document library using FTP");
testFile1 = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, "file1 content");
ftpProtocol.authenticateUser(testUser1).usingSite(publicSite).createFile(testFile1).then().assertThat().existsInRepo();
STEP("* 4. U1 applyAcl(permission) for U2 with role Site Manager to the document using CMIS");
cmisAPI.authenticateUser(testUser1).usingResource(testFile1).addAcl(testUser2, UserRole.SiteCollaborator).then().assertThat().permissionIsSetForUser(testUser2, UserRole.SiteCollaborator);
STEP("* 5. U2 edits the document using FTP");
ftpProtocol.authenticateUser(testUser2).usingSite(publicSite).usingResource(testFile1).update("new Content").assertThat().contentIs("new Content");
}
/**
* Scenario 79
* 1. Using CMIS create two users: u1 and u2
* 2. U1 creates a public site using CMIS
* 3. U1 creates a file in public site's document library using FTP
* 4. U1 applyAcl(permission) for U2 with role Site Contributor to the document using CMIS
* 5. U2 edits the document using FTP
*/
@Test(groups = { TestGroup.INTEGRATION, TestGroup.FULL })
@TestRail(section = { TestGroup.INTEGRATION, TestGroup.CONTENT }, executionType = ExecutionType.REGRESSION,
description = "Verify contributor permission to a document in a public site - is not able to edit document.")
public void addContributorPermissionToADocumentFromPublicSite() throws Exception
{
STEP("* 1. Using CMIS create two users: u1 and u2");
testUser1 = dataUser.createRandomTestUser();
testUser2 = dataUser.createRandomTestUser();
STEP("* 2. U1 creates a public site using CMIS");
publicSite = dataSite.usingUser(testUser1).createPublicRandomSite();
STEP("* 3. U1 creates a file in public site's document library using FTP");
testFile1 = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, "file1 content");
ftpProtocol.authenticateUser(testUser1).usingSite(publicSite).createFile(testFile1).then().assertThat().existsInRepo();
STEP("* 4. U1 applyAcl(permission) for U2 with role Site Manager to the document using CMIS");
cmisAPI.authenticateUser(testUser1).usingResource(testFile1).addAcl(testUser2, UserRole.SiteContributor).then().assertThat().permissionIsSetForUser(testUser2, UserRole.SiteContributor);
STEP("* 5. U2 edits the document using FTP");
ftpProtocol.authenticateUser(testUser2).usingSite(publicSite).usingResource(testFile1).update("new Content");
ftpProtocol.authenticateUser(testUser1).usingSite(publicSite).usingResource(testFile1).assertThat().contentIs("file1 content");
}
/**
* Scenario 80
* 1. Using CMIS create two users: u1 and u2
* 2. U1 creates a public site using CMIS
* 3. U1 creates a file in public site's document library using FTP
* 4. U1 applyAcl(permission) for U2 with role Site Consumer to the document using CMIS
* 5. U2 edits the document using FTP
*/
@Test(groups = { TestGroup.INTEGRATION, TestGroup.FULL })
@TestRail(section = { TestGroup.INTEGRATION, TestGroup.CONTENT }, executionType = ExecutionType.REGRESSION,
description = "Verify consumer permission to a document in a public site - is not able to edit document.")
public void addConsumerPermissionToADocumentFromPublicSite() throws Exception
{
STEP("* 1. Using CMIS create two users: u1 and u2");
testUser1 = dataUser.createRandomTestUser();
testUser2 = dataUser.createRandomTestUser();
STEP("* 2. U1 creates a public site using CMIS");
publicSite = dataSite.usingUser(testUser1).createPublicRandomSite();
STEP("* 3. U1 creates a file in public site's document library using FTP");
testFile1 = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, "file1 content");
ftpProtocol.authenticateUser(testUser1).usingSite(publicSite).createFile(testFile1).then().assertThat().existsInRepo();
STEP("* 4. U1 applyAcl(permission) for U2 with role Site Manager to the document using CMIS");
cmisAPI.authenticateUser(testUser1).usingResource(testFile1).addAcl(testUser2, UserRole.SiteConsumer).then().assertThat().permissionIsSetForUser(testUser2, UserRole.SiteConsumer);
STEP("* 5. U2 edits the document using FTP");
ftpProtocol.authenticateUser(testUser2).usingSite(publicSite).usingResource(testFile1).update("new Content");
ftpProtocol.authenticateUser(testUser1).usingSite(publicSite).usingResource(testFile1).assertThat().contentIs("file1 content");
}
/**
* Scenario 107
* 1. Using CMIS create two users: u1 and u2
* 2. U1 creates a moderated site using CMIS
* 3. U1 creates a file in moderated site's document library using FTP
* 4. U1 applyAcl(permission) for U2 with role Site Manager to the document using CMIS
* 5. U2 edits the document using FTP
*/
@Test(groups = { TestGroup.INTEGRATION, TestGroup.FULL })
@TestRail(section = { TestGroup.INTEGRATION, TestGroup.CONTENT }, executionType = ExecutionType.REGRESSION,
description = "Verify manager permission to a document in a moderated site - is not able to edit document.")
public void addManagerPermissionToADocumentFromModeratedSite() throws Exception
{
STEP("* 1. Using CMIS create two users: u1 and u2");
testUser1 = dataUser.createRandomTestUser();
testUser2 = dataUser.createRandomTestUser();
STEP("* 2. U1 creates a moderated site using CMIS");
moderatedSite = dataSite.usingUser(testUser1).createModeratedRandomSite();
STEP("* 3. U1 creates a file in moderated site's document library using FTP");
testFile1 = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, "file1 content");
ftpProtocol.authenticateUser(testUser1).usingSite(moderatedSite).createFile(testFile1).then().assertThat().existsInRepo();
STEP("* 4. U1 applyAcl(permission) for U2 with role Site Manager to the document using CMIS");
cmisAPI.authenticateUser(testUser1).usingResource(testFile1).addAcl(testUser2, UserRole.SiteManager).then().assertThat().permissionIsSetForUser(testUser2, UserRole.SiteManager);
STEP("* 5. U2 edits the document using FTP");
ftpProtocol.authenticateUser(testUser2).usingSite(moderatedSite).usingResource(testFile1).update("new Content");
ftpProtocol.authenticateUser(testUser1).usingSite(moderatedSite).usingResource(testFile1).assertThat().contentIs("file1 content");
}
/**
* Scenario 108
* 1. Using CMIS create two users: u1 and u2
* 2. U1 creates a private site using CMIS
* 3. U1 creates a file in private site's document library using FTP
* 4. U1 applyAcl(permission) for U2 with role Site Manager to the document using CMIS
* 5. U2 edits the document using FTP
*/
@Test(groups = { TestGroup.INTEGRATION, TestGroup.FULL })
@TestRail(section = { TestGroup.INTEGRATION, TestGroup.CONTENT }, executionType = ExecutionType.REGRESSION,
description = "Verify manager permission to a document in a private site - is not able to edit document.")
public void addManagerPermissionToADocumentFromPrivateSite() throws Exception
{
STEP("* 1. Using CMIS create two users: u1 and u2");
testUser1 = dataUser.createRandomTestUser();
testUser2 = dataUser.createRandomTestUser();
STEP("* 2. U1 creates a private site using CMIS");
privateSite = dataSite.usingUser(testUser1).createPrivateRandomSite();
STEP("* 3. U1 creates a file in private site's document library using FTP");
testFile1 = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, "file1 content");
ftpProtocol.authenticateUser(testUser1).usingSite(privateSite).createFile(testFile1).then().assertThat().existsInRepo();
STEP("* 4. U1 applyAcl(permission) for U2 with role Site Manager to the document using CMIS");
cmisAPI.authenticateUser(testUser1).usingResource(testFile1).addAcl(testUser2, UserRole.SiteManager).then().assertThat().permissionIsSetForUser(testUser2, UserRole.SiteManager);
STEP("* 5. U2 edits the document using FTP");
ftpProtocol.authenticateUser(testUser2).usingSite(privateSite).usingResource(testFile1).update("new Content");
ftpProtocol.authenticateUser(testUser1).usingSite(privateSite).usingResource(testFile1).assertThat().contentIs("file1 content");
}
/**
* Scenario 60
* 1. Using CMIS creates one test user: u1
* 2. U1 creates testFile1 in public site using FTP
* 3. U1 creates testFile2 in public site using FTP
* 4. U1 updates testFile2 using FTP
* 5. Compare created date with modified date
*/
@Test(groups = { TestGroup.INTEGRATION, TestGroup.FULL })
@TestRail(section = { TestGroup.INTEGRATION, TestGroup.CONTENT}, executionType = ExecutionType.REGRESSION, description = "Compare Modified Date")
public void manageModificationTimeOfFile() throws Exception
{
STEP("1. Using CMIS creates one test user: u1");
testUser1 = dataUser.createRandomTestUser();
STEP("2. U1 creates testFile1 in a public site using FTP");
publicSite = dataSite.usingUser(testUser1).createPublicRandomSite();
testFile1 = new FileModel("testFile1", FileType.TEXT_PLAIN);
ftpProtocol.authenticateUser(testUser1).usingSite(publicSite).createFile(testFile1).assertThat().existsInRepo();
String modifiedDate1 = ftpProtocol.getModificationTime();
STEP("3. U1 creates testFile2 in a public site using FTP");
publicSite = dataSite.usingUser(testUser1).createPublicRandomSite();
testFile2 = new FileModel("testFile1", FileType.TEXT_PLAIN);
Utility.waitToLoopTime(2);
ftpProtocol.usingSite(publicSite).createFile(testFile2).assertThat().existsInRepo();
String modifiedDate2 = ftpProtocol.getModificationTime();
Utility.waitToLoopTime(2, "Waiting for update");
STEP("4. U1 updates testFile2 in a public site using FTP");
ftpProtocol.update("test update").assertThat().contentIs("test update");
String updatedDate2 = ftpProtocol.getModificationTime();
STEP("5. Compare created date with modified date");
Assert.assertNotEquals(modifiedDate1, modifiedDate2, "Updated and modified dates are equal");
Assert.assertNotEquals(modifiedDate2, updatedDate2, "Modified and updated dates are equal");
}
}

View File

@@ -0,0 +1,106 @@
package org.alfresco.tas.integration;
import java.lang.reflect.Method;
import org.alfresco.cmis.CmisProperties;
import org.alfresco.cmis.CmisWrapper;
import org.alfresco.dataprep.WorkflowService;
import org.alfresco.email.EmailProperties;
import org.alfresco.email.ImapWrapper;
import org.alfresco.email.SmtpWrapper;
import org.alfresco.ftp.FTPWrapper;
import org.alfresco.rest.core.RestProperties;
import org.alfresco.rest.core.RestWrapper;
import org.alfresco.utility.LogFactory;
import org.alfresco.utility.data.DataContent;
import org.alfresco.utility.data.DataGroup;
import org.alfresco.utility.data.DataSite;
import org.alfresco.utility.data.DataUser;
import org.alfresco.utility.data.DataWorkflow;
import org.alfresco.utility.extension.ExtentionPointTestUtility;
import org.alfresco.utility.network.ServerHealth;
import org.alfresco.webdav.WebDavWrapper;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
@ContextConfiguration("classpath:alfresco-integration-context.xml")
public abstract class IntegrationTest extends AbstractTestNGSpringContextTests
{
private static Logger LOG = LogFactory.getLogger();
@Autowired
protected DataUser dataUser;
@Autowired
protected DataSite dataSite;
@Autowired
protected DataContent dataContent;
@Autowired
protected DataGroup dataGroup;
@Autowired
protected DataWorkflow dataWorkflow;
@Autowired
protected WorkflowService workflow;
@Autowired
protected FTPWrapper ftpProtocol;
@Autowired
protected WebDavWrapper webDavProtocol;
@Autowired
protected CmisWrapper cmisAPI;
@Autowired
protected CmisProperties cmisProperties;
@Autowired
protected ImapWrapper imapProtocol;
@Autowired
protected RestWrapper restAPI;
@Autowired
protected ServerHealth serverHealth;
@Autowired
protected RestProperties restProperties;
@Autowired
protected ExtentionPointTestUtility extentionPointTestUtility;
@Autowired
protected SmtpWrapper smtpProtocol;
@Autowired
EmailProperties emailProperties;
@BeforeSuite(alwaysRun = true)
public void checkServerHealth() throws Exception
{
super.springTestContextPrepareTestInstance();
serverHealth.assertServerIsOnline();
}
@BeforeMethod(alwaysRun=true)
public void showStartTestInfo(Method method)
{
LOG.info(String.format("*** STARTING Test: [%s] ***",method.getName()));
}
@AfterMethod(alwaysRun=true)
public void showEndTestInfo(Method method)
{
LOG.info(String.format("*** ENDING Test: [%s] ***", method.getName()));
}
}

View File

@@ -0,0 +1,88 @@
package org.alfresco.tas.integration;
import static org.alfresco.utility.report.log.Step.STEP;
import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import java.util.HashMap;
import java.util.Map;
import javax.json.JsonObject;
import org.alfresco.rest.core.JsonBodyGenerator;
import org.alfresco.rest.core.RestRequest;
import org.alfresco.rest.model.RestHtmlResponse;
import org.alfresco.utility.model.TestGroup;
import org.alfresco.utility.model.UserModel;
import org.alfresco.utility.report.Bug;
import org.alfresco.utility.report.Bug.Status;
import org.alfresco.utility.testrail.ExecutionType;
import org.alfresco.utility.testrail.annotation.TestRail;
import org.apache.commons.codec.binary.Base64;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.testng.annotations.Test;
/**
* @author Catalin Gornea
*/
public class IntegrationWithAosTests extends IntegrationTest
{
@Bug(id = "REPO-2096", status = Status.FIXED)
@Test(groups = { TestGroup.INTEGRATION, TestGroup.AOS, TestGroup.FULL, TestGroup.SSO })
@TestRail(section = { TestGroup.INTEGRATION,
TestGroup.AOS }, executionType = ExecutionType.REGRESSION, description = "Security check for AOS Protocol with External Authentification - MNT-17474")
public void aosCSRFVulnerabilityInSSOEnvironment() throws Exception
{
STEP("1. Post call using RestAPI for specific AOS Security issue");
UserModel adminUser = dataUser.getAdminUser();
Map<String, String> headers = new HashMap<String, String>();
String authCookie = String.format("%s:%s", adminUser.getUsername(), adminUser.getPassword());
String authCookieEncoded = new String(Base64.encodeBase64(authCookie.getBytes()));
headers.put("Authorization", String.format("Basic %s", authCookieEncoded));
restAPI.configureRequestSpec().addHeaders(headers);
JsonObject postBody = JsonBodyGenerator.defineJSON().add("method", "create url-directories:6.0.2.8164")
.add("urldirs", "[[url=ExploitedMNT17474;meta_info=[]]]").build();
restAPI.authenticateUser(adminUser).usingContentType(ContentType.URLENC).withAosAPI();
RestRequest request = RestRequest.requestWithBody(HttpMethod.POST, postBody.toString(), "_vti_bin/_vti_aut/author.dll");
restAPI.process(request);
restAPI.assertStatusCodeIs(HttpStatus.BAD_REQUEST);
}
@Bug(id = "REPO-2172", status = Status.FIXED)
@Test(groups = { TestGroup.INTEGRATION, TestGroup.AOS, TestGroup.FULL, TestGroup.SSO })
@TestRail(section = { TestGroup.INTEGRATION, TestGroup.AOS },
executionType = ExecutionType.REGRESSION, description = "Non domain user can login to aos through Kerberos successfully.")
public void nonDomainKerberosUserCanLoginSuccessfulInAos() throws Exception {
STEP("1. Perform a GET request of aos using a non-domain kerberos user");
String webDavUrl = "alfresco/aos";
RestAssured.basePath = "";
restAPI.configureRequestSpec().setBasePath(RestAssured.basePath);
RestRequest request = RestRequest.simpleRequest(HttpMethod.GET, webDavUrl);
RestHtmlResponse response = restAPI.authenticateUser(dataUser.getAdminUser()).processHtmlResponse(request);
restAPI.assertStatusCodeIs(HttpStatus.OK);
response.assertPathInHtmlBodyEquals("html.body.table.tr[1].td[0].text()", "Shared");
response.assertPathInHtmlBodyEquals("html.body.table.tr[2].td[0].text()", "Imap Attachments");
}
@Bug(id = "REPO-2172", status = Status.FIXED)
@Test(groups = { TestGroup.INTEGRATION, TestGroup.WEBDAV, TestGroup.FULL, TestGroup.SSO })
@TestRail(section = { TestGroup.INTEGRATION, TestGroup.WEBDAV },
executionType = ExecutionType.REGRESSION, description = "Non domain user can login to webdav through Kerberos successfully.")
public void nonDomainKerberosUserCanLoginSuccessfulInWebDav() throws Exception {
STEP("1. Perform a GET request of webdav using a non-domain kerberos user");
String webDavUrl = "alfresco/webdav";
RestAssured.basePath = "";
restAPI.configureRequestSpec().setBasePath(RestAssured.basePath);
RestRequest request = RestRequest.simpleRequest(HttpMethod.GET, webDavUrl);
RestHtmlResponse response = restAPI.authenticateUser(dataUser.getAdminUser()).processHtmlResponse(request);
restAPI.assertStatusCodeIs(HttpStatus.OK);
response.assertPathInHtmlBodyEquals("html.body.table.tr.td[0].text()", "Directory listing for /");
response.assertPathInHtmlBodyEquals("html.body.table.tr.td.find{it.@class=='textData'}[0].text()", "Shared");
}
}

View File

@@ -0,0 +1,189 @@
package org.alfresco.tas.integration;
import static org.alfresco.utility.report.log.Step.STEP;
import io.restassured.RestAssured;
import java.util.HashMap;
import org.alfresco.rest.core.JsonBodyGenerator;
import org.alfresco.rest.core.RestRequest;
import org.alfresco.rest.core.RestResponse;
import org.alfresco.rest.model.RestNodeModel;
import org.alfresco.rest.model.RestRenditionInfoModel;
import org.alfresco.utility.Utility;
import org.alfresco.utility.exception.DataPreparationException;
import org.alfresco.utility.model.FileModel;
import org.alfresco.utility.model.FileType;
import org.alfresco.utility.model.FolderModel;
import org.alfresco.utility.model.SiteModel;
import org.alfresco.utility.model.TestGroup;
import org.alfresco.utility.model.UserModel;
import org.alfresco.utility.report.Bug;
import org.alfresco.utility.testrail.ExecutionType;
import org.alfresco.utility.testrail.annotation.TestRail;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
public class IntegrationWithCmisTests extends IntegrationTest
{
private UserModel user;
private SiteModel site;
@BeforeClass(alwaysRun = true)
public void createUserAndSite() throws DataPreparationException
{
user = dataUser.createRandomTestUser();
site = dataSite.usingUser(user).createPublicRandomSite();
}
// @Test(groups = { TestGroup.INTEGRATION, TestGroup.CMIS, TestGroup.FULL })
@TestRail(section = { TestGroup.INTEGRATION,
TestGroup.CMIS }, executionType = ExecutionType.REGRESSION, description = "Verify getChildren action for a large number of files from CMIS returns only unique values with few retries")
public void verifyGetChildrenReturnsUniqueValues() throws Exception
{
STEP("1. Create user, site, folder.");
FolderModel folder = FolderModel.getRandomFolderModel();
folder = dataContent.usingUser(user).usingSite(site).createFolder(folder);
STEP("2. Create 5000 files in folder using webscript");
int totalFiles = 5000;
String fileCreationWebScript = "alfresco/s/api/model/filefolder/load";
HashMap<String, String> input = new HashMap<String, String>();
input.put("folderPath", folder.getCmisLocation());
input.put("fileCount", String.valueOf(totalFiles));
String postBody = JsonBodyGenerator.keyValueJson(input);
RestAssured.basePath = "";
restAPI.configureRequestSpec().setBasePath(RestAssured.basePath);
RestRequest request = RestRequest.requestWithBody(HttpMethod.POST, postBody, fileCreationWebScript);
RestResponse response = restAPI.authenticateUser(user).process(request);
Assert.assertEquals(response.getResponse().getStatusCode(), HttpStatus.OK.value());
STEP("3. Verify getChildren from CMIS returns unique values");
cmisAPI.authenticateUser(user).usingSite(site).usingResource(folder);
for (int i = 1; i <= 20; i++)
{
System.out.println(String.format("Try no: %d", i));
cmisAPI.usingResource(folder).assertThat().hasUniqueChildren(totalFiles);
}
}
@Test(groups = { TestGroup.INTEGRATION, TestGroup.CMIS, TestGroup.CORE })
@TestRail(section = { TestGroup.INTEGRATION,
TestGroup.CMIS }, executionType = ExecutionType.REGRESSION, description = "Verify content and thumbnail of TIF files are retrieved by CMIS ")
@Bug(id = "REPO-2042", description = "Should fail only on MAC OS System and Linux")
public void verifyContentAndThumbnailForTifFile() throws Exception
{
STEP("1. Create user, site and a folder ");
FolderModel folder = FolderModel.getRandomFolderModel();
folder = dataContent.usingUser(user).usingSite(site).createFolder(folder);
STEP("2. Upload existing TIF file using RESTAPI");
restAPI.authenticateUser(user).configureRequestSpec().addMultiPart("filedata", Utility.getResourceTestDataFile("my-file.tif"));
RestNodeModel fileNode = restAPI.authenticateUser(user).withCoreAPI().usingNode(folder).createNode();
restAPI.assertStatusCodeIs(HttpStatus.CREATED);
FileModel file = new FileModel("my-file.tif");
file.setCmisLocation(folder.getCmisLocation() + "/my-file.tif");
file.setNodeRef(fileNode.getId());
STEP("3. Create thumbnail and content of TIF files using file");
restAPI.withCoreAPI().usingNode(file).createNodeRendition("pdf");
restAPI.assertStatusCodeIs(HttpStatus.ACCEPTED);
restAPI.withCoreAPI().usingNode(file).createNodeRendition("doclib");
restAPI.assertStatusCodeIs(HttpStatus.ACCEPTED);
STEP("4. Verify thumbnail and content of TIF files are created using RESTAPI");
cmisAPI.authenticateUser(user).usingSite(site).usingResource(folder).usingResource(file).assertThat().contentContains("Adobe Photoshop CC 2015");
RestRenditionInfoModel renditionInfo = restAPI.withCoreAPI().usingNode(file).getNodeRendition("pdf");
restAPI.assertStatusCodeIs(HttpStatus.OK);
renditionInfo.assertThat().field("status").is("CREATED");
renditionInfo = restAPI.withCoreAPI().usingNode(file).getNodeRendition("doclib");
restAPI.assertStatusCodeIs(HttpStatus.OK);
renditionInfo.assertThat().field("status").is("CREATED");
}
@Test(groups = { TestGroup.INTEGRATION, TestGroup.CMIS, TestGroup.FULL })
@TestRail(section = { TestGroup.INTEGRATION,
TestGroup.CMIS }, executionType = ExecutionType.REGRESSION, description = "Verify getChildren action for a large number of files from CMIS returns only unique values with few retries")
public void verifyContentDispositionForContentThatAreWhiteListed() throws Exception
{
STEP("1. Create a .pdf and a .html file in the Shared folder in CMIS");
FolderModel sharedFolder = FolderModel.getSharedFolderModel();
FileModel pdfFile = FileModel.getRandomFileModel(FileType.PDF);
FileModel htmlFile = FileModel.getRandomFileModel(FileType.HTML);
STEP("2. Upload the .pdf file and verify the reponse header adding the download=inline/attachement parameters (accepted both).");
cmisAPI.authenticateUser(user).usingResource(sharedFolder).createFile(pdfFile);
RestResponse response = restAPI.authenticateUser(user).withCMISApi().getRootObjectByLocation(pdfFile);
restAPI.assertStatusCodeIs(HttpStatus.OK);
response.assertThat().header("Content-Disposition", String.format("inline; filename=%s", pdfFile.getName()));
response = restAPI.authenticateUser(user).withCMISApi().usingParams("download=inline").getRootObjectByLocation(pdfFile);
restAPI.assertStatusCodeIs(HttpStatus.OK);
response.assertThat().header("Content-Disposition", String.format("inline; filename=%s", pdfFile.getName()));
response = restAPI.authenticateUser(user).withCMISApi().usingParams("download=attachment").getRootObjectByLocation(pdfFile);
restAPI.assertStatusCodeIs(HttpStatus.OK);
response.assertThat().header("Content-Disposition", String.format("attachment; filename=%s", pdfFile.getName()));
STEP("3. Upload the .html file and verify the reponse header adding the download=inline/attachement parameters (accepted only attachment) .");
cmisAPI.usingResource(sharedFolder).createFile(htmlFile);
response = restAPI.authenticateUser(user).withCMISApi().getRootObjectByLocation(htmlFile);
restAPI.assertStatusCodeIs(HttpStatus.OK);
response.assertThat().header("Content-Disposition", String.format("attachment; filename=%s", htmlFile.getName()));
response = restAPI.authenticateUser(user).withCMISApi().usingParams("download=attachment").getRootObjectByLocation(htmlFile);
restAPI.assertStatusCodeIs(HttpStatus.OK);
response.assertThat().header("Content-Disposition", String.format("attachment; filename=%s", htmlFile.getName()));
response = restAPI.authenticateUser(user).withCMISApi().usingParams("download=inline").getRootObjectByLocation(htmlFile);
restAPI.assertStatusCodeIs(HttpStatus.OK);
response.assertThat().header("Content-Disposition", String.format("attachment; filename=%s", htmlFile.getName()));
}
@Test(groups = { TestGroup.INTEGRATION, TestGroup.CMIS, TestGroup.FULL })
@TestRail(section = { TestGroup.INTEGRATION,
TestGroup.CMIS }, executionType = ExecutionType.SANITY, description = "Verify that alfresco returns the correct encoding for files created via CMIS.")
public void verifyFileEncodingUsingCMIS() throws Exception
{
STEP("1. Create a folder, two text file with specific encoding content and define the expected encoding.");
FileModel utf8File = FileModel.getRandomFileModel(FileType.TEXT_PLAIN, " ∮ E⋅da = Q");
FileModel iso8859File = FileModel.getRandomFileModel(FileType.TEXT_PLAIN,
"<html><head><title>aegif Mind Share Leader Generating New Paradigms by aegif corporation</title></head><body><p> Test html</p></body></html></body></html>");
String utf8Type = "text/plain;charset=UTF-8";
String iso8859Type = "text/plain;charset=ISO-8859-1";
STEP("2. Upload the files via CMIS.");
cmisAPI.authenticateUser(user).usingSite(site).createFile(utf8File);
cmisAPI.createFile(iso8859File);
String fileCreationWebScript = "alfresco/service/api/node/content/workspace/SpacesStore/";
RestAssured.basePath = "";
STEP("3. Retrieve the nodes via webscripts and verify that the content type is the expected one (GET alfresco/service/api/node/content/workspace/SpacesStore/).");
restAPI.configureRequestSpec().setBasePath(RestAssured.basePath);
RestRequest request = RestRequest.simpleRequest(HttpMethod.GET, fileCreationWebScript + utf8File.getNodeRefWithoutVersion());
RestResponse response = restAPI.authenticateUser(user).process(request);
Assert.assertEquals(response.getResponse().getStatusCode(), HttpStatus.OK.value());
Assert.assertEquals(response.getResponse().getContentType(), utf8Type);
request = RestRequest.simpleRequest(HttpMethod.GET, fileCreationWebScript + iso8859File.getNodeRefWithoutVersion());
response = restAPI.process(request);
Assert.assertEquals(response.getResponse().getStatusCode(), HttpStatus.OK.value());
Assert.assertEquals(response.getResponse().getContentType(), iso8859Type);
// Commented the use of v1 RestAPI GET (nodes/{nodeId}), because it works on alfresco 5.2.N or above.
// STEP("3. Retrieve the nodes and verify that the content type is the expected one (GET nodes/{nodeId}).");
// restAPI.authenticateUser(user).withCoreAPI().usingNode(utf8File).getNodeContent().assertThat().contentType(utf8Type);
// restAPI.authenticateUser(user).withCoreAPI().usingNode(iso8859File).getNodeContent().assertThat().contentType(iso8859Type);
}
}

View File

@@ -0,0 +1,82 @@
package org.alfresco.tas.integration;
import static org.alfresco.utility.report.log.Step.STEP;
import io.restassured.RestAssured;
import io.restassured.http.Cookie;
import io.restassured.response.Response;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.List;
import org.alfresco.rest.core.JsonBodyGenerator;
import org.alfresco.rest.core.RestRequest;
import org.alfresco.rest.model.RestPersonModel;
import org.alfresco.utility.Utility;
import org.alfresco.utility.model.TestGroup;
import org.alfresco.utility.model.UserModel;
import org.alfresco.utility.report.Bug;
import org.alfresco.utility.testrail.ExecutionType;
import org.alfresco.utility.testrail.annotation.TestRail;
import org.apache.commons.codec.binary.Base64;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.testng.Assert;
import org.testng.annotations.Test;
public class IntegrationWithWebScriptsTests extends IntegrationTest
{
@Test(groups = { TestGroup.INTEGRATION, TestGroup.REST_API, TestGroup.FULL })
@TestRail(section = { TestGroup.INTEGRATION,
TestGroup.REST_API }, executionType = ExecutionType.REGRESSION, description = "Verify when importing multiple users via CSV, if the password is not set in the CSV file, user will be disable")
public void verifyCSVUserImportDisableUserAndGivesRandomPasswordIfItIsMissing() throws Exception
{
STEP("1.Upload the CSV File that contains the users.");
restAPI.authenticateUser(dataUser.getAdminUser()).configureRequestSpec().addMultiPart("filedata",
Utility.getResourceTestDataFile("userCSV.csv"));
String fileCreationWebScript = "alfresco/s/api/people/upload";
RestAssured.basePath = "";
restAPI.configureRequestSpec().setBasePath(RestAssured.basePath);
RestRequest request = RestRequest.simpleRequest(HttpMethod.POST, fileCreationWebScript);
restAPI.authenticateUser(dataUser.getAdminUser()).process(request);
restAPI.assertStatusCodeIs(HttpStatus.OK);
STEP("2.Verify that user1np is disabled and user2 is enabled");
UserModel disabledUserPerson = new UserModel("MNT-171990-user-with-no-password", "user1");
UserModel enabledUserPerson = new UserModel("MNT-171990-user-with-password", "user2");
RestPersonModel personModel = restAPI.authenticateUser(dataUser.getAdminUser()).withCoreAPI()
.usingUser(new UserModel(disabledUserPerson.getUsername(), disabledUserPerson.getPassword())).getPerson();
restAPI.assertStatusCodeIs(HttpStatus.OK);
personModel.assertThat().field("enabled").is("false");
personModel = restAPI.authenticateUser(dataUser.getAdminUser()).withCoreAPI()
.usingUser(new UserModel(enabledUserPerson.getUsername(), enabledUserPerson.getPassword())).getPerson();
restAPI.assertStatusCodeIs(HttpStatus.OK);
personModel.assertThat().field("enabled").is("true");
STEP("3.Activate the disabled user.");
HashMap<String, String> input = new HashMap<String, String>();
input.put("enabled", "true");
String putBody = JsonBodyGenerator.keyValueJson(input);
restAPI.authenticateUser(dataUser.getAdminUser()).withCoreAPI().usingUser(disabledUserPerson).updatePerson(putBody);
restAPI.assertStatusCodeIs(HttpStatus.OK);
STEP("4.Verify that the disabled user has a randomly generated password not the same as firstname(DOCS-2755)");
restAPI.authenticateUser(disabledUserPerson).withCoreAPI()
.usingUser(new UserModel(enabledUserPerson.getUsername(), enabledUserPerson.getPassword())).getPerson();
restAPI.assertStatusCodeIs(HttpStatus.UNAUTHORIZED);
STEP("5.Change the user password and try an Rest API call.");
input = new HashMap<String, String>();
input.put("password", "newPassword1");
putBody = JsonBodyGenerator.keyValueJson(input);
restAPI.authenticateUser(dataUser.getAdminUser()).withCoreAPI().usingUser(disabledUserPerson).updatePerson(putBody);
restAPI.assertStatusCodeIs(HttpStatus.OK);
disabledUserPerson = new UserModel(disabledUserPerson.getUsername(), "newPassword1");
restAPI.authenticateUser(disabledUserPerson).withCoreAPI()
.usingUser(new UserModel(enabledUserPerson.getUsername(), enabledUserPerson.getPassword())).getPerson();
restAPI.assertStatusCodeIs(HttpStatus.OK);
dataUser.usingAdmin().deleteUser(disabledUserPerson);
dataUser.usingAdmin().deleteUser(enabledUserPerson);
}
}

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<context:annotation-config />
<context:component-scan base-package="org.alfresco" />
<import resource="classpath:dataprep-context.xml" />
<import resource="classpath*:alfresco-cifs-context.xml" />
<import resource="classpath*:alfresco-ftp-context.xml" />
<import resource="classpath*:alfresco-restapi-context.xml" />
<import resource="classpath*:alfresco-cmis-context.xml" />
<import resource="classpath*:alfresco-smtp-context.xml" />
<import resource="classpath*:alfresco-imap-context.xml" />
<import resource="classpath*:alfresco-webdav-context.xml" />
<import resource="classpath*:alfresco-share-po-context.xml" />
</beans>

View File

@@ -0,0 +1,148 @@
# dataprep related
alfresco.scheme=http
alfresco.server=localhost
alfresco.port=8082
# credentials
admin.user=admin
admin.password=admin
admin.name=Administrator
# in containers we cannot access directly JMX, so we will use http://jolokia.org agent
# disabling this we will use direct JMX calls to server
jmx.useJolokiaAgent=false
# Server Health section
# in ServerHealth#isServerReachable() - could also be shown.
# enable this option to view if on server there are tenants or not
serverHealth.showTenants=false
# IMAP Service settings from admin console
imap.server=${alfresco.server}
imap.port=143
imaps.port=993
# Inbound Email settings from admin console
smtp.server=${alfresco.server}
smtp.port=25
smtp.authentication.enabled=true
smtp.tsl.enabled=false
# Outbound Email settings from admin console
mail.encoding=UTF-8
mail.from.default=admin@alfness.com
mail.from.enabled=true
mail.host=172.29.100.164
mail.password=admin
mail.port=25
mail.protocol=smtp
mail.smtp.auth=true
mail.smtp.debug=false
mail.smtp.starttls.enable=true
mail.smtp.timeout=30000
mail.smtps.auth=true
mail.smtps.starttls.enable=true
mail.username=admin@alfness.com
# FTP related
ftp.port=21
ftp.timeout=20000
# use passive or active depending where the tests are run
# (docker env or not)
ftp.passiveMode=true
# CMIS related
# set cmis binding to 'browser' or 'atom'
cmis.binding=browser
cmis.basePath=/alfresco/api/-default-/public/cmis/versions/1.1/${cmis.binding}
# WEBDAV related
webdav.port=${alfresco.port}
# AOS related
aos.path=/alfresco/aos
aos.windowsNetwork=\\\${alfresco.server}:${alfresco.port}${aos.path}
aos.linuxNetwork=${alfresco.scheme}://${alfresco.server}:${alfresco.port}${aos.path}
# TEST MANAGEMENT SECTION - Test Rail
#
# (currently supporting Test Rail v5.2.1.3472 integration)
#
# Example of configuration:
# ------------------------------------------------------
# if testManagement.enabled=true we enabled TestRailExecutorListener (if used in your suite xml file)
# testManagement.updateTestExecutionResultsOnly=true (this will just update the results of a test: no step will be updated - good for performance)
# testManagement.endPoint=https://alfresco.testrail.com/
# testManagement.username=<username>
# testManagement.apiKey=<api-key>
# testManagement.project=<id-of-your-project
# testManagement.testRun=<test-run-name>
# testManagement.includeOnlyTestCasesExecuted=true #if you want to include in your run ONLY the test cases that you run, then set this value to false
# testManagement.rateLimitInSeconds=1 #is the default rate limit after what minimum time, should we upload the next request. http://docs.gurock.com/testrail-api2/introduction #Rate Limit
# testManagement.suiteId=23 (the id of the Master suite)
# ------------------------------------------------------
testManagement.enabled=false
testManagement.endPoint=
testManagement.username=
testManagement.apiKey=
testManagement.project=7
testManagement.includeOnlyTestCasesExecuted=true
testManagement.rateLimitInSeconds=1
testManagement.testRun=MyTestRunInTestRail
testManagement.suiteId=12
# The location of the reports path
reports.path=./target/reports
#
# Database Section
# You should provide here the database URL, that can be a differed server as alfresco.
# https://docs.oracle.com/javase/tutorial/jdbc/basics/connecting.html
#
# Current supported db.url:
#
# MySQL:
# db.url = jdbc:mysql://${alfresco.server}:3306/alfresco
#
# PostgreSQL:
# db.url = jdbc:postgresql://<your-DB-IP>:3306/alfresco
#
# Oracle:
# db.url = jdbc:oracle://<your-DB-IP>:3306/alfresco
#
# MariaDB:
# db.url = jdbc:mariadb://<your-DB-IP>:3306/alfresco
#
db.url = jdbc:mysql://${alfresco.server}:3306/alfresco
db.username = alfresco
db.password = alfresco
# ------------------------------------------------------
#WEB specific
# ------------------------------------------------------
# set browser type: Firefox, Chrome
browser.name=Firefox
browser.version=41.0
# browser.chrome.driver=/Users/p3700454/projects/drivers/chromedriver
env.platform=WINDOWS
# default implicit wait for web elements to be rendered
browser.implicitWait=3
browser.explicitWait=30
share.port=${alfresco.port}
share.url=${alfresco.scheme}://${alfresco.server}:${share.port}/share
share2.url=${server2.url}:${server2.port}/share
server2.port=9090
server2.url=http://172.29.100.215
# location of all screenshots taken on failed test
screenshots.dir=screenshots
# grid based settings
grid.enabled=false
grid.url=http://127.0.0.1:4444/wd/hub
# handle internationalization
locale.language=en
locale.country=US

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Integration" preserve-order="true">
<listeners>
<listener class-name="org.alfresco.utility.report.HtmlReportListener"/>
<listener class-name="org.alfresco.utility.testrail.TestRailExecutorListener"/>
<listener class-name="org.alfresco.utility.testng.OSTestMethodSelector"/>
</listeners>
<test name="Integration Tests">
<packages>
<package name="org.alfresco.tas.integration.*"/>
</packages>
</test>
</suite>

View File

@@ -0,0 +1,26 @@
# Root logger option
log4j.rootLogger=INFO, file, stdout
# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./target/reports/alfresco-tas.log
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%t] %d{HH:mm:ss} %-5p %c{1}:%L - %m%n
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%t] %d{HH:mm:ss} %-5p %c{1}:%L - %m%n
# TestRail particular log file
# Direct log messages to a log file
log4j.appender.testrailLog=org.apache.log4j.RollingFileAppender
log4j.appender.testrailLog.File=./target/reports/alfresco-testrail.log
log4j.appender.testrailLog.MaxBackupIndex=10
log4j.appender.testrailLog.layout=org.apache.log4j.PatternLayout
log4j.appender.testrailLog.layout.ConversionPattern=%d{HH:mm:ss} %-5p %c{1}:%L - %m%n
log4j.category.testrail=INFO, testrailLog
log4j.additivity.testrail=false

View File

@@ -0,0 +1,30 @@
<xs:schema attributeFormDefault="unqualified"
elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="ExtensionPointTestSuite">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="name" />
<xs:element type="xs:string" name="description" />
<xs:element name="TestCases">
<xs:complexType>
<xs:sequence>
<xs:element name="testcase" maxOccurs="unbounded"
minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="description" />
<xs:element type="xs:int" name="duration" />
<xs:element type="xs:string" name="actualValue" />
<xs:element type="xs:string" name="expectedValue" />
<xs:element type="xs:string" name="stackTrace" />
</xs:sequence>
<xs:attribute type="xs:string" name="name" use="optional" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

View File

@@ -0,0 +1 @@
text file to upload

View File

@@ -0,0 +1,196 @@
{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch31505\stshfloch31506\stshfhich31506\stshfbi0\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
{\f39\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0302020204030204}Calibri Light;}
{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}
{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f40\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f41\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
{\f43\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f44\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f45\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f46\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
{\f47\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f48\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f40\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f41\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
{\f43\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f44\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f45\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f46\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
{\f47\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f48\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f430\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f431\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}
{\f433\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f434\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\f437\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f438\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}
{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}
{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}
{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}
{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}
{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhimajor\f31528\fbidi \fswiss\fcharset238\fprq2 Calibri Light CE;}{\fhimajor\f31529\fbidi \fswiss\fcharset204\fprq2 Calibri Light Cyr;}
{\fhimajor\f31531\fbidi \fswiss\fcharset161\fprq2 Calibri Light Greek;}{\fhimajor\f31532\fbidi \fswiss\fcharset162\fprq2 Calibri Light Tur;}{\fhimajor\f31535\fbidi \fswiss\fcharset186\fprq2 Calibri Light Baltic;}
{\fhimajor\f31536\fbidi \fswiss\fcharset163\fprq2 Calibri Light (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}
{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}
{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}
{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}
{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}
{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}
{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}
{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}
{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}
{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}
{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;
\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\*\defchp \fs22\loch\af31506\hich\af31506\dbch\af31505 }{\*\defpap \ql \li0\ri0\sa160\sl259\slmult1
\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0
\fs22\lang1033\langfe1033\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\*
\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa160\sl259\slmult1
\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 \snext11 \ssemihidden \sunhideused
Normal Table;}}{\*\rsidtbl \rsid5330132\rsid6713591\rsid12614322\rsid14699881}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\operator Alecsandru Pruna}
{\creatim\yr2017\mo2\dy9\hr9\min19}{\revtim\yr2017\mo2\dy9\hr9\min20}{\version4}{\edmins0}{\nofpages1}{\nofwords0}{\nofchars5}{\nofcharsws5}{\vern19}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}
\paperw12240\paperh15840\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect
\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\horzdoc\dghspace120\dgvspace120\dghorigin1701
\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale100\rsidroot14699881 \fet0{\*\wgrffmtfilter 2450}\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2
\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6
\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang
{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0
\fs22\lang1033\langfe1033\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5330132 \hich\af31506\dbch\af31505\loch\f31506 t}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14699881
\hich\af31506\dbch\af31505\loch\f31506 est}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12614322
\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid6713591
\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a
9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad
5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6
b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0
0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6
a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f
c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512
0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462
a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865
6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b
4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b
4757e8d3f729e245eb2b260a0238fd010000ffff0300504b030414000600080000002100ec7f4c3895070000c9200000160000007468656d652f7468656d652f
7468656d65312e786d6cec59cd8b1bc915bf07f23f347d97f5d5ad8fc1f2a24fcfda33b6b164873dd648a5eef2547789aad28cc56208de532e81c026e49085bd
ed21842cecc22eb9e48f31d8249b3f22afaa5bdd5552c99e191c3061463074977eefd5afde7bf5de53d5ddcf5e26d4bbc05c1096f6fcfa9d9aefe174ce16248d
7afeb3d9a4d2f13d2151ba4094a5b8e76fb0f03fbbf7eb5fdd454732c609f6403e1547a8e7c752ae8eaa5531876124eeb0154ee1bb25e30992f0caa3ea82a34b
d09bd06aa3566b55134452df4b51026a1f2f97648ebd9952e9dfdb2a1f53784da5500373caa74a35b6243476715e5708b11143cabd0b447b3eccb3609733fc52
fa1e4542c2173dbfa6fffceabdbb5574940b517940d6909be8bf5c2e17589c37f49c3c3a2b260d823068f50bfd1a40e53e6edc1eb7c6ad429f06a0f91c569a71
31758683ee6014e65803943d3a748fdaa366ddc21bfa9b7b9cfba1fa58780dcaf4077bf8c9640856b4f01a94e1c33d7c10b41bc3c0c26b50866fede1dbb5fe28
685b780d8a2949cff7d0b5b0d51c6e575b40968c1e3be1dd3098b41bb9f21205d15044979a62c9527928d612f482f1090014902249524f6e567889e610c54344
c91927de09896208bc154a9980e15aa336a935e1bffa04fa495b041d6164482b5ec044ec0d293e9e9873b2923dff0168f50dc8db9f7f7ef3fac737af7f7af3d5
576f5eff3d9f5babb2e48e511a9972bf7cf787ff7cf35befdf3f7cfbcbd77fcca6dec50b13ffee6fbf7bf78f7fbe4f3dacb834c5db3f7dffeec7efdffef9f7ff
faebd70eed7d8ece4cf88c2458788ff0a5f79425b040077f7cc6af27318b113125fa6924508ad42c0efd63195be8471b44910337c0b61d9f7348352ee0fdf50b
8bf034e66b491c1a1fc689053c658c0e18775ae1a19acb30f36c9d46eec9f9dac43d45e8c235f710a59697c7eb15e458e252398cb145f30945a944114eb1f4d4
77ec1c63c7eabe20c4b2eb29997326d8527a5f106f8088d324337266455329744c12f0cbc64510fc6dd9e6f4b93760d4b5ea11beb091b0371075909f616a99f1
3e5a4b94b854ce50424d839f2019bb484e377c6ee2c64282a7234c99375e60215c328f39acd770fa4348336eb79fd24d6223b924e72e9d278831133962e7c318
252b17764ad2d8c47e2ece214491f7844917fc94d93b44bd831f507ad0ddcf09b6dcfde16cf00c32ac49a90c10f5cd9a3b7c791f332b7ea71bba44d8956afa3c
b1526c9f1367740cd69115da271853748916187bcf3e773018b09565f392f48318b2ca317605d60364c7aa7a4fb1805e493537fb79f284082b64a7386207f89c
6e7612cf06a509e287343f02af9b361f43a94b5c01f098cecf4de023023d20c48bd3288f05e83082fba0d62731b20a987a17ee78dd70cb7f57d963b02f5f5834
aeb02f41065f5b0612bb29f35edbcc10b52628036686a0cb70a55b10b1dc5f8aa8e2aac5d64eb9a5bd694b37407764353d09493fd801edf43ee1ffaef7810ee3
ed5fbe71ec838fd3efb8155bc9ea9a9dcea16472bcd3df1cc2ed763543c617e4d36f6a46689d3ec15047f633d66d4f73dbd3f8fff73dcda1fd7cdbc91cea376e
3b191f3a8cdb4e263f5cf9389d4cd9bc405fa30e3cb2831e7dec931c3cf559124aa77243f189d0073f027ecf2c2630a8e4f489272e4e0157313caa32071358b8
88232de371267f43643c8dd10a4e87eabe5212895c7524bc15137068a4879dba159eae9353b6c80e3beb7575b09955568164395e0b8b7138a89219bad52e0ff0
0af59a6da40f5ab70494ec75481893d9249a0e12ededa032923ed605a33948e8957d14165d078b8e52bf75d51e0ba05678057e707bf033bde787018880109cc7
4173be507eca5cbdf5ae76e6c7f4f421635a11000df636024a4f7715d783cb53abcb42ed0a9eb64818e16693d096d10d9e88e167701e9d6af42a34aeebeb6ee9
528b9e32859e0f42aba4d1eebc8fc54d7d0d72bbb981a666a6a0a977d9f35bcd1042668e563d7f0987c6f098ac207684facd856804372f73c9b30d7f93ccb2e2
428e90883383eba49365838448cc3d4a929eaf965fb881a63a87686ef50624844f965c17d2caa7460e9c6e3b192f97782e4db71b23cad2d92b64f82c5738bfd5
e237072b49b606774fe3c5a57746d7fc2982100bdb7565c00511707750cfacb92070195624b232fe760a539e76cddb281d43d938a2ab18e515c54ce6195ca7f2
828e7e2b6c60bce56b06831a26c90be159a40aac6954ab9a165523e370b0ea7e584859ce489a65cdb4b28aaa9aee2c66cdb02d033bb6bc599137586d4d0c39cd
acf059eade4db9dd6daedbe9138a2a01062fece7a8ba57280806b572328b9a62bc9f8655cece47eddab15de007a85da5481859bfb555bb63b7a24638a783c11b
557e90db8d5a185a6efb4a6d697d6b6e5e6cb3b317903c46d0e5aea914da9570b2cb11344453dd93646903b6c84b996f0d78f2d69cf4fc2f6b613f1836c261a5
d609c795a019d42a9db0dfacf4c3b0591f87f5da68d078058545c6493dcc6eec2770814137f9bdbd1edfbbbb4fb6773477e62ca9327d375fd5c4f5dd7dbd71f8
eede239074be6c3526dd6677d0aa749bfd4925180d3a95eeb035a88c5ac3f668321a869deee495ef5d6870d06f0e83d6b85369d587c34ad0aa29fa9d6ea51d34
1afda0ddef8c83feabbc8d819567e923b7059857f3baf75f000000ffff0300504b0304140006000800000021000dd1909fb60000001b01000027000000746865
6d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e435
0d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d262452
282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe514173
d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c02000013000000000000000000
00000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b0000000000000000
0000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c000000000000000000000000001902
00007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d0014000600080000002100ec7f4c3895070000c9200000160000000000
0000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b0100002700
0000000000000000000000009f0a00007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d0100009a0b00000000}
{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d
617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169
6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363
656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e}
{\*\latentstyles\lsdstimax374\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1;
\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4;
\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7;
\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 1;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 5;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 6;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 7;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 8;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 9;
\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 1;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 2;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 3;
\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 4;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 5;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 6;
\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 7;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 8;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 9;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal Indent;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footnote text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 header;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footer;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index heading;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 table of figures;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 envelope address;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 envelope return;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footnote reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation reference;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 line number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 page number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 endnote reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 endnote text;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 table of authorities;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 macro;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 toa heading;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 3;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 3;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 3;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 5;\lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Closing;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Signature;\lsdsemihidden1 \lsdunhideused1 \lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 4;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Message Header;\lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Salutation;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Date;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Note Heading;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent 3;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Block Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Hyperlink;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 FollowedHyperlink;\lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;
\lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Document Map;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Plain Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 E-mail Signature;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Top of Form;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Bottom of Form;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal (Web);\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Acronym;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Address;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Cite;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Code;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Definition;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Keyboard;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Preformatted;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Sample;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Typewriter;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Variable;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation subject;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 No List;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 1;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Balloon Text;\lsdpriority39 \lsdlocked0 Table Grid;
\lsdsemihidden1 \lsdlocked0 Placeholder Text;\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid;
\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2;
\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List;\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1;
\lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;
\lsdsemihidden1 \lsdlocked0 Revision;\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;
\lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2;
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;
\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3;
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;
\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4;
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;
\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdpriority62 \lsdlocked0 Light Grid Accent 5;
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5;
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;
\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6;
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;
\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis;
\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography;
\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;\lsdpriority41 \lsdlocked0 Plain Table 1;\lsdpriority42 \lsdlocked0 Plain Table 2;\lsdpriority43 \lsdlocked0 Plain Table 3;\lsdpriority44 \lsdlocked0 Plain Table 4;
\lsdpriority45 \lsdlocked0 Plain Table 5;\lsdpriority40 \lsdlocked0 Grid Table Light;\lsdpriority46 \lsdlocked0 Grid Table 1 Light;\lsdpriority47 \lsdlocked0 Grid Table 2;\lsdpriority48 \lsdlocked0 Grid Table 3;\lsdpriority49 \lsdlocked0 Grid Table 4;
\lsdpriority50 \lsdlocked0 Grid Table 5 Dark;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 1;
\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 1;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 1;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 1;
\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 1;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 2;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 2;
\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 2;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 2;
\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 3;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 3;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 3;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 3;
\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 3;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 4;
\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 4;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 4;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 4;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 4;
\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 4;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 5;
\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 5;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 5;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 5;
\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 5;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 6;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 6;
\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 6;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 6;
\lsdpriority46 \lsdlocked0 List Table 1 Light;\lsdpriority47 \lsdlocked0 List Table 2;\lsdpriority48 \lsdlocked0 List Table 3;\lsdpriority49 \lsdlocked0 List Table 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark;
\lsdpriority51 \lsdlocked0 List Table 6 Colorful;\lsdpriority52 \lsdlocked0 List Table 7 Colorful;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 List Table 2 Accent 1;\lsdpriority48 \lsdlocked0 List Table 3 Accent 1;
\lsdpriority49 \lsdlocked0 List Table 4 Accent 1;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 1;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 1;
\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 List Table 2 Accent 2;\lsdpriority48 \lsdlocked0 List Table 3 Accent 2;\lsdpriority49 \lsdlocked0 List Table 4 Accent 2;
\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 2;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 3;
\lsdpriority47 \lsdlocked0 List Table 2 Accent 3;\lsdpriority48 \lsdlocked0 List Table 3 Accent 3;\lsdpriority49 \lsdlocked0 List Table 4 Accent 3;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 3;
\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 4;\lsdpriority47 \lsdlocked0 List Table 2 Accent 4;
\lsdpriority48 \lsdlocked0 List Table 3 Accent 4;\lsdpriority49 \lsdlocked0 List Table 4 Accent 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 4;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 4;
\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 List Table 2 Accent 5;\lsdpriority48 \lsdlocked0 List Table 3 Accent 5;
\lsdpriority49 \lsdlocked0 List Table 4 Accent 5;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 5;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 5;
\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 List Table 2 Accent 6;\lsdpriority48 \lsdlocked0 List Table 3 Accent 6;\lsdpriority49 \lsdlocked0 List Table 4 Accent 6;
\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 6;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Mention;
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Smart Hyperlink;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Hashtag;}}{\*\datastore 0105000002000000180000004d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000
d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e50000000000000000000000005063
a2efa482d201feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000105000000000000}}

View File

@@ -0,0 +1 @@
test upload file.

View File

@@ -0,0 +1,2 @@
MNT-171990-user-with-no-password,user1,user1,user1171990@alfresco.com,,
MNT-171990-user-with-password,user2,user2,user2171990@alfresco.com,,user2
1 MNT-171990-user-with-no-password user1 user1 user1171990@alfresco.com
2 MNT-171990-user-with-password user2 user2 user2171990@alfresco.com user2