package org.molgenis.data.annotation.core.resources.impl;
import com.google.common.collect.Lists;
import org.mockito.Mockito;
import org.molgenis.data.DataService;
import org.molgenis.data.Entity;
import org.molgenis.data.Query;
import org.molgenis.data.annotation.core.resources.Resource;
import org.molgenis.data.annotation.core.resources.Resources;
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.support.DynamicEntity;
import org.molgenis.data.support.QueryImpl;
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.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.util.Arrays;
import java.util.stream.Stream;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.testng.Assert.*;
@ContextConfiguration(classes = ResourcesTest.Config.class)
public class ResourcesTest extends AbstractMolgenisSpringTest
{
@Autowired
AttributeFactory attributeFactory;
@Autowired
EntityTypeFactory entityTypeFactory;
@Autowired
private Resource resource;
@Autowired
private DataService dataService;
@Autowired
private Resources resources;
private EntityType emd;
private Entity e1;
@BeforeClass
public void beforeClass()
{
emd = entityTypeFactory.create().setName("resourceName");
Attribute attr = attributeFactory.create().setName("id").setIdAttribute(true).setLabelAttribute(true);
emd.addAttribute(attr);
e1 = new DynamicEntity(emd);
e1.set("id", "5");
}
@BeforeMethod
public void beforeMethod()
{
Mockito.reset(resource, dataService);
when(resource.getName()).thenReturn("resourceName");
}
@Test
public void ifResourceExistsAndIsAvailableThenHasResourceReturnsTrue()
{
when(resource.isAvailable()).thenReturn(true);
assertTrue(resources.hasRepository("resourceName"));
}
@Test
public void ifResourceExistsButIsUnavailableThenHasResourceReturnsTrue()
{
when(resource.isAvailable()).thenReturn(false);
assertFalse(resources.hasRepository("resourceName"));
}
@Test
public void ifResourceDoesNotExistThenHasResourceReturnsFalse()
{
when(dataService.hasRepository("blah")).thenReturn(false);
assertFalse(resources.hasRepository("blah"));
}
@Test
public void ifResourceExistsInDataServiceThenHasResourceReturnsTrue()
{
when(dataService.hasRepository("blah")).thenReturn(true);
assertTrue(resources.hasRepository("blah"));
}
@Test
public void ifResourceExistsThenFindAllDelegatesWithoutCheckingAvailability()
{
Query<Entity> q = QueryImpl.EQ("id", "5");
when(resource.findAll(q)).thenReturn(Arrays.asList(e1));
assertEquals(resources.findAll("resourceName", q), Arrays.asList(e1));
Mockito.verify(resource, Mockito.never()).isAvailable();
}
@Test
public void ifResourceExistsAndIsAvailableButQueryFailsThenExceptionGetsThrown()
{
Query<Entity> q = QueryImpl.EQ("id", "5");
Exception ex = new RuntimeException();
when(resource.findAll(q)).thenThrow(ex);
when(resource.isAvailable()).thenReturn(true);
try
{
resources.findAll("resourceName", q);
fail("should throw exception");
}
catch (Exception expected)
{
assertSame(expected, ex);
}
}
@Test
public void ifResourceIsUnavailableThenQueryIsDelegated()
{
Query<Entity> q = QueryImpl.EQ("id", "5");
Exception ex = new RuntimeException();
when(resource.findAll(q)).thenThrow(ex);
when(resource.isAvailable()).thenReturn(false);
when(dataService.findAll("resourceName", q)).thenReturn(Stream.of(e1));
assertEquals(Lists.newArrayList(resources.findAll("resourceName", q)), Arrays.asList(e1));
}
@Test
public void ifResourceDoesNotExistThenQueryIsDelegated()
{
Query<Entity> q = QueryImpl.EQ("id", "5");
when(dataService.findAll("blah", q)).thenReturn(Stream.of(e1));
assertEquals(Lists.newArrayList(resources.findAll("blah", q)), Arrays.asList(e1));
}
@Configuration
@ComponentScan({ "org.molgenis.data.vcf.model", "org.molgenis.data.annotation.core.effects" })
public static class Config
{
@Bean
public Resource resource()
{
Resource result = mock(Resource.class);
when(result.getName()).thenReturn("resourceName");
return result;
}
@Bean
public DataService dataService()
{
return mock(DataService.class);
}
@Bean
public Resources resources()
{
return new ResourcesImpl();
}
}
}