Skip to content

Commit

Permalink
The CreateDatasetVersionCommand is now testible, and has unit tests (…
Browse files Browse the repository at this point in the history
…re: #2746)
  • Loading branch information
michbarsinai committed Dec 31, 2015
1 parent a2dadfd commit 35f1f8c
Show file tree
Hide file tree
Showing 8 changed files with 253 additions and 7 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,4 @@ scripts/api/py_api_wrapper/local-data/*
doc/sphinx-guides/build
faces-config.NavData
src/main/java/BuildNumber.properties
/nbproject/
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,12 @@ public boolean isUniqueIdentifier(String userIdentifier, String protocol, String
return u;
}

public DatasetVersion storeVersion( DatasetVersion dsv ) {
em.persist(dsv);
return dsv;
}


public String createCitationRIS(DatasetVersion version) {
return createCitationRIS(version, null);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,13 @@
*/
public interface CommandContext {

/**
* Note: While this method is not deprecated *yet*, please consider not using it,
* and using a method on the service bean instead. Using the em directly makes
* the command less testable.
*
* @return the entity manager
*/
public EntityManager em();

public DataverseEngine engine();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public class DataverseRequest {

private final User user;
private final IpAddress sourceAddress;

public DataverseRequest(User aUser, HttpServletRequest aHttpServletRequest) {
this.user = aUser;
String remoteAddressStr = null;
Expand All @@ -37,6 +37,11 @@ public DataverseRequest(User aUser, HttpServletRequest aHttpServletRequest) {
sourceAddress = IpAddress.valueOf( remoteAddressStr );
}

public DataverseRequest( User aUser, IpAddress aSourceAddress ) {
user = aUser;
sourceAddress = aSourceAddress;
}

public User getUser() {
return user;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ public DatasetVersion execute(CommandContext ctxt) throws CommandException {
throw new IllegalCommandException("Latest version is already a draft. Cannot add another draft", this);
}
}
newVersion.setDataset(dataset);
newVersion.setDatasetFields(newVersion.initDatasetFields());

Set<ConstraintViolation> constraintViolations = newVersion.validate();
Expand Down Expand Up @@ -78,7 +79,6 @@ public DatasetVersion execute(CommandContext ctxt) throws CommandException {
FileMetadata fmdCopy = fmd.createCopy();
fmdCopy.setDatasetVersion(newVersion);
newVersionMetadatum.add( fmdCopy );
logger.info( "added file metadata " + fmdCopy );
}
newVersion.setFileMetadatas(newVersionMetadatum);

Expand All @@ -88,12 +88,16 @@ public DatasetVersion execute(CommandContext ctxt) throws CommandException {
newVersion.setLastUpdateTime(now);
dataset.setModificationTime(now);
newVersion.setDataset(dataset);
ctxt.em().persist(newVersion);

final List<DatasetVersion> currentVersions = dataset.getVersions();
ArrayList<DatasetVersion> dsvs = new ArrayList<>(currentVersions.size());
dsvs.addAll(currentVersions);
dsvs.set(0, newVersion);
dataset.setVersions( dsvs );

// TODO make async
// ctxt.index().indexDataset(dataset);
// ctxt.index().indexDataset(dataset);
return ctxt.datasets().storeVersion(newVersion);

return newVersion;
}

}
108 changes: 108 additions & 0 deletions src/test/java/edu/harvard/iq/dataverse/engine/MocksFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
package edu.harvard.iq.dataverse.engine;

import edu.harvard.iq.dataverse.DataFile;
import edu.harvard.iq.dataverse.Dataset;
import edu.harvard.iq.dataverse.DatasetFieldType;
import edu.harvard.iq.dataverse.Dataverse;
import edu.harvard.iq.dataverse.MetadataBlock;
import edu.harvard.iq.dataverse.authorization.groups.impl.ipaddress.ip.IpAddress;
import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser;
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.Month;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

/**
* A utility class for creating mock objects for unit tests. Mostly, the non-parameter
* methods created objects with reasonable defaults that should fit most tests.
* Of course, feel free to change of make these mocks more elaborate as the code
* evolves.
*
* @author michael
*/
public class MocksFactory {

private static final AtomicInteger NEXT_ID = new AtomicInteger();

public static Long nextId() {
return Long.valueOf( NEXT_ID.incrementAndGet() );
}

public static Date date(int year, int month, int day ) {
return new Date( LocalDate.of(year, Month.of(month), day).toEpochDay() );
}

public static Timestamp timestamp(int year, int month, int day ) {
return new Timestamp( date(year, month, day).getTime() );
}

public static DataFile makeDataFile() {
DataFile retVal = new DataFile();
retVal.setId( nextId() );
retVal.setContentType("application/unitTests");
retVal.setCreateDate( new Timestamp(System.currentTimeMillis()) );
retVal.setModificationTime( retVal.getCreateDate() );
return retVal;
}

public static List<DataFile> makeFiles( int count ) {
List<DataFile> retVal = new ArrayList<>(count);
for ( int i=0; i<count; i++ ) {
retVal.add( makeDataFile() );
}
return retVal;
}

public static AuthenticatedUser makeAuthentiucatedUser( String firstName, String lastName ) {
AuthenticatedUser user = new AuthenticatedUser();
user.setId( nextId() );
user.setAffiliation("UnitTester");
user.setEmail( firstName + "." + lastName + "@someU.edu" );
user.setLastName(lastName);
user.setFirstName(firstName);
user.setPosition("In-Memory user");
user.setUserIdentifier("unittest" + user.getId() );
return user;
}

public static DataverseRequest makeDatasetRequest() {
return new DataverseRequest( makeAuthentiucatedUser("Jane", "Doe"), IpAddress.valueOf("215.0.2.17") );
}

public static Dataverse makeDataverse() {
Dataverse retVal = new Dataverse();
retVal.setId( nextId() );

retVal.setAffiliation("Unit Test U");
retVal.setAlias("unitTest" + retVal.getId());
retVal.setCreateDate(timestamp(2012,4,5));
retVal.setMetadataBlockRoot(true);
retVal.setName("UnitTest Dataverse #" + retVal.getId());

MetadataBlock mtb = new MetadataBlock();
mtb.setDisplayName("Test Block #1-" + retVal.getId());
mtb.setId(nextId());
mtb.setDatasetFieldTypes( Arrays.asList(
new DatasetFieldType("JustAString", DatasetFieldType.FieldType.TEXT, false),
new DatasetFieldType("ManyStrings", DatasetFieldType.FieldType.TEXT, true),
new DatasetFieldType("AnEmail", DatasetFieldType.FieldType.EMAIL, false)
));

retVal.setMetadataBlocks( Arrays.asList(mtb) );

return retVal;
}

public static Dataset makeDataset() {
Dataset ds = new Dataset();
ds.setIdentifier("sample-ds");
ds.setFiles( makeFiles(10) );
ds.setOwner( makeDataverse() );
return ds;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
/*
* (C) Michael Bar-Sinai
*/
package edu.harvard.iq.dataverse.engine.command.impl;

import edu.harvard.iq.dataverse.Dataset;
import edu.harvard.iq.dataverse.DatasetServiceBean;
import edu.harvard.iq.dataverse.DatasetVersion;
import edu.harvard.iq.dataverse.engine.MocksFactory;
import static edu.harvard.iq.dataverse.engine.MocksFactory.*;
import edu.harvard.iq.dataverse.engine.TestCommandContext;
import edu.harvard.iq.dataverse.engine.TestDataverseEngine;
import edu.harvard.iq.dataverse.engine.command.exception.IllegalCommandException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.junit.After;
import org.junit.AfterClass;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

/**
*
* @author michael
*/
public class CreateDatasetVersionCommandTest {

public CreateDatasetVersionCommandTest() {
}

@BeforeClass
public static void setUpClass() {
}

@AfterClass
public static void tearDownClass() {
}

@Before
public void setUp() {
}

@After
public void tearDown() {
}

@Test
public void testSimpleVersionAddition() throws Exception {
SimpleDateFormat dateFmt = new SimpleDateFormat("yyyyMMdd");
// Create Dataset
Dataset ds = makeDataset();

// Populate the Initial version
DatasetVersion dsvInitial = ds.getEditVersion();
dsvInitial.setCreateTime( dateFmt.parse("20001012") );
dsvInitial.setLastUpdateTime( dsvInitial.getLastUpdateTime() );
dsvInitial.setId( MocksFactory.nextId() );
dsvInitial.setReleaseTime( dateFmt.parse("20010101") );
dsvInitial.setVersionState(DatasetVersion.VersionState.RELEASED);
dsvInitial.setMinorVersionNumber(0l);
dsvInitial.setVersionNumber(1l);

// Create version to be added
DatasetVersion dsvNew = new DatasetVersion();
dsvNew.setVersionState(DatasetVersion.VersionState.DRAFT);

// Execute
CreateDatasetVersionCommand sut = new CreateDatasetVersionCommand( makeDatasetRequest(), ds, dsvNew );

final MockDatasetServiceBean serviceBean = new MockDatasetServiceBean();
TestDataverseEngine testEngine = new TestDataverseEngine( new TestCommandContext(){
@Override public DatasetServiceBean datasets() { return serviceBean; }
} );

testEngine.submit(sut);

// asserts
assertTrue( serviceBean.storeVersionCalled );
Date dsvCreationDate = dsvNew.getCreateTime();
assertEquals( dsvCreationDate, dsvNew.getLastUpdateTime() );
assertEquals( dsvCreationDate.getTime(), ds.getModificationTime().getTime() );
assertEquals( ds, dsvNew.getDataset() );
assertEquals( dsvNew, ds.getEditVersion() );
}

@Test(expected=IllegalCommandException.class)
public void testCantCreateTwoDraftVersions() throws Exception {
DatasetVersion dsvNew = new DatasetVersion();
dsvNew.setVersionState(DatasetVersion.VersionState.DRAFT);

// Execute
CreateDatasetVersionCommand sut = new CreateDatasetVersionCommand( makeDatasetRequest(), makeDataset(), dsvNew );

TestDataverseEngine testEngine = new TestDataverseEngine( new TestCommandContext() );

testEngine.submit(sut);
}


static class MockDatasetServiceBean extends DatasetServiceBean {

boolean storeVersionCalled = false;

@Override
public DatasetVersion storeVersion(DatasetVersion dsv) {
storeVersionCalled = true;
dsv.setId( nextId() );
return dsv;
}

}

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package edu.harvard.iq.dataverse.engine.command;
package edu.harvard.iq.dataverse.engine.command.impl;

import edu.harvard.iq.dataverse.engine.command.impl.MoveDataverseCommand;
import edu.harvard.iq.dataverse.Dataverse;
Expand Down

0 comments on commit 35f1f8c

Please sign in to comment.