package org.molgenis.data.annotation.core.resources.impl;
import com.google.common.collect.ImmutableMap;
import org.elasticsearch.common.collect.Lists;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.molgenis.data.Entity;
import org.molgenis.data.Query;
import org.molgenis.data.Repository;
import org.molgenis.data.annotation.core.resources.MultiResourceConfig;
import org.molgenis.data.annotation.core.resources.ResourceConfig;
import org.molgenis.data.support.QueryImpl;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;
import static org.mockito.Mockito.when;
import static org.testng.Assert.*;
public class MultiFileResourceTest
{
private MultiFileResource multiFileResource;
@Mock
private MultiResourceConfig config;
@Mock
private RepositoryFactory factory;
private Map<String, ResourceConfig> configs;
@Mock
private ResourceConfig chrom3Config;
@Mock
private ResourceConfig chrom4Config;
@Mock
private Repository<Entity> chrom3Repository;
@Mock
private Repository<Entity> chrom4Repository;
@BeforeMethod
public void beforeMethod()
{
MockitoAnnotations.initMocks(this);
configs = ImmutableMap.of("3", chrom3Config, "4", chrom4Config);
when(config.getConfigs()).thenReturn(configs);
multiFileResource = new MultiFileResource("name", config)
{
@Override
public RepositoryFactory getRepositoryFactory()
{
return factory;
}
};
}
@Test
public void findAllDelegatesToTheCorrectResource() throws IOException
{
File chrom3File = File.createTempFile("chrom3", "tmp");
when(chrom3Config.getFile()).thenReturn(chrom3File);
when(factory.createRepository(chrom3File)).thenReturn(chrom3Repository);
Query<Entity> q = QueryImpl.EQ("#CHROM", "3").and().eq("POS", 12345);
List<Entity> result = Lists.newArrayList();
when(chrom3Repository.findAll(q)).thenReturn(Stream.empty());
assertEquals(result, Lists.newArrayList(multiFileResource.findAll(q)));
}
@Test
public void whenAllFilesAvailableThenIsAvailableReturnsTrue() throws IOException
{
File chrom3File = File.createTempFile("chrom3", "tmp");
when(chrom3Config.getFile()).thenReturn(chrom3File);
File chrom4File = File.createTempFile("chrom4", "tmp");
when(chrom4Config.getFile()).thenReturn(chrom4File);
when(factory.createRepository(chrom3File)).thenReturn(chrom3Repository);
when(factory.createRepository(chrom4File)).thenReturn(chrom4Repository);
assertTrue(multiFileResource.isAvailable());
}
@Test
public void whenOneFileIsNotAvailableThenIsAvailableReturnsFalse() throws IOException
{
File chrom3File = File.createTempFile("chrom3", "tmp");
when(chrom3Config.getFile()).thenReturn(chrom3File);
File chrom4File = new File("bogusChrom4");
when(chrom4Config.getFile()).thenReturn(chrom4File);
when(factory.createRepository(chrom3File)).thenReturn(chrom3Repository);
assertFalse(multiFileResource.isAvailable());
}
@Test
public void whenOneConfigChangesFilePatternThenIsAvailableUpdates() throws IOException
{
File chrom3File = File.createTempFile("chrom3", "tmp");
when(chrom3Config.getFile()).thenReturn(chrom3File);
File chrom4File = File.createTempFile("chrom4", "tmp");
when(chrom4Config.getFile()).thenReturn(chrom4File);
when(factory.createRepository(chrom3File)).thenReturn(chrom3Repository);
when(factory.createRepository(chrom4File)).thenReturn(chrom4Repository);
assertTrue(multiFileResource.isAvailable());
when(chrom3Config.getFile()).thenReturn(new File("bogus"));
assertFalse(multiFileResource.isAvailable());
when(chrom3Config.getFile()).thenReturn(chrom3File);
assertTrue(multiFileResource.isAvailable());
when(chrom4Config.getFile()).thenReturn(new File("bogus"));
assertFalse(multiFileResource.isAvailable());
}
@Test
public void whenConfigsChangeThenIsAvailableUpdates() throws IOException
{
SingleResourceConfig chrom5Config = Mockito.mock(SingleResourceConfig.class);
when(config.getConfigs()).thenReturn(ImmutableMap.<String, ResourceConfig>of("5", chrom5Config));
File chrom5File = new File("Bogus");
when(chrom5Config.getFile()).thenReturn(chrom5File);
assertFalse(multiFileResource.isAvailable());
when(chrom5Config.getFile()).thenReturn(File.createTempFile("chrom5", "tmp"));
assertTrue(multiFileResource.isAvailable());
}
}