use of alfio.controller.form.UpdateTicketOwnerForm in project alf.io by alfio-event.
the class ReservationFlowIntegrationTest method reservationFlowTest.
/**
* Test a complete offline payment flow.
* Will not check in detail...
*/
@Test
public void reservationFlowTest() throws Exception {
String eventName = event.getShortName();
assertTrue(checkInManager.findAllFullTicketInfo(event.getId()).isEmpty());
List<EventStatistic> eventStatistic = eventStatisticsManager.getAllEventsWithStatistics(user);
assertEquals(1, eventStatistic.size());
assertTrue(eventStatisticsManager.getTicketSoldStatistics(event.getId(), new Date(0), DateUtils.addDays(new Date(), 1)).isEmpty());
EventWithAdditionalInfo eventWithAdditionalInfo = eventStatisticsManager.getEventWithAdditionalInfo(event.getShortName(), user);
assertEquals(0, eventWithAdditionalInfo.getNotSoldTickets());
assertEquals(0, eventWithAdditionalInfo.getSoldTickets());
assertEquals(20, eventWithAdditionalInfo.getAvailableSeats());
eventManager.toggleActiveFlag(event.getId(), user, true);
// list events
String eventList = eventController.listEvents(new BindingAwareModelMap(), Locale.ENGLISH);
if (eventManager.getPublishedEvents().size() == 1) {
Assert.assertTrue(eventList.startsWith("redirect:/"));
} else {
assertEquals("/event/event-list", eventList);
}
//
// show event
String showEvent = eventController.showEvent(eventName, new BindingAwareModelMap(), new MockHttpServletRequest(), Locale.ENGLISH);
assertEquals("/event/show-event", showEvent);
//
// check calendar
checkCalendar(eventName);
//
String redirectResult = reserveTicket(eventName);
String redirectStart = "redirect:/event/" + eventName + "/reservation/";
// check reservation success
Assert.assertTrue(redirectResult.startsWith(redirectStart));
Assert.assertTrue(redirectResult.endsWith("/book"));
//
String reservationIdentifier = redirectResult.substring(redirectStart.length()).replace("/book", "");
// check that the payment page is shown
String reservationPage = reservationController.showPaymentPage(eventName, reservationIdentifier, null, null, null, null, null, null, null, null, null, null, null, null, new BindingAwareModelMap(), Locale.ENGLISH);
assertEquals("/event/reservation-page", reservationPage);
//
// pay offline
String successPage = payOffline(eventName, reservationIdentifier);
assertEquals("redirect:/event/" + eventName + "/reservation/" + reservationIdentifier + "/success", successPage);
//
// go to success page, payment is still pending
String confirmationPage = reservationController.showConfirmationPage(eventName, reservationIdentifier, false, false, new BindingAwareModelMap(), Locale.ENGLISH, new MockHttpServletRequest());
Assert.assertTrue(confirmationPage.endsWith("/waitingPayment"));
assertEquals("/event/reservation-waiting-for-payment", reservationController.showWaitingPaymentPage(eventName, reservationIdentifier, new BindingAwareModelMap(), Locale.ENGLISH));
//
validatePayment(eventName, reservationIdentifier);
//
Assert.assertTrue(reservationController.showWaitingPaymentPage(eventName, reservationIdentifier, new BindingAwareModelMap(), Locale.ENGLISH).endsWith("/success"));
//
TicketDecorator ticketDecorator = checkReservationComplete(eventName, reservationIdentifier);
//
String ticketIdentifier = ticketDecorator.getUuid();
// ticket is still not assigned, will redirect
Assert.assertTrue(ticketController.showTicket(eventName, ticketIdentifier, false, Locale.ENGLISH, new BindingAwareModelMap()).startsWith("redirect:/event/"));
Assert.assertTrue(ticketController.showTicketForUpdate(eventName, ticketIdentifier, new BindingAwareModelMap(), Locale.ENGLISH).startsWith("redirect:/event/"));
//
String fname1 = "Test";
String lname1 = "McTest";
// assign ticket to person
assignTicket(eventName, reservationIdentifier, ticketIdentifier, fname1, lname1);
assertEquals(1, checkInManager.findAllFullTicketInfo(event.getId()).size());
assertEquals("/event/update-ticket", ticketController.showTicketForUpdate(eventName, ticketIdentifier, new BindingAwareModelMap(), Locale.ENGLISH));
//
assertEquals("/event/show-ticket", ticketController.showTicket(eventName, ticketIdentifier, false, Locale.ENGLISH, new BindingAwareModelMap()));
//
checkCSV(eventName, ticketIdentifier, fname1 + " " + lname1);
// use api to update
UpdateTicketOwnerForm updateTicketOwnerForm = new UpdateTicketOwnerForm();
updateTicketOwnerForm.setFirstName("Test");
updateTicketOwnerForm.setLastName("Testson");
updateTicketOwnerForm.setEmail("testmctest@test.com");
updateTicketOwnerForm.setUserLanguage("en");
reservationApiController.assignTicketToPerson(eventName, ticketIdentifier, true, updateTicketOwnerForm, new BeanPropertyBindingResult(updateTicketOwnerForm, "updateTicketForm"), new MockHttpServletRequest(), new BindingAwareModelMap(), null);
checkCSV(eventName, ticketIdentifier, "Test Testson");
//
// update
String fname2 = "Test";
String lname2 = "OTest";
assignTicket(eventName, reservationIdentifier, ticketIdentifier, fname2, lname2);
checkCSV(eventName, ticketIdentifier, fname2 + " " + lname2);
// lock ticket
Principal principal = Mockito.mock(Principal.class);
Mockito.when(principal.getName()).thenReturn(user);
eventApiController.toggleTicketLocking(eventName, ticketDecorator.getCategoryId(), ticketDecorator.getId(), principal);
assignTicket(eventName, reservationIdentifier, ticketIdentifier, fname1, fname2);
checkCSV(eventName, ticketIdentifier, fname2 + " " + lname2);
// ticket has changed, update
ticketDecorator = checkReservationComplete(eventName, reservationIdentifier);
// check stats after selling one ticket
assertFalse(eventStatisticsManager.getTicketSoldStatistics(event.getId(), new Date(0), DateUtils.addDays(new Date(), 2)).isEmpty());
EventWithAdditionalInfo eventWithAdditionalInfo2 = eventStatisticsManager.getEventWithAdditionalInfo(event.getShortName(), user);
assertEquals(0, eventWithAdditionalInfo2.getNotSoldTickets());
assertEquals(1, eventWithAdditionalInfo2.getSoldTickets());
assertEquals(20, eventWithAdditionalInfo2.getAvailableSeats());
assertEquals(0, eventWithAdditionalInfo2.getCheckedInTickets());
// --- check in sequence
String ticketCode = ticketDecorator.ticketCode(event.getPrivateKey());
TicketAndCheckInResult ticketAndCheckInResult = checkInApiController.findTicketWithUUID(event.getId(), ticketIdentifier, ticketCode);
assertEquals(CheckInStatus.OK_READY_TO_BE_CHECKED_IN, ticketAndCheckInResult.getResult().getStatus());
CheckInApiController.TicketCode tc = new CheckInApiController.TicketCode();
tc.setCode(ticketCode);
assertEquals(CheckInStatus.SUCCESS, checkInApiController.checkIn(event.getId(), ticketIdentifier, tc, new TestingAuthenticationToken("ciccio", "ciccio")).getResult().getStatus());
List<ScanAudit> audits = scanAuditRepository.findAllForEvent(event.getId());
assertFalse(audits.isEmpty());
assertTrue(audits.stream().anyMatch(sa -> sa.getTicketUuid().equals(ticketIdentifier)));
TicketAndCheckInResult ticketAndCheckInResultOk = checkInApiController.findTicketWithUUID(event.getId(), ticketIdentifier, ticketCode);
assertEquals(CheckInStatus.ALREADY_CHECK_IN, ticketAndCheckInResultOk.getResult().getStatus());
// check stats after check in one ticket
assertFalse(eventStatisticsManager.getTicketSoldStatistics(event.getId(), new Date(0), DateUtils.addDays(new Date(), 1)).isEmpty());
EventWithAdditionalInfo eventWithAdditionalInfo3 = eventStatisticsManager.getEventWithAdditionalInfo(event.getShortName(), user);
assertEquals(0, eventWithAdditionalInfo3.getNotSoldTickets());
assertEquals(0, eventWithAdditionalInfo3.getSoldTickets());
assertEquals(20, eventWithAdditionalInfo3.getAvailableSeats());
assertEquals(1, eventWithAdditionalInfo3.getCheckedInTickets());
// test revert check in
assertTrue(checkInApiController.revertCheckIn(event.getId(), ticketIdentifier, principal));
assertFalse(checkInApiController.revertCheckIn(event.getId(), ticketIdentifier, principal));
TicketAndCheckInResult ticketAndCheckInResult2 = checkInApiController.findTicketWithUUID(event.getId(), ticketIdentifier, ticketCode);
assertEquals(CheckInStatus.OK_READY_TO_BE_CHECKED_IN, ticketAndCheckInResult2.getResult().getStatus());
UsersApiController.UserWithPasswordAndQRCode sponsorUser = usersApiController.insertUser(new UserModification(null, event.getOrganizationId(), "SPONSOR", "sponsor", "first", "last", "email@email.com"), "http://localhost:8080", principal);
Principal sponsorPrincipal = Mockito.mock(Principal.class);
Mockito.when(sponsorPrincipal.getName()).thenReturn(sponsorUser.getUsername());
// check failures
assertEquals(CheckInStatus.EVENT_NOT_FOUND, attendeeApiController.scanBadge(new AttendeeApiController.SponsorScanRequest("not-existing-event", "not-existing-ticket"), sponsorPrincipal).getBody().getResult().getStatus());
assertEquals(CheckInStatus.TICKET_NOT_FOUND, attendeeApiController.scanBadge(new AttendeeApiController.SponsorScanRequest(eventName, "not-existing-ticket"), sponsorPrincipal).getBody().getResult().getStatus());
assertEquals(CheckInStatus.INVALID_TICKET_STATE, attendeeApiController.scanBadge(new AttendeeApiController.SponsorScanRequest(eventName, ticketIdentifier), sponsorPrincipal).getBody().getResult().getStatus());
//
// check stats after revert check in one ticket
assertFalse(eventStatisticsManager.getTicketSoldStatistics(event.getId(), new Date(0), DateUtils.addDays(new Date(), 1)).isEmpty());
EventWithAdditionalInfo eventWithAdditionalInfo4 = eventStatisticsManager.getEventWithAdditionalInfo(event.getShortName(), user);
assertEquals(0, eventWithAdditionalInfo4.getNotSoldTickets());
assertEquals(1, eventWithAdditionalInfo4.getSoldTickets());
assertEquals(20, eventWithAdditionalInfo4.getAvailableSeats());
assertEquals(0, eventWithAdditionalInfo4.getCheckedInTickets());
CheckInApiController.TicketCode tc2 = new CheckInApiController.TicketCode();
tc2.setCode(ticketCode);
TicketAndCheckInResult ticketAndcheckInResult = checkInApiController.checkIn(event.getId(), ticketIdentifier, tc2, new TestingAuthenticationToken("ciccio", "ciccio"));
assertEquals(CheckInStatus.SUCCESS, ticketAndcheckInResult.getResult().getStatus());
//
//
List<Integer> offlineIdentifiers = checkInApiController.getOfflineIdentifiers(event.getShortName(), 0L, new MockHttpServletResponse(), principal);
assertTrue(offlineIdentifiers.isEmpty());
configurationRepository.insertEventLevel(event.getOrganizationId(), event.getId(), ConfigurationKeys.OFFLINE_CHECKIN_ENABLED.name(), "true", null);
configurationRepository.insert(ConfigurationKeys.ALFIO_PI_INTEGRATION_ENABLED.name(), "true", null);
offlineIdentifiers = checkInApiController.getOfflineIdentifiers(event.getShortName(), 0L, new MockHttpServletResponse(), principal);
assertFalse(offlineIdentifiers.isEmpty());
Map<String, String> payload = checkInApiController.getOfflineEncryptedInfo(event.getShortName(), Collections.emptyList(), offlineIdentifiers, principal);
assertEquals(1, payload.size());
Ticket ticket = ticketAndcheckInResult.getTicket();
String ticketKey = ticket.hmacTicketInfo(event.getPrivateKey());
String hashedTicketKey = DigestUtils.sha256Hex(ticketKey);
String encJson = payload.get(hashedTicketKey);
assertNotNull(encJson);
String ticketPayload = CheckInManager.decrypt(ticket.getUuid() + "/" + ticketKey, encJson);
Map<String, String> jsonPayload = Json.fromJson(ticketPayload, new TypeReference<Map<String, String>>() {
});
assertNotNull(jsonPayload);
assertEquals(8, jsonPayload.size());
assertEquals("Test", jsonPayload.get("firstName"));
assertEquals("OTest", jsonPayload.get("lastName"));
assertEquals("Test OTest", jsonPayload.get("fullName"));
assertEquals(ticket.getUuid(), jsonPayload.get("uuid"));
assertEquals("testmctest@test.com", jsonPayload.get("email"));
assertEquals("CHECKED_IN", jsonPayload.get("status"));
String categoryName = ticketCategoryRepository.findByEventId(event.getId()).stream().findFirst().orElseThrow(IllegalStateException::new).getName();
assertEquals(categoryName, jsonPayload.get("category"));
//
// check register sponsor scan success flow
assertTrue(attendeeApiController.getScannedBadges(event.getShortName(), EventUtil.JSON_DATETIME_FORMATTER.format(LocalDateTime.of(1970, 1, 1, 0, 0)), sponsorPrincipal).getBody().isEmpty());
assertEquals(CheckInStatus.SUCCESS, attendeeApiController.scanBadge(new AttendeeApiController.SponsorScanRequest(eventName, ticket.getUuid()), sponsorPrincipal).getBody().getResult().getStatus());
assertEquals(1, attendeeApiController.getScannedBadges(event.getShortName(), EventUtil.JSON_DATETIME_FORMATTER.format(LocalDateTime.of(1970, 1, 1, 0, 0)), sponsorPrincipal).getBody().size());
//
eventManager.deleteEvent(event.getId(), principal.getName());
}
use of alfio.controller.form.UpdateTicketOwnerForm in project alf.io by alfio-event.
the class ReservationFlowIntegrationTest method assignTicket.
private void assignTicket(String eventName, String reservationIdentifier, String ticketIdentifier, String firstName, String lastName) throws Exception {
UpdateTicketOwnerForm ticketOwnerForm = new UpdateTicketOwnerForm();
ticketOwnerForm.setFirstName(firstName);
ticketOwnerForm.setLastName(lastName);
ticketOwnerForm.setEmail("testmctest@test.com");
ticketOwnerForm.setUserLanguage("en");
Assert.assertTrue(reservationController.assignTicketToPerson(eventName, reservationIdentifier, ticketIdentifier, ticketOwnerForm, Mockito.mock(BindingResult.class), new MockHttpServletRequest(), new BindingAwareModelMap()).endsWith("/success"));
}
use of alfio.controller.form.UpdateTicketOwnerForm in project alf.io by alfio-event.
the class TicketReservationManagerTest method doNotSendWarningEmailIfAdmin.
@Test
public void doNotSendWarningEmailIfAdmin() {
final String ticketId = "abcde";
final String ticketReservationId = "abcdef";
final String originalEmail = "me@myaddress.com";
final String originalName = "First Last";
Ticket original = mock(Ticket.class);
Ticket modified = mock(Ticket.class);
UpdateTicketOwnerForm form = new UpdateTicketOwnerForm();
when(event.getShortName()).thenReturn("short-name");
initUpdateTicketOwner(original, modified, ticketId, originalEmail, originalName, form);
TicketReservation reservation = mock(TicketReservation.class);
when(original.getTicketsReservationId()).thenReturn(ticketReservationId);
when(ticketReservationRepository.findOptionalReservationById(eq(ticketReservationId))).thenReturn(Optional.of(reservation));
UserDetails userDetails = new User("user", "password", singletonList(new SimpleGrantedAuthority(Role.ADMIN.getRoleName())));
trm.updateTicketOwner(original, Locale.ENGLISH, event, form, (a) -> null, (b) -> null, Optional.of(userDetails));
verify(messageSource, never()).getMessage(eq("ticket-has-changed-owner-subject"), eq(new Object[] { "short-name" }), eq(Locale.ITALIAN));
}
use of alfio.controller.form.UpdateTicketOwnerForm in project alf.io by alfio-event.
the class TicketReservationManagerTest method dontSendWarningEmailIfNotAcquiredStatus.
// check we don't send the ticket-has-changed-owner email if the originalEmail and name are present and the status is not ACQUIRED
@Test
public void dontSendWarningEmailIfNotAcquiredStatus() {
final String ticketId = "abcde";
final String originalEmail = "me@myaddress.com";
final String originalName = "First Last";
Ticket original = mock(Ticket.class);
when(original.getStatus()).thenReturn(TicketStatus.FREE);
Ticket modified = mock(Ticket.class);
UpdateTicketOwnerForm form = new UpdateTicketOwnerForm();
when(event.getShortName()).thenReturn("short-name");
initUpdateTicketOwner(original, modified, ticketId, originalEmail, originalName, form);
PartialTicketTextGenerator ownerChangeTextBuilder = mock(PartialTicketTextGenerator.class);
when(ownerChangeTextBuilder.generate(eq(modified))).thenReturn("Hello, world");
when(original.getUserLanguage()).thenReturn(USER_LANGUAGE);
trm.updateTicketOwner(original, Locale.ENGLISH, event, form, (a) -> null, ownerChangeTextBuilder, Optional.empty());
verifyZeroInteractions(messageSource);
}
use of alfio.controller.form.UpdateTicketOwnerForm in project alf.io by alfio-event.
the class TicketReservationManagerTest method fallbackToCurrentLocale.
@Test
public void fallbackToCurrentLocale() throws IOException {
final String ticketId = "abcde";
final String originalEmail = "me@myaddress.com";
final String originalName = "First Last";
Ticket original = mock(Ticket.class);
when(original.getStatus()).thenReturn(TicketStatus.ACQUIRED);
Ticket modified = mock(Ticket.class);
when(modified.getStatus()).thenReturn(TicketStatus.ACQUIRED);
UpdateTicketOwnerForm form = new UpdateTicketOwnerForm();
when(event.getShortName()).thenReturn("short-name");
initUpdateTicketOwner(original, modified, ticketId, originalEmail, originalName, form);
form.setUserLanguage("");
PartialTicketTextGenerator ownerChangeTextBuilder = mock(PartialTicketTextGenerator.class);
when(ownerChangeTextBuilder.generate(eq(modified))).thenReturn("Hello, world");
when(original.getUserLanguage()).thenReturn(USER_LANGUAGE);
trm.updateTicketOwner(original, Locale.ENGLISH, event, form, (a) -> null, ownerChangeTextBuilder, Optional.empty());
verify(messageSource, times(1)).getMessage(eq("ticket-has-changed-owner-subject"), any(), eq(Locale.ITALIAN));
verify(notificationManager, times(1)).sendTicketByEmail(eq(modified), eq(event), eq(Locale.ENGLISH), any(), any(), any());
verify(notificationManager, times(1)).sendSimpleEmail(eq(event), eq(originalEmail), anyString(), any(TextTemplateGenerator.class));
}
Aggregations