/**
* 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.manager;
import alfio.manager.support.TextTemplateGenerator;
import alfio.manager.system.ConfigurationManager;
import alfio.model.Event;
import alfio.model.WaitingQueueSubscription;
import alfio.model.modification.ASReservationWithOptionalCodeModification;
import alfio.model.modification.TicketReservationWithOptionalCodeModification;
import alfio.model.system.Configuration;
import alfio.repository.WaitingQueueRepository;
import alfio.util.TemplateManager;
import com.insightfullogic.lambdabehave.JunitSuiteRunner;
import org.apache.commons.lang3.tuple.Triple;
import org.junit.runner.RunWith;
import org.springframework.context.MessageSource;
import java.time.ZonedDateTime;
import java.util.*;
import java.util.stream.Stream;
import static alfio.model.system.ConfigurationKeys.ENABLE_WAITING_QUEUE;
import static com.insightfullogic.lambdabehave.Suite.describe;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.*;
@RunWith(JunitSuiteRunner.class)
public class WaitingQueueSubscriptionProcessorTest {{
describe("handleWaitingTickets", it -> {
EventManager eventManager = it.usesMock(EventManager.class);
TicketReservationManager ticketReservationManager = it.usesMock(TicketReservationManager.class);
ConfigurationManager configurationManager = it.usesMock(ConfigurationManager.class);
WaitingQueueManager waitingQueueManager = it.usesMock(WaitingQueueManager.class);
NotificationManager notificationManager = it.usesMock(NotificationManager.class);
MessageSource messageSource = it.usesMock(MessageSource.class);
TemplateManager templateManager = it.usesMock(TemplateManager.class);
WaitingQueueRepository waitingQueueRepository = it.usesMock(WaitingQueueRepository.class);
WaitingQueueSubscriptionProcessor processor = new WaitingQueueSubscriptionProcessor(eventManager, ticketReservationManager, configurationManager, waitingQueueManager, notificationManager, waitingQueueRepository, messageSource, templateManager);
final int eventId = 1;
Event event = mock(Event.class);
final String reservationId = "reservation-id";
when(event.getId()).thenReturn(eventId);
List<Event> activeEvents = Collections.singletonList(event);
it.should("filter events whose 'waiting queue' flag is not active", expect -> {
when(eventManager.getActiveEvents()).thenReturn(activeEvents);
when(configurationManager.getBooleanConfigValue(eq(Configuration.from(event.getOrganizationId(), event.getId(), ENABLE_WAITING_QUEUE)), eq(false))).thenReturn(false);
processor.handleWaitingTickets();
verify(waitingQueueManager, never()).distributeSeats(eq(event));
});
it.should("process pending tickets", expect -> {
when(eventManager.getActiveEvents()).thenReturn(activeEvents);
when(configurationManager.getBooleanConfigValue(eq(Configuration.from(event.getOrganizationId(), event.getId(), ENABLE_WAITING_QUEUE)), eq(false))).thenReturn(true);
when(messageSource.getMessage(anyString(), any(), eq(Locale.ENGLISH))).thenReturn("subject");
WaitingQueueSubscription subscription = it.usesMock(WaitingQueueSubscription.class);
when(subscription.getLocale()).thenReturn(Locale.ENGLISH);
when(subscription.getEmailAddress()).thenReturn("me");
TicketReservationWithOptionalCodeModification reservation = it.usesMock(TicketReservationWithOptionalCodeModification.class);
ZonedDateTime expiration = ZonedDateTime.now().plusDays(1);
when(waitingQueueManager.distributeSeats(eq(event))).thenReturn(Stream.of(Triple.of(subscription, reservation, expiration)));
when(ticketReservationManager.createTicketReservation(eq(event), anyListOf(TicketReservationWithOptionalCodeModification.class), anyListOf(ASReservationWithOptionalCodeModification.class), any(Date.class), eq(Optional.empty()), eq(Optional.empty()), any(Locale.class), eq(true))).thenReturn(reservationId);
processor.handleWaitingTickets();
verify(configurationManager).getBooleanConfigValue(eq(Configuration.from(event.getOrganizationId(), event.getId(), ENABLE_WAITING_QUEUE)), eq(false));
verify(ticketReservationManager).createTicketReservation(eq(event), eq(Collections.singletonList(reservation)), anyListOf(ASReservationWithOptionalCodeModification.class), eq(Date.from(expiration.toInstant())), eq(Optional.empty()), eq(Optional.empty()), eq(Locale.ENGLISH), eq(true));
verify(notificationManager).sendSimpleEmail(eq(event), eq("me"), eq("subject"), any(TextTemplateGenerator.class));
});
});
}}