package edu.harvard.iq.dataverse.engine.command.impl; import edu.harvard.iq.dataverse.Dataset; import edu.harvard.iq.dataverse.DatasetVersion; import edu.harvard.iq.dataverse.DataverseRoleServiceBean; import edu.harvard.iq.dataverse.RoleAssignment; import edu.harvard.iq.dataverse.authorization.DataverseRole; import edu.harvard.iq.dataverse.authorization.users.PrivateUrlUser; import edu.harvard.iq.dataverse.engine.TestCommandContext; import edu.harvard.iq.dataverse.engine.TestDataverseEngine; import edu.harvard.iq.dataverse.engine.command.exception.CommandException; import edu.harvard.iq.dataverse.privateurl.PrivateUrl; import edu.harvard.iq.dataverse.privateurl.PrivateUrlServiceBean; import edu.harvard.iq.dataverse.util.SystemConfig; import java.util.ArrayList; import java.util.List; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; public class CreatePrivateUrlCommandTest { private TestDataverseEngine testEngine; private Dataset dataset; private final Long privateUrlAlreadyExists = 1l; private final Long latestVersionIsNotDraft = 2l; private final Long createDatasetLong = 3l; @Before public void setUp() { dataset = new Dataset(); testEngine = new TestDataverseEngine(new TestCommandContext() { @Override public PrivateUrlServiceBean privateUrl() { return new PrivateUrlServiceBean() { @Override public PrivateUrl getPrivateUrlFromDatasetId(long datasetId) { if (datasetId == privateUrlAlreadyExists) { Dataset dataset = new Dataset(); dataset.setId(privateUrlAlreadyExists); String token = null; PrivateUrlUser privateUrlUser = new PrivateUrlUser(datasetId); RoleAssignment roleAssignment = new RoleAssignment(null, privateUrlUser, dataset, token); return new PrivateUrl(roleAssignment, dataset, "FIXME"); } else if (datasetId == latestVersionIsNotDraft) { return null; } else { return null; } } }; } @Override public DataverseRoleServiceBean roles() { return new DataverseRoleServiceBean() { @Override public DataverseRole findBuiltinRoleByAlias(String alias) { return new DataverseRole(); } @Override public RoleAssignment save(RoleAssignment assignment) { // no-op return assignment; } }; } @Override public SystemConfig systemConfig() { return new SystemConfig() { @Override public String getDataverseSiteUrl() { return "https://dataverse.example.edu"; } }; } } ); } @Test public void testDatasetNull() { dataset = null; String expected = "Can't create Private URL. Dataset is null."; String actual = null; PrivateUrl privateUrl = null; try { privateUrl = testEngine.submit(new CreatePrivateUrlCommand(null, dataset)); } catch (CommandException ex) { actual = ex.getMessage(); } assertEquals(expected, actual); assertNull(privateUrl); } @Test public void testAlreadyExists() { dataset.setId(privateUrlAlreadyExists); String expected = "Private URL already exists for dataset id " + privateUrlAlreadyExists + "."; String actual = null; PrivateUrl privateUrl = null; try { privateUrl = testEngine.submit(new CreatePrivateUrlCommand(null, dataset)); } catch (CommandException ex) { actual = ex.getMessage(); } assertEquals(expected, actual); assertNull(privateUrl); } @Test public void testAttemptCreatePrivateUrlOnNonDraft() { dataset = new Dataset(); List<DatasetVersion> versions = new ArrayList<>(); DatasetVersion datasetVersion = new DatasetVersion(); datasetVersion.setVersionState(DatasetVersion.VersionState.RELEASED); versions.add(datasetVersion); dataset.setVersions(versions); dataset.setId(latestVersionIsNotDraft); String expected = "Can't create Private URL because the latest version of dataset id " + latestVersionIsNotDraft + " is not a draft."; String actual = null; PrivateUrl privateUrl = null; try { privateUrl = testEngine.submit(new CreatePrivateUrlCommand(null, dataset)); } catch (CommandException ex) { actual = ex.getMessage(); } assertEquals(expected, actual); assertNull(privateUrl); } @Test public void testCreatePrivateUrlSuccessfully() throws CommandException { dataset = new Dataset(); dataset.setId(createDatasetLong); PrivateUrl privateUrl = testEngine.submit(new CreatePrivateUrlCommand(null, dataset)); assertNotNull(privateUrl); assertNotNull(privateUrl.getDataset()); assertNotNull(privateUrl.getRoleAssignment()); PrivateUrlUser expectedUser = new PrivateUrlUser(dataset.getId()); assertEquals(expectedUser.getIdentifier(), privateUrl.getRoleAssignment().getAssigneeIdentifier()); assertEquals(expectedUser.isSuperuser(), false); assertEquals(expectedUser.isBuiltInUser(), false); assertEquals(expectedUser.isAuthenticated(), false); assertEquals(expectedUser.getDisplayInfo().getTitle(), "Private URL Enabled"); assertNotNull(privateUrl.getToken()); assertEquals("https://dataverse.example.edu/privateurl.xhtml?token=" + privateUrl.getToken(), privateUrl.getLink()); } }