package com.constellio.model.services.schemas.builders;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.when;
import java.util.Arrays;
import org.junit.Before;
import org.junit.FixMethodOrder;
import org.junit.runners.MethodSorters;
import org.mockito.Mock;
import com.constellio.data.dao.services.DataStoreTypesFactory;
import com.constellio.model.entities.Language;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataValueType;
import com.constellio.model.services.factories.ModelLayerFactory;
import com.constellio.model.services.schemas.builders.MetadataSchemaTypesBuilderRuntimeException.NoSuchSchemaType;
import com.constellio.model.services.taxonomies.TaxonomiesManager;
import com.constellio.model.utils.ClassProvider;
import com.constellio.model.utils.DefaultClassProvider;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.schemas.FakeDataStoreTypeFactory;
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class MetadataBuilderTest extends ConstellioTest {
static final String COLLECTION = "zeUltimateCollection";
static final String CODE_DEFAULT_METADATA = "codeMetadata";
static final String DEFAULT_SCHEMA_CODE = "codeSchema_default";
static final String CUSTOM_SCHEMA_CODE = "codeSchema_codeSchema";
static final MetadataValueType VALUE_TYPE = MetadataValueType.NUMBER;
static final boolean ENABLE = true;
static final boolean DISABLE = false;
@Mock MetadataSchemaTypesBuilder typesBuilder;
@Mock TaxonomiesManager taxonomiesManager;
@Mock ModelLayerFactory modelLayerFactory;
DataStoreTypesFactory typesFactory = new FakeDataStoreTypeFactory();
MetadataBuilder metadataWithInheritanceBuilder, metadataWithoutInheritanceBuilder, inheritedMetadataBuilder;
MetadataBuilder anotherSchemaMetadataBuilder, referenceOtherSchemaMetadataBuilder;
Metadata metadataWithInheritance, metadataWithoutInheritance, inheritedMetadata;
MetadataSchemaTypeBuilder schemaTypeBuilder, anotherSchemaTypeBuilder;
MetadataSchemaBuilder schemaBuilder, anotherSchemaBuilder;
String anotherSchemaTypeCompleteCode;
String anotherSchemaCompleteCode;
String anotherSchemaMetadataCompleteCode;
@Before
public void setup() {
when(modelLayerFactory.getTaxonomiesManager()).thenReturn(taxonomiesManager);
when(typesBuilder.getSchemaType(anyString())).thenThrow(NoSuchSchemaType.class);
when(typesBuilder.getClassProvider()).thenReturn(new DefaultClassProvider());
when(typesBuilder.getLanguages()).thenReturn(Arrays.asList(Language.French));
schemaTypeBuilder = MetadataSchemaTypeBuilder.createNewSchemaType(COLLECTION, "codeSchema", typesBuilder);
schemaBuilder = schemaTypeBuilder.getDefaultSchema();
anotherSchemaTypeBuilder = MetadataSchemaTypeBuilder.createNewSchemaType(COLLECTION, "anotherSchemaType", typesBuilder);
anotherSchemaBuilder = anotherSchemaTypeBuilder.getDefaultSchema();
anotherSchemaMetadataBuilder = MetadataBuilder.createMetadataWithoutInheritance("anotherSchemaMetadata",
anotherSchemaBuilder).setType(MetadataValueType.STRING);
anotherSchemaTypeCompleteCode = anotherSchemaTypeBuilder.getCode();
anotherSchemaCompleteCode = anotherSchemaBuilder.getCode();
anotherSchemaMetadataCompleteCode = anotherSchemaMetadataBuilder.getCode();
metadataWithoutInheritanceBuilder = MetadataBuilder.createMetadataWithoutInheritance(CODE_DEFAULT_METADATA,
schemaBuilder);
inheritedMetadataBuilder = metadataWithoutInheritanceBuilder;
metadataWithInheritanceBuilder = MetadataBuilder.createCustomMetadataFromDefault(inheritedMetadataBuilder, "codeSchema");
referenceOtherSchemaMetadataBuilder = MetadataBuilder.createMetadataWithoutInheritance("ref", schemaBuilder);
referenceOtherSchemaMetadataBuilder.defineReferences().set(anotherSchemaTypeBuilder);
}
protected void build() {
metadataWithoutInheritance = metadataWithoutInheritanceBuilder.buildWithoutInheritance(typesFactory, modelLayerFactory);
inheritedMetadata = metadataWithoutInheritance;
metadataWithInheritance = metadataWithInheritanceBuilder.buildWithInheritance(inheritedMetadata);
}
protected void buildAndModify() {
Metadata inheritedMetadata = metadataWithoutInheritanceBuilder.buildWithoutInheritance(typesFactory, modelLayerFactory);
Metadata metadataWithInheritance = metadataWithInheritanceBuilder.buildWithInheritance(inheritedMetadata);
ClassProvider classProvider = new DefaultClassProvider();
metadataWithoutInheritanceBuilder = MetadataBuilder.modifyMetadataWithoutInheritance(inheritedMetadata, classProvider);
inheritedMetadataBuilder = metadataWithoutInheritanceBuilder;
metadataWithInheritanceBuilder = MetadataBuilder.modifyMetadataWithInheritance(metadataWithInheritance,
inheritedMetadataBuilder);
}
}