package eu.dnetlib.enabling.manager.msro;

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 static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.anyString;
import org.mockito.runners.MockitoJUnit44Runner;

import com.googlecode.sarasvati.Graph;
import com.googlecode.sarasvati.GraphProcess;
import com.googlecode.sarasvati.ProcessState;

import eu.dnetlib.enabling.manager.msro.rmi.ProcessDescription;
import eu.dnetlib.workflow.GraphProcessRegistry;

/**
 * MSRO test.
 *
 * @author marko
 *
 */
@RunWith(MockitoJUnit44Runner.class)
public class MSROServiceImplTest {

	/**
	 * instance under test.
	 */
	private transient MSROServiceImpl msro;

	/**
	 * registry mock.
	 */
	@Mock
	private transient GraphProcessRegistry registry;

	/**
	 * process mock.
	 */
	@Mock
	private transient GraphProcess testProcess;

	/**
	 * graph mock.
	 */
	@Mock
	private transient Graph testGraph;

	/**
	 * common setup.
	 */
	@Before
	public void setUp() {
		msro = new MSROServiceImpl();
		msro.setProcessRegistry(registry);
	}

	/**
	 * test list orchestration.
	 */
	@Test
	public void testListOrchestrationProcesses() {

		final List<GraphProcess> procs = new ArrayList<GraphProcess>();
		procs.add(testProcess);
		when(registry.findProcessesByResource("123")).thenReturn(procs);
		when(registry.getProcessIdentifier(testProcess)).thenReturn("pr123");
		when(registry.findProcess(anyString())).thenReturn(testProcess);

		when(testProcess.getGraph()).thenReturn(testGraph);
		when(testProcess.getState()).thenReturn(ProcessState.Completed);

		final List<ProcessDescription> res = msro.listOrchestrationProcesses("123", 0);

		assertEquals("check process", "pr123", res.get(0).getProcessId());

	}

}
