|
|
|
@@ -99,372 +99,367 @@ testBothBookers.describe("Booking with Seats", (bookerVariant) => {
|
|
|
|
|
// todo("Attendee #1 should be able to reschedule his booking");
|
|
|
|
|
// TODO: Make E2E test: All attendees canceling should delete the booking for the User
|
|
|
|
|
// todo("All attendees canceling should delete the booking for the User");
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
testBothBookers.describe("Reschedule for booking with seats", () => {
|
|
|
|
|
test("Should reschedule booking with seats", async ({ page, users, bookings }) => {
|
|
|
|
|
const { booking } = await createUserWithSeatedEventAndAttendees({ users, bookings }, [
|
|
|
|
|
{ name: "John First", email: "first+seats@cal.com", timeZone: "Europe/Berlin" },
|
|
|
|
|
{ name: "Jane Second", email: "second+seats@cal.com", timeZone: "Europe/Berlin" },
|
|
|
|
|
{ name: "John Third", email: "third+seats@cal.com", timeZone: "Europe/Berlin" },
|
|
|
|
|
]);
|
|
|
|
|
const bookingAttendees = await prisma.attendee.findMany({
|
|
|
|
|
where: { bookingId: booking.id },
|
|
|
|
|
select: {
|
|
|
|
|
id: true,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const bookingSeats = [
|
|
|
|
|
{ bookingId: booking.id, attendeeId: bookingAttendees[0].id, referenceUid: uuidv4() },
|
|
|
|
|
{ bookingId: booking.id, attendeeId: bookingAttendees[1].id, referenceUid: uuidv4() },
|
|
|
|
|
{ bookingId: booking.id, attendeeId: bookingAttendees[2].id, referenceUid: uuidv4() },
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
await prisma.bookingSeat.createMany({
|
|
|
|
|
data: bookingSeats,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const references = await prisma.bookingSeat.findMany({
|
|
|
|
|
where: { bookingId: booking.id },
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await page.goto(`/reschedule/${references[2].referenceUid}`);
|
|
|
|
|
|
|
|
|
|
await selectFirstAvailableTimeSlotNextMonth(page);
|
|
|
|
|
|
|
|
|
|
// expect input to be filled with attendee number 3 data
|
|
|
|
|
const thirdAttendeeElement = await page.locator("input[name=name]");
|
|
|
|
|
const attendeeName = await thirdAttendeeElement.inputValue();
|
|
|
|
|
expect(attendeeName).toBe("John Third");
|
|
|
|
|
|
|
|
|
|
await page.locator('[data-testid="confirm-reschedule-button"]').click();
|
|
|
|
|
|
|
|
|
|
await page.waitForLoadState("networkidle");
|
|
|
|
|
|
|
|
|
|
await expect(page).toHaveURL(/.*booking/);
|
|
|
|
|
|
|
|
|
|
// Should expect old booking to be accepted with two attendees
|
|
|
|
|
const oldBooking = await prisma.booking.findFirst({
|
|
|
|
|
where: { uid: booking.uid },
|
|
|
|
|
include: { seatsReferences: true, attendees: true },
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
expect(oldBooking?.status).toBe(BookingStatus.ACCEPTED);
|
|
|
|
|
expect(oldBooking?.attendees.length).toBe(2);
|
|
|
|
|
expect(oldBooking?.seatsReferences.length).toBe(2);
|
|
|
|
|
testBothBookers.describe("Reschedule for booking with seats", () => {
|
|
|
|
|
test("Should reschedule booking with seats", async ({ page, users, bookings }) => {
|
|
|
|
|
const { booking } = await createUserWithSeatedEventAndAttendees({ users, bookings }, [
|
|
|
|
|
{ name: "John First", email: "first+seats@cal.com", timeZone: "Europe/Berlin" },
|
|
|
|
|
{ name: "Jane Second", email: "second+seats@cal.com", timeZone: "Europe/Berlin" },
|
|
|
|
|
{ name: "John Third", email: "third+seats@cal.com", timeZone: "Europe/Berlin" },
|
|
|
|
|
]);
|
|
|
|
|
const bookingAttendees = await prisma.attendee.findMany({
|
|
|
|
|
where: { bookingId: booking.id },
|
|
|
|
|
select: {
|
|
|
|
|
id: true,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// FIXME: https://github.com/calcom/cal.com/issues/9193
|
|
|
|
|
test.fixme(
|
|
|
|
|
"Should reschedule booking with seats and if everyone rescheduled it should be deleted",
|
|
|
|
|
async ({ page, users, bookings }) => {
|
|
|
|
|
const { booking } = await createUserWithSeatedEventAndAttendees({ users, bookings }, [
|
|
|
|
|
{ name: "John First", email: "first+seats@cal.com", timeZone: "Europe/Berlin" },
|
|
|
|
|
{ name: "Jane Second", email: "second+seats@cal.com", timeZone: "Europe/Berlin" },
|
|
|
|
|
]);
|
|
|
|
|
const bookingSeats = [
|
|
|
|
|
{ bookingId: booking.id, attendeeId: bookingAttendees[0].id, referenceUid: uuidv4() },
|
|
|
|
|
{ bookingId: booking.id, attendeeId: bookingAttendees[1].id, referenceUid: uuidv4() },
|
|
|
|
|
{ bookingId: booking.id, attendeeId: bookingAttendees[2].id, referenceUid: uuidv4() },
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
const bookingAttendees = await prisma.attendee.findMany({
|
|
|
|
|
where: { bookingId: booking.id },
|
|
|
|
|
select: {
|
|
|
|
|
id: true,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
await prisma.bookingSeat.createMany({
|
|
|
|
|
data: bookingSeats,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const bookingSeats = [
|
|
|
|
|
{ bookingId: booking.id, attendeeId: bookingAttendees[0].id, referenceUid: uuidv4() },
|
|
|
|
|
{ bookingId: booking.id, attendeeId: bookingAttendees[1].id, referenceUid: uuidv4() },
|
|
|
|
|
];
|
|
|
|
|
const references = await prisma.bookingSeat.findMany({
|
|
|
|
|
where: { bookingId: booking.id },
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await prisma.bookingSeat.createMany({
|
|
|
|
|
data: bookingSeats,
|
|
|
|
|
});
|
|
|
|
|
await page.goto(`/reschedule/${references[2].referenceUid}`);
|
|
|
|
|
|
|
|
|
|
const references = await prisma.bookingSeat.findMany({
|
|
|
|
|
where: { bookingId: booking.id },
|
|
|
|
|
});
|
|
|
|
|
await selectFirstAvailableTimeSlotNextMonth(page);
|
|
|
|
|
|
|
|
|
|
await page.goto(`/reschedule/${references[0].referenceUid}`);
|
|
|
|
|
// expect input to be filled with attendee number 3 data
|
|
|
|
|
const thirdAttendeeElement = await page.locator("input[name=name]");
|
|
|
|
|
const attendeeName = await thirdAttendeeElement.inputValue();
|
|
|
|
|
expect(attendeeName).toBe("John Third");
|
|
|
|
|
|
|
|
|
|
await selectFirstAvailableTimeSlotNextMonth(page);
|
|
|
|
|
await page.locator('[data-testid="confirm-reschedule-button"]').click();
|
|
|
|
|
|
|
|
|
|
await page.locator('[data-testid="confirm-reschedule-button"]').click();
|
|
|
|
|
await page.waitForLoadState("networkidle");
|
|
|
|
|
|
|
|
|
|
await page.waitForURL(/.*booking/);
|
|
|
|
|
await expect(page).toHaveURL(/.*booking/);
|
|
|
|
|
|
|
|
|
|
await page.goto(`/reschedule/${references[1].referenceUid}`);
|
|
|
|
|
// Should expect old booking to be accepted with two attendees
|
|
|
|
|
const oldBooking = await prisma.booking.findFirst({
|
|
|
|
|
where: { uid: booking.uid },
|
|
|
|
|
include: { seatsReferences: true, attendees: true },
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await selectFirstAvailableTimeSlotNextMonth(page);
|
|
|
|
|
expect(oldBooking?.status).toBe(BookingStatus.ACCEPTED);
|
|
|
|
|
expect(oldBooking?.attendees.length).toBe(2);
|
|
|
|
|
expect(oldBooking?.seatsReferences.length).toBe(2);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await page.locator('[data-testid="confirm-reschedule-button"]').click();
|
|
|
|
|
test("Should reschedule booking with seats and if everyone rescheduled it should be deleted", async ({
|
|
|
|
|
page,
|
|
|
|
|
users,
|
|
|
|
|
bookings,
|
|
|
|
|
}) => {
|
|
|
|
|
const { booking } = await createUserWithSeatedEventAndAttendees({ users, bookings }, [
|
|
|
|
|
{ name: "John First", email: "first+seats@cal.com", timeZone: "Europe/Berlin" },
|
|
|
|
|
{ name: "Jane Second", email: "second+seats@cal.com", timeZone: "Europe/Berlin" },
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
// Using waitForUrl here fails the assertion `expect(oldBooking?.status).toBe(BookingStatus.CANCELLED);` probably because waitForUrl is considered complete before waitForNavigation and till that time the booking is not cancelled
|
|
|
|
|
await page.waitForNavigation({ url: /.*booking/ });
|
|
|
|
|
const bookingAttendees = await prisma.attendee.findMany({
|
|
|
|
|
where: { bookingId: booking.id },
|
|
|
|
|
select: {
|
|
|
|
|
id: true,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Should expect old booking to be cancelled
|
|
|
|
|
const oldBooking = await prisma.booking.findFirst({
|
|
|
|
|
where: { uid: booking.uid },
|
|
|
|
|
include: {
|
|
|
|
|
seatsReferences: true,
|
|
|
|
|
attendees: true,
|
|
|
|
|
eventType: {
|
|
|
|
|
include: { users: true, hosts: true },
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
const bookingSeats = [
|
|
|
|
|
{ bookingId: booking.id, attendeeId: bookingAttendees[0].id, referenceUid: uuidv4() },
|
|
|
|
|
{ bookingId: booking.id, attendeeId: bookingAttendees[1].id, referenceUid: uuidv4() },
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
expect(oldBooking?.status).toBe(BookingStatus.CANCELLED);
|
|
|
|
|
}
|
|
|
|
|
await prisma.bookingSeat.createMany({
|
|
|
|
|
data: bookingSeats,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const references = await prisma.bookingSeat.findMany({
|
|
|
|
|
where: { bookingId: booking.id },
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await page.goto(`/reschedule/${references[0].referenceUid}`);
|
|
|
|
|
|
|
|
|
|
await selectFirstAvailableTimeSlotNextMonth(page);
|
|
|
|
|
|
|
|
|
|
await page.locator('[data-testid="confirm-reschedule-button"]').click();
|
|
|
|
|
|
|
|
|
|
await page.waitForURL(/.*booking/);
|
|
|
|
|
|
|
|
|
|
await page.goto(`/reschedule/${references[1].referenceUid}`);
|
|
|
|
|
|
|
|
|
|
await selectFirstAvailableTimeSlotNextMonth(page);
|
|
|
|
|
|
|
|
|
|
await page.locator('[data-testid="confirm-reschedule-button"]').click();
|
|
|
|
|
|
|
|
|
|
// Using waitForUrl here fails the assertion `expect(oldBooking?.status).toBe(BookingStatus.CANCELLED);` probably because waitForUrl is considered complete before waitForNavigation and till that time the booking is not cancelled
|
|
|
|
|
await page.waitForNavigation({ url: /.*booking/ });
|
|
|
|
|
|
|
|
|
|
// Should expect old booking to be cancelled
|
|
|
|
|
const oldBooking = await prisma.booking.findFirst({
|
|
|
|
|
where: { uid: booking.uid },
|
|
|
|
|
include: {
|
|
|
|
|
seatsReferences: true,
|
|
|
|
|
attendees: true,
|
|
|
|
|
eventType: {
|
|
|
|
|
include: { users: true, hosts: true },
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
expect(oldBooking?.status).toBe(BookingStatus.CANCELLED);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test("Should cancel with seats and have no attendees and cancelled", async ({ page, users, bookings }) => {
|
|
|
|
|
const { user, booking } = await createUserWithSeatedEventAndAttendees({ users, bookings }, [
|
|
|
|
|
{ name: "John First", email: "first+seats@cal.com", timeZone: "Europe/Berlin" },
|
|
|
|
|
{ name: "Jane Second", email: "second+seats@cal.com", timeZone: "Europe/Berlin" },
|
|
|
|
|
]);
|
|
|
|
|
await user.login();
|
|
|
|
|
|
|
|
|
|
const oldBooking = await prisma.booking.findFirst({
|
|
|
|
|
where: { uid: booking.uid },
|
|
|
|
|
include: { seatsReferences: true, attendees: true },
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const bookingAttendees = await prisma.attendee.findMany({
|
|
|
|
|
where: { bookingId: booking.id },
|
|
|
|
|
select: {
|
|
|
|
|
id: true,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const bookingSeats = [
|
|
|
|
|
{ bookingId: booking.id, attendeeId: bookingAttendees[0].id, referenceUid: uuidv4() },
|
|
|
|
|
{ bookingId: booking.id, attendeeId: bookingAttendees[1].id, referenceUid: uuidv4() },
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
await prisma.bookingSeat.createMany({
|
|
|
|
|
data: bookingSeats,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Now we cancel the booking as the organizer
|
|
|
|
|
await page.goto(`/booking/${booking.uid}?cancel=true`);
|
|
|
|
|
|
|
|
|
|
await page.locator('[data-testid="cancel"]').click();
|
|
|
|
|
|
|
|
|
|
await page.waitForLoadState("networkidle");
|
|
|
|
|
|
|
|
|
|
await expect(page).toHaveURL(/.*booking/);
|
|
|
|
|
|
|
|
|
|
// Should expect old booking to be cancelled
|
|
|
|
|
const updatedBooking = await prisma.booking.findFirst({
|
|
|
|
|
where: { uid: booking.uid },
|
|
|
|
|
include: { seatsReferences: true, attendees: true },
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
expect(oldBooking?.startTime).not.toBe(updatedBooking?.startTime);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test("If rescheduled/cancelled booking with seats it should display the correct number of seats", async ({
|
|
|
|
|
page,
|
|
|
|
|
users,
|
|
|
|
|
bookings,
|
|
|
|
|
}) => {
|
|
|
|
|
const { booking } = await createUserWithSeatedEventAndAttendees({ users, bookings }, [
|
|
|
|
|
{ name: "John First", email: "first+seats@cal.com", timeZone: "Europe/Berlin" },
|
|
|
|
|
{ name: "Jane Second", email: "second+seats@cal.com", timeZone: "Europe/Berlin" },
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
const bookingAttendees = await prisma.attendee.findMany({
|
|
|
|
|
where: { bookingId: booking.id },
|
|
|
|
|
select: {
|
|
|
|
|
id: true,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const bookingSeats = [
|
|
|
|
|
{ bookingId: booking.id, attendeeId: bookingAttendees[0].id, referenceUid: uuidv4() },
|
|
|
|
|
{ bookingId: booking.id, attendeeId: bookingAttendees[1].id, referenceUid: uuidv4() },
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
await prisma.bookingSeat.createMany({
|
|
|
|
|
data: bookingSeats,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const references = await prisma.bookingSeat.findMany({
|
|
|
|
|
where: { bookingId: booking.id },
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await page.goto(
|
|
|
|
|
`/booking/${references[0].referenceUid}?cancel=true&seatReferenceUid=${references[0].referenceUid}`
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
test("Should cancel with seats and have no attendees and cancelled", async ({
|
|
|
|
|
page,
|
|
|
|
|
users,
|
|
|
|
|
bookings,
|
|
|
|
|
}) => {
|
|
|
|
|
const { user, booking } = await createUserWithSeatedEventAndAttendees({ users, bookings }, [
|
|
|
|
|
{ name: "John First", email: "first+seats@cal.com", timeZone: "Europe/Berlin" },
|
|
|
|
|
{ name: "Jane Second", email: "second+seats@cal.com", timeZone: "Europe/Berlin" },
|
|
|
|
|
]);
|
|
|
|
|
await user.login();
|
|
|
|
|
await page.locator('[data-testid="cancel"]').click();
|
|
|
|
|
|
|
|
|
|
const oldBooking = await prisma.booking.findFirst({
|
|
|
|
|
where: { uid: booking.uid },
|
|
|
|
|
include: { seatsReferences: true, attendees: true },
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const bookingAttendees = await prisma.attendee.findMany({
|
|
|
|
|
where: { bookingId: booking.id },
|
|
|
|
|
select: {
|
|
|
|
|
id: true,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const bookingSeats = [
|
|
|
|
|
{ bookingId: booking.id, attendeeId: bookingAttendees[0].id, referenceUid: uuidv4() },
|
|
|
|
|
{ bookingId: booking.id, attendeeId: bookingAttendees[1].id, referenceUid: uuidv4() },
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
await prisma.bookingSeat.createMany({
|
|
|
|
|
data: bookingSeats,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Now we cancel the booking as the organizer
|
|
|
|
|
await page.goto(`/booking/${booking.uid}?cancel=true`);
|
|
|
|
|
|
|
|
|
|
await page.locator('[data-testid="cancel"]').click();
|
|
|
|
|
|
|
|
|
|
await page.waitForLoadState("networkidle");
|
|
|
|
|
|
|
|
|
|
await expect(page).toHaveURL(/.*booking/);
|
|
|
|
|
|
|
|
|
|
// Should expect old booking to be cancelled
|
|
|
|
|
const updatedBooking = await prisma.booking.findFirst({
|
|
|
|
|
where: { uid: booking.uid },
|
|
|
|
|
include: { seatsReferences: true, attendees: true },
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
expect(oldBooking?.startTime).not.toBe(updatedBooking?.startTime);
|
|
|
|
|
const oldBooking = await prisma.booking.findFirst({
|
|
|
|
|
where: { uid: booking.uid },
|
|
|
|
|
select: {
|
|
|
|
|
id: true,
|
|
|
|
|
status: true,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test("If rescheduled/cancelled booking with seats it should display the correct number of seats", async ({
|
|
|
|
|
page,
|
|
|
|
|
users,
|
|
|
|
|
bookings,
|
|
|
|
|
}) => {
|
|
|
|
|
const { booking } = await createUserWithSeatedEventAndAttendees({ users, bookings }, [
|
|
|
|
|
{ name: "John First", email: "first+seats@cal.com", timeZone: "Europe/Berlin" },
|
|
|
|
|
{ name: "Jane Second", email: "second+seats@cal.com", timeZone: "Europe/Berlin" },
|
|
|
|
|
]);
|
|
|
|
|
expect(oldBooking?.status).toBe(BookingStatus.ACCEPTED);
|
|
|
|
|
|
|
|
|
|
const bookingAttendees = await prisma.attendee.findMany({
|
|
|
|
|
where: { bookingId: booking.id },
|
|
|
|
|
select: {
|
|
|
|
|
id: true,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
await page.goto(`/reschedule/${references[1].referenceUid}`);
|
|
|
|
|
|
|
|
|
|
const bookingSeats = [
|
|
|
|
|
{ bookingId: booking.id, attendeeId: bookingAttendees[0].id, referenceUid: uuidv4() },
|
|
|
|
|
{ bookingId: booking.id, attendeeId: bookingAttendees[1].id, referenceUid: uuidv4() },
|
|
|
|
|
];
|
|
|
|
|
await page.click('[data-testid="incrementMonth"]');
|
|
|
|
|
|
|
|
|
|
await prisma.bookingSeat.createMany({
|
|
|
|
|
data: bookingSeats,
|
|
|
|
|
});
|
|
|
|
|
await page.locator('[data-testid="day"][data-disabled="false"]').nth(1).click();
|
|
|
|
|
|
|
|
|
|
const references = await prisma.bookingSeat.findMany({
|
|
|
|
|
where: { bookingId: booking.id },
|
|
|
|
|
});
|
|
|
|
|
// Validate that the number of seats its 10
|
|
|
|
|
expect(await page.locator("text=9 / 10 Seats available").count()).toEqual(0);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await page.goto(
|
|
|
|
|
`/booking/${references[0].referenceUid}?cancel=true&seatReferenceUid=${references[0].referenceUid}`
|
|
|
|
|
);
|
|
|
|
|
test("Should cancel with seats but event should be still accesible and with one less attendee/seat", async ({
|
|
|
|
|
page,
|
|
|
|
|
users,
|
|
|
|
|
bookings,
|
|
|
|
|
}) => {
|
|
|
|
|
const { user, booking } = await createUserWithSeatedEventAndAttendees({ users, bookings }, [
|
|
|
|
|
{ name: "John First", email: "first+seats@cal.com", timeZone: "Europe/Berlin" },
|
|
|
|
|
{ name: "Jane Second", email: "second+seats@cal.com", timeZone: "Europe/Berlin" },
|
|
|
|
|
]);
|
|
|
|
|
await user.login();
|
|
|
|
|
|
|
|
|
|
await page.locator('[data-testid="cancel"]').click();
|
|
|
|
|
|
|
|
|
|
const oldBooking = await prisma.booking.findFirst({
|
|
|
|
|
where: { uid: booking.uid },
|
|
|
|
|
select: {
|
|
|
|
|
id: true,
|
|
|
|
|
status: true,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
expect(oldBooking?.status).toBe(BookingStatus.ACCEPTED);
|
|
|
|
|
|
|
|
|
|
await page.goto(`/reschedule/${references[1].referenceUid}`);
|
|
|
|
|
|
|
|
|
|
await page.click('[data-testid="incrementMonth"]');
|
|
|
|
|
|
|
|
|
|
await page.locator('[data-testid="day"][data-disabled="false"]').nth(1).click();
|
|
|
|
|
|
|
|
|
|
// Validate that the number of seats its 10
|
|
|
|
|
expect(await page.locator("text=9 / 10 Seats available").count()).toEqual(0);
|
|
|
|
|
const bookingAttendees = await prisma.attendee.findMany({
|
|
|
|
|
where: { bookingId: booking.id },
|
|
|
|
|
select: {
|
|
|
|
|
id: true,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test("Should cancel with seats but event should be still accesible and with one less attendee/seat", async ({
|
|
|
|
|
page,
|
|
|
|
|
users,
|
|
|
|
|
bookings,
|
|
|
|
|
}) => {
|
|
|
|
|
const { user, booking } = await createUserWithSeatedEventAndAttendees({ users, bookings }, [
|
|
|
|
|
{ name: "John First", email: "first+seats@cal.com", timeZone: "Europe/Berlin" },
|
|
|
|
|
{ name: "Jane Second", email: "second+seats@cal.com", timeZone: "Europe/Berlin" },
|
|
|
|
|
]);
|
|
|
|
|
await user.login();
|
|
|
|
|
const bookingSeats = [
|
|
|
|
|
{ bookingId: booking.id, attendeeId: bookingAttendees[0].id, referenceUid: uuidv4() },
|
|
|
|
|
{ bookingId: booking.id, attendeeId: bookingAttendees[1].id, referenceUid: uuidv4() },
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
const bookingAttendees = await prisma.attendee.findMany({
|
|
|
|
|
where: { bookingId: booking.id },
|
|
|
|
|
select: {
|
|
|
|
|
id: true,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const bookingSeats = [
|
|
|
|
|
{ bookingId: booking.id, attendeeId: bookingAttendees[0].id, referenceUid: uuidv4() },
|
|
|
|
|
{ bookingId: booking.id, attendeeId: bookingAttendees[1].id, referenceUid: uuidv4() },
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
await prisma.bookingSeat.createMany({
|
|
|
|
|
data: bookingSeats,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Now we cancel the booking as the first attendee
|
|
|
|
|
// booking/${bookingUid}?cancel=true&allRemainingBookings=false&seatReferenceUid={bookingSeat.referenceUid}
|
|
|
|
|
await page.goto(
|
|
|
|
|
`/booking/${booking.uid}?cancel=true&allRemainingBookings=false&seatReferenceUid=${bookingSeats[0].referenceUid}`
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
await page.locator('[data-testid="cancel"]').click();
|
|
|
|
|
|
|
|
|
|
await page.waitForLoadState("networkidle");
|
|
|
|
|
|
|
|
|
|
await expect(page).toHaveURL(/.*booking/);
|
|
|
|
|
|
|
|
|
|
await page.goto(
|
|
|
|
|
`/booking/${booking.uid}?cancel=true&allRemainingBookings=false&seatReferenceUid=${bookingSeats[1].referenceUid}`
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// Page should not be 404
|
|
|
|
|
await page.locator('[data-testid="cancel"]').click();
|
|
|
|
|
|
|
|
|
|
await page.waitForLoadState("networkidle");
|
|
|
|
|
|
|
|
|
|
await expect(page).toHaveURL(/.*booking/);
|
|
|
|
|
await prisma.bookingSeat.createMany({
|
|
|
|
|
data: bookingSeats,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test("Should book with seats and hide attendees info from showAttendees true", async ({
|
|
|
|
|
page,
|
|
|
|
|
users,
|
|
|
|
|
bookings,
|
|
|
|
|
}) => {
|
|
|
|
|
const { user, booking } = await createUserWithSeatedEventAndAttendees({ users, bookings }, [
|
|
|
|
|
{ name: "John First", email: "first+seats@cal.com", timeZone: "Europe/Berlin" },
|
|
|
|
|
{ name: "Jane Second", email: "second+seats@cal.com", timeZone: "Europe/Berlin" },
|
|
|
|
|
]);
|
|
|
|
|
await user.login();
|
|
|
|
|
const bookingWithEventType = await prisma.booking.findFirst({
|
|
|
|
|
where: { uid: booking.uid },
|
|
|
|
|
select: {
|
|
|
|
|
id: true,
|
|
|
|
|
eventTypeId: true,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
// Now we cancel the booking as the first attendee
|
|
|
|
|
// booking/${bookingUid}?cancel=true&allRemainingBookings=false&seatReferenceUid={bookingSeat.referenceUid}
|
|
|
|
|
await page.goto(
|
|
|
|
|
`/booking/${booking.uid}?cancel=true&allRemainingBookings=false&seatReferenceUid=${bookingSeats[0].referenceUid}`
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
await prisma.eventType.update({
|
|
|
|
|
data: {
|
|
|
|
|
seatsShowAttendees: false,
|
|
|
|
|
},
|
|
|
|
|
where: {
|
|
|
|
|
id: bookingWithEventType?.eventTypeId || -1,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
await page.locator('[data-testid="cancel"]').click();
|
|
|
|
|
|
|
|
|
|
const bookingAttendees = await prisma.attendee.findMany({
|
|
|
|
|
where: { bookingId: booking.id },
|
|
|
|
|
select: {
|
|
|
|
|
id: true,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
await page.waitForLoadState("networkidle");
|
|
|
|
|
|
|
|
|
|
const bookingSeats = [
|
|
|
|
|
{ bookingId: booking.id, attendeeId: bookingAttendees[0].id, referenceUid: uuidv4() },
|
|
|
|
|
{ bookingId: booking.id, attendeeId: bookingAttendees[1].id, referenceUid: uuidv4() },
|
|
|
|
|
];
|
|
|
|
|
await expect(page).toHaveURL(/.*booking/);
|
|
|
|
|
|
|
|
|
|
await prisma.bookingSeat.createMany({
|
|
|
|
|
data: bookingSeats,
|
|
|
|
|
});
|
|
|
|
|
await page.goto(
|
|
|
|
|
`/booking/${booking.uid}?cancel=true&allRemainingBookings=false&seatReferenceUid=${bookingSeats[1].referenceUid}`
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// Go to cancel page and see that attendees are listed and myself as I'm owner of the booking
|
|
|
|
|
await page.goto(`/booking/${booking.uid}?cancel=true&allRemainingBookings=false`);
|
|
|
|
|
// Page should not be 404
|
|
|
|
|
await page.locator('[data-testid="cancel"]').click();
|
|
|
|
|
|
|
|
|
|
const foundFirstAttendeeAsOwner = await page.locator(
|
|
|
|
|
'p[data-testid="attendee-email-first+seats@cal.com"]'
|
|
|
|
|
);
|
|
|
|
|
await expect(foundFirstAttendeeAsOwner).toHaveCount(1);
|
|
|
|
|
const foundSecondAttendeeAsOwner = await page.locator(
|
|
|
|
|
'p[data-testid="attendee-email-second+seats@cal.com"]'
|
|
|
|
|
);
|
|
|
|
|
await expect(foundSecondAttendeeAsOwner).toHaveCount(1);
|
|
|
|
|
await page.goto("auth/logout");
|
|
|
|
|
await page.waitForLoadState("networkidle");
|
|
|
|
|
|
|
|
|
|
// Now we cancel the booking as the first attendee
|
|
|
|
|
// booking/${bookingUid}?cancel=true&allRemainingBookings=false&seatReferenceUid={bookingSeat.referenceUid}
|
|
|
|
|
await page.goto(
|
|
|
|
|
`/booking/${booking.uid}?cancel=true&allRemainingBookings=false&seatReferenceUid=${bookingSeats[0].referenceUid}`
|
|
|
|
|
);
|
|
|
|
|
await expect(page).toHaveURL(/.*booking/);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// No attendees should be displayed only the one that it's cancelling
|
|
|
|
|
const notFoundSecondAttendee = await page.locator(
|
|
|
|
|
'p[data-testid="attendee-email-second+seats@cal.com"]'
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
await expect(notFoundSecondAttendee).toHaveCount(0);
|
|
|
|
|
const foundFirstAttendee = await page.locator('p[data-testid="attendee-email-first+seats@cal.com"]');
|
|
|
|
|
await expect(foundFirstAttendee).toHaveCount(1);
|
|
|
|
|
|
|
|
|
|
await prisma.eventType.update({
|
|
|
|
|
data: {
|
|
|
|
|
seatsShowAttendees: true,
|
|
|
|
|
},
|
|
|
|
|
where: {
|
|
|
|
|
id: bookingWithEventType?.eventTypeId || -1,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await page.goto(
|
|
|
|
|
`/booking/${booking.uid}?cancel=true&allRemainingBookings=false&seatReferenceUid=${bookingSeats[1].referenceUid}`
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// Now attendees should be displayed
|
|
|
|
|
const foundSecondAttendee = await page.locator('p[data-testid="attendee-email-second+seats@cal.com"]');
|
|
|
|
|
|
|
|
|
|
await expect(foundSecondAttendee).toHaveCount(1);
|
|
|
|
|
const foundFirstAttendeeAgain = await page
|
|
|
|
|
.locator('p[data-testid="attendee-email-first+seats@cal.com"]')
|
|
|
|
|
.first();
|
|
|
|
|
await expect(foundFirstAttendeeAgain).toHaveCount(1);
|
|
|
|
|
test("Should book with seats and hide attendees info from showAttendees true", async ({
|
|
|
|
|
page,
|
|
|
|
|
users,
|
|
|
|
|
bookings,
|
|
|
|
|
}) => {
|
|
|
|
|
const { user, booking } = await createUserWithSeatedEventAndAttendees({ users, bookings }, [
|
|
|
|
|
{ name: "John First", email: "first+seats@cal.com", timeZone: "Europe/Berlin" },
|
|
|
|
|
{ name: "Jane Second", email: "second+seats@cal.com", timeZone: "Europe/Berlin" },
|
|
|
|
|
]);
|
|
|
|
|
await user.login();
|
|
|
|
|
const bookingWithEventType = await prisma.booking.findFirst({
|
|
|
|
|
where: { uid: booking.uid },
|
|
|
|
|
select: {
|
|
|
|
|
id: true,
|
|
|
|
|
eventTypeId: true,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await prisma.eventType.update({
|
|
|
|
|
data: {
|
|
|
|
|
seatsShowAttendees: false,
|
|
|
|
|
},
|
|
|
|
|
where: {
|
|
|
|
|
id: bookingWithEventType?.eventTypeId || -1,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const bookingAttendees = await prisma.attendee.findMany({
|
|
|
|
|
where: { bookingId: booking.id },
|
|
|
|
|
select: {
|
|
|
|
|
id: true,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const bookingSeats = [
|
|
|
|
|
{ bookingId: booking.id, attendeeId: bookingAttendees[0].id, referenceUid: uuidv4() },
|
|
|
|
|
{ bookingId: booking.id, attendeeId: bookingAttendees[1].id, referenceUid: uuidv4() },
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
await prisma.bookingSeat.createMany({
|
|
|
|
|
data: bookingSeats,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Go to cancel page and see that attendees are listed and myself as I'm owner of the booking
|
|
|
|
|
await page.goto(`/booking/${booking.uid}?cancel=true&allRemainingBookings=false`);
|
|
|
|
|
|
|
|
|
|
const foundFirstAttendeeAsOwner = await page.locator(
|
|
|
|
|
'p[data-testid="attendee-email-first+seats@cal.com"]'
|
|
|
|
|
);
|
|
|
|
|
await expect(foundFirstAttendeeAsOwner).toHaveCount(1);
|
|
|
|
|
const foundSecondAttendeeAsOwner = await page.locator(
|
|
|
|
|
'p[data-testid="attendee-email-second+seats@cal.com"]'
|
|
|
|
|
);
|
|
|
|
|
await expect(foundSecondAttendeeAsOwner).toHaveCount(1);
|
|
|
|
|
|
|
|
|
|
await page.goto("auth/logout");
|
|
|
|
|
|
|
|
|
|
// Now we cancel the booking as the first attendee
|
|
|
|
|
// booking/${bookingUid}?cancel=true&allRemainingBookings=false&seatReferenceUid={bookingSeat.referenceUid}
|
|
|
|
|
await page.goto(
|
|
|
|
|
`/booking/${booking.uid}?cancel=true&allRemainingBookings=false&seatReferenceUid=${bookingSeats[0].referenceUid}`
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// No attendees should be displayed only the one that it's cancelling
|
|
|
|
|
const notFoundSecondAttendee = await page.locator('p[data-testid="attendee-email-second+seats@cal.com"]');
|
|
|
|
|
|
|
|
|
|
await expect(notFoundSecondAttendee).toHaveCount(0);
|
|
|
|
|
const foundFirstAttendee = await page.locator('p[data-testid="attendee-email-first+seats@cal.com"]');
|
|
|
|
|
await expect(foundFirstAttendee).toHaveCount(1);
|
|
|
|
|
|
|
|
|
|
await prisma.eventType.update({
|
|
|
|
|
data: {
|
|
|
|
|
seatsShowAttendees: true,
|
|
|
|
|
},
|
|
|
|
|
where: {
|
|
|
|
|
id: bookingWithEventType?.eventTypeId || -1,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await page.goto(
|
|
|
|
|
`/booking/${booking.uid}?cancel=true&allRemainingBookings=false&seatReferenceUid=${bookingSeats[1].referenceUid}`
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// Now attendees should be displayed
|
|
|
|
|
const foundSecondAttendee = await page.locator('p[data-testid="attendee-email-second+seats@cal.com"]');
|
|
|
|
|
|
|
|
|
|
await expect(foundSecondAttendee).toHaveCount(1);
|
|
|
|
|
const foundFirstAttendeeAgain = await page
|
|
|
|
|
.locator('p[data-testid="attendee-email-first+seats@cal.com"]')
|
|
|
|
|
.first();
|
|
|
|
|
await expect(foundFirstAttendeeAgain).toHaveCount(1);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|