package com.constellio.app.ui.acceptation; import static com.constellio.app.ui.i18n.i18n.$; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.fail; import java.util.ArrayList; import java.util.List; import java.util.Locale; import org.junit.Test; import com.constellio.app.modules.rm.RMTestRecords; import com.constellio.app.modules.rm.services.RMSchemasRecordsServices; import com.constellio.app.ui.i18n.i18n; import com.constellio.data.utils.LangUtils.ListComparisonResults; import com.constellio.model.entities.EnumWithSmallCode; import com.constellio.model.entities.Language; import com.constellio.model.entities.Taxonomy; import com.constellio.model.entities.configs.SystemConfiguration; import com.constellio.model.entities.configs.SystemConfigurationGroup; import com.constellio.model.entities.schemas.Metadata; import com.constellio.model.entities.schemas.MetadataSchema; import com.constellio.model.entities.schemas.MetadataSchemaType; import com.constellio.model.entities.schemas.MetadataSchemaTypes; import com.constellio.model.services.records.RecordServices; import com.constellio.model.utils.EnumWithSmallCodeUtils; import com.constellio.sdk.dev.tools.CompareI18nKeys; import com.constellio.sdk.tests.ConstellioTest; import com.constellio.sdk.tests.selenium.adapters.constellio.ConstellioWebDriver; public class I18NAcceptationAcceptTest extends ConstellioTest { RecordServices recordServices; ConstellioWebDriver driver; RMTestRecords records; RMSchemasRecordsServices schemas; List<String> missingKeys = new ArrayList<>(); Locale locale; Locale defaultLocale; private static List<String> keysWithSameFrenchEnglishValue = new ArrayList<>(); static { keysWithSameFrenchEnglishValue.add("SystemConfigurationGroup.agent"); } @Test public void givenEnglishSystemEnsureAllObjectsHasATitle() throws Exception { givenEnglishSystem(); findMissingKeys(); assertThat(missingKeys).isEmpty(); } @Test public void givenFrenchSystemEnsureAllObjectsHasATitle() throws Exception { givenFrenchSystem(); findMissingKeys(); assertThat(missingKeys).isEmpty(); } @Test public void ensureAllLanguageFilesHaveSameKeys() throws Exception { ListComparisonResults<String> results = CompareI18nKeys.compare(Language.English); if (!results.getNewItems().isEmpty() || !results.getRemovedItems().isEmpty()) { String comparisonMessage = CompareI18nKeys.getComparisonMessage(Language.English, results); fail("Missing i18n keys\n" + comparisonMessage); } } private void givenEnglishSystem() { givenSystemLanguageIs("en"); givenTransactionLogIsEnabled(); givenCollectionWithTitle(zeCollection, asList("en"), "Collection de test").withMockedAvailableModules(false) .withConstellioRMModule().withAllTestUsers() .withConstellioESModule().withRobotsModule(); setupPlugins(); i18n.setLocale(Locale.ENGLISH); locale = Locale.ENGLISH; } protected void givenFrenchSystem() { givenSystemLanguageIs("fr"); givenTransactionLogIsEnabled(); givenCollectionWithTitle(zeCollection, asList("fr"), "Collection de test").withMockedAvailableModules(false) .withConstellioRMModule().withAllTestUsers() .withConstellioESModule().withRobotsModule(); setupPlugins(); i18n.setLocale(Locale.FRENCH); locale = Locale.FRENCH; } protected void setupPlugins() { } private void findMissingKeys() { findTypesMissingKeys(); findTaxonomiesMissingKeys(); findMissingConfigKeys(); if (!missingKeys.isEmpty()) { System.out.println("###############################################################################"); System.out.println("# New/Modified objects"); System.out.println("###############################################################################"); for (String missingKey : missingKeys) { System.out.println(missingKey + "="); } System.out.println("\n\n"); } } private void findMissingConfigKeys() { List<String> missingKeys = new ArrayList<>(); for (SystemConfiguration config : getModelLayerFactory().getSystemConfigurationsManager().getAllConfigurations()) { //SystemConfigurationGroup.decommissioning.calculatedCloseDateNumberOfYearWhenVariableRule String key = "SystemConfigurationGroup." + config.getConfigGroupCode() + "." + config.getCode(); addIfNoValueInMainI18N(key); if (config.getEnumClass() != null) { findEnumMissingKeys(config.getEnumClass()); } } for (SystemConfigurationGroup group : getModelLayerFactory().getSystemConfigurationsManager().getConfigurationGroups()) { String key = "SystemConfigurationGroup." + group.getCode(); addIfNoValueInMainI18N(key); } } private void findTypesMissingKeys() { List<String> missingKeys = new ArrayList<>(); Language language = Language.withCode(locale.getLanguage()); MetadataSchemaTypes types = getModelLayerFactory().getMetadataSchemasManager().getSchemaTypes(zeCollection); for (MetadataSchemaType type : types.getSchemaTypes()) { addIfNoValue(type.getLabel(language)); for (MetadataSchema schema : type.getAllSchemas()) { addIfNoValue(schema.getLabel(language)); for (Metadata metadata : schema.getMetadatas()) { addIfNoValue(metadata.getLabel(language)); if (metadata.getEnumClass() != null) { findEnumMissingKeys(metadata.getEnumClass()); } } } } } private void findEnumMissingKeys(Class<? extends Enum<?>> enumClass) { if (enumClass.isAssignableFrom(EnumWithSmallCode.class)) { for (String smallCode : EnumWithSmallCodeUtils.toSmallCodeList(enumClass)) { addIfNoValueInMainI18N(enumClass.getSimpleName() + "." + smallCode); } } } private void findTaxonomiesMissingKeys() { List<String> missingKeys = new ArrayList<>(); for (Taxonomy taxonomy : getModelLayerFactory().getTaxonomiesManager().getEnabledTaxonomies(zeCollection)) { addIfNoValue(taxonomy.getTitle()); } } private void addIfNoValueInMainI18N(String key) { i18n.setLocale(locale); String label = $(key, locale); if (key.equals(label) && !missingKeys.contains(key)) { missingKeys.add(key); } else if (locale != Locale.FRENCH) { i18n.setLocale(Locale.FRENCH); String frenchLabel = $(key); if (label.equals(frenchLabel) && !missingKeys.contains(key) && !keysWithSameFrenchEnglishValue.contains(key)) { missingKeys.add(key); } } } private void addIfNoValue(String title) { if (title.startsWith("init.")) { if (!missingKeys.contains(title)) { missingKeys.add(title); } } } }