Skip to content

Extract CreateProjectCommand and prepare to move to remote api #1179

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jul 25, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 93 additions & 0 deletions src/org/labkey/remoteapi/admin/CreateProjectCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package org.labkey.remoteapi.admin;

import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.message.BasicNameValuePair;
import org.labkey.remoteapi.CommandResponse;
import org.labkey.remoteapi.PostCommand;

import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;

public class CreateProjectCommand extends PostCommand<CommandResponse>
{
private String _name;
private String _folderType;
private boolean _assignProjectAdmin = false;
private String _templateSourceId;
private boolean _templateIncludeSubfolders = false;
private List<String> _templateWriterTypes = List.of();

public CreateProjectCommand()
{
super("admin", "createProject");
}

public CreateProjectCommand setName(String name)
{
_name = name;
return this;
}

public CreateProjectCommand setFolderType(String folderType)
{
_folderType = folderType;
return this;
}

public CreateProjectCommand setAssignProjectAdmin(boolean assignProjectAdmin)
{
_assignProjectAdmin = assignProjectAdmin;
return this;
}

public CreateProjectCommand setTemplateSourceId(String templateSourceId)
{
_templateSourceId = templateSourceId;
return this;
}

public CreateProjectCommand setTemplateIncludeSubfolders(boolean templateIncludeSubfolders)
{
_templateIncludeSubfolders = templateIncludeSubfolders;
return this;
}

public CreateProjectCommand setTemplateWriterTypes(String... templateWriterTypes)
{
_templateWriterTypes = List.of(templateWriterTypes);
return this;
}

@Override
protected HttpUriRequest createRequest(URI uri)
{
// CreateProjectAction is not a real API action, so we POST form data instead of JSON

List<BasicNameValuePair> postData = new ArrayList<>();
postData.add(new BasicNameValuePair("name", _name));
postData.add(new BasicNameValuePair("folderType", _folderType));
postData.add(new BasicNameValuePair("assignProjectAdmin", Boolean.toString(_assignProjectAdmin)));

if ("Template".equals(_folderType))
{
postData.add(new BasicNameValuePair("templateSourceId", _templateSourceId));
postData.add(new BasicNameValuePair("templateIncludeSubfolders", Boolean.toString(_templateIncludeSubfolders)));
_templateWriterTypes.forEach(type -> postData.add(new BasicNameValuePair("templateWriterTypes", type)));
}

try
{
HttpPost request = new HttpPost(uri);
request.setEntity(new UrlEncodedFormEntity(postData));
return request;
}
catch (UnsupportedEncodingException e)
{
throw new RuntimeException(e);
}
}
}
105 changes: 33 additions & 72 deletions src/org/labkey/test/tests/ProjectCreatorUserTest.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,12 @@
package org.labkey.test.tests;

import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.message.BasicNameValuePair;
import org.jetbrains.annotations.Nullable;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.labkey.remoteapi.CommandException;
import org.labkey.remoteapi.CommandResponse;
import org.labkey.remoteapi.PostCommand;
import org.labkey.remoteapi.admin.CreateProjectCommand;
import org.labkey.test.BaseWebDriverTest;
import org.labkey.test.Locator;
import org.labkey.test.TestFileUtils;
Expand All @@ -24,14 +19,8 @@
import org.openqa.selenium.WebElement;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
Expand Down Expand Up @@ -101,11 +90,11 @@ public void testCreateProjectByProjectCreator() throws IOException
log("Project Creator creating the project with admin permission");
goToHome();
impersonate(PROJECT_CREATOR_USER);
Map<String, Object> params = new HashMap<>();
params.put("name", PROJECT_NAME_PC);
params.put("assignProjectAdmin", "true");
params.put("folderType", "Collaboration");
createProject(params);
CreateProjectCommand command = new CreateProjectCommand()
.setName(PROJECT_NAME_PC)
.setAssignProjectAdmin(true)
.setFolderType("Collaboration");
createProject(command);
stopImpersonating();

log("Verifying the permissions");
Expand All @@ -119,11 +108,11 @@ public void testCreateProjectByProjectCreator() throws IOException
log("Project Creator creating the project without admin permission");
goToHome();
impersonate(PROJECT_CREATOR_USER);
params = new HashMap<>();
params.put("name", PROJECT_NAME_PC);
params.put("assignProjectAdmin", "false");
params.put("folderType", "Collaboration");
createProject(params);
command = new CreateProjectCommand()
.setName(PROJECT_NAME_PC)
.setAssignProjectAdmin(false)
.setFolderType("Collaboration");
createProject(command);
stopImpersonating();

log("Verifying the permissions");
Expand All @@ -137,11 +126,11 @@ public void testCreateProjectByReader() throws IOException
log("Verifying Reader creating the project fails");
goToHome();
impersonate(READER);
Map<String, Object> params = new HashMap<>();
params.put("name", PROJECT_NAME_PC);
params.put("assignProjectAdmin", "false");
params.put("folderType", "Collaboration");
String response = createProject(params);
CreateProjectCommand command = new CreateProjectCommand()
.setName(PROJECT_NAME_PC)
.setAssignProjectAdmin(false)
.setFolderType("Collaboration");
String response = createProject(command);
stopImpersonating();

assertEquals("Should not be able to create the project", "403 : Forbidden", response);
Expand All @@ -154,13 +143,14 @@ public void testCreateProjectByTemplate() throws IOException, CommandException
String containerId = ((APIContainerHelper) _containerHelper).getContainerId(TEMPLATE_PROJECT);
goToHome();
impersonate(PROJECT_CREATOR_USER);
Map<String, Object> params = new HashMap<>();
params.put("name", PROJECT_NAME_PC);
params.put("assignProjectAdmin", "true");
params.put("folderType", "Template");
params.put("templateSourceId", containerId);
params.put("templateWriterTypes", "Lists");
createProject(params);
CreateProjectCommand command = new CreateProjectCommand()
.setName(PROJECT_NAME_PC)
.setAssignProjectAdmin(true)
.setFolderType("Template")
.setTemplateSourceId(containerId)
.setTemplateIncludeSubfolders(true)
.setTemplateWriterTypes("Lists");
createProject(command);
stopImpersonating();

goToProjectHome(PROJECT_NAME_PC);
Expand All @@ -182,14 +172,14 @@ public void testCreateProjectByTemplateWithSubfolderAndPermission() throws Comma

goToHome();
impersonate(PROJECT_CREATOR_USER);
Map<String, Object> params = new HashMap<>();
params.put("name", PROJECT_NAME_PC);
params.put("assignProjectAdmin", "true");
params.put("folderType", "Template");
params.put("templateSourceId", containerId);
params.put("templateIncludeSubfolders", "true");
params.put("templateWriterTypes", List.of("Role assignments for users and groups", "Project-level groups and members"));
createProject(params);
CreateProjectCommand command = new CreateProjectCommand()
.setName(PROJECT_NAME_PC)
.setAssignProjectAdmin(true)
.setFolderType("Template")
.setTemplateSourceId(containerId)
.setTemplateIncludeSubfolders(true)
.setTemplateWriterTypes("Role assignments for users and groups", "Project-level groups and members");
createProject(command);
stopImpersonating();

assertTrue(projectMenu().projectLinkExists(PROJECT_NAME_PC));
Expand All @@ -199,37 +189,8 @@ public void testCreateProjectByTemplateWithSubfolderAndPermission() throws Comma
goToFolderPermissions().isUserInGroup(PROJECT_CREATOR_USER, TEMPLATE_FOLDER_PERMISSION, PermissionsHelper.PrincipalType.USER);
}

private String createProject(Map<String, Object> params) throws IOException
private String createProject(CreateProjectCommand command) throws IOException
{
// CreateProjectAction is not a real API action, so we POST form data not JSON
PostCommand<CommandResponse> command = new PostCommand<>("admin", "createProject")
{
@Override
protected HttpUriRequest createRequest(URI uri)
{
List<BasicNameValuePair> postData = new ArrayList<>();

params.forEach((k, v) -> {
// Expand any collections into multiple individual params
if (v instanceof Collection<?> col)
col.forEach(val -> postData.add(new BasicNameValuePair(k, String.valueOf(val))));
else
postData.add(new BasicNameValuePair(k, String.valueOf(v)));
});

try
{
HttpPost request = new HttpPost(uri);
request.setEntity(new UrlEncodedFormEntity(postData));
return request;
}
catch (UnsupportedEncodingException e)
{
throw new RuntimeException(e);
}
}
};

try
{
command.execute(getRemoteApiConnection(), "/");
Expand Down