mirror of https://github.com/nocodb/nocodb
4 changed files with 151 additions and 4 deletions
@ -0,0 +1,116 @@ |
|||||||
|
// playwright-dev-page.ts
|
||||||
|
import { expect, Locator } from "@playwright/test"; |
||||||
|
import BasePage from "../../Base"; |
||||||
|
import { DashboardPage } from ".."; |
||||||
|
// import clipboard from "clipboardy";
|
||||||
|
|
||||||
|
export class WebhookFormPage extends BasePage { |
||||||
|
readonly dashboard: DashboardPage; |
||||||
|
readonly addNewButton: Locator; |
||||||
|
readonly saveButton: Locator; |
||||||
|
readonly testButton: Locator; |
||||||
|
|
||||||
|
constructor(dashboard: DashboardPage) { |
||||||
|
super(dashboard.rootPage); |
||||||
|
this.dashboard = dashboard; |
||||||
|
this.addNewButton = this.dashboard.get().locator(".nc-btn-create-webhook"); |
||||||
|
this.saveButton = this.get().locator('button:has-text("Save")'); |
||||||
|
this.testButton = this.get().locator('button:has-text("Test Webhook")'); |
||||||
|
} |
||||||
|
|
||||||
|
get() { |
||||||
|
return this.dashboard.get().locator(`.nc-drawer-webhook`); |
||||||
|
} |
||||||
|
|
||||||
|
async create({ |
||||||
|
title, |
||||||
|
event, |
||||||
|
url, |
||||||
|
}: { |
||||||
|
title: string; |
||||||
|
event: string; |
||||||
|
url: string; |
||||||
|
}) { |
||||||
|
await this.addNewButton.click(); |
||||||
|
await this.get().waitFor({ state: "visible" }); |
||||||
|
|
||||||
|
await this.configureHeader({ |
||||||
|
key: "Content-type", |
||||||
|
value: "application/json", |
||||||
|
}); |
||||||
|
|
||||||
|
await this.configureWebhook({ title, event, url }); |
||||||
|
} |
||||||
|
|
||||||
|
async configureWebhook({ |
||||||
|
title, |
||||||
|
event, |
||||||
|
url, |
||||||
|
}: { |
||||||
|
title?: string; |
||||||
|
event?: string; |
||||||
|
url?: string; |
||||||
|
}) { |
||||||
|
if (title) { |
||||||
|
await this.get().locator(`.nc-text-field-hook-title`).fill(title); |
||||||
|
} |
||||||
|
if (event) { |
||||||
|
await this.get().locator(`.nc-text-field-hook-event`).click(); |
||||||
|
const modal = this.rootPage.locator(`.nc-dropdown-webhook-event`); |
||||||
|
await modal.locator(`.ant-select-item:has-text("${event}")`).click(); |
||||||
|
} |
||||||
|
if (url) { |
||||||
|
await this.get().locator(`.nc-text-field-hook-url-path`).fill(url); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
async addCondition() { |
||||||
|
await this.get().locator(`.nc-check-box-hook-condition`).click(); |
||||||
|
const modal = await this.get().locator(`.menu-filter-dropdown`).last(); |
||||||
|
await modal.locator(`button:has-text("Add Filter")`).click(); |
||||||
|
} |
||||||
|
|
||||||
|
async deleteCondition() { |
||||||
|
await this.get().locator(`.nc-filter-item-remove-btn`).click(); |
||||||
|
} |
||||||
|
|
||||||
|
async save() { |
||||||
|
await this.saveButton.click(); |
||||||
|
} |
||||||
|
|
||||||
|
async test() { |
||||||
|
await this.testButton.click(); |
||||||
|
await this.toastWait({ message: "Webhook tested successfully" }); |
||||||
|
} |
||||||
|
|
||||||
|
async delete({ index }: { index: number }) { |
||||||
|
await this.get().locator(`.nc-hook-delete-icon`).nth(index).click(); |
||||||
|
await this.toastWait({ message: "Hook deleted successfully" }); |
||||||
|
} |
||||||
|
|
||||||
|
async close() { |
||||||
|
// type esc key
|
||||||
|
await this.get().press("Escape"); |
||||||
|
} |
||||||
|
|
||||||
|
async open({ index }: { index: number }) { |
||||||
|
await this.dashboard.get().locator(`.nc-hook`).nth(index).click(); |
||||||
|
} |
||||||
|
|
||||||
|
async configureHeader({ key, value }: { key: string; value: string }) { |
||||||
|
// hardcode "Content-type: application/json"
|
||||||
|
await this.get().locator(`.ant-tabs-tab-btn:has-text("Headers")`).click(); |
||||||
|
|
||||||
|
await this.get().locator(".nc-input-hook-header-key >> input").fill(key); |
||||||
|
const modal = this.rootPage.locator(`.nc-dropdown-webhook-header`); |
||||||
|
await modal.locator(`.ant-select-item:has-text("${key}")`).click(); |
||||||
|
|
||||||
|
await this.get().locator(".nc-input-hook-header-value").type(value); |
||||||
|
await this.get().press("Enter"); |
||||||
|
|
||||||
|
await this.get() |
||||||
|
.locator(".nc-hook-header-tab-checkbox") |
||||||
|
.locator("input.ant-checkbox-input") |
||||||
|
.click(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,32 @@ |
|||||||
|
import { test } from "@playwright/test"; |
||||||
|
import { DashboardPage } from "../pages/Dashboard"; |
||||||
|
import setup from "../setup"; |
||||||
|
import { ToolbarPage } from "../pages/Dashboard/common/Toolbar"; |
||||||
|
|
||||||
|
test.describe.skip("Webhook", () => { |
||||||
|
let dashboard: DashboardPage, toolbar: ToolbarPage; |
||||||
|
let context: any; |
||||||
|
|
||||||
|
test.beforeEach(async ({ page }) => { |
||||||
|
context = await setup({ page }); |
||||||
|
dashboard = new DashboardPage(page, context.project); |
||||||
|
toolbar = dashboard.grid.toolbar; |
||||||
|
}); |
||||||
|
|
||||||
|
test("CRUD", async () => { |
||||||
|
// close 'Team & Auth' tab
|
||||||
|
await dashboard.closeTab({ title: "Team & Auth" }); |
||||||
|
await dashboard.treeView.createTable({ title: "Test" }); |
||||||
|
|
||||||
|
await toolbar.clickActions(); |
||||||
|
await toolbar.actions.click("Webhooks"); |
||||||
|
|
||||||
|
await dashboard.webhookForm.create({ |
||||||
|
title: "Test", |
||||||
|
url: "https://example.com", |
||||||
|
event: "After Insert", |
||||||
|
}); |
||||||
|
|
||||||
|
await dashboard.webhookForm.addCondition(); |
||||||
|
}); |
||||||
|
}); |
Loading…
Reference in new issue