use of alfio.controller.support.TicketDecorator 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.support.TicketDecorator in project alf.io by alfio-event.
the class ReservationFlowIntegrationTest method checkReservationComplete.
private TicketDecorator checkReservationComplete(String eventName, String reservationIdentifier) {
Model confirmationPageModel = new BindingAwareModelMap();
String confirmationPageSuccess = reservationController.showConfirmationPage(eventName, reservationIdentifier, false, false, confirmationPageModel, Locale.ENGLISH, new MockHttpServletRequest());
assertEquals("/event/reservation-page-complete", confirmationPageSuccess);
@SuppressWarnings("unchecked") List<Pair<?, List<TicketDecorator>>> tickets = (List<Pair<?, List<TicketDecorator>>>) confirmationPageModel.asMap().get("ticketsByCategory");
assertEquals(1, tickets.size());
assertEquals(1, tickets.get(0).getRight().size());
return tickets.get(0).getRight().get(0);
}
use of alfio.controller.support.TicketDecorator in project alf.io by alfio-event.
the class TicketController method showTicketForUpdate.
@RequestMapping(value = "/event/{eventName}/ticket/{ticketIdentifier}/update", method = RequestMethod.GET)
public String showTicketForUpdate(@PathVariable("eventName") String eventName, @PathVariable("ticketIdentifier") String ticketIdentifier, Model model, Locale locale) {
Optional<Triple<Event, TicketReservation, Ticket>> oData = ticketReservationManager.fetchCompleteAndAssigned(eventName, ticketIdentifier);
if (!oData.isPresent()) {
return "redirect:/event/" + eventName;
}
Triple<Event, TicketReservation, Ticket> data = oData.get();
Event event = data.getLeft();
TicketCategory ticketCategory = ticketCategoryRepository.getByIdAndActive(data.getRight().getCategoryId(), event.getId());
Organization organization = organizationRepository.getById(event.getOrganizationId());
boolean enableFreeCancellation = configurationManager.getBooleanConfigValue(Configuration.from(event.getOrganizationId(), event.getId(), ticketCategory.getId(), ALLOW_FREE_TICKETS_CANCELLATION), false);
Ticket ticket = data.getRight();
//
model.addAttribute("ticketAndCategory", Pair.of(eventManager.getTicketCategoryById(ticket.getCategoryId(), event.getId()), new TicketDecorator(ticket, enableFreeCancellation, eventManager.checkTicketCancellationPrerequisites().apply(ticket), "ticket/" + ticket.getUuid() + "/view", ticketHelper.findTicketFieldConfigurationAndValue(event.getId(), ticket, locale), true, ""))).addAttribute("reservation", //
data.getMiddle()).addAttribute("reservationId", ticketReservationManager.getShortReservationID(event, data.getMiddle().getId())).addAttribute("event", //
event).addAttribute("ticketCategory", //
ticketCategory).addAttribute("countries", TicketHelper.getLocalizedCountries(locale)).addAttribute("organization", //
organization).addAttribute("pageTitle", "show-ticket.header.title").addAttribute("useFirstAndLastName", event.mustUseFirstAndLastName());
return "/event/update-ticket";
}
Aggregations