/** * *************************************************************************** * Copyright (c) 2010 Qcadoo Limited * Project: Qcadoo Framework * Version: 1.4 * * This file is part of Qcadoo. * * Qcadoo is free software; you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published * by the Free Software Foundation; either version 3 of the License, * or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * *************************************************************************** */ package com.qcadoo.model.types; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertNull; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.mock; import java.math.BigDecimal; import java.util.Date; import java.util.Locale; import java.util.Set; import org.apache.commons.lang3.StringUtils; import org.junit.Test; import org.springframework.security.authentication.encoding.PasswordEncoder; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.qcadoo.localization.api.TranslationService; import com.qcadoo.model.api.DictionaryService; import com.qcadoo.model.api.FieldDefinition; import com.qcadoo.model.api.types.EnumeratedType; import com.qcadoo.model.api.types.FieldType; import com.qcadoo.model.api.types.ManyToManyType; import com.qcadoo.model.internal.DataAccessTest; import com.qcadoo.model.internal.DefaultEntity; import com.qcadoo.model.internal.FieldDefinitionImpl; import com.qcadoo.model.internal.api.ValueAndError; import com.qcadoo.model.internal.types.BelongsToEntityType; import com.qcadoo.model.internal.types.BooleanType; import com.qcadoo.model.internal.types.DateTimeType; import com.qcadoo.model.internal.types.DateType; import com.qcadoo.model.internal.types.DecimalType; import com.qcadoo.model.internal.types.DictionaryType; import com.qcadoo.model.internal.types.EnumType; import com.qcadoo.model.internal.types.IntegerType; import com.qcadoo.model.internal.types.ManyToManyEntitiesType; import com.qcadoo.model.internal.types.PasswordType; import com.qcadoo.model.internal.types.PriorityType; import com.qcadoo.model.internal.types.StringType; import com.qcadoo.model.internal.types.TextType; public class FieldTypeFactoryTest extends DataAccessTest { private final FieldDefinition fieldDefinition = new FieldDefinitionImpl(null, "aa"); @Test public void shouldReturnEnumType() throws Exception { // given TranslationService translationService = mock(TranslationService.class); given(translationService.translate("path.value.val1", Locale.ENGLISH)).willReturn("i18nVal1"); given(translationService.translate("path.value.val2", Locale.ENGLISH)).willReturn("i18nVal2"); given(translationService.translate("path.value.val3", Locale.ENGLISH)).willReturn("i18nVal3"); // when EnumeratedType fieldType = new EnumType(translationService, "path", true, "val1", "val2", "val3"); // then assertEquals(fieldType.values(Locale.ENGLISH).keySet(), Sets.newHashSet("val1", "val2", "val3")); assertEquals(Lists.newArrayList(fieldType.values(Locale.ENGLISH).values()), Lists.newArrayList("i18nVal1", "i18nVal2", "i18nVal3")); assertEquals(String.class, fieldType.getType()); ValueAndError valueAndError1 = fieldType.toObject(fieldDefinition, "val1"); ValueAndError valueAndError2 = fieldType.toObject(fieldDefinition, "val4"); assertTrue(valueAndError1.isValid()); assertFalse(valueAndError2.isValid()); assertNotNull(valueAndError1.getValue()); assertNull(valueAndError2.getValue()); assertEquals("qcadooView.validate.field.error.invalidDictionaryItem", valueAndError2.getMessage()); assertEquals("[val1, val2, val3]", valueAndError2.getArgs()[0]); } @Test public void shouldReturnDictionaryType() throws Exception { // given DictionaryService dictionaryService = mock(DictionaryService.class); given(dictionaryService.getValues("dictionary", Locale.ENGLISH)).willReturn( ImmutableMap.of("val1", "val1", "val2", "val2", "val3", "val3")); given(dictionaryService.getKeys("dictionary")).willReturn(Lists.newArrayList("val1", "val2", "val3")); // when EnumeratedType fieldType = new DictionaryType("dictionary", dictionaryService, true); // then assertEquals(fieldType.values(Locale.ENGLISH).keySet(), Sets.newHashSet("val1", "val2", "val3")); assertEquals(Lists.newArrayList(fieldType.values(Locale.ENGLISH).values()), Lists.newArrayList("val1", "val2", "val3")); assertEquals(String.class, fieldType.getType()); ValueAndError valueAndError1 = fieldType.toObject(fieldDefinition, "val1"); ValueAndError valueAndError2 = fieldType.toObject(fieldDefinition, "val4"); assertNotNull(valueAndError1.getValue()); assertNull(valueAndError2.getValue()); assertEquals("qcadooView.validate.field.error.invalidDictionaryItem", valueAndError2.getMessage()); assertEquals("[val1, val2, val3]", valueAndError2.getArgs()[0]); } @Test public void shouldReturnBooleanType() throws Exception { // when FieldType fieldType = new BooleanType(); // then assertEquals(Boolean.class, fieldType.getType()); assertTrue(fieldType.toObject(fieldDefinition, false).isValid()); } @Test public void shouldReturnDateType() throws Exception { // when FieldType fieldType = new DateType(); // then assertEquals(Date.class, fieldType.getType()); assertTrue(fieldType.toObject(fieldDefinition, new Date()).isValid()); } @Test public void shouldReturnDateTimeType() throws Exception { // when FieldType fieldType = new DateTimeType(); // then assertEquals(Date.class, fieldType.getType()); assertTrue(fieldType.toObject(fieldDefinition, new Date()).isValid()); } @Test public void shouldReturnDecimalType() throws Exception { // when FieldType fieldType = new DecimalType(); // then assertEquals(BigDecimal.class, fieldType.getType()); assertTrue(fieldType.toObject(fieldDefinition, BigDecimal.valueOf(1.21)).isValid()); assertTrue(fieldType.toObject(fieldDefinition, BigDecimal.valueOf(1)).isValid()); assertTrue(fieldType.toObject(fieldDefinition, BigDecimal.valueOf(1)).isValid()); assertTrue(fieldType.toObject(fieldDefinition, BigDecimal.valueOf(1234567)).isValid()); } @Test public void shouldReturnIntegerType() throws Exception { // when FieldType fieldType = new IntegerType(); // then assertEquals(Integer.class, fieldType.getType()); assertTrue(fieldType.toObject(fieldDefinition, 1).isValid()); assertTrue(fieldType.toObject(fieldDefinition, 1234567890).isValid()); } @Test public void shouldReturnStringType() throws Exception { // when FieldType fieldType = new StringType(); // then assertEquals(String.class, fieldType.getType()); assertTrue(fieldType.toObject(fieldDefinition, "test").isValid()); assertTrue(fieldType.toObject(fieldDefinition, StringUtils.repeat("a", 255)).isValid()); assertTrue(fieldType.toObject(fieldDefinition, StringUtils.repeat("a", 300)).isValid()); } @Test public void shouldReturnTextType() throws Exception { // when FieldType fieldType = new TextType(); // then assertEquals(String.class, fieldType.getType()); assertTrue(fieldType.toObject(fieldDefinition, "test").isValid()); assertTrue(fieldType.toObject(fieldDefinition, StringUtils.repeat("a", 2048)).isValid()); assertTrue(fieldType.toObject(fieldDefinition, StringUtils.repeat("a", 2049)).isValid()); } @Test public void shouldReturnBelongToType() throws Exception { // when FieldType fieldType = new BelongsToEntityType("parent", "entity", dataDefinitionService, false, true); // then assertEquals(Object.class, fieldType.getType()); assertTrue(fieldType.toObject(fieldDefinition, new DefaultEntity(dataDefinition)).isValid()); } @Test public void shouldReturnManyToManyType() throws Exception { // when FieldType fieldType = new ManyToManyEntitiesType("parent", "entity", "joinFieldName", ManyToManyType.Cascade.NULLIFY, true, false, dataDefinitionService); // then assertEquals(Set.class, fieldType.getType()); assertTrue(fieldType.toObject(fieldDefinition, new DefaultEntity(dataDefinition)).isValid()); } @Test public void shouldReturnPasswordType() throws Exception { // when PasswordEncoder passwordEncoder = mock(PasswordEncoder.class); FieldType fieldType = new PasswordType(passwordEncoder); // then assertEquals(String.class, fieldType.getType()); } @Test public void shouldReturnPriorityType() throws Exception { // given FieldDefinition fieldDefinition = new FieldDefinitionImpl(null, "aaa"); // when FieldType fieldType = new PriorityType(fieldDefinition); // then assertEquals(Integer.class, fieldType.getType()); assertTrue(fieldType.toObject(fieldDefinition, 1).isValid()); assertEquals(fieldDefinition, ((PriorityType) fieldType).getScopeFieldDefinition()); } }