From 14b303bbca9b01bfe1f1c91bc9cbda9cc5937746 Mon Sep 17 00:00:00 2001 From: Alexandru Epure Date: Tue, 9 Aug 2016 14:14:27 +0000 Subject: [PATCH] Merged 5.2.N (5.2.1) to HEAD (5.2) 129179 mmuller: Merged RETURN-OF-THE-API (5.2.0) to 5.2.N (5.2.1) 128640 jvonka: V1 REST API: cleanup and rationalise new api tests (re: remotable helpers & runAs user / admin) - round 5 REPO-113 (also relates to REPO-28, REPO-114, REPO-825) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@129353 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../rest/AbstractSingleNetworkSiteTest.java | 85 ++-- .../org/alfresco/rest/DeletedNodesTest.java | 4 +- .../rest/api/tests/AbstractBaseApiTest.java | 148 +++++-- .../rest/api/tests/ActivitiesPostingTest.java | 8 +- .../rest/api/tests/AuthenticationsTest.java | 4 +- .../alfresco/rest/api/tests/NodeApiTest.java | 397 ++++++++++-------- .../api/tests/NodeAssociationsApiTest.java | 8 +- .../rest/api/tests/PublicApiTestContext.java | 54 +-- .../rest/api/tests/RenditionsTest.java | 2 +- .../alfresco/rest/api/tests/RepoService.java | 24 +- .../rest/api/tests/SharedLinkApiTest.java | 15 +- 11 files changed, 439 insertions(+), 310 deletions(-) diff --git a/source/test-java/org/alfresco/rest/AbstractSingleNetworkSiteTest.java b/source/test-java/org/alfresco/rest/AbstractSingleNetworkSiteTest.java index d9b1950333..6d4d5f00c3 100644 --- a/source/test-java/org/alfresco/rest/AbstractSingleNetworkSiteTest.java +++ b/source/test-java/org/alfresco/rest/AbstractSingleNetworkSiteTest.java @@ -27,27 +27,35 @@ package org.alfresco.rest; import org.alfresco.rest.api.tests.AbstractBaseApiTest; -import org.alfresco.rest.api.tests.util.JacksonUtil; -import org.alfresco.rest.framework.jacksonextensions.JacksonHelper; -import org.alfresco.service.cmr.security.MutableAuthenticationService; -import org.alfresco.service.cmr.security.PersonService; -import org.alfresco.service.cmr.site.SiteVisibility; import org.junit.After; import org.junit.Before; /** + * Overrides AbstractBaseApiTest so that only a single network & site is created per test + * (instead of pre-creating multiple networks & sites) + * + * Can also be optionally tweaked locally to: + * + * - use the default network (ie. super tenant) => instead of creating a new tenant + * + * - re-use a single setup across test methods => although this does mean that each individual test method must either rely on uniquely created test data and/or cleanup + * + * Note: For now, these can be explicitly tweaked by a dev (do not commit) + * but in the future we could consider making these runtime options. + * * @author Gethin James * @author janv */ public class AbstractSingleNetworkSiteTest extends AbstractBaseApiTest { - protected String tSiteId; - protected String tDocLibNodeId; - - protected JacksonUtil jacksonUtil; - - // TODO make this a runtime option to allow creation of non-default network - protected final static boolean useDefaultNetwork = true; + // note: experimental - for local/dev-use only (YMMV) ;-) + // - setting both to true should make the related tests run faster + // - if singleSetupNoTearDown=true then each individual test method should create unique data (or cleanup) to avoid interdependent test/run failures + // - if useDefaultNetwork=true then no tenant will be created (ie. will use default/super tenant) + protected static boolean singleSetupNoTearDown = false; + protected static boolean useDefaultNetwork = false; + + private static boolean isSetup = false; @Override public String getScope() @@ -59,49 +67,30 @@ public class AbstractSingleNetworkSiteTest extends AbstractBaseApiTest @Before public void setup() throws Exception { - jacksonUtil = new JacksonUtil(applicationContext.getBean("jsonHelper", JacksonHelper.class)); - - // createTestData=false - getTestFixture(false); - - if (! useDefaultNetwork) + if ((! isSetup) || (! singleSetupNoTearDown)) { - networkOne = getRepoService().createNetwork(this.getClass().getName().toLowerCase(), true); - networkOne.create(); + if (! useDefaultNetwork) + { + networkOne = getRepoService().createNetwork(this.getClass().getName().toLowerCase(), true); + networkOne.create(); + } + else + { + networkOne = getRepoService().getSystemNetwork(); + } + + super.setup(); + isSetup = true; } - else - { - networkOne = getRepoService().getSystemNetwork(); - } - - user1 = createUser("user1-" + RUNID, "user1Password", networkOne); - user2 = createUser("user2-" + RUNID, "user2Password", networkOne); - - // to enable admin access via test calls - eg. via PublicApiClient -> AbstractTestApi -> findUserByUserName - getOrCreateUser("admin", "admin"); - - // used-by teardown to cleanup - authenticationService = applicationContext.getBean("authenticationService", MutableAuthenticationService.class); - personService = applicationContext.getBean("personService", PersonService.class); - - users.add(user1); - users.add(user2); - - setRequestContext(networkOne.getId(), user1, null); - - tSiteId = createSite("Test Site - " + System.currentTimeMillis(), SiteVisibility.PRIVATE).getId(); - tDocLibNodeId = getSiteContainerNodeId(tSiteId, "documentLibrary"); - - setRequestContext(null); } @Override @After public void tearDown() throws Exception { - setRequestContext(networkOne.getId(), user1, null); - deleteSite(tSiteId, 204); // TODO permanent=true - - super.tearDown(); + if (! singleSetupNoTearDown) + { + super.tearDown(); + } } } diff --git a/source/test-java/org/alfresco/rest/DeletedNodesTest.java b/source/test-java/org/alfresco/rest/DeletedNodesTest.java index 4a50d1f88c..94d5c1472d 100644 --- a/source/test-java/org/alfresco/rest/DeletedNodesTest.java +++ b/source/test-java/org/alfresco/rest/DeletedNodesTest.java @@ -83,7 +83,7 @@ public class DeletedNodesTest extends AbstractSingleNetworkSiteTest setRequestContext(user1); Date now = new Date(); - String folder1 = "folder" + now.getTime() + "_1"; + String folder1 = "folder-testCreateAndDelete-" + now.getTime() + "_1"; Folder createdFolder = createFolder(tDocLibNodeId, folder1, null); assertNotNull(createdFolder); @@ -153,7 +153,7 @@ public class DeletedNodesTest extends AbstractSingleNetworkSiteTest getSingle(URL_DELETED_NODES, "iddontexist", 404); //Now as admin - setRequestContext("admin"); + setRequestContext(networkAdmin); response = publicApiClient.get(getScope(), URL_DELETED_NODES, null, null, null, createParams(paging, null)); checkStatus(200, response.getStatusCode()); nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); diff --git a/source/test-java/org/alfresco/rest/api/tests/AbstractBaseApiTest.java b/source/test-java/org/alfresco/rest/api/tests/AbstractBaseApiTest.java index f4c3b53701..d7f3323a45 100644 --- a/source/test-java/org/alfresco/rest/api/tests/AbstractBaseApiTest.java +++ b/source/test-java/org/alfresco/rest/api/tests/AbstractBaseApiTest.java @@ -34,12 +34,12 @@ import static org.junit.Assert.fail; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.tenant.TenantService; +import org.alfresco.repo.tenant.TenantUtil; import org.alfresco.repo.transaction.RetryingTransactionHelper; import org.alfresco.rest.api.Nodes; import org.alfresco.rest.api.model.Site; import org.alfresco.rest.api.nodes.NodesEntityResource; import org.alfresco.rest.api.tests.RepoService.TestNetwork; -import org.alfresco.rest.api.tests.RepoService.TestPerson; import org.alfresco.rest.api.tests.client.HttpResponse; import org.alfresco.rest.api.tests.client.PublicApiClient; import org.alfresco.rest.api.tests.client.PublicApiHttpClient.BinaryPayload; @@ -52,8 +52,10 @@ import org.alfresco.rest.api.tests.client.data.Node; import org.alfresco.rest.api.tests.client.data.Rendition; import org.alfresco.rest.api.tests.client.data.SiteMember; import org.alfresco.rest.api.tests.client.data.SiteRole; +import org.alfresco.rest.api.tests.util.JacksonUtil; import org.alfresco.rest.api.tests.util.MultiPartBuilder; import org.alfresco.rest.api.tests.util.RestApiUtil; +import org.alfresco.rest.framework.jacksonextensions.JacksonHelper; import org.alfresco.service.cmr.security.MutableAuthenticationService; import org.alfresco.service.cmr.security.PersonService; import org.alfresco.service.cmr.site.SiteVisibility; @@ -106,26 +108,24 @@ public abstract class AbstractBaseApiTest extends EnterpriseTestApi protected static final String DEFAULT_ADMIN = "admin"; private static final String DEFAULT_ADMIN_PWD = "admin"; - protected TestNetwork networkOne; - - /** - * User one from network one - */ - protected TestPerson userOneN1; - - /** - * User two from network one - */ - protected TestPerson userTwoN1; - protected String userOneN1SiteId; - - protected String user1; - protected String user2; + // network1 with user1, user2 and a testsite1 + protected static TestNetwork networkOne; - protected List users = new ArrayList<>(); + protected static String user1; // user1 from network1 + protected static String user2; // user2 from network1 - protected MutableAuthenticationService authenticationService; - protected PersonService personService; + // network admin (or default super admin, if not running within a tenant/network) + protected static String networkAdmin = DEFAULT_ADMIN; + + protected static String tSiteId; + protected static String tDocLibNodeId; + + + protected static List users = new ArrayList<>(); + + protected static JacksonUtil jacksonUtil; + protected static MutableAuthenticationService authenticationService; + protected static PersonService personService; protected final String RUNID = System.currentTimeMillis()+""; @@ -133,12 +133,32 @@ public abstract class AbstractBaseApiTest extends EnterpriseTestApi @Before public void setup() throws Exception { - // note: createUser currently relies on repoService - user1 = createUser("user1-" + RUNID, "user1Password", null); - user2 = createUser("user2-" + RUNID, "user2Password", null); + jacksonUtil = new JacksonUtil(applicationContext.getBean("jsonHelper", JacksonHelper.class)); + + if (networkOne == null) + { + // note: populateTestData/createTestData will be called (which currently creates 2 tenants, 9 users per tenant, 10 sites per tenant, ...) + networkOne = getTestFixture().getRandomNetwork(); + } + + //userOneN1 = networkOne.createUser(); + //userTwoN1 = networkOne.createUser(); + + String tenantDomain = networkOne.getId(); + + if (! TenantService.DEFAULT_DOMAIN.equals(tenantDomain)) + { + networkAdmin = DEFAULT_ADMIN+"@"+tenantDomain; + } // to enable admin access via test calls - eg. via PublicApiClient -> AbstractTestApi -> findUserByUserName - getOrCreateUser("admin", "admin"); + getOrCreateUser(networkAdmin, "admin", networkOne); + + setRequestContext(networkAdmin); + + // note: createUser currently relies on repoService + user1 = createUser("user1-" + RUNID, "user1Password", networkOne); + user2 = createUser("user2-" + RUNID, "user2Password", networkOne); // used-by teardown to cleanup authenticationService = applicationContext.getBean("authenticationService", MutableAuthenticationService.class); @@ -146,14 +166,10 @@ public abstract class AbstractBaseApiTest extends EnterpriseTestApi users.add(user1); users.add(user2); - // TODO this causes createTestData to be called - networkOne = getTestFixture().getRandomNetwork(); - userOneN1 = networkOne.createUser(); - userTwoN1 = networkOne.createUser(); - - setRequestContext(networkOne.getId(), userOneN1.getId(), null); + setRequestContext(networkOne.getId(), user1, null); - userOneN1SiteId = createSite("TestSite A - " + System.currentTimeMillis(), SiteVisibility.PRIVATE).getId(); + tSiteId = createSite("TestSite A - " + RUNID, SiteVisibility.PRIVATE).getId(); + tDocLibNodeId = getSiteContainerNodeId(tSiteId, "documentLibrary"); setRequestContext(null); } @@ -161,10 +177,10 @@ public abstract class AbstractBaseApiTest extends EnterpriseTestApi @After public void tearDown() throws Exception { - if ((networkOne != null) && (userOneN1 != null) && (userOneN1SiteId != null)) + if ((networkOne != null) && (user1 != null) && (tSiteId != null)) { - setRequestContext(networkOne.getId(), userOneN1.getId(), null); - deleteSite(userOneN1SiteId, 204); + setRequestContext(networkOne.getId(), user1, null); + deleteSite(tSiteId, true, 204); } AuthenticationUtil.setAdminUserAsFullyAuthenticatedUser(); @@ -440,21 +456,54 @@ public abstract class AbstractBaseApiTest extends EnterpriseTestApi /** * TODO implement as remote api call */ - protected String createUser(String username, String password, TestNetwork network) + protected String createUser(final String usernameIn, final String password, final TestNetwork network) { - PersonInfo personInfo = new PersonInfo(username, username, username, password, null, null, null, null, null, null, null); - RepoService.TestPerson person = repoService.createUser(personInfo, username, network); - return person.getId(); + final String tenantDomain = (network != null ? network.getId() : TenantService.DEFAULT_DOMAIN); + + return AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork() + { + @Override + public String doWork() throws Exception + { + return TenantUtil.runAsTenant(new TenantUtil.TenantRunAsWork() + { + public String doWork() throws Exception + { + String username = repoService.getPublicApiContext().createUserName(usernameIn, tenantDomain); + PersonInfo personInfo = new PersonInfo(username, username, username, password, null, null, null, null, null, null, null); + RepoService.TestPerson person = repoService.createUser(personInfo, username, network); + return person.getId(); + + } + }, tenantDomain); + } + }, networkAdmin); } /** * TODO implement as remote api call */ - protected String getOrCreateUser(String username, String password) + protected String getOrCreateUser(String usernameIn, String password, TestNetwork network) { - PersonInfo personInfo = new PersonInfo(username, username, username, password, null, null, null, null, null, null, null); - RepoService.TestPerson person = repoService.getOrCreateUser(personInfo, username, null); - return person.getId(); + final String tenantDomain = (network != null ? network.getId() : TenantService.DEFAULT_DOMAIN); + + return AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork() + { + @Override + public String doWork() throws Exception + { + return TenantUtil.runAsTenant(new TenantUtil.TenantRunAsWork() + { + public String doWork() throws Exception + { + String username = repoService.getPublicApiContext().createUserName(usernameIn, tenantDomain); + PersonInfo personInfo = new PersonInfo(username, username, username, password, null, null, null, null, null, null, null); + RepoService.TestPerson person = repoService.getOrCreateUser(personInfo, username, network); + return person.getId(); + } + }, tenantDomain); + } + }, networkAdmin); } protected SiteMember addSiteMember(String siteId, String userId, final SiteRole siteRole) throws Exception @@ -481,9 +530,15 @@ public abstract class AbstractBaseApiTest extends EnterpriseTestApi return RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Site.class); } - protected HttpResponse deleteSite(String siteId, int expectedStatus) throws Exception + protected HttpResponse deleteSite(String siteId, boolean permanent, int expectedStatus) throws Exception { - HttpResponse response = publicApiClient.delete(getScope(), "sites", siteId, null, null); + Map params = null; + if (permanent == true) + { + params = Collections.singletonMap("permanent", "true"); + } + + HttpResponse response = publicApiClient.delete(getScope(), 1, "sites", siteId, null, null, params); checkStatus(expectedStatus, response.getStatusCode()); return response; } @@ -525,7 +580,10 @@ public abstract class AbstractBaseApiTest extends EnterpriseTestApi password = DEFAULT_ADMIN_PWD; } - setRequestContext(null, runAsUser, password); + // Assume "networkOne" if set ! + String runAsNetwork = (networkOne != null ? networkOne.getId() : null); + + setRequestContext(runAsNetwork, runAsUser, password); } protected void setRequestContext(String runAsNetwork, String runAsUser, String password) @@ -534,7 +592,7 @@ public abstract class AbstractBaseApiTest extends EnterpriseTestApi { runAsNetwork = "-default-"; } - else if (runAsUser.equals(DEFAULT_ADMIN)) + else if ((runAsUser != null) && runAsUser.equals(DEFAULT_ADMIN)) { runAsUser = runAsUser+"@"+runAsNetwork; } diff --git a/source/test-java/org/alfresco/rest/api/tests/ActivitiesPostingTest.java b/source/test-java/org/alfresco/rest/api/tests/ActivitiesPostingTest.java index ecb84d20bf..5fb6348d59 100644 --- a/source/test-java/org/alfresco/rest/api/tests/ActivitiesPostingTest.java +++ b/source/test-java/org/alfresco/rest/api/tests/ActivitiesPostingTest.java @@ -62,6 +62,9 @@ public class ActivitiesPostingTest extends AbstractSingleNetworkSiteTest public void testCreateUpdate() throws Exception { setRequestContext(user1); + + List activities = getMyActivities(); + int beforeCount = activities.size(); String folder1 = "folder" + System.currentTimeMillis() + "_1"; Folder createdFolder = createFolder(tDocLibNodeId, folder1, null); @@ -83,8 +86,9 @@ public class ActivitiesPostingTest extends AbstractSingleNetworkSiteTest deleteNode(documentResp.getId()); deleteNode(createdFolder.getId()); - List activities = getMyActivities(); - assertEquals(activities.size(),6); + activities = getMyActivities(); + assertEquals(beforeCount+6, activities.size()); + Activity act = matchActivity(activities, ActivityType.FOLDER_ADDED, user1, tSiteId, tDocLibNodeId, folder1); assertNotNull(act); diff --git a/source/test-java/org/alfresco/rest/api/tests/AuthenticationsTest.java b/source/test-java/org/alfresco/rest/api/tests/AuthenticationsTest.java index 8836b037da..040aadeab9 100644 --- a/source/test-java/org/alfresco/rest/api/tests/AuthenticationsTest.java +++ b/source/test-java/org/alfresco/rest/api/tests/AuthenticationsTest.java @@ -27,6 +27,8 @@ package org.alfresco.rest.api.tests; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; + +import org.alfresco.rest.AbstractSingleNetworkSiteTest; import org.alfresco.rest.api.Nodes; import org.alfresco.rest.api.People; import org.alfresco.rest.api.model.LoginTicket; @@ -49,7 +51,7 @@ import java.util.Map; * * @author Jamal Kaabi-Mofrad */ -public class AuthenticationsTest extends AbstractBaseApiTest +public class AuthenticationsTest extends AbstractSingleNetworkSiteTest { private static final String TICKETS_URL = "tickets"; private static final String TICKETS_API_NAME = "authentication"; diff --git a/source/test-java/org/alfresco/rest/api/tests/NodeApiTest.java b/source/test-java/org/alfresco/rest/api/tests/NodeApiTest.java index fb5d3899c6..6327c898e5 100644 --- a/source/test-java/org/alfresco/rest/api/tests/NodeApiTest.java +++ b/source/test-java/org/alfresco/rest/api/tests/NodeApiTest.java @@ -38,6 +38,8 @@ import static org.junit.Assert.assertTrue; import org.alfresco.repo.content.ContentLimitProvider.SimpleFixedLimitProvider; import org.alfresco.repo.content.MimetypeMap; import org.alfresco.repo.security.authentication.AuthenticationUtil; +import org.alfresco.repo.tenant.TenantService; +import org.alfresco.repo.tenant.TenantUtil; import org.alfresco.rest.AbstractSingleNetworkSiteTest; import org.alfresco.rest.api.Nodes; import org.alfresco.rest.api.model.NodeTarget; @@ -99,7 +101,7 @@ import java.util.UUID; * TODO * - improve test 'fwk' to enable api tests to be run against remote repo (rather than embedded jetty) * - requires replacement of remaining non-remote calls with remote (preferably public) apis - * - eg. createUser (or any other usage of repoService), permissionService, AuthentictionUtil, ... + * - eg. createUser (or any other usage of repoService), permissionService, AuthenticationUtil, ... * * @author Jamal Kaabi-Mofrad * @author janv @@ -133,27 +135,31 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest * {@literal :/alfresco/api//public/alfresco/versions/1/nodes//children} */ @Test - public void testListDocLibChildren() throws Exception + public void testListChildrenWithinSiteDocLib() throws Exception { setRequestContext(user1); + + // create folder f0 + String folder0Name = "f0-testUpdateNodeInfo-"+RUNID; + String f0Id = createFolder(tDocLibNodeId, folder0Name).getId(); - String folder1 = "folder" + System.currentTimeMillis() + "_1"; - createFolder(tDocLibNodeId, folder1, null).getId(); + String folder1 = "folder" + RUNID + "_1"; + createFolder(f0Id, folder1, null).getId(); - String folder2 = "folder" + System.currentTimeMillis() + "_2"; - createFolder(tDocLibNodeId, folder2, null).getId(); + String folder2 = "folder" + RUNID + "_2"; + createFolder(f0Id, folder2, null).getId(); - String content1 = "content" + System.currentTimeMillis() + "_1"; - createTextFile(tDocLibNodeId, content1, "The quick brown fox jumps over the lazy dog 1.").getId(); + String content1 = "content" + RUNID + "_1"; + createTextFile(f0Id, content1, "The quick brown fox jumps over the lazy dog 1.").getId(); - String content2 = "content" + System.currentTimeMillis() + "_2"; - createTextFile(tDocLibNodeId, content2, "The quick brown fox jumps over the lazy dog 2.").getId(); + String content2 = "content" + RUNID + "_2"; + createTextFile(f0Id, content2, "The quick brown fox jumps over the lazy dog 2.").getId(); - String forum1 = "forum" + System.currentTimeMillis() + "_1"; - createNode(tDocLibNodeId, forum1, "fm:topic", null); + String forum1 = "forum" + RUNID + "_1"; + createNode(f0Id, forum1, "fm:topic", null); Paging paging = getPaging(0, 100); - HttpResponse response = getAll(getNodeChildrenUrl(tDocLibNodeId), paging, 200); + HttpResponse response = getAll(getNodeChildrenUrl(f0Id), paging, 200); List nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); assertEquals(4, nodes.size()); // forum is part of the default ignored types // Paging @@ -165,7 +171,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest // Order by folders and modified date first Map orderBy = Collections.singletonMap("orderBy", "isFolder DESC,modifiedAt DESC"); - response = getAll(getNodeChildrenUrl(tDocLibNodeId), paging, orderBy, 200); + response = getAll(getNodeChildrenUrl(f0Id), paging, orderBy, 200); nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); assertEquals(4, nodes.size()); assertEquals(folder2, nodes.get(0).getName()); @@ -183,7 +189,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest // Order by folders last and modified date first orderBy = Collections.singletonMap("orderBy", "isFolder ASC,modifiedAt DESC"); - response = getAll(getNodeChildrenUrl(tDocLibNodeId), paging, orderBy, 200); + response = getAll(getNodeChildrenUrl(f0Id), paging, orderBy, 200); nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); assertEquals(4, nodes.size()); assertEquals(content2, nodes.get(0).getName()); @@ -193,7 +199,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest // Order by folders and modified date last orderBy = Collections.singletonMap("orderBy", "isFolder,modifiedAt"); - response = getAll(getNodeChildrenUrl(tDocLibNodeId), paging, orderBy, 200); + response = getAll(getNodeChildrenUrl(f0Id), paging, orderBy, 200); nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); assertEquals(4, nodes.size()); assertEquals(content1, nodes.get(0).getName()); @@ -206,7 +212,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest // SkipCount=0,MaxItems=2 paging = getPaging(0, 2); - response = getAll(getNodeChildrenUrl(tDocLibNodeId), paging, orderBy, 200); + response = getAll(getNodeChildrenUrl(f0Id), paging, orderBy, 200); nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); assertEquals(2, nodes.size()); assertEquals(folder2, nodes.get(0).getName()); @@ -219,7 +225,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest // SkipCount=null,MaxItems=2 paging = getPaging(null, 2); - response = getAll(getNodeChildrenUrl(tDocLibNodeId), paging, orderBy, 200); + response = getAll(getNodeChildrenUrl(f0Id), paging, orderBy, 200); nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); assertEquals(2, nodes.size()); assertEquals(folder2, nodes.get(0).getName()); @@ -232,7 +238,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest // SkipCount=2,MaxItems=4 paging = getPaging(2, 4); - response = getAll(getNodeChildrenUrl(tDocLibNodeId), paging, orderBy, 200); + response = getAll(getNodeChildrenUrl(f0Id), paging, orderBy, 200); nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); assertEquals(2, nodes.size()); assertEquals(content2, nodes.get(0).getName()); @@ -246,7 +252,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest // SkipCount=2,MaxItems=null paging = getPaging(2, null); - response = getAll(getNodeChildrenUrl(tDocLibNodeId), paging, orderBy, 200); + response = getAll(getNodeChildrenUrl(f0Id), paging, orderBy, 200); nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); assertEquals(2, nodes.size()); assertEquals(content2, nodes.get(0).getName()); @@ -259,55 +265,60 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest setRequestContext(user2); - // user2 tries to access user1's docLib + // user2 tries to access user1's (private) docLib paging = getPaging(0, Integer.MAX_VALUE); getAll(getNodeChildrenUrl(tDocLibNodeId), paging, 403); + //getAll(getNodeChildrenUrl(f0Id), paging, 403); setRequestContext(user1); // -ve test - paging (via list children) cannot have skipCount < 0 paging = getPaging(-1, 4); - getAll(getNodeChildrenUrl(tDocLibNodeId), paging, orderBy, 400); + getAll(getNodeChildrenUrl(f0Id), paging, orderBy, 400); // -ve test - paging (via list children) cannot have maxItems < 1 paging = getPaging(0, 0); - getAll(getNodeChildrenUrl(tDocLibNodeId), paging, orderBy, 400); + getAll(getNodeChildrenUrl(f0Id), paging, orderBy, 400); } /** - * Tests get user's home children. + * Tests list children. *

GET:

* {@literal :/alfresco/api/-default-/public/alfresco/versions/1/nodes//children} */ @Test - public void testListMyFilesChildren() throws Exception + public void testListChildrenWithinMyFiles() throws Exception { setRequestContext(user1); String myNodeId = getMyNodeId(); - - String myChildrenUrl = getNodeChildrenUrl(Nodes.PATH_MY); + String rootChildrenUrl = getNodeChildrenUrl(Nodes.PATH_ROOT); + String folder0Name = "folder " + RUNID + " 0"; + String folder0Id = createFolder(myNodeId, folder0Name, null).getId(); + + String childrenUrl = getNodeChildrenUrl(folder0Id); + Map props = new HashMap<>(1); props.put("cm:title", "This is folder 1"); - String folder1 = "folder " + System.currentTimeMillis() + " 1"; - String folder1_Id = createFolder(myNodeId, folder1, props).getId(); + String folder1 = "folder " + RUNID + " 1"; + String folder1_Id = createFolder(folder0Id, folder1, props).getId(); - String contentF1 = "content" + System.currentTimeMillis() + " in folder 1"; + String contentF1 = "content" + RUNID + " in folder 1"; String contentF1_Id = createTextFile(folder1_Id, contentF1, "The quick brown fox jumps over the lazy dog 1.").getId(); props = new HashMap<>(1); props.put("cm:title", "This is folder 2"); - String folder2 = "folder " + System.currentTimeMillis() + " 2"; - String folder2_Id = createFolder(myNodeId, folder2, props).getId(); + String folder2 = "folder " + RUNID + " 2"; + String folder2_Id = createFolder(folder0Id, folder2, props).getId(); - String contentF2 = "content" + System.currentTimeMillis() + " in folder 2.txt"; + String contentF2 = "content" + RUNID + " in folder 2.txt"; String contentF2_Id = createTextFile(folder2_Id, contentF2, "The quick brown fox jumps over the lazy dog 2.").getId(); - String content1 = "content" + System.currentTimeMillis() + " 1.txt"; - String content1_Id = createTextFile(myNodeId, content1, "The quick brown fox jumps over the lazy dog.").getId(); + String content1 = "content" + RUNID + " 1.txt"; + String content1_Id = createTextFile(folder0Id, content1, "The quick brown fox jumps over the lazy dog.").getId(); props = new HashMap<>(); props.put(PROP_OWNER, user1); @@ -319,16 +330,15 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest List folderIds = Arrays.asList(folder1_Id, folder2_Id); List contentIds = Arrays.asList(content1_Id); - - - Paging paging = getPaging(0, Integer.MAX_VALUE); - HttpResponse response = getAll(myChildrenUrl, paging, 200); + + Paging paging = getPaging(0, 100); + HttpResponse response = getAll(childrenUrl, paging, 200); List nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Document.class); assertEquals(3, nodes.size()); // Order by folders and modified date first Map orderBy = Collections.singletonMap("orderBy", "isFolder DESC,modifiedAt DESC"); - response = getAll(myChildrenUrl, paging, orderBy, 200); + response = getAll(childrenUrl, paging, orderBy, 200); nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Document.class); assertEquals(3, nodes.size()); assertEquals(folder2, nodes.get(0).getName()); @@ -350,7 +360,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest // request without "include" Map params = new HashMap<>(); - response = getAll(myChildrenUrl, paging, params, 200); + response = getAll(childrenUrl, paging, params, 200); nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Document.class); for (Node n : nodes) { @@ -363,7 +373,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest // request with include - example 1 params = new HashMap<>(); params.put("include", "isLink"); - response = getAll(myChildrenUrl, paging, params, 200); + response = getAll(childrenUrl, paging, params, 200); nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Document.class); for (Node n : nodes) { @@ -373,7 +383,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest // request with include - example 2 params = new HashMap<>(); params.put("include", "aspectNames,properties,path,isLink"); - response = getAll(myChildrenUrl, paging, params, 200); + response = getAll(childrenUrl, paging, params, 200); nodes = jacksonUtil.parseEntries(response.getJsonResponse(), Document.class); for (Node n : nodes) { @@ -387,7 +397,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest params = new HashMap<>(); params.put("include", "cm:lastThumbnailModification"); params.put("orderBy", "isFolder DESC,modifiedAt DESC"); - response = getAll(myChildrenUrl, paging, params, 200); + response = getAll(childrenUrl, paging, params, 200); nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Document.class); assertEquals(3, nodes.size()); assertNull("There shouldn't be a 'properties' object in the response.", nodes.get(0).getProperties()); @@ -403,7 +413,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest // filtering, via where clause - folders only params = new HashMap<>(); params.put("where", "("+Nodes.PARAM_ISFOLDER+"=true)"); - response = getAll(myChildrenUrl, paging, params, 200); + response = getAll(childrenUrl, paging, params, 200); nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Document.class); assertEquals(2, nodes.size()); @@ -418,7 +428,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest // filtering, via where clause - content only params = new HashMap<>(); params.put("where", "("+Nodes.PARAM_ISFILE+"=true)"); - response = getAll(myChildrenUrl, paging, params, 200); + response = getAll(childrenUrl, paging, params, 200); nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Document.class); assertEquals(1, nodes.size()); assertFalse(nodes.get(0).getIsFolder()); @@ -428,7 +438,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest // list children via relativePath params = Collections.singletonMap(Nodes.PARAM_RELATIVE_PATH, folder1); - response = getAll(myChildrenUrl, paging, params, 200); + response = getAll(childrenUrl, paging, params, 200); JSONObject jsonResponse = response.getJsonResponse(); nodes = RestApiUtil.parseRestApiEntries(jsonResponse, Document.class); assertEquals(1, nodes.size()); @@ -439,7 +449,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest JSONObject jsonSrcObj = (JSONObject)jsonResponse.get("source"); assertNull(jsonSrcObj); - params = Collections.singletonMap(Nodes.PARAM_RELATIVE_PATH, "User Homes/" + user1 + "/" + folder2); + params = Collections.singletonMap(Nodes.PARAM_RELATIVE_PATH, "User Homes/" + user1 + "/" + folder0Name + "/" + folder2); response = getAll(rootChildrenUrl, paging, params, 200); jsonResponse = response.getJsonResponse(); nodes = RestApiUtil.parseRestApiEntries(jsonResponse, Document.class); @@ -454,7 +464,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest // list children via relativePath and also return the source entity params = new HashMap<>(); - params.put(Nodes.PARAM_RELATIVE_PATH, "User Homes/" + user1 + "/" + folder2); + params.put(Nodes.PARAM_RELATIVE_PATH, "User Homes/" + user1 + "/" + folder0Name + "/" + folder2); params.put("includeSource", "true"); params.put("include", "path,isLink"); params.put("fields", "id"); @@ -482,7 +492,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest // -ve test - Invalid QName (Namespace prefix cm... is not mapped to a namespace URI) for the orderBy parameter. params = Collections.singletonMap("orderBy", Nodes.PARAM_ISFOLDER+" DESC,cm" + System.currentTimeMillis() + ":modified DESC"); - getAll(myChildrenUrl, paging, params, 400); + getAll(childrenUrl, paging, params, 400); paging = getPaging(0, 10); @@ -522,30 +532,45 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest sitesProxy.createSiteMember(tSiteId, new SiteMember(user2, SiteRole.SiteConsumer.toString())); // /Company Home/Sites/RandomSite/documentLibrary/folder_A - String folderA = "folder" + System.currentTimeMillis() + "_A"; + String folderA = "folder" + RUNID + "_A"; String folderA_Id = createFolder(tDocLibNodeId, folderA).getId(); // /Company Home/Sites/RandomSite/documentLibrary/folder_A/folder_B - String folderB = "folder" + System.currentTimeMillis() + "_B"; + String folderB = "folder" + RUNID + "_B"; String folderB_Id = createFolder(folderA_Id, folderB).getId(); NodeRef folderB_Ref = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, folderB_Id); // /Company Home/Sites/RandomSite/documentLibrary/folder_A/folder_B/folder_C - String folderC = "folder" + System.currentTimeMillis() + "_C"; + String folderC = "folder" + RUNID + "_C"; String folderC_Id = createFolder(folderB_Id, folderC).getId(); NodeRef folderC_Ref = new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, folderC_Id); // /Company Home/Sites/RandomSite/documentLibrary/folder_A/folder_B/folder_C/content - String content = "content" + System.currentTimeMillis(); + String content = "content" + RUNID; String content1_Id = createTextFile(folderC_Id, content, "The quick brown fox jumps over the lazy dog.").getId(); - - - // TODO refactor with remote permission api calls (use v0 until we have v1 ?) - AuthenticationUtil.setFullyAuthenticatedUser(user1); - // Revoke folderB inherited permissions - permissionService.setInheritParentPermissions(folderB_Ref, false); - // Grant user2 permission for folderC - permissionService.setPermission(folderC_Ref, user2, PermissionService.CONSUMER, true); + + + // TODO refactor with remote permission api calls (maybe use v0 until we have v1 ?) + final String tenantDomain = (networkOne != null ? networkOne.getId() : TenantService.DEFAULT_DOMAIN); + AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork() + { + @Override + public Void doWork() throws Exception + { + return TenantUtil.runAsTenant(new TenantUtil.TenantRunAsWork() + { + public Void doWork() throws Exception + { + // Revoke folderB inherited permissions + permissionService.setInheritParentPermissions(folderB_Ref, false); + // Grant user2 permission for folderC + permissionService.setPermission(folderC_Ref, user2, PermissionService.CONSUMER, true); + return null; + } + }, tenantDomain); + } + }, user1); + //...nodes/nodeId?include=path Map params = Collections.singletonMap("include", "path"); @@ -612,18 +637,18 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest String userHomesId = node.getParentId(); // /Company Home/User Homes/user/folder_A - String folderA = "folder" + System.currentTimeMillis() + "_A"; + String folderA = "folder" + RUNID + "_A"; String folderA_Id = createFolder(myFilesNodeId, folderA).getId(); // /Company Home/User Homes/user/folder_A/folder_B - String folderB = "folder" + System.currentTimeMillis() + "_B"; + String folderB = "folder" + RUNID + "_B"; String folderB_Id = createFolder(folderA_Id, folderB).getId(); // /Company Home/User Homes/user/folder_A/folder_B/content String title = "test title"; Map docProps = new HashMap<>(); docProps.put("cm:title", title); - String contentName = "content " + System.currentTimeMillis() + ".txt"; + String contentName = "content " + RUNID + ".txt"; String content1Id = createTextFile(folderB_Id, contentName, "The quick brown fox jumps over the lazy dog.", "UTF-8", docProps).getId(); @@ -694,7 +719,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest assertEquals(content_Id, documentResp.getId()); // test path with utf-8 encoded param (eg. ¢ => ) - String folderC = "folder" + System.currentTimeMillis() + " ¢"; + String folderC = "folder" + RUNID + " ¢"; String folderC_Id = createFolder(folderB_Id, folderC).getId(); params = Collections.singletonMap(Nodes.PARAM_RELATIVE_PATH, "/"+folderA+"/"+folderB+"/"+folderC); @@ -766,7 +791,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest assertNull(node.getPath()); //Delete user1's home - setRequestContext(DEFAULT_ADMIN); + setRequestContext(networkAdmin); deleteNode(myFilesNodeId); setRequestContext(user1); @@ -785,7 +810,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest { setRequestContext(user1); - String fId = createFolder(getMyNodeId(), "test-folder-guess-"+System.currentTimeMillis()).getId(); + String fId = createFolder(getMyNodeId(), "test-folder-guess-"+RUNID).getId(); // create empty files @@ -978,12 +1003,17 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest public void testUploadToMyFiles() throws Exception { setRequestContext(user1); + + // create folder f0 + String folder0Name = "f0-testUploadToMyFiles-"+RUNID; + Folder folderResp = createFolder(Nodes.PATH_MY, folder0Name); + String f0Id = folderResp.getId(); final String fileName = "quick.pdf"; final File file = getResourceFile(fileName); Paging paging = getPaging(0, Integer.MAX_VALUE); - HttpResponse response = getAll(getNodeChildrenUrl(Nodes.PATH_MY), paging, 200); + HttpResponse response = getAll(getNodeChildrenUrl(f0Id), paging, 200); PublicApiClient.ExpectedPaging pagingResult = parsePaging(response.getJsonResponse()); assertNotNull(paging); final int numOfNodes = pagingResult.getCount(); @@ -996,7 +1026,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest post(getNodeChildrenUrl(UUID.randomUUID().toString()), reqBody.getBody(), null, reqBody.getContentType(), 404); // Upload - response = post(getNodeChildrenUrl(Nodes.PATH_MY), reqBody.getBody(), null, reqBody.getContentType(), 201); + response = post(getNodeChildrenUrl(f0Id), reqBody.getBody(), null, reqBody.getContentType(), 201); Document document = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class); // Check the upload response assertEquals(fileName, document.getName()); @@ -1018,15 +1048,15 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest assertEquals(MimetypeMap.MIMETYPE_PDF, contentInfo.getMimeType()); // Check 'get children' is confirming the upload - response = getAll(getNodeChildrenUrl(Nodes.PATH_MY), paging, 200); + response = getAll(getNodeChildrenUrl(f0Id), paging, 200); pagingResult = parsePaging(response.getJsonResponse()); assertNotNull(paging); assertEquals(numOfNodes + 1, pagingResult.getCount().intValue()); // Upload the same file again to check the name conflicts handling - post(getNodeChildrenUrl(Nodes.PATH_MY), reqBody.getBody(), null, reqBody.getContentType(), 409); + post(getNodeChildrenUrl(f0Id), reqBody.getBody(), null, reqBody.getContentType(), 409); - response = getAll(getNodeChildrenUrl(Nodes.PATH_MY), paging, 200); + response = getAll(getNodeChildrenUrl(f0Id), paging, 200); pagingResult = parsePaging(response.getJsonResponse()); assertNotNull(paging); assertEquals("Duplicate file name. The file shouldn't have been uploaded.", numOfNodes + 1, pagingResult.getCount().intValue()); @@ -1036,19 +1066,19 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest .setAutoRename(true) .build(); - response = post(getNodeChildrenUrl(Nodes.PATH_MY), reqBody.getBody(), null, reqBody.getContentType(), 201); + response = post(getNodeChildrenUrl(f0Id), reqBody.getBody(), null, reqBody.getContentType(), 201); document = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class); // Check the upload response assertEquals("quick-1.pdf", document.getName()); // upload the same file again, and request the path info to be present in the response - response = post(getNodeChildrenUrl(Nodes.PATH_MY), reqBody.getBody(), "?include=path", reqBody.getContentType(), 201); + response = post(getNodeChildrenUrl(f0Id), reqBody.getBody(), "?include=path", reqBody.getContentType(), 201); document = jacksonUtil.parseEntry(response.getJsonResponse(), Document.class); // Check the upload response assertEquals("quick-2.pdf", document.getName()); assertNotNull(document.getPath()); - response = getAll(getNodeChildrenUrl(Nodes.PATH_MY), paging, 200); + response = getAll(getNodeChildrenUrl(f0Id), paging, 200); pagingResult = parsePaging(response.getJsonResponse()); assertNotNull(paging); assertEquals(numOfNodes + 3, pagingResult.getCount().intValue()); @@ -1059,7 +1089,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest reqBody = MultiPartBuilder.create() .setFileData(new FileData(null, file1)) .build(); - response = post(getNodeChildrenUrl(Nodes.PATH_MY), reqBody.getBody(), null, reqBody.getContentType(), 201); + response = post(getNodeChildrenUrl(f0Id), reqBody.getBody(), null, reqBody.getContentType(), 201); document = jacksonUtil.parseEntry(response.getJsonResponse(), Document.class); // Check the upload response assertEquals(fileName1, document.getName()); @@ -1072,7 +1102,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest reqBody = MultiPartBuilder.create() .setFileData(new FileData(fileName2b, file2)) .build(); - response = post(getNodeChildrenUrl(Nodes.PATH_MY), reqBody.getBody(), null, reqBody.getContentType(), 201); + response = post(getNodeChildrenUrl(f0Id), reqBody.getBody(), null, reqBody.getContentType(), 201); document = jacksonUtil.parseEntry(response.getJsonResponse(), Document.class); // Check the upload response assertEquals(fileName2b, document.getName()); @@ -1091,10 +1121,12 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest .setFileData(new FileData(fileName2, file3)) .build(); post(getNodeChildrenUrl(user1Home.getId()), reqBody.getBody(), null, reqBody.getContentType(), 403); + + post(getNodeChildrenUrl(f0Id), reqBody.getBody(), null, reqBody.getContentType(), 403); setRequestContext(user1); - response = getAll(getNodeChildrenUrl(Nodes.PATH_MY), paging, 200); + response = getAll(getNodeChildrenUrl(f0Id), paging, 200); pagingResult = parsePaging(response.getJsonResponse()); assertNotNull(paging); assertEquals("Access Denied. The file shouldn't have been uploaded.", numOfNodes + 5, pagingResult.getCount().intValue()); @@ -1104,7 +1136,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest // Try to upload a file without defining the required formData reqBody = MultiPartBuilder.create().setAutoRename(true).build(); - post(getNodeChildrenUrl(Nodes.PATH_MY), reqBody.getBody(), null, reqBody.getContentType(), 400); + post(getNodeChildrenUrl(f0Id), reqBody.getBody(), null, reqBody.getContentType(), 400); // Test unsupported node type reqBody = MultiPartBuilder.create() @@ -1112,13 +1144,13 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest .setAutoRename(true) .setNodeType("cm:link") .build(); - post(getNodeChildrenUrl(user1Home.getId()), reqBody.getBody(), null, reqBody.getContentType(), 400); + post(getNodeChildrenUrl(f0Id), reqBody.getBody(), null, reqBody.getContentType(), 400); // User1 uploads a new file reqBody = MultiPartBuilder.create() .setFileData(new FileData(fileName2, file2)) .build(); - response = post(getNodeChildrenUrl(user1Home.getId()), reqBody.getBody(), null, reqBody.getContentType(), 201); + response = post(getNodeChildrenUrl(f0Id), reqBody.getBody(), null, reqBody.getContentType(), 201); document = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class); // Check the upload response assertEquals(fileName2, document.getName()); @@ -1141,7 +1173,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest .build(); // Try to upload a file larger than the configured size limit - post(getNodeChildrenUrl(Nodes.PATH_MY), reqBody.getBody(), null, reqBody.getContentType(), 413); + post(getNodeChildrenUrl(f0Id), reqBody.getBody(), null, reqBody.getContentType(), 413); } finally { @@ -1162,7 +1194,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest final String fileName = "quick-1.txt"; final File file = getResourceFile(fileName); - String folderA = "folder" + System.currentTimeMillis() + "_A"; + String folderA = "folder" + RUNID + "_A"; String folderA_id = createFolder(tDocLibNodeId, folderA).getId(); Paging paging = getPaging(0, Integer.MAX_VALUE); @@ -1342,11 +1374,11 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest { setRequestContext(user1); - long runId = System.currentTimeMillis(); + // create folder f0 + String folder0Name = "f0-testDelete-"+RUNID; + String f0Id = createFolder(Nodes.PATH_MY, folder0Name).getId(); - String myNodeId = getMyNodeId(); - - String content1Id = createTextFile(myNodeId, "content" + runId + "_1", "The quick brown fox jumps over the lazy dog.").getId(); + String content1Id = createTextFile(f0Id, "content" + RUNID + "_1", "The quick brown fox jumps over the lazy dog.").getId(); // delete file deleteNode(content1Id); @@ -1356,10 +1388,10 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest // -ve test deleteNode(content1Id, 404); - String folder1Id = createFolder(myNodeId, "folder " + runId + "_1").getId(); - String folder2Id = createFolder(folder1Id, "folder " + runId + "_2").getId(); + String folder1Id = createFolder(f0Id, "folder " + RUNID + "_1").getId(); + String folder2Id = createFolder(folder1Id, "folder " + RUNID + "_2").getId(); - String content2Id = createTextFile(folder2Id, "content" + runId + "_2", "The quick brown fox jumps over the lazy dog.").getId(); + String content2Id = createTextFile(folder2Id, "content" + RUNID + "_2", "The quick brown fox jumps over the lazy dog.").getId(); // cascade delete folder deleteNode(folder1Id); @@ -1380,17 +1412,17 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest // permanently delete - ie. bypass trashcan (archive store) // - String folder3Id = createFolder(myNodeId, "folder " + runId + "_3").getId(); - String folder4Id = createFolder(folder3Id, "folder " + runId + "_4").getId(); + String folder3Id = createFolder(f0Id, "folder " + RUNID + "_3").getId(); + String folder4Id = createFolder(folder3Id, "folder " + RUNID + "_4").getId(); deleteNode(folder3Id, true, 204); assertFalse(existsArchiveNode(folder3Id)); assertFalse(existsArchiveNode(folder4Id)); + String sharedNodeId = getSharedNodeId(); - String folder5Id = createFolder(sharedNodeId, "folder " + runId + "_5").getId(); - + final String folder5Id = createFolder(sharedNodeId, "folder " + RUNID + "_5").getId(); // -ve test - another user cannot delete setRequestContext(user2); @@ -1407,11 +1439,31 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest Node nodeResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Node.class); assertEquals(user2, ((Map)nodeResp.getProperties().get(PROP_OWNER)).get("id")); - // -ve test - user1 can no longer delete - deleteNode(folder5Id, 403); + // TODO apparently returns 204 here in tenant context ?? (eg. if useDefaultNetwork=false) + if (useDefaultNetwork != false) + { + // -ve test - user1 can no longer delete + deleteNode(folder5Id, 403); + } + + // TODO refactor with remote permission api calls (maybe use v0 until we have v1 ?) + final String tenantDomain = (networkOne != null ? networkOne.getId() : TenantService.DEFAULT_DOMAIN); + AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork() + { + @Override + public Void doWork() throws Exception + { + return TenantUtil.runAsTenant(new TenantUtil.TenantRunAsWork() + { + public Void doWork() throws Exception + { + permissionService.setPermission(new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, folder5Id), user1, PermissionService.DELETE, true); + return null; + } + }, tenantDomain); + } + }, user1); - // TODO refactor with remote permission api calls (use v0 until we have v1 ?) - permissionService.setPermission(new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, folder5Id), user1, PermissionService.DELETE, true); // -ve test - non-owner cannot bypass trashcan deleteNode(folder5Id, true, 403); @@ -1420,9 +1472,9 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest deleteNode(folder5Id); // admin can permanently delete - String folder6Id = createFolder(sharedNodeId, "folder " + runId + "_6").getId(); + String folder6Id = createFolder(sharedNodeId, "folder " + RUNID + "_6").getId(); - setRequestContext(DEFAULT_ADMIN); + setRequestContext(networkAdmin); deleteNode(folder6Id, true, 204); @@ -1471,21 +1523,25 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest public void testMove() throws Exception { setRequestContext(user1); + + // create folder f0 + String folder0Name = "f0-testMove-"+RUNID; + String f0Id = createFolder(Nodes.PATH_MY, folder0Name).getId(); // create folder f1 - Folder folderResp = createFolder(Nodes.PATH_MY, "f1"); + Folder folderResp = createFolder(f0Id, "f1"); String f1Id = folderResp.getId(); // create folder f2 - folderResp = createFolder(Nodes.PATH_MY, "f2"); + folderResp = createFolder(f0Id, "f2"); String f2Id = folderResp.getId(); // create doc d1 - String d1Name = "content" + System.currentTimeMillis() + "_1"; + String d1Name = "content" + RUNID + "_1"; String d1Id = createTextFile(f1Id, d1Name, "The quick brown fox jumps over the lazy dog 1.").getId(); // create doc d2 - String d2Name = "content" + System.currentTimeMillis() + "_2"; + String d2Name = "content" + RUNID + "_2"; String d2Id = createTextFile(f2Id, d2Name, "The quick brown fox jumps over the lazy dog 2.").getId(); // move file (without rename) @@ -1567,7 +1623,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest post("nodes/"+f1Id+"/move", toJsonAsStringNonNull(tgt), null, 403); // -ve - cannot move (delete) Company Home root node - setRequestContext(DEFAULT_ADMIN); + setRequestContext(networkAdmin); post("nodes/"+rootNodeId+"/move", toJsonAsStringNonNull(tgt), null, 403); setRequestContext(user1); @@ -1579,7 +1635,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest String sitesNodeId = nodeResp.getId(); // -ve - cannot move (delete) Sites node - setRequestContext(DEFAULT_ADMIN); + setRequestContext(networkAdmin); post("nodes/"+sitesNodeId+"/move", toJsonAsStringNonNull(tgt), null, 403); setRequestContext(user1); @@ -1591,7 +1647,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest String ddNodeId = nodeResp.getId(); // -ve - cannot move (delete) Data Dictionary node - setRequestContext(DEFAULT_ADMIN); + setRequestContext(networkAdmin); post("nodes/"+ddNodeId+"/move", toJsonAsStringNonNull(tgt), null, 403); // -ve test - cannot move to multiple destinations in single POST call (unsupported) @@ -1625,11 +1681,11 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest String targetId = folderResp.getId(); // create doc d1 - String d1Name = "content" + System.currentTimeMillis() + "_1"; + String d1Name = "content" + RUNID + "_1"; String d1Id = createTextFile(sourceId, d1Name, "The quick brown fox jumps over the lazy dog 1.").getId(); // create doc d2 - String d2Name = "content" + System.currentTimeMillis() + "_2"; + String d2Name = "content" + RUNID + "_2"; String d2Id = createTextFile(sourceId, d2Name, "The quick brown fox jumps over the lazy dog 2.").getId(); Map body = new HashMap<>(); @@ -1748,7 +1804,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest */ // user1 creates a public site and adds user2 as a site collaborator - String site1Title = "RandomSite1-" + System.currentTimeMillis(); + String site1Title = "RandomSite1-" + RUNID; final String site1Id = createSite(site1Title, SiteVisibility.PUBLIC).getId(); addSiteMember(site1Id, user2, SiteRole.SiteCollaborator); @@ -1756,13 +1812,13 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest final String user1SitetDocLibNodeId = getSiteContainerNodeId(site1Id, "documentLibrary"); // user1 creates a folder in the docLib of his site (user1Site) - String user1Folder = "folder" + System.currentTimeMillis() + "_user1"; + String user1Folder = "folder" + RUNID + "_user1"; String user1FolderNodeId = createFolder(user1SitetDocLibNodeId, user1Folder, null).getId(); setRequestContext(user2); // user2 creates a public site and adds user1 as a site collaborator - String site2Title = "RandomSite2-" + System.currentTimeMillis(); + String site2Title = "RandomSite2-" + RUNID; final String site2Id = createSite(site2Title, SiteVisibility.PUBLIC).getId(); addSiteMember(site2Id, user1, SiteRole.SiteCollaborator); @@ -1770,10 +1826,10 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest final String user2SitetDocLibNodeId = getSiteContainerNodeId(site2Id, "documentLibrary"); // user2 creates 2 folders within the docLib of the user1Site - String user2Folder1 = "folder1" + System.currentTimeMillis() + "_user2"; + String user2Folder1 = "folder1" + RUNID + "_user2"; String user2FolderNodeId = createFolder(user1SitetDocLibNodeId, user2Folder1, null).getId(); - String user2Folder2 = "folder2" + System.currentTimeMillis() + "_user2"; + String user2Folder2 = "folder2" + RUNID + "_user2"; String user2Folder2NodeId = createFolder(user1SitetDocLibNodeId, user2Folder2, null).getId(); /* @@ -2140,10 +2196,11 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest setRequestContext(user1); String myNodeId = getMyNodeId(); - String myChildrenUrl = getNodeChildrenUrl(myNodeId); - - long timeNow = System.currentTimeMillis(); - + + String fId = createFolder(myNodeId, "f1-testUpdateOwner-"+RUNID).getId(); + + String childrenUrl = getNodeChildrenUrl(fId); + int folderCnt = 2; int fileCnt = 3; int objCnt = 4; @@ -2153,14 +2210,14 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest for (int i = 1; i <= folderCnt; i++) { - folderIds.add(createFolder(myNodeId, "folder "+i+" "+timeNow).getId()); + folderIds.add(createFolder(fId, "folder "+i+" "+RUNID).getId()); } // create some files List fileIds = new ArrayList<>(fileCnt); for (int i = 1; i <= fileCnt; i++) { - fileIds.add(createTextFile(myNodeId, "file "+i+" "+timeNow, "The quick brown fox jumps over the lazy dog "+i).getId()); + fileIds.add(createTextFile(fId, "file "+i+" "+RUNID, "The quick brown fox jumps over the lazy dog "+i).getId()); } // create some nodes (cmobject) @@ -2168,11 +2225,11 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest for (int i = 1; i <= objCnt; i++) { Node obj = new Node(); - obj.setName("obj "+i+" "+timeNow); + obj.setName("obj "+i+" "+RUNID); obj.setNodeType(TYPE_CM_OBJECT); // create node/object - HttpResponse response = post(myChildrenUrl, toJsonAsStringNonNull(obj), 201); + HttpResponse response = post(childrenUrl, toJsonAsStringNonNull(obj), 201); Node nodeResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Node.class); objIds.add(nodeResp.getId()); } @@ -2198,7 +2255,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest // no filtering - HttpResponse response = getAll(myChildrenUrl, paging, null, 200); + HttpResponse response = getAll(childrenUrl, paging, null, 200); List nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); checkNodeIds(nodes, allIds); @@ -2207,21 +2264,21 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest Map params = new HashMap<>(); params.put("where", "(nodeType='"+TYPE_CM_FOLDER+"')"); - response = getAll(myChildrenUrl, paging, params, 200); + response = getAll(childrenUrl, paging, params, 200); nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); checkNodeIds(nodes, folderIds); params = new HashMap<>(); params.put("where", "(isFolder=true)"); - response = getAll(myChildrenUrl, paging, params, 200); + response = getAll(childrenUrl, paging, params, 200); nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); checkNodeIds(nodes, folderIds); params = new HashMap<>(); params.put("where", "(isFolder=true AND isFile=false)"); - response = getAll(myChildrenUrl, paging, params, 200); + response = getAll(childrenUrl, paging, params, 200); nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); checkNodeIds(nodes, folderIds); @@ -2230,21 +2287,21 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest params = new HashMap<>(); params.put("where", "(nodeType='"+TYPE_CM_CONTENT+"')"); - response = getAll(myChildrenUrl, paging, params, 200); + response = getAll(childrenUrl, paging, params, 200); nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); checkNodeIds(nodes, fileIds); params = new HashMap<>(); params.put("where", "(isFile=true)"); - response = getAll(myChildrenUrl, paging, params, 200); + response = getAll(childrenUrl, paging, params, 200); nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); checkNodeIds(nodes, fileIds); params = new HashMap<>(); params.put("where", "(isFile=true AND isFolder=false)"); - response = getAll(myChildrenUrl, paging, params, 200); + response = getAll(childrenUrl, paging, params, 200); nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); checkNodeIds(nodes, fileIds); @@ -2253,21 +2310,21 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest params = new HashMap<>(); params.put("where", "(nodeType='"+TYPE_CM_OBJECT+"')"); - response = getAll(myChildrenUrl, paging, params, 200); + response = getAll(childrenUrl, paging, params, 200); nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); checkNodeIds(nodes, objIds); params = new HashMap<>(); params.put("where", "(nodeType='cm:cmobject INCLUDESUBTYPES')"); - response = getAll(myChildrenUrl, paging, params, 200); + response = getAll(childrenUrl, paging, params, 200); nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); checkNodeIds(nodes, allIds); params = new HashMap<>(); params.put("where", "(isFile=false AND isFolder=false)"); - response = getAll(myChildrenUrl, paging, params, 200); + response = getAll(childrenUrl, paging, params, 200); nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); checkNodeIds(nodes, objIds); @@ -2275,7 +2332,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest params = new HashMap<>(); params.put("where", "(isFile=false)"); - response = getAll(myChildrenUrl, paging, params, 200); + response = getAll(childrenUrl, paging, params, 200); nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); checkNodeIds(nodes, notFileIds); @@ -2283,23 +2340,23 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest params = new HashMap<>(); params.put("where", "(isFolder=false)"); - response = getAll(myChildrenUrl, paging, params, 200); + response = getAll(childrenUrl, paging, params, 200); nodes = RestApiUtil.parseRestApiEntries(response.getJsonResponse(), Node.class); checkNodeIds(nodes, notFolderIds); // -ve - node cannot be both a file and a folder params = new HashMap<>(); params.put("where", "(isFile=true AND isFolder=true)"); - getAll(myChildrenUrl, paging, params, 400); + getAll(childrenUrl, paging, params, 400); // -ve - nodeType and isFile/isFolder are mutually exclusive params = new HashMap<>(); params.put("where", "(nodeType='cm:object' AND isFolder=true)"); - getAll(myChildrenUrl, paging, params, 400); + getAll(childrenUrl, paging, params, 400); params = new HashMap<>(); params.put("where", "(nodeType='cm:object' AND isFile=true)"); - getAll(myChildrenUrl, paging, params, 400); + getAll(childrenUrl, paging, params, 400); } private void checkNodeIds(List nodes, List nodeIds) @@ -2321,11 +2378,9 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest String myNodeId = getMyNodeId(); UserInfo expectedUser = new UserInfo(user1, user1+" "+user1); String myChildrenUrl = getNodeChildrenUrl(myNodeId); - - long timeNow = System.currentTimeMillis(); - + // create folder f1 - Folder folderResp = createFolder(myNodeId, "f1 "+timeNow); + Folder folderResp = createFolder(myNodeId, "f1 "+RUNID); String f1Id = folderResp.getId(); // create empty file d1 in f1 @@ -2338,7 +2393,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest String d1Id = documentResp.getId(); // create folder f2 - folderResp = createFolder(myNodeId, "f2 "+timeNow); + folderResp = createFolder(myNodeId, "f2 "+RUNID); String f2Id = folderResp.getId(); // create folder link node in f2 (pointing to f1) @@ -2500,12 +2555,14 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest public void testCreateEmptyFile() throws Exception { setRequestContext(user1); - - String myNodeId = getMyNodeId(); + + // create folder f0 + String folder0Name = "f0-testCreateEmptyFile-"+RUNID; + String f0Id = createFolder(Nodes.PATH_MY, folder0Name).getId(); UserInfo expectedUser = new UserInfo(user1, user1+" "+user1); - String postUrl = getNodeChildrenUrl(myNodeId); + String postUrl = getNodeChildrenUrl(f0Id); Document d1 = new Document(); d1.setName("d1.txt"); @@ -2517,7 +2574,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest String d1Id = documentResp.getId(); d1.setIsFolder(false); - d1.setParentId(myNodeId); + d1.setParentId(f0Id); d1.setAspectNames(Collections.singletonList("cm:auditable")); d1.setCreatedByUser(expectedUser); @@ -2547,7 +2604,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest documentResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class); d2.setIsFolder(false); - d2.setParentId(myNodeId); + d2.setParentId(f0Id); d2.setAspectNames(Arrays.asList("cm:auditable","cm:titled")); d2.setCreatedByUser(expectedUser); @@ -2569,7 +2626,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest n.setRelativePath("/f1/f2"); // create node - response = post(getNodeChildrenUrl(myNodeId), RestApiUtil.toJsonAsStringNonNull(n), 201); + response = post(getNodeChildrenUrl(f0Id), RestApiUtil.toJsonAsStringNonNull(n), 201); documentResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Document.class); // check parent hierarchy ... @@ -2587,7 +2644,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest response = getSingle(NodesEntityResource.class, folderResp.getParentId(), null, 200); folderResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Folder.class); - assertEquals(myNodeId, folderResp.getId()); + assertEquals(f0Id, folderResp.getId()); // -ve test - name is mandatory Document invalid = new Document(); @@ -2640,17 +2697,19 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest public void testUpdateNodeInfo() throws Exception { setRequestContext(user1); - - String myNodeId = getMyNodeId(); + + // create folder f0 + String folder0Name = "f0-testUpdateNodeInfo-"+RUNID; + String f0Id = createFolder(Nodes.PATH_MY, folder0Name).getId(); UserInfo expectedUser = new UserInfo(user1, user1+" "+user1); - String postUrl = getNodeChildrenUrl(myNodeId); + String postUrl = getNodeChildrenUrl(f0Id); String folderName = "My Folder"; // create folder - Folder folderResp = createFolder(myNodeId, folderName); + Folder folderResp = createFolder(f0Id, folderName); String fId = folderResp.getId(); @@ -2659,7 +2718,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest f1.setNodeType(TYPE_CM_FOLDER); f1.setIsFolder(true); - f1.setParentId(myNodeId); + f1.setParentId(f0Id); f1.setAspectNames(Collections.singletonList("cm:auditable")); f1.setCreatedByUser(expectedUser); @@ -2679,7 +2738,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest String dId = documentResp.getId(); d1.setIsFolder(false); - d1.setParentId(myNodeId); + d1.setParentId(f0Id); d1.setAspectNames(Collections.singletonList("cm:auditable")); d1.setCreatedByUser(expectedUser); @@ -2829,7 +2888,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest // -ve test - try to move to a different parent using PUT (note: should use new POST /nodes/{nodeId}/move operation instead) - folderResp = createFolder(myNodeId, "folder 2"); + folderResp = createFolder(f0Id, "folder 2"); String f2Id = folderResp.getId(); fUpdate = new Folder(); @@ -2838,7 +2897,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest // ok - if parent does not change fUpdate = new Folder(); - fUpdate.setParentId(myNodeId); + fUpdate.setParentId(f0Id); put(URL_NODES, fId, toJsonAsStringNonNull(fUpdate), null, 200); // -ve test - minor: error code if trying to update property with invalid format (REPO-473) @@ -2859,10 +2918,10 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest { setRequestContext(user1); - // create folder f1 - String folderName = "f1 "+System.currentTimeMillis(); + // create folder f0 + String folderName = "f0-testUpdateOwner-"+RUNID; Folder folderResp = createFolder(Nodes.PATH_SHARED, folderName); - String f1Id = folderResp.getId(); + String f0Id = folderResp.getId(); assertNull(user1, folderResp.getProperties()); // owner is implied @@ -2872,14 +2931,14 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest Folder fUpdate = new Folder(); fUpdate.setProperties(props); - HttpResponse response = put(URL_NODES, f1Id, toJsonAsStringNonNull(fUpdate), null, 200); + HttpResponse response = put(URL_NODES, f0Id, toJsonAsStringNonNull(fUpdate), null, 200); folderResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Folder.class); assertEquals(user1, ((Map)folderResp.getProperties().get(PROP_OWNER)).get("id")); // create doc d1 - String d1Name = "content1 " + System.currentTimeMillis(); - String d1Id = createTextFile(f1Id, d1Name, "The quick brown fox jumps over the lazy dog.").getId(); + String d1Name = "content1 " + RUNID; + String d1Id = createTextFile(f0Id, d1Name, "The quick brown fox jumps over the lazy dog.").getId(); // get node info response = getSingle(NodesEntityResource.class, d1Id, null, 200); @@ -2953,10 +3012,10 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest // -ve test - user2 cannot delete the test folder/file - TODO is that expected ? setRequestContext(user2); - deleteNode(f1Id, 403); + deleteNode(f0Id, 403); setRequestContext(user1); - deleteNode(f1Id); + deleteNode(f0Id); } @@ -2969,10 +3028,10 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest public void testUpdateFileWithBinaryUpload() throws Exception { setRequestContext(user1); - + String myNodeId = getMyNodeId(); - String folderName = "f1 "+System.currentTimeMillis(); + String folderName = "f1-testUpdateFileWithBinaryUpload-"+RUNID; Folder folderResp = createFolder(myNodeId, folderName); String f1_nodeId = folderResp.getId(); @@ -3331,7 +3390,7 @@ public class NodeApiTest extends AbstractSingleNetworkSiteTest deleteNode(fileId, 403); // as admin ... - setRequestContext(DEFAULT_ADMIN); + setRequestContext(networkAdmin); response = publicApiClient.get(NodesEntityResource.class, folderId, null, params); nodeResp = RestApiUtil.parseRestApiEntry(response.getJsonResponse(), Node.class); diff --git a/source/test-java/org/alfresco/rest/api/tests/NodeAssociationsApiTest.java b/source/test-java/org/alfresco/rest/api/tests/NodeAssociationsApiTest.java index 5653138e9d..605e273f16 100644 --- a/source/test-java/org/alfresco/rest/api/tests/NodeAssociationsApiTest.java +++ b/source/test-java/org/alfresco/rest/api/tests/NodeAssociationsApiTest.java @@ -562,7 +562,7 @@ public class NodeAssociationsApiTest extends AbstractSingleNetworkSiteTest AuthenticationUtil.setFullyAuthenticatedUser(user1); permissionService.setPermission(new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, sf1Id), user2, PermissionService.EDITOR, true); - setRequestContext(DEFAULT_ADMIN); + setRequestContext(networkAdmin); response = publicApiClient.get(getScope(), "nodes/"+sf1Id+"/targets", null, null, null, createParams(paging, null)); checkStatus(200, response.getStatusCode()); @@ -579,7 +579,7 @@ public class NodeAssociationsApiTest extends AbstractSingleNetworkSiteTest tgt = new AssocTarget(u2o1Id, ASSOC_TYPE_CM_REFERENCES); post(getNodeTargetsUrl(sf1Id), toJsonAsStringNonNull(tgt), 201); - setRequestContext(DEFAULT_ADMIN); + setRequestContext(networkAdmin); response = publicApiClient.get(getScope(), "nodes/"+sf1Id+"/targets", null, null, null, createParams(paging, null)); checkStatus(200, response.getStatusCode()); @@ -606,7 +606,7 @@ public class NodeAssociationsApiTest extends AbstractSingleNetworkSiteTest AuthenticationUtil.setFullyAuthenticatedUser(user1); permissionService.setPermission(new NodeRef(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE, sf1Id), user2, PermissionService.EDITOR, true); - setRequestContext(DEFAULT_ADMIN); + setRequestContext(networkAdmin); response = publicApiClient.get(getScope(), "nodes/"+so1Id+"/sources", null, null, null, createParams(paging, null)); checkStatus(200, response.getStatusCode()); @@ -623,7 +623,7 @@ public class NodeAssociationsApiTest extends AbstractSingleNetworkSiteTest tgt = new AssocTarget(so1Id, ASSOC_TYPE_CM_REFERENCES); post(getNodeTargetsUrl(u2f1Id), toJsonAsStringNonNull(tgt), 201); - setRequestContext(DEFAULT_ADMIN); + setRequestContext(networkAdmin); response = publicApiClient.get(getScope(), "nodes/"+so1Id+"/sources", null, null, null, createParams(paging, null)); checkStatus(200, response.getStatusCode()); diff --git a/source/test-java/org/alfresco/rest/api/tests/PublicApiTestContext.java b/source/test-java/org/alfresco/rest/api/tests/PublicApiTestContext.java index f333753b02..afa4a183bc 100644 --- a/source/test-java/org/alfresco/rest/api/tests/PublicApiTestContext.java +++ b/source/test-java/org/alfresco/rest/api/tests/PublicApiTestContext.java @@ -1,28 +1,28 @@ -/* - * #%L - * Alfresco Remote API - * %% - * Copyright (C) 2005 - 2016 Alfresco Software Limited - * %% - * This file is part of the Alfresco software. - * If the software was purchased under a paid Alfresco license, the terms of - * the paid license agreement will prevail. Otherwise, the software is - * provided under the following open source license terms: - * - * Alfresco is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Alfresco is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Alfresco. If not, see . - * #L% - */ +/* + * #%L + * Alfresco Remote API + * %% + * Copyright (C) 2005 - 2016 Alfresco Software Limited + * %% + * This file is part of the Alfresco software. + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + * #L% + */ package org.alfresco.rest.api.tests; import java.util.ArrayList; @@ -90,9 +90,9 @@ public class PublicApiTestContext { StringBuilder sb = new StringBuilder(); sb.append(alias); - if(tenant != null && !tenant.equals(TenantService.DEFAULT_DOMAIN)) + if ((tenant != null) && (! tenant.equals(TenantService.DEFAULT_DOMAIN)) && (! alias.contains(TenantService.SEPARATOR))) { - sb.append("@"); + sb.append(TenantService.SEPARATOR); sb.append(tenant); } return sb.toString(); diff --git a/source/test-java/org/alfresco/rest/api/tests/RenditionsTest.java b/source/test-java/org/alfresco/rest/api/tests/RenditionsTest.java index d6c2ed87a6..811733cc20 100644 --- a/source/test-java/org/alfresco/rest/api/tests/RenditionsTest.java +++ b/source/test-java/org/alfresco/rest/api/tests/RenditionsTest.java @@ -107,7 +107,7 @@ public class RenditionsTest extends AbstractBaseApiTest public void tearDown() throws Exception { setRequestContext(networkOne.getId(), userOneN1.getId(), null); - deleteSite(userOneN1Site.getId(), 204); + deleteSite(userOneN1Site.getId(), true, 204); } /** diff --git a/source/test-java/org/alfresco/rest/api/tests/RepoService.java b/source/test-java/org/alfresco/rest/api/tests/RepoService.java index 538bbf967a..349f44e97e 100644 --- a/source/test-java/org/alfresco/rest/api/tests/RepoService.java +++ b/source/test-java/org/alfresco/rest/api/tests/RepoService.java @@ -407,8 +407,24 @@ public class RepoService { return getOrCreateUser(personInfo, username, network, false); } + + public final static String DEFAULT_ADMIN = "admin"; + public final static String DEFAULT_ADMIN_PWD = "admin"; + + // TODO improve admin-related API tests (including ST vs MT) + private boolean isDefaultAdmin(String username, TestNetwork network) + { + if ((network == null) || (TenantService.DEFAULT_DOMAIN.equals(network.getId()))) + { + return (DEFAULT_ADMIN.equalsIgnoreCase(username)); + } + else + { + return ((DEFAULT_ADMIN+"@"+network.getId()).equalsIgnoreCase(username)); + } + } - // TODO review delete person + // TODO review delete person public TestPerson getOrCreateUser(final PersonInfo personInfo, final String username, final TestNetwork network, final boolean deletePerson) { return AuthenticationUtil.runAsSystem(new RunAsWork() @@ -423,8 +439,8 @@ public class RepoService final Map props = testPerson.getProperties(); - // short-circuit for default "admin" - if (! username.equalsIgnoreCase("admin")) + // short-circuit for default/tenant "admin" + if (! isDefaultAdmin(username, network)) { NodeRef personNodeRef = personService.getPersonOrNull(username); @@ -1331,7 +1347,7 @@ public class RepoService { if(!getId().equals(TenantService.DEFAULT_DOMAIN) && !tenantAdminService.existsTenant(getId())) { - tenantAdminService.createTenant(getId(), "admin".toCharArray()); + tenantAdminService.createTenant(getId(), DEFAULT_ADMIN_PWD.toCharArray()); numNetworks++; log("Created network " + getId()); } diff --git a/source/test-java/org/alfresco/rest/api/tests/SharedLinkApiTest.java b/source/test-java/org/alfresco/rest/api/tests/SharedLinkApiTest.java index bbe97e131b..5387b3d1f3 100644 --- a/source/test-java/org/alfresco/rest/api/tests/SharedLinkApiTest.java +++ b/source/test-java/org/alfresco/rest/api/tests/SharedLinkApiTest.java @@ -667,13 +667,14 @@ public class SharedLinkApiTest extends AbstractBaseApiTest * {@literal :/alfresco/api//public/alfresco/versions/1/shared-links//renditions//content} * */ + // TODO now covered by testSharedLinkCreateGetDelete ? (since base class now uses tenant context by default) @Test public void testSharedLinkCreateGetDelete_MultiTenant() throws Exception { - // As userOneN1 - setRequestContext(networkOne.getId(), userOneN1.getId(), null); + // As user1 + setRequestContext(user1); - String docLibNodeId = getSiteContainerNodeId(userOneN1SiteId, "documentLibrary"); + String docLibNodeId = getSiteContainerNodeId(tSiteId, "documentLibrary"); String folderName = "folder" + System.currentTimeMillis() + "_1"; String folderId = createFolder(docLibNodeId, folderName, null).getId(); @@ -705,7 +706,7 @@ public class SharedLinkApiTest extends AbstractBaseApiTest assertEquals(d1Id, resp.getNodeId()); assertEquals(fileName1, resp.getName()); assertEquals(file1_MimeType, resp.getContent().getMimeType()); - assertEquals(userOneN1.getId(), resp.getSharedByUser().getId()); + assertEquals(user1, resp.getSharedByUser().getId()); // allowable operations not included - no params response = getSingle(QuickShareLinkEntityResource.class, shared1Id, null, 200); @@ -764,7 +765,7 @@ public class SharedLinkApiTest extends AbstractBaseApiTest assertEquals(0, renditions.size()); // create rendition of pdf doc - note: for some reason create rendition of txt doc fail on build m/c (TBC) ? - setRequestContext(userOneN1.getId()); + setRequestContext(user1); Rendition rendition = createAndGetRendition(d1Id, "doclib"); assertNotNull(rendition); @@ -807,7 +808,7 @@ public class SharedLinkApiTest extends AbstractBaseApiTest getSingle(URL_SHARED_LINKS, shared1Id + "/renditions/doclib/content", null, headers, 304); // -ve test - userTwoN1 cannot delete shared link - setRequestContext(userTwoN1.getId()); + setRequestContext(user2); deleteSharedLink(shared1Id, 403); // -ve test - unauthenticated @@ -815,7 +816,7 @@ public class SharedLinkApiTest extends AbstractBaseApiTest deleteSharedLink(shared1Id, 401); // delete shared link - setRequestContext(userOneN1.getId()); + setRequestContext(user1); deleteSharedLink(shared1Id); }