package test.org.korsakow.command;
import java.io.File;
import org.dsrg.soenea.domain.command.CommandException;
import org.dsrg.soenea.uow.UoW;
import org.junit.Assert;
import org.junit.Test;
import org.korsakow.domain.CommandExecutor;
import org.korsakow.domain.command.AbstractCommand;
import org.korsakow.domain.command.Helper;
import org.korsakow.ide.DataRegistry;
import org.korsakow.ide.util.DomUtil;
import test.util.DomainTestUtil;
public class TestCommandExecutor {
@Test public void testRollbackOnException() throws Exception
{
File dataFile = File.createTempFile("TestCommandExecutor", "testRollbackOnException");
dataFile.deleteOnExit();
DomainTestUtil.setupDataRegistry(dataFile);
DomUtil.appendTextNode(DataRegistry.getDocument(), DataRegistry.getDocument().getDocumentElement(), "version0Node", "version0Value");
DataRegistry.commit();
DataRegistry.flush();
try {
CommandExecutor.executeCommand(testRollbackOnExceptionCommand.class);
throw new Exception("expected an exception");
} catch (CommandException e) {
// expected
}
Assert.assertEquals("version0Value", DomUtil.getString(DataRegistry.getDocument().getDocumentElement(), "version0Node"));
Assert.assertNull("commandValue", DomUtil.getString(DataRegistry.getDocument().getDocumentElement(), "commandNode"));
}
public static class testRollbackOnExceptionCommand extends AbstractCommand
{
public testRollbackOnExceptionCommand(Helper request, Helper response) {
super(request, response);
}
public void execute() throws CommandException {
DomUtil.appendTextNode(DataRegistry.getDocument(), DataRegistry.getDocument().getDocumentElement(), "commandNode", "commandValue");
throw new CommandException();
}
}
@Test public void testRollbackWhenNoCommit() throws Exception
{
File dataFile = File.createTempFile("TestCommandExecutor", "testRollbackOnException");
dataFile.deleteOnExit();
DomainTestUtil.setupDataRegistry(dataFile);
DomUtil.appendTextNode(DataRegistry.getDocument(), DataRegistry.getDocument().getDocumentElement(), "version0Node", "version0Value");
DataRegistry.commit();
DataRegistry.flush();
CommandExecutor.executeCommand(testRollbackWhenNoCommitCommand.class);
Assert.assertEquals("version0Value", DomUtil.getString(DataRegistry.getDocument().getDocumentElement(), "version0Node"));
Assert.assertNull("commandValue", DomUtil.getString(DataRegistry.getDocument().getDocumentElement(), "commandNode"));
}
public static class testRollbackWhenNoCommitCommand extends AbstractCommand
{
public testRollbackWhenNoCommitCommand(Helper request, Helper response) {
super(request, response);
}
public void execute() throws CommandException {
DomUtil.appendTextNode(DataRegistry.getDocument(), DataRegistry.getDocument().getDocumentElement(), "commandNode", "commandValue");
}
}
@Test public void testCommitKeepsChanges() throws Exception
{
File dataFile = File.createTempFile("TestCommandExecutor", "testRollbackOnException");
dataFile.deleteOnExit();
DomainTestUtil.setupDataRegistry(dataFile);
DomUtil.appendTextNode(DataRegistry.getDocument(), DataRegistry.getDocument().getDocumentElement(), "version0Node", "version0Value");
DataRegistry.commit();
DataRegistry.flush();
CommandExecutor.executeCommand(testCommitKeepsChangesCommand.class);
Assert.assertEquals("version0Value", DomUtil.getString(DataRegistry.getDocument().getDocumentElement(), "version0Node"));
Assert.assertEquals("commandValue", DomUtil.getString(DataRegistry.getDocument().getDocumentElement(), "commandNode"));
}
public static class testCommitKeepsChangesCommand extends AbstractCommand
{
public testCommitKeepsChangesCommand(Helper request, Helper response) {
super(request, response);
}
public void execute() throws CommandException {
DomUtil.appendTextNode(DataRegistry.getDocument(), DataRegistry.getDocument().getDocumentElement(), "commandNode", "commandValue");
try {
UoW.getCurrent().commit();
} catch (Exception e) {
throw new CommandException(e);
}
}
}
}