package org.molgenis.ui.freemarker;
import org.apache.commons.io.IOUtils;
import org.mockito.Mockito;
import org.molgenis.data.DataService;
import org.molgenis.data.support.QueryImpl;
import org.molgenis.data.system.core.FreemarkerTemplate;
import org.molgenis.data.system.core.FreemarkerTemplateFactory;
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.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.molgenis.data.system.core.FreemarkerTemplateMetaData.FREEMARKER_TEMPLATE;
import static org.testng.Assert.*;
@ContextConfiguration(classes = RepositoryTemplateLoaderTest.Config.class)
public class RepositoryTemplateLoaderTest extends AbstractMolgenisSpringTest
{
@Configuration
@ComponentScan({ "org.molgenis.data.system.core" })
static class Config
{
@Bean
public DataService dataService()
{
return mock(DataService.class);
}
@Bean
public RepositoryTemplateLoader repositoryTemplateLoader()
{
return new RepositoryTemplateLoader(dataService());
}
}
@Autowired
private FreemarkerTemplateFactory freemarkerTemplateFactory;
@Autowired
private DataService dataService;
@Autowired
private RepositoryTemplateLoader repositoryTemplateLoader;
private FreemarkerTemplate template1;
private FreemarkerTemplate template1Modified;
private FreemarkerTemplate template2;
@BeforeMethod
public void init()
{
template1 = freemarkerTemplateFactory.create();
template1.setId("1234");
template1.setName("template1");
template1.setValue("template1\ncontents");
template1Modified = freemarkerTemplateFactory.create();
template1Modified.setId("1234");
template1Modified.setName("template1");
template1Modified.setValue("template1\nmodified contents");
template2 = freemarkerTemplateFactory.create();
template2.setId("2345");
template2.setName("template2");
template2.setValue("template2\ncontents");
}
@BeforeMethod
public void reset()
{
Mockito.reset(dataService);
}
@Test
public void loadAndRead() throws IOException
{
when(dataService.findOne(FREEMARKER_TEMPLATE, new QueryImpl<FreemarkerTemplate>().eq("Name", "template1"),
FreemarkerTemplate.class)).thenReturn(template1);
Object source = repositoryTemplateLoader.findTemplateSource("template1");
assertNotNull(source);
Reader reader = repositoryTemplateLoader.getReader(source, null);
assertTrue(IOUtils.contentEquals(reader, new StringReader(template1.getValue())));
}
@Test
public void lastModifiedEqualsMinusOne() throws IOException
{
when(dataService.findOne(FREEMARKER_TEMPLATE, new QueryImpl<FreemarkerTemplate>().eq("Name", "template1"),
FreemarkerTemplate.class)).thenReturn(template1);
Object source = repositoryTemplateLoader.findTemplateSource("template1");
assertTrue(repositoryTemplateLoader.getLastModified(source) == -1);
}
@Test
public void newSourceReturnedWhenContentChanges() throws IOException
{
when(dataService.findOne(FREEMARKER_TEMPLATE, new QueryImpl<FreemarkerTemplate>().eq("Name", "template1"),
FreemarkerTemplate.class)).thenReturn(template1, template1Modified);
Object source = repositoryTemplateLoader.findTemplateSource("template1");
assertTrue(IOUtils.contentEquals(repositoryTemplateLoader.getReader(source, null),
new StringReader(template1.getValue())));
Object modifiedSource = repositoryTemplateLoader.findTemplateSource("template1");
assertNotEquals(source, modifiedSource);
assertTrue(IOUtils.contentEquals(repositoryTemplateLoader.getReader(modifiedSource, null),
new StringReader(template1Modified.getValue())));
}
@Test
public void sourceBelongsToContentAndCanBeReadMultipleTimes() throws IOException
{
when(dataService.findOne(FREEMARKER_TEMPLATE, new QueryImpl<FreemarkerTemplate>().eq("Name", "template1"),
FreemarkerTemplate.class)).thenReturn(template1);
when(dataService.findOne(FREEMARKER_TEMPLATE, new QueryImpl<FreemarkerTemplate>().eq("Name", "template2"),
FreemarkerTemplate.class)).thenReturn(template2);
Object source1 = repositoryTemplateLoader.findTemplateSource("template1");
Object source2 = repositoryTemplateLoader.findTemplateSource("template2");
assertTrue(IOUtils.contentEquals(repositoryTemplateLoader.getReader(source2, null),
new StringReader(template2.getValue())));
assertTrue(IOUtils.contentEquals(repositoryTemplateLoader.getReader(source1, null),
new StringReader(template1.getValue())));
assertTrue(IOUtils.contentEquals(repositoryTemplateLoader.getReader(source1, null),
new StringReader(template1.getValue())));
assertTrue(IOUtils.contentEquals(repositoryTemplateLoader.getReader(source1, null),
new StringReader(template1.getValue())));
assertTrue(IOUtils.contentEquals(repositoryTemplateLoader.getReader(source2, null),
new StringReader(template2.getValue())));
}
}