/** * This file is part of alf.io. * * alf.io is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * alf.io 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with alf.io. If not, see <http://www.gnu.org/licenses/>. */ package alfio.util; import alfio.model.AdditionalService; import alfio.model.AdditionalServiceText; import alfio.model.ContentLanguage; import alfio.model.modification.DateTimeModification; import alfio.model.modification.EventModification; import alfio.model.result.ValidationResult; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.springframework.validation.Errors; import org.springframework.validation.MapBindingResult; import java.math.BigDecimal; import java.time.ZonedDateTime; import java.util.Collections; import java.util.HashMap; import java.util.stream.Stream; import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; import static org.junit.Assert.*; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class ValidatorTest { private static final DateTimeModification VALID_EXPIRATION = DateTimeModification.fromZonedDateTime(ZonedDateTime.now().plusHours(1L)); private static final DateTimeModification VALID_INCEPTION = DateTimeModification.fromZonedDateTime(ZonedDateTime.now().minusDays(1L)); @Mock private EventModification eventModification; private Errors errors; private EventModification.AdditionalServiceText title = new EventModification.AdditionalServiceText(0, "it", "titolo", AdditionalServiceText.TextType.TITLE); private EventModification.AdditionalServiceText description = new EventModification.AdditionalServiceText(0, "it", "descrizione", AdditionalServiceText.TextType.DESCRIPTION); @Before public void init() { errors = new MapBindingResult(new HashMap<>(), "test"); } @Test public void testValidationSuccess() { EventModification.AdditionalService valid1 = new EventModification.AdditionalService(0, BigDecimal.ZERO, false, 0, -1, 1, VALID_INCEPTION, VALID_EXPIRATION, null, AdditionalService.VatType.NONE, Collections.emptyList(), singletonList(title), singletonList(description)); EventModification.AdditionalService valid2 = new EventModification.AdditionalService(0, BigDecimal.ONE, true, 1, 100, 1, VALID_INCEPTION, VALID_EXPIRATION, BigDecimal.TEN, AdditionalService.VatType.INHERITED, Collections.emptyList(), singletonList(title), singletonList(description)); assertTrue(Stream.of(valid1, valid2).map(as -> Validator.validateAdditionalService(as, errors)).allMatch(ValidationResult::isSuccess)); assertFalse(errors.hasFieldErrors()); } @Test public void testValidationErrorExpirationBeforeInception() { EventModification.AdditionalService invalid = new EventModification.AdditionalService(0, BigDecimal.ZERO, false, 0, -1, 1, VALID_EXPIRATION, VALID_INCEPTION, null, AdditionalService.VatType.NONE, Collections.emptyList(), singletonList(title), singletonList(description)); assertFalse(Validator.validateAdditionalService(invalid, errors).isSuccess()); assertTrue(errors.hasFieldErrors()); assertNotNull(errors.getFieldError("additionalServices")); } @Test public void testValidationErrorInceptionNull() { EventModification.AdditionalService invalid = new EventModification.AdditionalService(0, BigDecimal.ONE, true, 1, 100, 1, null, VALID_EXPIRATION, BigDecimal.TEN, AdditionalService.VatType.INHERITED, Collections.emptyList(), singletonList(title), singletonList(description)); assertFalse(Validator.validateAdditionalService(invalid, errors).isSuccess()); assertTrue(errors.hasFieldErrors()); assertNotNull(errors.getFieldError("additionalServices")); } @Test public void testValidationExpirationNull() { EventModification.AdditionalService invalid = new EventModification.AdditionalService(0, BigDecimal.ONE, true, 1, 100, 1, VALID_INCEPTION, null, BigDecimal.TEN, AdditionalService.VatType.INHERITED, Collections.emptyList(), singletonList(title), singletonList(description)); assertFalse(Validator.validateAdditionalService(invalid, errors).isSuccess()); assertTrue(errors.hasFieldErrors()); assertNotNull(errors.getFieldError("additionalServices")); } @Test public void testValidationInceptionExpirationNull() { EventModification.AdditionalService invalid = new EventModification.AdditionalService(0, BigDecimal.ONE, true, 1, 100, 1, null, null, BigDecimal.TEN, AdditionalService.VatType.INHERITED, Collections.emptyList(), singletonList(title), singletonList(description)); assertFalse(Validator.validateAdditionalService(invalid, errors).isSuccess()); assertTrue(errors.hasFieldErrors()); assertNotNull(errors.getFieldError("additionalServices")); } @Test public void testValidationFailedDescriptionsDontMatchTitles() { EventModification.AdditionalService invalid = new EventModification.AdditionalService(0, BigDecimal.ZERO, false, 0, -1, 1, VALID_INCEPTION, VALID_EXPIRATION, null, AdditionalService.VatType.NONE, Collections.emptyList(), emptyList(), singletonList(description)); EventModification.AdditionalService valid = new EventModification.AdditionalService(0, BigDecimal.ONE, true, 1, 100, 1, VALID_INCEPTION, VALID_EXPIRATION, BigDecimal.TEN, AdditionalService.VatType.INHERITED, Collections.emptyList(), singletonList(title), singletonList(description)); assertTrue(Validator.validateAdditionalService(valid, errors).isSuccess()); assertFalse(Validator.validateAdditionalService(invalid, errors).isSuccess()); assertTrue(errors.hasFieldErrors()); assertNotNull(errors.getFieldError("additionalServices")); } @Test public void testValidationFailedDescription() { when(eventModification.getLocales()).thenReturn(ContentLanguage.ENGLISH.getValue()); EventModification.AdditionalService invalid1 = new EventModification.AdditionalService(0, BigDecimal.ZERO, false, 0, -1, 1, VALID_INCEPTION, VALID_EXPIRATION, null, AdditionalService.VatType.NONE, Collections.emptyList(), emptyList(), singletonList(description));//English is required here EventModification.AdditionalService invalid2 = new EventModification.AdditionalService(0, BigDecimal.ONE, true, 1, 100, 1, VALID_INCEPTION, VALID_EXPIRATION, BigDecimal.TEN, AdditionalService.VatType.INHERITED, Collections.emptyList(), singletonList(title), singletonList(new EventModification.AdditionalServiceText(0, "en", "", AdditionalServiceText.TextType.DESCRIPTION))); assertFalse(Validator.validateAdditionalService(invalid1, errors).isSuccess()); assertTrue(errors.hasFieldErrors()); assertNotNull(errors.getFieldError("additionalServices")); assertFalse(Validator.validateAdditionalService(invalid2, errors).isSuccess()); assertTrue(errors.hasFieldErrors()); assertNotNull(errors.getFieldError("additionalServices")); } }