package org.molgenis.data.support;
import com.google.common.collect.Lists;
import org.molgenis.data.DataService;
import org.molgenis.data.Entity;
import org.molgenis.data.meta.model.Attribute;
import org.molgenis.data.meta.model.EntityType;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.sql.Date;
import java.sql.Timestamp;
import java.util.Arrays;
import static org.mockito.Mockito.*;
import static org.testng.Assert.assertEquals;
public class LazyEntityTest
{
private static final String ENTITY_NAME = "entity";
private static final String ID_ATTR_NAME = "id";
private EntityType entityType;
private Attribute idAttr;
private DataService dataService;
private Object id;
private LazyEntity lazyEntity;
private Entity entity;
@BeforeMethod
public void setUpBeforeMethod()
{
entityType = mock(EntityType.class);
when(entityType.getName()).thenReturn(ENTITY_NAME);
idAttr = mock(Attribute.class);
when(idAttr.getName()).thenReturn(ID_ATTR_NAME);
when(entityType.getIdAttribute()).thenReturn(idAttr);
dataService = mock(DataService.class);
entity = mock(Entity.class);
when(dataService.findOneById(ENTITY_NAME, id)).thenReturn(entity);
id = Integer.valueOf(1);
lazyEntity = new LazyEntity(entityType, dataService, id);
}
@Test(expectedExceptions = NullPointerException.class)
public void LazyEntity()
{
new LazyEntity(null, null, null);
}
@Test
public void get()
{
String attrName = "attr";
Object value = mock(Object.class);
when(entity.get(attrName)).thenReturn(value);
assertEquals(value, lazyEntity.get(attrName));
assertEquals(value, lazyEntity.get(attrName));
verify(dataService, times(1)).findOneById(ENTITY_NAME, id);
}
@Test
public void getIdAttr()
{
assertEquals(id, lazyEntity.get(ID_ATTR_NAME));
}
@Test
public void getAttributeNames()
{
Entity entity = new DynamicEntity(entityType);
Attribute attr0 = when(mock(Attribute.class).getName()).thenReturn("attr0").getMock();
Attribute attr1 = when(mock(Attribute.class).getName()).thenReturn("attr1").getMock();
when(entityType.getAtomicAttributes()).thenReturn(Arrays.asList(attr0, attr1));
assertEquals(Lists.newArrayList(entity.getAttributeNames()), Arrays.asList("attr0", "attr1"));
}
@Test
public void getBoolean()
{
String attrName = "attr";
Boolean value = Boolean.TRUE;
when(entity.getBoolean(attrName)).thenReturn(value);
assertEquals(value, lazyEntity.getBoolean(attrName));
assertEquals(value, lazyEntity.getBoolean(attrName));
verify(dataService, times(1)).findOneById(ENTITY_NAME, id);
}
@Test
public void getDate()
{
String attrName = "attr";
Date value = new Date(0);
when(entity.getDate(attrName)).thenReturn(value);
assertEquals(value, lazyEntity.getDate(attrName));
assertEquals(value, lazyEntity.getDate(attrName));
verify(dataService, times(1)).findOneById(ENTITY_NAME, id);
}
@Test
public void getDouble()
{
String attrName = "attr";
Double value = Double.valueOf(0);
when(entity.getDouble(attrName)).thenReturn(value);
assertEquals(value, lazyEntity.getDouble(attrName));
assertEquals(value, lazyEntity.getDouble(attrName));
verify(dataService, times(1)).findOneById(ENTITY_NAME, id);
}
@Test
public void getEntitiesString()
{
String attrName = "attr";
@SuppressWarnings("unchecked")
Iterable<Entity> entities = mock(Iterable.class);
when(entity.getEntities(attrName)).thenReturn(entities);
assertEquals(entities, lazyEntity.getEntities(attrName));
assertEquals(entities, lazyEntity.getEntities(attrName));
verify(dataService, times(1)).findOneById(ENTITY_NAME, id);
}
@Test
public void getEntitiesStringClassE()
{
String attrName = "attr";
@SuppressWarnings("unchecked")
Iterable<Entity> entities = mock(Iterable.class);
when(entity.getEntities(attrName, Entity.class)).thenReturn(entities);
assertEquals(entities, lazyEntity.getEntities(attrName, Entity.class));
assertEquals(entities, lazyEntity.getEntities(attrName, Entity.class));
verify(dataService, times(1)).findOneById(ENTITY_NAME, id);
}
@Test
public void getEntityString()
{
String attrName = "attr";
Entity value = mock(Entity.class);
when(entity.getEntity(attrName)).thenReturn(value);
assertEquals(value, lazyEntity.getEntity(attrName));
assertEquals(value, lazyEntity.getEntity(attrName));
verify(dataService, times(1)).findOneById(ENTITY_NAME, id);
}
@Test
public void getEntityStringClassE()
{
String attrName = "attr";
Entity value = mock(Entity.class);
when(entity.getEntity(attrName, Entity.class)).thenReturn(value);
assertEquals(value, lazyEntity.getEntity(attrName, Entity.class));
assertEquals(value, lazyEntity.getEntity(attrName, Entity.class));
verify(dataService, times(1)).findOneById(ENTITY_NAME, id);
}
@Test
public void getEntityType()
{
assertEquals(entityType, lazyEntity.getEntityType());
}
@Test
public void getIdValue()
{
assertEquals(id, lazyEntity.getIdValue());
}
@Test
public void getInt()
{
String attrName = "attr";
Integer value = Integer.valueOf(0);
when(entity.getInt(attrName)).thenReturn(value);
assertEquals(value, lazyEntity.getInt(attrName));
assertEquals(value, lazyEntity.getInt(attrName));
verify(dataService, times(1)).findOneById(ENTITY_NAME, id);
}
@Test
public void getIntIdAttr()
{
assertEquals(id, lazyEntity.getInt(ID_ATTR_NAME));
}
@Test
public void getLabelValue()
{
String value = "label";
when(entity.getLabelValue()).thenReturn(value);
assertEquals(value, lazyEntity.getLabelValue());
assertEquals(value, lazyEntity.getLabelValue());
verify(dataService, times(1)).findOneById(ENTITY_NAME, id);
}
@Test
public void getLabelValueLabelAttrIsIdAttr()
{
when(entityType.getLabelAttribute()).thenReturn(idAttr);
assertEquals(id.toString(), lazyEntity.getLabelValue().toString());
verifyNoMoreInteractions(dataService);
}
@Test
public void getLong()
{
String attrName = "attr";
Long value = Long.valueOf(0l);
when(entity.getLong(attrName)).thenReturn(value);
assertEquals(value, lazyEntity.getLong(attrName));
assertEquals(value, lazyEntity.getLong(attrName));
verify(dataService, times(1)).findOneById(ENTITY_NAME, id);
}
@Test
public void getString()
{
String attrName = "attr";
String value = "str";
when(entity.getString(attrName)).thenReturn(value);
assertEquals(value, lazyEntity.getString(attrName));
assertEquals(value, lazyEntity.getString(attrName));
verify(dataService, times(1)).findOneById(ENTITY_NAME, id);
}
@Test
public void getStringIdAttr()
{
String strId = "1";
when(dataService.findOneById(ENTITY_NAME, strId)).thenReturn(entity);
lazyEntity = new LazyEntity(entityType, dataService, strId);
assertEquals(strId, lazyEntity.getString(ID_ATTR_NAME));
}
@Test
public void getTimestamp()
{
String attrName = "attr";
Timestamp value = new Timestamp(0);
when(entity.getTimestamp(attrName)).thenReturn(value);
assertEquals(value, lazyEntity.getTimestamp(attrName));
assertEquals(value, lazyEntity.getTimestamp(attrName));
verify(dataService, times(1)).findOneById(ENTITY_NAME, id);
}
@Test
public void getUtilDate()
{
String attrName = "attr";
java.util.Date value = new java.util.Date();
when(entity.getUtilDate(attrName)).thenReturn(value);
assertEquals(value, lazyEntity.getUtilDate(attrName));
assertEquals(value, lazyEntity.getUtilDate(attrName));
verify(dataService, times(1)).findOneById(ENTITY_NAME, id);
}
@Test
public void setStringObject()
{
String attrName = "attr";
Object value = mock(Object.class);
lazyEntity.set(attrName, value);
lazyEntity.set(attrName, value);
verify(dataService, times(1)).findOneById(ENTITY_NAME, id);
verify(entity, times(2)).set(attrName, value);
}
@Test
public void setEntity()
{
Entity value = mock(Entity.class);
lazyEntity.set(value);
lazyEntity.set(value);
verify(dataService, times(1)).findOneById(ENTITY_NAME, id);
verify(entity, times(2)).set(value);
}
}