238 lines
8.3 KiB
TypeScript
238 lines
8.3 KiB
TypeScript
import { expect } from "@playwright/test";
|
|
|
|
import prisma from "@calcom/prisma";
|
|
|
|
import { test } from "./lib/fixtures";
|
|
import { selectFirstAvailableTimeSlotNextMonth } from "./lib/testUtils";
|
|
|
|
test.describe.configure({ mode: "parallel" });
|
|
test.afterEach(({ users }) => users.deleteAll());
|
|
|
|
test.describe("Payment app", () => {
|
|
test("Should be able to edit alby price, currency", async ({ page, users }) => {
|
|
const user = await users.create();
|
|
await user.apiLogin();
|
|
const paymentEvent = user.eventTypes.find((item) => item.slug === "paid");
|
|
if (!paymentEvent) {
|
|
throw new Error("No payment event found");
|
|
}
|
|
await prisma.credential.create({
|
|
data: {
|
|
type: "alby_payment",
|
|
userId: user.id,
|
|
key: {
|
|
account_id: "random",
|
|
account_email: "random@example.com",
|
|
webhook_endpoint_id: "ep_randomString",
|
|
webhook_endpoint_secret: "whsec_randomString",
|
|
account_lightning_address: "random@getalby.com",
|
|
},
|
|
},
|
|
});
|
|
|
|
await page.goto(`event-types/${paymentEvent.id}?tabName=apps`);
|
|
|
|
await page.locator("#event-type-form").getByRole("switch").click();
|
|
await page.getByPlaceholder("Price").click();
|
|
await page.getByPlaceholder("Price").fill("200");
|
|
await page.getByText("SatoshissatsCurrencyBTCPayment optionCollect payment on booking").click();
|
|
await page.getByTestId("update-eventtype").click();
|
|
|
|
await page.goto(`${user.username}/${paymentEvent.slug}`);
|
|
|
|
// expect 200 sats to be displayed in page
|
|
expect(await page.locator("text=200 sats").first()).toBeTruthy();
|
|
|
|
await selectFirstAvailableTimeSlotNextMonth(page);
|
|
expect(await page.locator("text=200 sats").first()).toBeTruthy();
|
|
|
|
// go to /event-types and check if the price is 200 sats
|
|
await page.goto(`event-types/`);
|
|
expect(await page.locator("text=200 sats").first()).toBeTruthy();
|
|
});
|
|
|
|
test("Should be able to edit stripe price, currency", async ({ page, users }) => {
|
|
const user = await users.create();
|
|
await user.apiLogin();
|
|
const paymentEvent = user.eventTypes.find((item) => item.slug === "paid");
|
|
if (!paymentEvent) {
|
|
throw new Error("No payment event found");
|
|
}
|
|
await prisma.credential.create({
|
|
data: {
|
|
type: "stripe_payment",
|
|
userId: user.id,
|
|
key: {
|
|
scope: "read_write",
|
|
livemode: false,
|
|
token_type: "bearer",
|
|
access_token: "sk_test_randomString",
|
|
refresh_token: "rt_randomString",
|
|
stripe_user_id: "acct_randomString",
|
|
default_currency: "usd",
|
|
stripe_publishable_key: "pk_test_randomString",
|
|
},
|
|
},
|
|
});
|
|
|
|
await page.goto(`event-types/${paymentEvent.id}?tabName=apps`);
|
|
await page.locator("#event-type-form").getByRole("switch").click();
|
|
await page.locator(".text-black > .bg-default > div > div:nth-child(2)").first().click();
|
|
await page.getByTestId("select-option-usd").click();
|
|
|
|
await page.getByTestId("price-input-stripe").click();
|
|
await page.getByTestId("price-input-stripe").fill("350");
|
|
await page.getByTestId("update-eventtype").click();
|
|
|
|
await page.goto(`${user.username}/${paymentEvent.slug}`);
|
|
|
|
// expect 200 sats to be displayed in page
|
|
expect(await page.locator("text=350").first()).toBeTruthy();
|
|
|
|
await selectFirstAvailableTimeSlotNextMonth(page);
|
|
expect(await page.locator("text=350").first()).toBeTruthy();
|
|
|
|
// go to /event-types and check if the price is 200 sats
|
|
await page.goto(`event-types/`);
|
|
expect(await page.locator("text=350").first()).toBeTruthy();
|
|
});
|
|
|
|
test("Should be able to edit paypal price, currency", async ({ page, users }) => {
|
|
const user = await users.create();
|
|
await user.apiLogin();
|
|
const paymentEvent = user.eventTypes.find((item) => item.slug === "paid");
|
|
if (!paymentEvent) {
|
|
throw new Error("No payment event found");
|
|
}
|
|
await prisma.credential.create({
|
|
data: {
|
|
type: "paypal_payment",
|
|
userId: user.id,
|
|
key: {
|
|
client_id: "randomString",
|
|
secret_key: "randomString",
|
|
webhook_id: "randomString",
|
|
},
|
|
},
|
|
});
|
|
|
|
await page.goto(`event-types/${paymentEvent.id}?tabName=apps`);
|
|
|
|
await page.locator("#event-type-form").getByRole("switch").click();
|
|
|
|
await page.getByPlaceholder("Price").click();
|
|
await page.getByPlaceholder("Price").fill("150");
|
|
|
|
await page.locator(".text-black > .bg-default > div > div:nth-child(2)").first().click();
|
|
await page.locator("#react-select-2-option-13").click();
|
|
|
|
await page.locator(".mb-1 > .bg-default > div > div:nth-child(2)").first().click();
|
|
|
|
await page.getByText("$MXNCurrencyMexican pesoPayment option").click();
|
|
await page.getByTestId("update-eventtype").click();
|
|
|
|
await page.goto(`${user.username}/${paymentEvent.slug}`);
|
|
|
|
// expect 150 to be displayed in page
|
|
expect(await page.locator("text=MX$150.00").first()).toBeTruthy();
|
|
|
|
await selectFirstAvailableTimeSlotNextMonth(page);
|
|
// expect 150 to be displayed in page
|
|
expect(await page.locator("text=MX$150.00").first()).toBeTruthy();
|
|
|
|
// go to /event-types and check if the price is 150
|
|
await page.goto(`event-types/`);
|
|
expect(await page.locator("text=MX$150.00").first()).toBeTruthy();
|
|
});
|
|
|
|
test("Should display App is not setup already for alby", async ({ page, users }) => {
|
|
const user = await users.create();
|
|
await user.apiLogin();
|
|
const paymentEvent = user.eventTypes.find((item) => item.slug === "paid");
|
|
if (!paymentEvent) {
|
|
throw new Error("No payment event found");
|
|
}
|
|
await prisma.credential.create({
|
|
data: {
|
|
type: "alby_payment",
|
|
userId: user.id,
|
|
key: {},
|
|
},
|
|
});
|
|
|
|
await page.goto(`event-types/${paymentEvent.id}?tabName=apps`);
|
|
|
|
await page.locator("#event-type-form").getByRole("switch").click();
|
|
|
|
// expect text "This app has not been setup yet" to be displayed
|
|
expect(await page.locator("text=This app has not been setup yet").first()).toBeTruthy();
|
|
|
|
await page.getByRole("button", { name: "Setup" }).click();
|
|
|
|
// Expect "Connect with Alby" to be displayed
|
|
expect(await page.locator("text=Connect with Alby").first()).toBeTruthy();
|
|
});
|
|
|
|
test("Should display App is not setup already for paypal", async ({ page, users }) => {
|
|
const user = await users.create();
|
|
await user.apiLogin();
|
|
const paymentEvent = user.eventTypes.find((item) => item.slug === "paid");
|
|
if (!paymentEvent) {
|
|
throw new Error("No payment event found");
|
|
}
|
|
await prisma.credential.create({
|
|
data: {
|
|
type: "paypal_payment",
|
|
userId: user.id,
|
|
key: {},
|
|
},
|
|
});
|
|
|
|
await page.goto(`event-types/${paymentEvent.id}?tabName=apps`);
|
|
|
|
await page.locator("#event-type-form").getByRole("switch").click();
|
|
|
|
// expect text "This app has not been setup yet" to be displayed
|
|
expect(await page.locator("text=This app has not been setup yet").first()).toBeTruthy();
|
|
|
|
await page.getByRole("button", { name: "Setup" }).click();
|
|
|
|
// Expect "Getting started with Paypal APP" to be displayed
|
|
expect(await page.locator("text=Getting started with Paypal APP").first()).toBeTruthy();
|
|
});
|
|
|
|
/**
|
|
* For now almost all the payment apps show display "This app has not been setup yet"
|
|
* this can change in the future
|
|
*/
|
|
test("Should not display App is not setup already for non payment app", async ({ page, users }) => {
|
|
// We will use google analytics app for this test
|
|
const user = await users.create();
|
|
await user.apiLogin();
|
|
// Any event should work here
|
|
const paymentEvent = user.eventTypes.find((item) => item.slug === "paid");
|
|
if (!paymentEvent) {
|
|
throw new Error("No payment event found");
|
|
}
|
|
|
|
await prisma.credential.create({
|
|
data: {
|
|
type: "ga4_analytics",
|
|
userId: user.id,
|
|
appId: "ga4",
|
|
invalid: false,
|
|
key: {},
|
|
},
|
|
});
|
|
|
|
await page.goto(`event-types/${paymentEvent.id}?tabName=apps`);
|
|
|
|
await page.locator("#event-type-form").getByRole("switch").click();
|
|
// make sure Tracking ID is displayed
|
|
expect(await page.locator("text=Tracking ID").first()).toBeTruthy();
|
|
await page.getByLabel("Tracking ID").click();
|
|
await page.getByLabel("Tracking ID").fill("demo");
|
|
await page.getByTestId("update-eventtype").click();
|
|
});
|
|
});
|