package org.molgenis.script;
import org.mockito.ArgumentCaptor;
import org.molgenis.data.DataService;
import org.molgenis.data.Entity;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.util.stream.Stream;
import static com.google.common.collect.Lists.newArrayList;
import static java.util.Collections.singletonList;
import static java.util.stream.Collectors.toList;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.*;
import static org.molgenis.script.ScriptTypeMetaData.SCRIPT_TYPE;
import static org.testng.Assert.assertEquals;
public class ScriptTypePopulatorTest
{
private ScriptTypePopulator scriptTypePopulator;
private ScriptRunnerFactory scriptRunnerFactory;
private DataService dataService;
private ScriptTypeFactory scriptTypeFactory;
@BeforeMethod
public void setUpBeforeMethod()
{
scriptRunnerFactory = mock(ScriptRunnerFactory.class);
dataService = mock(DataService.class);
scriptTypeFactory = mock(ScriptTypeFactory.class);
scriptTypePopulator = new ScriptTypePopulator(scriptRunnerFactory, dataService, scriptTypeFactory);
}
@Test
public void populate() throws Exception
{
String scriptRunner0Name = "scriptRunner0";
ScriptRunner scriptRunner0 = when(mock(ScriptRunner.class).getName()).thenReturn(scriptRunner0Name).getMock();
String scriptRunner1Name = "scriptRunner1";
ScriptRunner scriptRunner1 = when(mock(ScriptRunner.class).getName()).thenReturn(scriptRunner1Name).getMock();
when(scriptRunnerFactory.getScriptRunners()).thenReturn(newArrayList(scriptRunner0, scriptRunner1));
ScriptType scriptType0 = mock(ScriptType.class);
when(dataService.findOneById(SCRIPT_TYPE, scriptRunner0Name, ScriptType.class)).thenReturn(scriptType0);
when(dataService.findOneById(SCRIPT_TYPE, scriptRunner1Name, ScriptType.class)).thenReturn(null);
ScriptType scriptType1 = mock(ScriptType.class);
when(scriptTypeFactory.create(scriptRunner1Name)).thenReturn(scriptType1);
scriptTypePopulator.populate();
@SuppressWarnings("unchecked")
ArgumentCaptor<Stream<Entity>> captor = ArgumentCaptor.forClass((Class) Stream.class);
verify(dataService).add(eq(SCRIPT_TYPE), captor.capture());
assertEquals(captor.getValue().collect(toList()), singletonList(scriptType1));
}
// regression test for https://github.com/molgenis/molgenis/issues/5168
@SuppressWarnings("unchecked")
@Test
public void populateNoChanges() throws Exception
{
String scriptRunner0Name = "scriptRunner0";
ScriptRunner scriptRunner0 = when(mock(ScriptRunner.class).getName()).thenReturn(scriptRunner0Name).getMock();
String scriptRunner1Name = "scriptRunner1";
ScriptRunner scriptRunner1 = when(mock(ScriptRunner.class).getName()).thenReturn(scriptRunner1Name).getMock();
when(scriptRunnerFactory.getScriptRunners()).thenReturn(newArrayList(scriptRunner0, scriptRunner1));
ScriptType scriptType0 = mock(ScriptType.class);
when(dataService.findOneById(SCRIPT_TYPE, scriptRunner0Name, ScriptType.class)).thenReturn(scriptType0);
ScriptType scriptType1 = mock(ScriptType.class);
when(dataService.findOneById(SCRIPT_TYPE, scriptRunner1Name, ScriptType.class)).thenReturn(scriptType1);
scriptTypePopulator.populate();
verify(dataService, times(0)).add(eq(SCRIPT_TYPE), any(Stream.class));
}
}