package org.ovirt.engine.ui.uicommonweb.action;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class SyncUiActionTest extends UiActionBaseTest {
@Test
public void runSingleActionTest() {
UiAction action = createAction();
action.runAction();
assertFinishedWithNoErrors(Collections.singletonList(action));
}
@Test
public void runParallelActionFlowTest() {
List<UiAction> actions = runActionFlow(ActionType.parallel);
assertFinishedWithNoErrors(actions);
}
@Test
public void runNextActionFlowTest() {
List<UiAction> actions = runActionFlow(ActionType.next);
assertFinishedWithNoErrors(actions);
}
@Test
public void runMixedActionFlowTest() {
List<UiAction> actions = runActionFlow(ActionType.next, ActionType.parallel);
assertFinishedWithNoErrors(actions);
}
@Test
public void runActionWithFlowStateTest() {
final UiAction action2 = createAction();
final UiAction action1 = createAction(action -> action2.runParallelAction(action.getActionFlowState()));
action1.runAction();
assertSame(action1.getActionFlowState(), action2.getActionFlowState());
assertFinishedWithNoErrors(new ArrayList<UiAction>(Arrays.asList(action1, action2)));
}
@Test
public void finalActionTest() {
final UiAction action1 = createAction(action -> assertNotAllDone(action.getActionFlowState()));
final UiAction action2 = createAction(action -> assertNotAllDone(action.getActionFlowState()));
final SimpleAction finalAction = createFinalAction(new ArrayList<UiAction>(Arrays.asList(action1, action2)));
action1.and(action2).onAllExecutionsFinish(finalAction);
action1.runAction();
}
@Test
public void shouldExecuteTest() {
UiAction action = new SyncUiAction(model, "test") { //$NON-NLS-1$
@Override
protected void onActionExecute() {
fail("the action shouln't be executed"); //$NON-NLS-1$
}
@Override
protected boolean shouldExecute() {
return false;
}
};
final SimpleAction finalAction = createFinalAction(Collections.singletonList(action));
action.onAllExecutionsFinish(finalAction);
action.runAction();
}
@Test
public void progressWasAlreadyStartedTest() {
when(model.getProgress()).thenReturn(progressModel);
UiAction action = createAction();
action.runAction();
assertFinishedWithNoErrors(Collections.singletonList(action), false);
}
@Test(expected = UnsupportedOperationException.class)
public void duplicateFinalAction() {
UiAction action1 = createAction();
UiAction action2 = createAction();
SimpleAction finalAction = () -> fail();
action1.onAllExecutionsFinish(finalAction);
action2.onAllExecutionsFinish(finalAction);
action1.then(action2);
action1.runAction();
}
private SimpleAction createFinalAction(final List<UiAction> actions) {
return () -> assertAllDone(actions);
}
protected UiAction createAction() {
return createAction(null);
}
protected UiAction createAction(final Executer executer) {
UiAction action = new SyncUiAction(model, "test") { //$NON-NLS-1$
@Override
protected void onActionExecute() {
if (executer != null) {
executer.onActionExecuted(this);
}
}
};
return action;
}
protected static interface Executer {
void onActionExecuted(UiAction action);
}
}