package org.ovirt.engine.ui.frontend.communication;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import java.util.ArrayList;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.ovirt.engine.core.common.action.VdcActionParametersBase;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.queries.VdcQueryParametersBase;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import com.google.gwt.event.shared.EventBus;
@RunWith(MockitoJUnitRunner.class)
public class VdcOperationManagerTest {
VdcOperationManager testManager;
@Mock
OperationProcessor mockOperationProcessor;
@Mock
EventBus mockEventBus;
@Before
public void setUp() throws Exception {
testManager = new VdcOperationManager(mockEventBus, mockOperationProcessor);
}
@Test
public void testAddOperationAction() {
VdcOperation<VdcActionType, VdcActionParametersBase> testOperation =
new VdcOperation<>(VdcActionType.AddNetworkOnProvider, new VdcActionParametersBase(), null);
testManager.addOperation(testOperation);
verify(mockOperationProcessor).processOperation(testManager);
verify(mockEventBus).fireEvent(any(EngineSessionRefreshedEvent.class));
assertEquals("Operations must match", testOperation, testManager.pollOperation()); //$NON-NLS-1$
}
@Test
public void testAddOperationMultipleQuery() {
VdcOperation<VdcQueryType, VdcQueryParametersBase> testOperation = new VdcOperation<>(VdcQueryType.Search, new VdcQueryParametersBase().withRefresh(), null);
testManager.addOperation(testOperation);
verify(mockOperationProcessor).processOperation(testManager);
verify(mockEventBus).fireEvent(any(EngineSessionRefreshedEvent.class));
// Second add, shouldn't add and generate an event.
testManager.addOperation(testOperation);
// Verify it is only called once (from before)
verify(mockOperationProcessor).processOperation(testManager);
verify(mockEventBus).fireEvent(any(EngineSessionRefreshedEvent.class));
}
@Test
public void testAddOperationList() {
VdcOperation<VdcActionType, VdcActionParametersBase> testOperation1 =
new VdcOperation<>(VdcActionType.AddNetworkOnProvider, new VdcActionParametersBase(), null);
VdcQueryParametersBase testParameters = new VdcQueryParametersBase().withRefresh();
VdcOperation<VdcQueryType, VdcQueryParametersBase> testOperation2 = new VdcOperation<>(VdcQueryType.Search, testParameters, null);
VdcOperation<VdcQueryType, VdcQueryParametersBase> testOperation3 = new VdcOperation<>(VdcQueryType.Search, testParameters, null);
List<VdcOperation<?, ?>> operationList = new ArrayList<>();
operationList.add(testOperation1);
operationList.add(testOperation2);
operationList.add(testOperation3);
testManager.addOperationList(operationList);
verify(mockOperationProcessor, times(3)).processOperation(testManager);
verify(mockEventBus, times(2)).fireEvent(any(EngineSessionRefreshedEvent.class));
assertEquals("First poll should be action", testManager.pollOperation(), testOperation1); //$NON-NLS-1$
assertEquals("Second poll should be query", testManager.pollOperation(), testOperation2); //$NON-NLS-1$
assertNull("Third poll should be null", testManager.pollOperation()); //$NON-NLS-1$
}
}