/* * Copyright 2016-2017 EuregJUG. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.euregjug.site.events; import java.util.Optional; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import static org.junit.rules.ExpectedException.none; import org.junit.runner.RunWith; import org.mockito.AdditionalAnswers; import static org.mockito.Matchers.any; import org.mockito.Mock; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import org.mockito.runners.MockitoJUnitRunner; import org.springframework.context.MessageSource; import org.springframework.mail.javamail.JavaMailSender; /** * @author Michael J. Simons, 2016-08-26 */ @RunWith(MockitoJUnitRunner.class) public class RegistrationServiceTest { @Mock private EventRepository eventRepository; @Mock private RegistrationRepository registrationRepository; @Mock private JavaMailSender mailSender; @Mock private MessageSource messageSource; @Rule public final ExpectedException expectedException = none(); @Test public void htmlTextToPlainTextShouldWork() { final RegistrationService service = new RegistrationService(eventRepository, registrationRepository, mailSender, null, messageSource, "info@euregjug.eu"); final String plainText = service.htmlTextToPlainText("<strong>Hallo<br>das ist ein<br />test.<br/>Auf wiedersehen."); assertThat(plainText, is("Hallo\r\ndas ist ein\r\ntest.\r\nAuf wiedersehen.")); } @Test public void shouldHandleInvalidEvent() { final RegistrationService service = new RegistrationService(eventRepository, registrationRepository, mailSender, null, messageSource, "info@euregjug.eu"); when(this.eventRepository.findOne(23)).thenReturn(Optional.empty()); expectedException.expect(RegistrationService.InvalidRegistrationException.class); expectedException.expectMessage("No event with the id 23"); service.register(23, new Registration()); } @Test public void shouldHandleEventWithoutRegistration() { final RegistrationService service = new RegistrationService(eventRepository, registrationRepository, mailSender, null, messageSource, "info@euregjug.eu"); final EventEntity event = mock(EventEntity.class); when(event.isNeedsRegistration()).thenReturn(false); when(this.eventRepository.findOne(23)).thenReturn(Optional.of(event)); expectedException.expect(RegistrationService.InvalidRegistrationException.class); expectedException.expectMessage("Event 23 doesn't need a registration"); final Registration registration = new Registration(); registration.setEmail("michael@euregjug.eu"); service.register(23, registration); } @Test public void shouldHandleClosedEvents() { final RegistrationService service = new RegistrationService(eventRepository, registrationRepository, mailSender, null, messageSource, "info@euregjug.eu"); final EventEntity event = mock(EventEntity.class); when(event.isNeedsRegistration()).thenReturn(true); when(event.isOpenForRegistration()).thenReturn(false); when(this.eventRepository.findOne(23)).thenReturn(Optional.of(event)); expectedException.expect(RegistrationService.InvalidRegistrationException.class); expectedException.expectMessage("Event 23 doesn't isn't open"); final Registration registration = new Registration(); registration.setEmail("michael@euregjug.eu"); service.register(23, registration); } @Test public void shouldHandleAlreadyRegisteredGuest() { final RegistrationService service = new RegistrationService(eventRepository, registrationRepository, mailSender, null, messageSource, "info@euregjug.eu"); final EventEntity event = mock(EventEntity.class); when(event.isNeedsRegistration()).thenReturn(true); when(event.isOpenForRegistration()).thenReturn(true); when(this.eventRepository.findOne(23)).thenReturn(Optional.of(event)); when(this.registrationRepository.findByEventAndEmail(event, "michael@euregjug.eu")).thenReturn(Optional.of(mock(RegistrationEntity.class))); expectedException.expect(RegistrationService.InvalidRegistrationException.class); expectedException.expectMessage("Guest 'michael@euregjug.eu' already registered for event 23"); final Registration registration = new Registration(); registration.setEmail("michael@euregjug.eu"); service.register(23, registration); } @Test public void registrationShouldWork() { final RegistrationService service = new RegistrationService(eventRepository, registrationRepository, mailSender, null, messageSource, "info@euregjug.eu"); final EventEntity event = mock(EventEntity.class); when(event.isNeedsRegistration()).thenReturn(true); when(event.isOpenForRegistration()).thenReturn(true); when(this.eventRepository.findOne(23)).thenReturn(Optional.of(event)); when(this.registrationRepository.findByEventAndEmail(event, "michael@euregjug.eu")).thenReturn(Optional.empty()); when(this.registrationRepository.save(any(RegistrationEntity.class))).thenAnswer(AdditionalAnswers.returnsFirstArg()); final Registration registration = new Registration(); registration.setFirstName("Michael"); registration.setName("Simons"); registration.setEmail("michael@euregjug.eu"); final RegistrationEntity registrationEntity = service.register(23, registration); assertThat(registrationEntity.getEvent(), is(event)); assertThat(registrationEntity.getFirstName(), is(registration.getFirstName())); assertThat(registrationEntity.getName(), is(registration.getName())); assertThat(registrationEntity.getEmail(), is(registration.getEmail())); verify(this.eventRepository).findOne(23); verify(this.registrationRepository).findByEventAndEmail(event, "michael@euregjug.eu"); verify(this.registrationRepository).save(any(RegistrationEntity.class)); verifyNoMoreInteractions(this.eventRepository, this.registrationRepository); } }