/**
* ***************************************************************************
* 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.validators;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
import static org.mockito.BDDMockito.given;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import org.hibernate.Criteria;
import org.junit.Before;
import org.junit.Test;
import org.springframework.test.util.ReflectionTestUtils;
import com.qcadoo.model.api.Entity;
import com.qcadoo.model.beans.sample.CustomEntityService;
import com.qcadoo.model.beans.sample.SampleSimpleDatabaseObject;
import com.qcadoo.model.internal.DataAccessTest;
import com.qcadoo.model.internal.DefaultEntity;
import com.qcadoo.model.internal.hooks.EntityHookDefinitionImpl;
import com.qcadoo.model.internal.hooks.FieldHookDefinitionImpl;
import com.qcadoo.model.internal.validators.CustomEntityValidator;
import com.qcadoo.model.internal.validators.CustomValidator;
import com.qcadoo.model.internal.validators.LengthValidator;
import com.qcadoo.model.internal.validators.RangeValidator;
import com.qcadoo.model.internal.validators.RegexValidator;
import com.qcadoo.model.internal.validators.RequiredValidator;
import com.qcadoo.model.internal.validators.ScaleValidator;
import com.qcadoo.model.internal.validators.UniqueValidator;
import com.qcadoo.model.internal.validators.UnscaledValueValidator;
import com.qcadoo.plugin.api.PluginStateResolver;
import com.qcadoo.plugin.internal.PluginUtilsService;
public class ValidatorTest extends DataAccessTest {
@Before
public void init() {
given(applicationContext.getBean(CustomEntityService.class)).willReturn(new CustomEntityService());
}
@Test
public void shouldHasNoErrorsIfAllFieldAreNotRequired() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("name", null);
entity.setField("age", null);
// when
entity = dataDefinition.save(entity);
// then
verify(session).save(any(SampleSimpleDatabaseObject.class));
assertTrue(entity.isValid());
assertTrue(entity.getErrors().isEmpty());
assertTrue(entity.getGlobalErrors().isEmpty());
}
@Test
public void shouldHasErrorMessage() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("age", "");
fieldDefinitionAge.withValidator(new RequiredValidator());
// when
entity = dataDefinition.save(entity);
// then
verify(session, never()).save(any(SampleSimpleDatabaseObject.class));
assertFalse(entity.isValid());
assertEquals(1, entity.getErrors().size());
assertEquals("qcadooView.validate.field.error.missing", entity.getError("age").getMessage());
assertEquals(0, entity.getGlobalErrors().size());
}
@Test
public void shouldHasCustomErrorMessage() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("age", "");
RequiredValidator requiredValidator = new RequiredValidator();
requiredValidator.setErrorMessage("missing age");
fieldDefinitionAge.withValidator(requiredValidator);
// when
entity = dataDefinition.save(entity);
// then
verify(session, never()).save(any(SampleSimpleDatabaseObject.class));
assertFalse(entity.isValid());
assertEquals(1, entity.getErrors().size());
assertEquals("missing age", entity.getError("age").getMessage());
assertEquals(0, entity.getGlobalErrors().size());
}
@Test
public void shouldBeRequiredIfHasRequiredValidator() throws Exception {
// given
fieldDefinitionName.withValidator(new RequiredValidator());
// then
assertTrue(fieldDefinitionName.isRequired());
}
@Test
public void shouldNotBeRequiredIfDoesNotHasRequiredValidator() throws Exception {
// then
assertFalse(fieldDefinitionName.isRequired());
}
@Test
public void shouldHasErrorIfIntegerTypeIsWrong() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("age", "21w");
// when
entity = dataDefinition.save(entity);
// then
verify(session, never()).save(any(SampleSimpleDatabaseObject.class));
assertFalse(entity.isValid());
}
@Test
public void shouldHasErrorIfBigDecimalTypeIsWrong() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("money", "221.2w");
// when
entity = dataDefinition.save(entity);
// then
verify(session, never()).save(any(SampleSimpleDatabaseObject.class));
assertFalse(entity.isValid());
}
@Test
public void shouldHasErrorIfDateTypeIsWrong() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("money", "2010-01-a");
// when
entity = dataDefinition.save(entity);
// then
verify(session, never()).save(any(SampleSimpleDatabaseObject.class));
assertFalse(entity.isValid());
}
@Test
public void shouldHasErrorIfBooleanTypeIsWrong() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("money", "a");
// when
entity = dataDefinition.save(entity);
// then
verify(session, never()).save(any(SampleSimpleDatabaseObject.class));
assertFalse(entity.isValid());
}
@Test
public void shouldBeUniqueIfHasUniqueValidator() throws Exception {
// given
fieldDefinitionName.withValidator(new UniqueValidator());
// then
assertTrue(fieldDefinitionName.isUnique());
}
@Test
public void shouldNotBeUniqueIfDoesNotHasUniqueValidator() throws Exception {
// then
assertFalse(fieldDefinitionName.isUnique());
}
@Test
public void shouldHasErrorsIfRequiredFieldsAreNotSet() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("name", "");
entity.setField("age", null);
fieldDefinitionName.withValidator(new RequiredValidator());
fieldDefinitionAge.withValidator(new RequiredValidator());
// when
entity = dataDefinition.save(entity);
// then
verify(session, never()).save(any(SampleSimpleDatabaseObject.class));
assertFalse(entity.isValid());
}
@Test
public void shouldHasErrorsIfStringValueIsTooLong() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("name", "qwerty");
fieldDefinitionName.withValidator(new LengthValidator(null, null, 5));
// when
entity = dataDefinition.save(entity);
// then
verify(session, never()).save(any(SampleSimpleDatabaseObject.class));
assertFalse(entity.isValid());
}
@Test
public void shouldHasErrorsIfStringValueIsOutsideTheRange() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("name", "ddd");
fieldDefinitionName.withValidator(new RangeValidator("a", "c", true));
// when
entity = dataDefinition.save(entity);
// then
verify(session, never()).save(any(SampleSimpleDatabaseObject.class));
assertFalse(entity.isValid());
}
@Test
public void shouldHasNoErrorsIfStringValueIsInsideTheRange() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("name", "bbb");
fieldDefinitionName.withValidator(new RangeValidator("a", "c", true));
// when
entity = dataDefinition.save(entity);
// then
verify(session).save(any(SampleSimpleDatabaseObject.class));
assertTrue(entity.isValid());
}
@Test
public void shouldHasErrorsIfIntegerValueIsOutsideTheRange() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("age", "11");
fieldDefinitionAge.withValidator(new RangeValidator(null, 10, true));
// when
entity = dataDefinition.save(entity);
// then
verify(session, never()).save(any(SampleSimpleDatabaseObject.class));
assertFalse(entity.isValid());
}
@Test
public void shouldHasNoErrorsIfIntegerValueIsInsideTheRange() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("age", 5);
fieldDefinitionAge.withValidator(new RangeValidator(4, null, true));
// when
entity = dataDefinition.save(entity);
// then
verify(session).save(any(SampleSimpleDatabaseObject.class));
assertTrue(entity.isValid());
}
@Test
public void shouldHasErrorsIfBigDecimalValueIsOutsideTheRange() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("money", "31.22");
fieldDefinitionMoney.withValidator(new RangeValidator(40, 50, true));
// when
entity = dataDefinition.save(entity);
// then
verify(session, never()).save(any(SampleSimpleDatabaseObject.class));
assertFalse(entity.isValid());
}
@Test
public void shouldHasNoErrorsIfBigDecimalValueIsInsideTheRange() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("money", "31.22");
fieldDefinitionMoney.withValidator(new RangeValidator(30, 40, true));
// when
entity = dataDefinition.save(entity);
// then
verify(session).save(any(SampleSimpleDatabaseObject.class));
assertTrue(entity.isValid());
}
@Test
public void shouldHasErrorsIfDateValueIsOutsideTheRange() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("birthDate", "2010-01-01");
fieldDefinitionBirthDate.withValidator(new RangeValidator(new Date(), new Date(), true));
// when
entity = dataDefinition.save(entity);
// then
verify(session, never()).save(any(SampleSimpleDatabaseObject.class));
assertFalse(entity.isValid());
}
@Test
public void shouldHasNoErrorsIfDateValueIsInsideTheRange() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("birthDate", "2010-01-01");
fieldDefinitionBirthDate.withValidator(new RangeValidator(null, new Date(), true));
// when
entity = dataDefinition.save(entity);
// then
verify(session).save(any(SampleSimpleDatabaseObject.class));
assertTrue(entity.isValid());
}
@Test
public void shouldHasNoCheckRangeOfBoolean() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("retired", "false");
fieldDefinitionRetired.withValidator(new RangeValidator(true, true, true));
// when
entity = dataDefinition.save(entity);
// then
verify(session).save(any(SampleSimpleDatabaseObject.class));
assertTrue(entity.isValid());
}
@Test
public void shouldHasErrorsIfIntegerValueIsTooLong() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("age", 123456);
fieldDefinitionAge.withValidator(new UnscaledValueValidator(null, null, 5));
// when
entity = dataDefinition.save(entity);
// then
verify(session, never()).save(any(SampleSimpleDatabaseObject.class));
assertFalse(entity.isValid());
}
@Test
public void shouldIgnoreUnscaledValueValidatorForStringValue() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("name", "Qcadoo Framework RLZ!");
fieldDefinitionName.withValidator(new UnscaledValueValidator(null, 1, null));
// when
entity = dataDefinition.save(entity);
// then
verify(session).save(any(SampleSimpleDatabaseObject.class));
assertTrue(entity.isValid());
}
@Test
public void shouldIgnoreScaleValidatorForStringValue() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("name", "Qcadoo Framework RLZ!");
fieldDefinitionName.withValidator(new ScaleValidator(null, 1, null));
// when
entity = dataDefinition.save(entity);
// then
verify(session).save(any(SampleSimpleDatabaseObject.class));
assertTrue(entity.isValid());
}
@Test
public void shouldIgnoreLengthValidatorForBigDecimalValue() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("money", new BigDecimal("123.456"));
fieldDefinitionMoney.withValidator(new LengthValidator(null, 1, null));
// when
entity = dataDefinition.save(entity);
// then
verify(session).save(any(SampleSimpleDatabaseObject.class));
assertTrue(entity.isValid());
}
@Test
public void shouldIgnoreLengthValidatorForIntegerValue() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("age", new Integer("123456"));
fieldDefinitionAge.withValidator(new LengthValidator(null, 1, null));
// when
entity = dataDefinition.save(entity);
// then
verify(session).save(any(SampleSimpleDatabaseObject.class));
assertTrue(entity.isValid());
}
@Test
public void shouldHasErrorsIfBigDecimalPresicionAndScaleAreTooLong() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("money", new BigDecimal("123.456"));
fieldDefinitionMoney.withValidator(new ScaleValidator(null, null, 2)).withValidator(
new UnscaledValueValidator(null, null, 4));
// when
entity = dataDefinition.save(entity);
// then
verify(session, never()).save(any(SampleSimpleDatabaseObject.class));
assertFalse(entity.isValid());
}
@Test
public void shouldHasErrorsIfBigDecimalUnscaledValueAreTooShort() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("money", new BigDecimal("123.45"));
fieldDefinitionMoney.withValidator(new UnscaledValueValidator(5, null, null));
// when
entity = dataDefinition.save(entity);
// then
verify(session, never()).save(any(SampleSimpleDatabaseObject.class));
assertFalse(entity.isValid());
}
@Test
public void shouldHasErrorsIfIntegerUnscaledValueAreTooShort() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("age", new Integer("123"));
fieldDefinitionAge.withValidator(new UnscaledValueValidator(5, null, null));
// when
entity = dataDefinition.save(entity);
// then
verify(session, never()).save(any(SampleSimpleDatabaseObject.class));
assertFalse(entity.isValid());
}
@Test
public void shouldHasErrorsIfBigDecimalScaleAreTooShort() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("money", new BigDecimal("123.45"));
fieldDefinitionMoney.withValidator(new ScaleValidator(3, null, null));
// when
entity = dataDefinition.save(entity);
// then
verify(session, never()).save(any(SampleSimpleDatabaseObject.class));
assertFalse(entity.isValid());
}
@Test
public void shouldHasErrorsIfBigDecimalScaleIsNotEqual() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("money", new BigDecimal("123.45"));
fieldDefinitionMoney.withValidator(new ScaleValidator(null, 4, null));
// when
entity = dataDefinition.save(entity);
// then
verify(session, never()).save(any(SampleSimpleDatabaseObject.class));
assertFalse(entity.isValid());
}
@Test
public void shouldHasErrorsIfIntegerUnscaledValueIsNotEqual() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("age", new Integer("123"));
fieldDefinitionAge.withValidator(new UnscaledValueValidator(null, 4, null));
// when
entity = dataDefinition.save(entity);
// then
verify(session, never()).save(any(SampleSimpleDatabaseObject.class));
assertFalse(entity.isValid());
}
@Test
public void shouldHasErrorsIfBigDecimalUnscaledValueIsNotEqual() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("money", new BigDecimal("123.45"));
fieldDefinitionMoney.withValidator(new UnscaledValueValidator(null, 4, null));
// when
entity = dataDefinition.save(entity);
// then
verify(session, never()).save(any(SampleSimpleDatabaseObject.class));
assertFalse(entity.isValid());
}
@Test
public void shouldHasNoErrorsIfBigDecimalValuePresicionAndScaleIsOk() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("money", new BigDecimal("123.4"));
fieldDefinitionMoney.withValidator(new UnscaledValueValidator(null, null, 3)).withValidator(
new ScaleValidator(null, null, 1));
// when
entity = dataDefinition.save(entity);
// then
verify(session).save(any(SampleSimpleDatabaseObject.class));
assertTrue(entity.isValid());
}
@Test
public void shouldHasErrorsIfStringLengthIsNotEqual() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("name", "Qcadoo Framework RLZ!");
fieldDefinitionName.withValidator(new LengthValidator(null, 4, null));
// when
entity = dataDefinition.save(entity);
// then
verify(session, never()).save(any(SampleSimpleDatabaseObject.class));
assertFalse(entity.isValid());
}
@Test
public void shouldHasErrorsIfStringIsTooShort() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("name", "Qcadoo Framework RLZ!");
fieldDefinitionName.withValidator(new LengthValidator(50, null, null));
// when
entity = dataDefinition.save(entity);
// then
verify(session, never()).save(any(SampleSimpleDatabaseObject.class));
assertFalse(entity.isValid());
}
@Test
public void shouldHasNoCheckLenghtOfBoolean() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("retired", false);
fieldDefinitionRetired.withValidator(new LengthValidator(null, null, 0));
// when
entity = dataDefinition.save(entity);
// then
verify(session).save(any(SampleSimpleDatabaseObject.class));
assertTrue(entity.isValid());
}
@Test
public void shouldHasNoCheckLenghtOfDate() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("birthDate", "2010-01-01");
fieldDefinitionBirthDate.withValidator(new LengthValidator(null, null, 0));
// when
entity = dataDefinition.save(entity);
// then
verify(session).save(any(SampleSimpleDatabaseObject.class));
assertTrue(entity.isValid());
}
@Test
public void shouldHasNoErrorsIfStringValueLenghtIsOk() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("name", "qwert");
fieldDefinitionName.withValidator(new LengthValidator(null, null, 5));
// when
entity = dataDefinition.save(entity);
// then
verify(session).save(any(SampleSimpleDatabaseObject.class));
assertTrue(entity.isValid());
}
@Test
public void shouldHasNoErrorsIfFieldIsNotDuplicated() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("name", "not existed");
given(criteria.uniqueResult()).willReturn(0);
fieldDefinitionName.withValidator(new UniqueValidator());
// when
entity = dataDefinition.save(entity);
// then
verify(session).save(any(SampleSimpleDatabaseObject.class));
assertTrue(entity.isValid());
}
@Test
public void shouldHasNoErrorsIfUpdatedFieldIsNotDuplicated() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition, 1L);
entity.setField("name", "not existed");
SampleSimpleDatabaseObject databaseObject = new SampleSimpleDatabaseObject(1L);
given(session.get(SampleSimpleDatabaseObject.class, 1L)).willReturn(databaseObject);
given(criteria.uniqueResult()).willReturn(0);
fieldDefinitionName.withValidator(new UniqueValidator());
// when
entity = dataDefinition.save(entity);
// then
verify(session).save(any(SampleSimpleDatabaseObject.class));
assertTrue(entity.isValid());
}
@Test
@SuppressWarnings({ "rawtypes", "unchecked" })
public void shouldHasErrorsIfFieldIsDuplicated() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("name", "existed");
given(hibernateService.getTotalNumberOfEntities(any(Criteria.class))).willReturn(1);
given(hibernateService.list(any(Criteria.class))).willReturn((List) Collections.singletonList(entity));
fieldDefinitionName.withValidator(new UniqueValidator());
// when
entity = dataDefinition.save(entity);
// then
verify(session, never()).save(any(SampleSimpleDatabaseObject.class));
assertFalse(entity.isValid());
}
@Test
public void shouldHasNoErrorIfCustomValidatorReturnsTrue() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("name", "qwerty");
fieldDefinitionName.withValidator(new CustomValidator(new FieldHookDefinitionImpl(CustomEntityService.class.getName(),
"isEqualToQwerty", PLUGIN_IDENTIFIER, applicationContext)));
// when
entity = dataDefinition.save(entity);
// then
verify(session).save(any(SampleSimpleDatabaseObject.class));
assertTrue(entity.isValid());
}
@Test
public void shouldHaveErrorIfCustomValidatorReturnsFalse() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("name", "qwert");
fieldDefinitionName.withValidator(new CustomValidator(new FieldHookDefinitionImpl(CustomEntityService.class.getName(),
"isEqualToQwerty", PLUGIN_IDENTIFIER, applicationContext)));
// when
entity = dataDefinition.save(entity);
// then
verify(session, never()).save(any(SampleSimpleDatabaseObject.class));
assertFalse(entity.isValid());
assertEquals(1, entity.getErrors().size());
assertEquals("qcadooView.validate.field.error.custom", entity.getError("name").getMessage());
assertEquals(0, entity.getGlobalErrors().size());
}
@Test
public void shouldHasNoErrorIfCustomEntityValidatorReturnsTrue() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("name", "Mr T");
entity.setField("age", "18");
dataDefinition.addValidatorHook(new CustomEntityValidator(new EntityHookDefinitionImpl(CustomEntityService.class
.getName(), "hasAge18AndNameMrT", PLUGIN_IDENTIFIER, applicationContext)));
// when
entity = dataDefinition.save(entity);
// then
verify(session).save(any(SampleSimpleDatabaseObject.class));
assertTrue(entity.isValid());
}
@Test
public void shouldHaveErrorIfCustomEntityValidatorReturnsFalse() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("name", "Mr");
entity.setField("age", "18");
dataDefinition.addValidatorHook(new CustomEntityValidator(new EntityHookDefinitionImpl(CustomEntityService.class
.getName(), "hasAge18AndNameMrT", PLUGIN_IDENTIFIER, applicationContext)));
// when
entity = dataDefinition.save(entity);
// then
verify(session, never()).save(any(SampleSimpleDatabaseObject.class));
assertFalse(entity.isValid());
}
@Test
public void shouldHasErrorsIfStringNotMatchExpression() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("name", "Qcadoo Framework RLZ!");
fieldDefinitionName.withValidator(new RegexValidator(".*MES.*"));
// when
entity = dataDefinition.save(entity);
// then
verify(session, never()).save(any(SampleSimpleDatabaseObject.class));
assertFalse(entity.isValid());
}
@Test
public void shouldHaveNoErrorsIfStringMatchExpression() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("name", "Qcadoo Framework RLZ!");
fieldDefinitionName.withValidator(new RegexValidator("^Qcadoo.*"));
// when
entity = dataDefinition.save(entity);
// then
verify(session).save(any(SampleSimpleDatabaseObject.class));
assertTrue(entity.isValid());
}
@Test
public final void shouldNotCallEntityValidatorIfSourcePluginIsNotEnabled() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
dataDefinition.addValidatorHook(new CustomEntityValidator(new EntityHookDefinitionImpl(CustomEntityService.class
.getName(), "hasAge18AndNameMrT", PLUGIN_IDENTIFIER, applicationContext)));
stubPluginIsEnabled(false);
// when
Entity savedEntity = dataDefinition.save(entity);
// then
assertTrue(savedEntity.isValid());
}
@Test
public final void shouldCallEntityValidatorIfSourcePluginIsEnabled() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("age", 24);
entity.setField("name", "Fantomas");
dataDefinition.addValidatorHook(new CustomEntityValidator(new EntityHookDefinitionImpl(CustomEntityService.class
.getName(), "hasAge18AndNameMrT", PLUGIN_IDENTIFIER, applicationContext)));
stubPluginIsEnabled(true);
// when
Entity savedEntity = dataDefinition.save(entity);
// then
assertFalse(savedEntity.isValid());
}
@Test
public final void shouldNotCallFieldValidatorIfSourcePluginIsNotEnabled() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("name", "EverythingButNotQWERTY :)");
fieldDefinitionName.withValidator(new CustomValidator(new FieldHookDefinitionImpl(CustomEntityService.class.getName(),
"isEqualToQwerty", PLUGIN_IDENTIFIER, applicationContext)));
stubPluginIsEnabled(false);
// when
Entity savedEntity = dataDefinition.save(entity);
// then
assertTrue(savedEntity.isValid());
}
@Test
public final void shouldCallFieldValidatorIfSourcePluginIsEnabled() throws Exception {
// given
Entity entity = new DefaultEntity(dataDefinition);
entity.setField("name", "not equals to qwerty string");
fieldDefinitionName.withValidator(new CustomValidator(new FieldHookDefinitionImpl(CustomEntityService.class.getName(),
"isEqualToQwerty", PLUGIN_IDENTIFIER, applicationContext)));
stubPluginIsEnabled(true);
// when
entity = dataDefinition.save(entity);
// then
verify(session, never()).save(any(SampleSimpleDatabaseObject.class));
assertFalse(entity.isValid());
}
private void stubPluginIsEnabled(final boolean isEnabled) {
PluginStateResolver pluginStateResolver = mock(PluginStateResolver.class);
PluginUtilsService pluginUtil = new PluginUtilsService(pluginStateResolver);
pluginUtil.init();
given(pluginStateResolver.isEnabled(PLUGIN_IDENTIFIER)).willReturn(isEnabled);
given(pluginStateResolver.isEnabledOrEnabling(PLUGIN_IDENTIFIER)).willReturn(isEnabled);
}
}