package org.ocpsoft.rewrite.servlet.event;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.ocpsoft.rewrite.context.EvaluationContext;
import org.ocpsoft.rewrite.event.Flow;
import org.ocpsoft.rewrite.mock.MockEvaluationContext;
import org.ocpsoft.rewrite.servlet.event.BaseRewrite.ServletRewriteFlow;
import org.ocpsoft.rewrite.test.MockServletRewrite;
public class SubflowTaskTest
{
private ServletRewrite<?, ?> rewrite;
@Before
public void before()
{
rewrite = new MockServletRewrite(null, null, null);
}
@Test
public void testSubflowRestoresOriginalFlowState()
{
rewrite.setFlow(ServletRewriteFlow.REDIRECT_PERMANENT);
Flow result = SubflowTask.perform(rewrite, new MockEvaluationContext(), new SubflowTask() {
@Override
public void performInSubflow(ServletRewrite<?, ?> event, EvaluationContext context)
{
Assert.assertEquals(ServletRewriteFlow.REDIRECT_PERMANENT, rewrite.getFlow());
event.setFlow(ServletRewriteFlow.HANDLED);
}
});
Assert.assertEquals(ServletRewriteFlow.HANDLED, result);
Assert.assertEquals(ServletRewriteFlow.REDIRECT_PERMANENT, rewrite.getFlow());
}
@Test
public void testSubflowRestoresOriginalFlowStateWithInitializedFlow()
{
rewrite.setFlow(ServletRewriteFlow.REDIRECT_PERMANENT);
Flow result = SubflowTask.perform(rewrite, new MockEvaluationContext(), ServletRewriteFlow.INCLUDE,
new SubflowTask() {
@Override
public void performInSubflow(ServletRewrite<?, ?> event, EvaluationContext context)
{
Assert.assertEquals(ServletRewriteFlow.INCLUDE, rewrite.getFlow());
event.setFlow(ServletRewriteFlow.HANDLED);
}
});
Assert.assertEquals(ServletRewriteFlow.HANDLED, result);
Assert.assertEquals(ServletRewriteFlow.REDIRECT_PERMANENT, rewrite.getFlow());
}
@Test
public void testSubflowRestoresOriginalFlowStateAfterException()
{
rewrite.setFlow(ServletRewriteFlow.REDIRECT_PERMANENT);
Flow result = null;
try {
result = SubflowTask.perform(rewrite, new MockEvaluationContext(), new SubflowTask() {
@Override
public void performInSubflow(ServletRewrite<?, ?> event, EvaluationContext context)
{
Assert.assertEquals(ServletRewriteFlow.REDIRECT_PERMANENT, rewrite.getFlow());
event.setFlow(ServletRewriteFlow.HANDLED);
throw new RuntimeException();
}
});
Assert.fail();
}
catch (RuntimeException e) {}
Assert.assertNull(result);
Assert.assertEquals(ServletRewriteFlow.REDIRECT_PERMANENT, rewrite.getFlow());
}
@Test
public void testSubflowRestoresOriginalFlowStateAfterExceptionWithInitializedFlow()
{
rewrite.setFlow(ServletRewriteFlow.REDIRECT_PERMANENT);
Flow result = null;
try {
result = SubflowTask.perform(rewrite, new MockEvaluationContext(), ServletRewriteFlow.INCLUDE,
new SubflowTask() {
@Override
public void performInSubflow(ServletRewrite<?, ?> event, EvaluationContext context)
{
Assert.assertEquals(ServletRewriteFlow.INCLUDE, rewrite.getFlow());
event.setFlow(ServletRewriteFlow.HANDLED);
throw new RuntimeException();
}
});
Assert.fail();
}
catch (RuntimeException e) {}
Assert.assertNull(result);
Assert.assertEquals(ServletRewriteFlow.REDIRECT_PERMANENT, rewrite.getFlow());
}
}