* WIP bookings page ui changes, created api endpoint * Ui changes mobile/desktop * Added translations * Fix lib import and common names * WIP reschedule * WIP * Save wip * [WIP] builder and class for CalendarEvent, email for attende * update rescheduled emails, booking view and availability page view * Working version reschedule * Fix for req.user as array * Added missing translation and refactor dialog to self component * Test for reschedule * update on types * Update lib no required * Update type on createBooking * fix types * remove preview stripe sub * remove unused file * remove unused import * Fix reschedule test * Refactor and cleaning up code * Email reschedule title fixes * Adding calendar delete and recreate placeholder of cancelled * Add translation * Removed logs, notes, fixed types * Fixes process.env types * Use strict compare * Fixes type inference * Type fixing is my middle name * Update apps/web/components/booking/BookingListItem.tsx * Update apps/web/components/dialog/RescheduleDialog.tsx * Update packages/core/builders/CalendarEvent/director.ts * Update apps/web/pages/success.tsx * Updates rescheduling labels * Update packages/core/builders/CalendarEvent/builder.ts * Type fixes * Update packages/core/builders/CalendarEvent/builder.ts * Only validating input blocked once * E2E fixes * Stripe tests fixes Co-authored-by: Peer Richelsen <peer@cal.com> Co-authored-by: zomars <zomars@me.com>
		
			
				
	
	
		
			81 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { Page, test } from "@playwright/test";
 | 
						|
 | 
						|
import { deleteAllBookingsByEmail } from "./lib/teardown";
 | 
						|
import {
 | 
						|
  bookFirstEvent,
 | 
						|
  bookTimeSlot,
 | 
						|
  selectFirstAvailableTimeSlotNextMonth,
 | 
						|
  selectSecondAvailableTimeSlotNextMonth,
 | 
						|
} from "./lib/testUtils";
 | 
						|
 | 
						|
test.describe("dynamic booking", () => {
 | 
						|
  test.use({ storageState: "playwright/artifacts/proStorageState.json" });
 | 
						|
 | 
						|
  test.beforeEach(async ({ page }) => {
 | 
						|
    await deleteAllBookingsByEmail("pro@example.com");
 | 
						|
    await deleteAllBookingsByEmail("free@example.com");
 | 
						|
    await page.goto("/pro+free");
 | 
						|
  });
 | 
						|
 | 
						|
  test.afterAll(async () => {
 | 
						|
    // delete test bookings
 | 
						|
    await deleteAllBookingsByEmail("pro@example.com");
 | 
						|
    await deleteAllBookingsByEmail("free@example.com");
 | 
						|
  });
 | 
						|
 | 
						|
  test("book an event first day in next month", async ({ page }) => {
 | 
						|
    // Click first event type
 | 
						|
    await page.click('[data-testid="event-type-link"]');
 | 
						|
    await selectFirstAvailableTimeSlotNextMonth(page);
 | 
						|
    await bookTimeSlot(page);
 | 
						|
 | 
						|
    // Make sure we're navigated to the success page
 | 
						|
    await page.waitForNavigation({
 | 
						|
      url(url) {
 | 
						|
        return url.pathname.endsWith("/success");
 | 
						|
      },
 | 
						|
    });
 | 
						|
  });
 | 
						|
 | 
						|
  test("can reschedule a booking", async ({ page }) => {
 | 
						|
    await bookFirstEvent(page);
 | 
						|
 | 
						|
    // Logged in
 | 
						|
    await page.goto("/bookings/upcoming");
 | 
						|
    await page.locator('[data-testid="reschedule"]').click();
 | 
						|
    await page.locator('[data-testid="edit"]').click();
 | 
						|
    await page.waitForNavigation({
 | 
						|
      url: (url) => {
 | 
						|
        const bookingId = url.searchParams.get("rescheduleUid");
 | 
						|
        return !!bookingId;
 | 
						|
      },
 | 
						|
    });
 | 
						|
    await selectSecondAvailableTimeSlotNextMonth(page);
 | 
						|
    // --- fill form
 | 
						|
    await page.locator('[data-testid="confirm-reschedule-button"]').click();
 | 
						|
    await page.waitForNavigation({
 | 
						|
      url(url) {
 | 
						|
        return url.pathname === "/success" && url.searchParams.get("reschedule") === "true";
 | 
						|
      },
 | 
						|
    });
 | 
						|
  });
 | 
						|
 | 
						|
  test("Can cancel the recently created booking", async ({ page }) => {
 | 
						|
    await bookFirstEvent(page);
 | 
						|
 | 
						|
    await page.goto("/bookings/upcoming");
 | 
						|
    await page.locator('[data-testid="cancel"]').first().click();
 | 
						|
    await page.waitForNavigation({
 | 
						|
      url: (url) => {
 | 
						|
        return url.pathname.startsWith("/cancel");
 | 
						|
      },
 | 
						|
    });
 | 
						|
    // --- fill form
 | 
						|
    await page.locator('[data-testid="cancel"]').click();
 | 
						|
    await page.waitForNavigation({
 | 
						|
      url(url) {
 | 
						|
        return url.pathname === "/cancel/success";
 | 
						|
      },
 | 
						|
    });
 | 
						|
  });
 | 
						|
});
 |