package org.molgenis.data.i18n;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.molgenis.data.*;
import org.molgenis.data.i18n.model.I18nStringMetaData;
import org.molgenis.data.i18n.model.Language;
import org.molgenis.data.i18n.model.LanguageFactory;
import org.molgenis.data.i18n.model.LanguageMetadata;
import org.molgenis.data.meta.MetaDataService;
import org.molgenis.data.meta.model.Attribute;
import org.molgenis.data.meta.model.AttributeFactory;
import org.molgenis.data.meta.model.AttributeMetadata;
import org.molgenis.data.meta.model.EntityTypeMetadata;
import org.molgenis.test.data.AbstractMolgenisSpringTest;
import org.springframework.beans.factory.annotation.Autowired;
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.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static java.util.Collections.singletonList;
import static org.mockito.Mockito.*;
import static org.molgenis.data.i18n.model.I18nStringMetaData.I18N_STRING;
import static org.molgenis.data.meta.model.AttributeMetadata.ATTRIBUTE_META_DATA;
import static org.molgenis.data.meta.model.EntityTypeMetadata.ENTITY_TYPE_META_DATA;
import static org.testng.Assert.assertEquals;
@ContextConfiguration(classes = { LanguageRepositoryDecoratorTest.Config.class })
public class LanguageRepositoryDecoratorTest extends AbstractMolgenisSpringTest
{
@Autowired
private AttributeMetadata attrMetaMeta;
@Autowired
private EntityTypeMetadata entityTypeMeta;
@Autowired
private I18nStringMetaData i18nStringMetaData;
@Autowired
private LanguageFactory languageFactory;
@Autowired
private AttributeFactory attrMetaFactory;
@Mock
private Repository<Language> decoratedRepo;
@Mock
private DataService dataService;
@Mock
private MetaDataService metaDataService;
@Mock
private RepositoryCollection defaultBackend;
@Mock
private LanguageMetadata languageMeta;
@Mock
private LanguageService languageService;
private LanguageRepositoryDecorator languageRepositoryDecorator;
@BeforeMethod
public void setUpBeforeMethod()
{
MockitoAnnotations.initMocks(this);
when(metaDataService.getDefaultBackend()).thenReturn(defaultBackend);
when(dataService.getMeta()).thenReturn(metaDataService);
when(dataService.getEntityType(ENTITY_TYPE_META_DATA)).thenReturn(entityTypeMeta);
when(dataService.getEntityType(ATTRIBUTE_META_DATA)).thenReturn(attrMetaMeta);
when(dataService.getEntityType(I18N_STRING)).thenReturn(i18nStringMetaData);
languageRepositoryDecorator = new LanguageRepositoryDecorator(decoratedRepo, languageService);
}
@Test
public void addStream()
{
Language language0 = mock(Language.class);
when(language0.getEntityType()).thenReturn(languageMeta);
when(language0.getCode()).thenReturn("nl");
Language language1 = mock(Language.class);
when(language1.getEntityType()).thenReturn(languageMeta);
when(language1.getCode()).thenReturn("de");
Stream<Language> entities = Arrays.asList(language0, language1).stream();
assertEquals(languageRepositoryDecorator.add(entities), Integer.valueOf(2));
verify(decoratedRepo, times(1)).add(language0);
verify(decoratedRepo, times(1)).add(language1);
}
@Test(expectedExceptions = Exception.class, expectedExceptionsMessageRegExp = "Adding languages is not allowed")
public void addStreamNotAllowed()
{
Language language0 = mock(Language.class);
when(language0.getEntityType()).thenReturn(languageMeta);
when(language0.getCode()).thenReturn("tt");
Stream<Language> entities = Arrays.asList(language0).stream();
assertEquals(languageRepositoryDecorator.add(entities), Integer.valueOf(2));
verify(decoratedRepo, times(1)).add(language0);
}
@Test(expectedExceptions = Exception.class, expectedExceptionsMessageRegExp = "Deleting languages is not allowed")
public void deleteStream()
{
String nl = "nl";
String de = "de";
// Add NL to language
Language languageNL = languageFactory.create(nl, "Nederlands", true);
// Add DE to language
Language languageDE = languageFactory.create(de, "Deutsch", true);
// Add NL attribute to i18n
i18nStringMetaData.addAttribute(attrMetaFactory.create().setName(nl));
// Add DE attributes to i18n
i18nStringMetaData.addAttribute(attrMetaFactory.create().setName(de));
// Add language NL attributes for entity meta data
Attribute entityLabelNL = attrMetaFactory.create().setName(EntityTypeMetadata.LABEL + '-' + nl);
Attribute entityDescriptionNL = attrMetaFactory.create().setName(EntityTypeMetadata.DESCRIPTION + '-' + nl);
entityTypeMeta.addAttribute(entityLabelNL);
entityTypeMeta.addAttribute(entityDescriptionNL);
// Add language DE attributes for entity meta data
Attribute entityLabelDE = attrMetaFactory.create().setName(EntityTypeMetadata.LABEL + '-' + de);
Attribute entityDescriptionDE = attrMetaFactory.create().setName(EntityTypeMetadata.DESCRIPTION + '-' + de);
entityTypeMeta.addAttribute(entityLabelDE);
entityTypeMeta.addAttribute(entityDescriptionDE);
// Add language NL attributes for attribute meta data
Attribute attributeLabelNL = attrMetaFactory.create().setName(AttributeMetadata.LABEL + '-' + nl);
Attribute attributeDescriptionNL = attrMetaFactory.create().setName(AttributeMetadata.DESCRIPTION + '-' + nl);
attrMetaMeta.addAttribute(attributeLabelNL);
attrMetaMeta.addAttribute(attributeDescriptionNL);
// Add language DE attributes for attribute meta data
Attribute attributeLabelDE = attrMetaFactory.create().setName(AttributeMetadata.LABEL + '-' + de);
Attribute attributeDescriptionDE = attrMetaFactory.create().setName(AttributeMetadata.DESCRIPTION + '-' + de);
attrMetaMeta.addAttribute(attributeLabelDE);
attrMetaMeta.addAttribute(attributeDescriptionDE);
languageRepositoryDecorator.delete(Stream.of(languageNL, languageDE));
verify(decoratedRepo, times(1)).delete(languageNL);
verify(decoratedRepo, times(1)).delete(languageDE);
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Test
public void updateStream()
{
Language language0 = mock(Language.class);
Stream<Language> entities = Stream.of(language0);
ArgumentCaptor<Stream<Language>> captor = ArgumentCaptor.forClass((Class) Stream.class);
doNothing().when(decoratedRepo).update(captor.capture());
languageRepositoryDecorator.update(entities);
assertEquals(captor.getValue().collect(Collectors.toList()), singletonList(language0));
}
@Test
public void findAllStream()
{
Object id0 = "id0";
Object id1 = "id1";
Language language0 = mock(Language.class);
Language language1 = mock(Language.class);
Stream<Object> entityIds = Stream.of(id0, id1);
when(decoratedRepo.findAll(entityIds)).thenReturn(Stream.of(language0, language1));
Stream<Language> expectedEntities = languageRepositoryDecorator.findAll(entityIds);
assertEquals(expectedEntities.collect(Collectors.toList()), Arrays.asList(language0, language1));
}
@Test
public void findAllStreamFetch()
{
Fetch fetch = new Fetch();
Object id0 = "id0";
Object id1 = "id1";
Language language0 = mock(Language.class);
Language language1 = mock(Language.class);
Stream<Object> entityIds = Stream.of(id0, id1);
when(decoratedRepo.findAll(entityIds, fetch)).thenReturn(Stream.of(language0, language1));
Stream<Language> expectedEntities = languageRepositoryDecorator.findAll(entityIds, fetch);
assertEquals(expectedEntities.collect(Collectors.toList()), Arrays.asList(language0, language1));
}
@Test
public void findAllAsStream()
{
Language language0 = mock(Language.class);
@SuppressWarnings("unchecked")
Query<Language> query = mock(Query.class);
when(decoratedRepo.findAll(query)).thenReturn(Stream.of(language0));
Stream<Language> entities = languageRepositoryDecorator.findAll(query);
assertEquals(entities.collect(Collectors.toList()), singletonList(language0));
}
@Test
public void forEachBatchedFetch()
{
Fetch fetch = new Fetch();
@SuppressWarnings("unchecked")
Consumer<List<Language>> consumer = mock(Consumer.class);
decoratedRepo.forEachBatched(fetch, consumer, 234);
verify(decoratedRepo, times(1)).forEachBatched(fetch, consumer, 234);
}
@Configuration
@ComponentScan({ "org.molgenis.data.i18n.model" })
public static class Config
{
}
}