package org.molgenis.data.mapper.service.impl; import com.google.common.collect.Maps; import org.molgenis.data.DataService; import org.molgenis.data.Query; import org.molgenis.data.meta.model.Attribute; import org.molgenis.data.meta.model.AttributeFactory; import org.molgenis.data.meta.model.EntityType; import org.molgenis.data.meta.model.EntityTypeFactory; import org.molgenis.data.semanticsearch.explain.bean.ExplainedAttribute; import org.molgenis.data.semanticsearch.explain.bean.ExplainedQueryString; import org.molgenis.data.support.QueryImpl; import org.molgenis.file.FileStore; import org.molgenis.js.magma.JsMagmaScriptRunner; import org.molgenis.script.*; import org.molgenis.security.core.token.TokenService; import org.molgenis.test.data.AbstractMolgenisSpringTest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.ContextConfiguration; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.util.Arrays; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; import static java.util.Collections.singletonList; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.molgenis.script.ScriptMetaData.SCRIPT; import static org.molgenis.script.ScriptMetaData.TYPE; import static org.molgenis.script.ScriptParameterMetaData.SCRIPT_PARAMETER; import static org.testng.Assert.assertEquals; @ContextConfiguration(classes = AlgorithmTemplateServiceImplTest.Config.class) public class AlgorithmTemplateServiceImplTest extends AbstractMolgenisSpringTest { @Autowired private ScriptFactory scriptFactory; @Autowired private ScriptParameterFactory scriptParameterFactory; @Autowired private EntityTypeFactory entityTypeFactory; @Autowired private AttributeFactory attrMetaFactory; @Autowired private AlgorithmTemplateServiceImpl algorithmTemplateServiceImpl; @Autowired private DataService dataService; private Script script0; private String param0Name = "param0", param1Name = "param1"; @BeforeMethod public void setUpBeforeMethod() { ScriptParameter param0 = scriptParameterFactory.create(); param0.setName(param0Name); ScriptParameter param1 = scriptParameterFactory.create(); param1.setName(param1Name); script0 = scriptFactory.create(); script0.setName("name"); script0.setContent(String.format("$('%s'),$('%s')", param0, param1)); script0.set(ScriptMetaData.PARAMETERS, Arrays.asList(param0, param1)); Query<Script> q = new QueryImpl<Script>().eq(TYPE, JsMagmaScriptRunner.NAME); when(dataService.findAll(SCRIPT, q, Script.class)).thenReturn(Stream.of(script0)); when(dataService.findOneById(SCRIPT_PARAMETER, param0Name)).thenReturn(param0); when(dataService.findOneById(SCRIPT_PARAMETER, param1Name)).thenReturn(param1); } @Test public void find() { String sourceAttr0Name = "sourceAttr0"; String sourceAttr1Name = "sourceAttr1"; EntityType sourceEntityMeta = entityTypeFactory.create("source"); Attribute sourceAttr0 = attrMetaFactory.create().setName(sourceAttr0Name); Attribute sourceAttr1 = attrMetaFactory.create().setName(sourceAttr1Name); sourceEntityMeta.addAttribute(sourceAttr0); sourceEntityMeta.addAttribute(sourceAttr1); ExplainedQueryString sourceAttr0Explain = ExplainedQueryString.create("a", "b", param0Name, 1.0); ExplainedQueryString sourceAttr1Explain = ExplainedQueryString.create("a", "b", param1Name, 0.5); Map<Attribute, ExplainedAttribute> attrResults = Maps.newHashMap(); attrResults.put(sourceAttr0, ExplainedAttribute.create(sourceAttr0, singletonList(sourceAttr0Explain), false)); attrResults.put(sourceAttr1, ExplainedAttribute.create(sourceAttr1, singletonList(sourceAttr1Explain), false)); Stream<AlgorithmTemplate> templateStream = algorithmTemplateServiceImpl.find(attrResults); Map<String, String> model = Maps.newHashMap(); model.put(param0Name, sourceAttr0Name); model.put(param1Name, sourceAttr1Name); AlgorithmTemplate expectedAlgorithmTemplate = new AlgorithmTemplate(script0, model); assertEquals(templateStream.collect(Collectors.toList()), Stream.of(expectedAlgorithmTemplate).collect(Collectors.toList())); } @Configuration @ComponentScan({ "org.molgenis.script" }) public static class Config { @Bean public FileStore fileStore() { return mock(FileStore.class); } @Bean public TokenService tokenService() { return mock(TokenService.class); } @Bean public AlgorithmTemplateServiceImpl algorithmTemplateServiceImpl() { return new AlgorithmTemplateServiceImpl(dataService()); } @Bean public DataService dataService() { return mock(DataService.class); } } }