package org.molgenis.data.mapper.repository.impl;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.MockitoAnnotations;
import org.molgenis.data.DataService;
import org.molgenis.data.Entity;
import org.molgenis.data.mapper.mapping.model.EntityMapping;
import org.molgenis.data.mapper.mapping.model.MappingTarget;
import org.molgenis.data.mapper.meta.EntityMappingMetaData;
import org.molgenis.data.mapper.meta.MappingTargetMetaData;
import org.molgenis.data.mapper.repository.EntityMappingRepository;
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.populate.IdGenerator;
import org.molgenis.data.support.DataServiceImpl;
import org.molgenis.data.support.DynamicEntity;
import org.molgenis.security.permission.PermissionSystemService;
import org.molgenis.security.user.UserService;
import org.molgenis.test.data.AbstractMolgenisSpringTest;
import org.molgenis.util.EntityUtils;
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.Collection;
import java.util.List;
import static java.util.Arrays.asList;
import static java.util.Collections.emptyList;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.molgenis.data.mapper.meta.MappingTargetMetaData.*;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
/**
* Unit test for the MappingTargetRepository. Tests the MappingTargetRepository in isolation.
*/
@ContextConfiguration(classes = { MappingTargetRepositoryImplTest.Config.class })
public class MappingTargetRepositoryImplTest extends AbstractMolgenisSpringTest
{
@Autowired
private EntityTypeFactory entityTypeFactory;
@Autowired
private AttributeFactory attrMetaFactory;
@Autowired
private DataService dataService;
@Autowired
private EntityMappingRepository entityMappingRepository;
@Autowired
private MappingTargetRepositoryImpl mappingTargetRepository;
@Autowired
private EntityMappingMetaData entityMappingMeta;
@Autowired
private MappingTargetMetaData mappingTargetMeta;
@Autowired
private IdGenerator idGenerator;
private List<MappingTarget> mappingTargets;
private List<Entity> mappingTargetEntities;
private EntityType targetEntityType;
private List<Entity> entityMappingEntities;
private List<EntityMapping> entityMappings;
@Captor
ArgumentCaptor<Collection<EntityMapping>> entityMappingCaptor;
@BeforeMethod
public void beforeMethod()
{
MockitoAnnotations.initMocks(this);
// POJOs
EntityType sourceEntityType = entityTypeFactory.create("source");
targetEntityType = entityTypeFactory.create("target");
Attribute targetAttribute = attrMetaFactory.create().setName("targetAttribute");
targetEntityType.addAttribute(targetAttribute);
entityMappings = asList(new EntityMapping("entityMappingID", sourceEntityType, targetEntityType, emptyList()));
mappingTargets = asList(new MappingTarget("mappingTargetID", targetEntityType, entityMappings));
// Entities
Entity entityMappingEntity = new DynamicEntity(entityMappingMeta);
entityMappingEntity.set(EntityMappingMetaData.IDENTIFIER, "entityMappingID");
entityMappingEntity.set(EntityMappingMetaData.SOURCE_ENTITY_TYPE, "source");
entityMappingEntity.set(EntityMappingMetaData.TARGET_ENTITY_TYPE, "target");
entityMappingEntity.set(EntityMappingMetaData.ATTRIBUTE_MAPPINGS, emptyList());
Entity mappingTargetEntity = new DynamicEntity(mappingTargetMeta);
mappingTargetEntity.set(IDENTIFIER, "mappingTargetID");
mappingTargetEntity.set(TARGET, "target");
entityMappingEntities = asList(entityMappingEntity);
mappingTargetEntity.set(ENTITY_MAPPINGS, entityMappingEntities);
mappingTargetEntities = asList(mappingTargetEntity);
}
@Test
public void testToMappingTargets()
{
when(dataService.getEntityType("target")).thenReturn(targetEntityType);
when(entityMappingRepository.toEntityMappings(entityMappingEntities)).thenReturn(entityMappings);
when(dataService.hasRepository("target")).thenReturn(true);
assertEquals(mappingTargetRepository.toMappingTargets(mappingTargetEntities), mappingTargets);
}
@Test
public void testUpdate()
{
when(entityMappingRepository.upsert(entityMappings)).thenReturn(entityMappingEntities);
List<Entity> result = mappingTargetRepository.upsert(mappingTargets);
assertEquals(mappingTargetEntities.size(), result.size());
for (int i = 0; i < mappingTargetEntities.size(); ++i)
{
assertTrue(EntityUtils.equals(mappingTargetEntities.get(i), result.get(i)));
}
}
@Test
public void testInsert()
{
mappingTargets.get(0).setIdentifier(null);
when(idGenerator.generateId()).thenReturn("mappingTargetID");
when(entityMappingRepository.upsert(entityMappings)).thenReturn(entityMappingEntities);
List<Entity> result = mappingTargetRepository.upsert(mappingTargets);
assertEquals(mappingTargetEntities.size(), result.size());
for (int i = 0; i < mappingTargetEntities.size(); ++i)
{
assertTrue(EntityUtils.equals(mappingTargetEntities.get(i), result.get(i)));
}
}
@Configuration
@ComponentScan({ "org.molgenis.data.mapper.meta", "org.molgenis.auth" })
public static class Config
{
@Bean
DataServiceImpl dataService()
{
return mock(DataServiceImpl.class);
}
@Bean
EntityMappingRepository entityMappingRepository()
{
return mock(EntityMappingRepository.class);
}
@Bean
MappingTargetRepositoryImpl mappingTargetRepository()
{
return new MappingTargetRepositoryImpl(entityMappingRepository());
}
@Bean
UserService userService()
{
return mock(UserService.class);
}
@Bean
PermissionSystemService permissionSystemService()
{
return mock(PermissionSystemService.class);
}
@Bean
IdGenerator idGenerator()
{
return mock(IdGenerator.class);
}
}
}