| | import { expect, test } from "@playwright/test"; |
| | import * as dotenv from "dotenv"; |
| | import path from "path"; |
| |
|
| | test.skip( |
| | "TextInputOutputComponent", |
| | { tag: ["@release", "@components"] }, |
| | async ({ page }) => { |
| | |
| | test.skip( |
| | !process?.env?.OPENAI_API_KEY, |
| | "OPENAI_API_KEY required to run this test", |
| | ); |
| | if (!process.env.CI) { |
| | dotenv.config({ path: path.resolve(__dirname, "../../.env") }); |
| | } |
| | await page.goto("/"); |
| | await page.waitForSelector('[data-testid="mainpage_title"]', { |
| | timeout: 30000, |
| | }); |
| | await page.waitForSelector('[id="new-project-btn"]', { |
| | timeout: 30000, |
| | }); |
| | let modalCount = 0; |
| | try { |
| | const modalTitleElement = await page?.getByTestId("modal-title"); |
| | if (modalTitleElement) { |
| | modalCount = await modalTitleElement.count(); |
| | } |
| | } catch (error) { |
| | modalCount = 0; |
| | } |
| | while (modalCount === 0) { |
| | await page.getByText("New Flow", { exact: true }).click(); |
| | await page.waitForTimeout(3000); |
| | modalCount = await page.getByTestId("modal-title")?.count(); |
| | } |
| | await page.waitForSelector('[data-testid="blank-flow"]', { |
| | timeout: 30000, |
| | }); |
| | await page.getByTestId("blank-flow").click(); |
| | await page.getByTestId("sidebar-search-input").click(); |
| | await page.getByTestId("sidebar-search-input").fill("text input"); |
| | await page.waitForTimeout(1000); |
| | await page |
| | .getByTestId("inputsText Input") |
| | .dragTo(page.locator('//*[@id="react-flow-id"]')); |
| | await page.mouse.up(); |
| | await page.mouse.down(); |
| | await page.getByTestId("sidebar-search-input").click(); |
| | await page.getByTestId("sidebar-search-input").fill("openai"); |
| | await page.waitForTimeout(1000); |
| | await page |
| | .getByTestId("modelsOpenAI") |
| | .dragTo(page.locator('//*[@id="react-flow-id"]')); |
| | await page.mouse.up(); |
| | await page.mouse.down(); |
| | await page.waitForSelector('[data-testid="fit_view"]', { |
| | timeout: 100000, |
| | }); |
| | await page.getByTestId("fit_view").click(); |
| | await page.getByTestId("zoom_out").click(); |
| | await page.getByTestId("zoom_out").click(); |
| | await page.getByTestId("zoom_out").click(); |
| | let visibleElementHandle; |
| | const elementsTextInputOutput = await page |
| | .getByTestId("handle-textinput-shownode-text-right") |
| | .all(); |
| | for (const element of elementsTextInputOutput) { |
| | if (await element.isVisible()) { |
| | visibleElementHandle = element; |
| | break; |
| | } |
| | } |
| | await visibleElementHandle.waitFor({ |
| | state: "visible", |
| | timeout: 30000, |
| | }); |
| | await visibleElementHandle.hover(); |
| | await page.mouse.down(); |
| | for (const element of elementsTextInputOutput) { |
| | if (await element.isVisible()) { |
| | visibleElementHandle = element; |
| | break; |
| | } |
| | } |
| | await visibleElementHandle.waitFor({ |
| | state: "visible", |
| | timeout: 30000, |
| | }); |
| | |
| | await visibleElementHandle.hover(); |
| | |
| | await page.mouse.up(); |
| | await page.getByTestId("sidebar-search-input").click(); |
| | await page.getByTestId("sidebar-search-input").fill("text output"); |
| | await page |
| | .getByTestId("outputsText Output") |
| | .dragTo(page.locator('//*[@id="react-flow-id"]')); |
| | await page.mouse.up(); |
| | await page.mouse.down(); |
| | await page.waitForSelector('[data-testid="fit_view"]', { |
| | timeout: 100000, |
| | }); |
| | await page.getByTestId("zoom_out").click(); |
| | await page.getByTestId("zoom_out").click(); |
| | await page.getByTestId("zoom_out").click(); |
| | await page.getByTestId("zoom_out").click(); |
| | await page.getByTestId("zoom_out").click(); |
| | await page.getByTestId("zoom_out").click(); |
| | const elementsOpenAiOutput = await page |
| | .getByTestId("handle-openaimodel-shownode-text-right") |
| | .all(); |
| | for (const element of elementsOpenAiOutput) { |
| | if (await element.isVisible()) { |
| | visibleElementHandle = element; |
| | break; |
| | } |
| | } |
| | await visibleElementHandle.waitFor({ |
| | state: "visible", |
| | timeout: 30000, |
| | }); |
| | |
| | await visibleElementHandle.hover(); |
| | await page.mouse.down(); |
| | const elementTextOutputInput = await page |
| | .getByTestId("handle-textoutput-shownode-text-left") |
| | .all(); |
| | for (const element of elementTextOutputInput) { |
| | if (await element.isVisible()) { |
| | visibleElementHandle = element; |
| | break; |
| | } |
| | } |
| | await visibleElementHandle.waitFor({ |
| | state: "visible", |
| | timeout: 30000, |
| | }); |
| | |
| | await visibleElementHandle.hover(); |
| | |
| | await page.mouse.up(); |
| | await page |
| | .getByTestId(/^rf__node-TextInput-[a-zA-Z0-9]+$/) |
| | .getByTestId("textarea_str_input_value") |
| | .fill("This is a test!"); |
| | let outdatedComponents = await page |
| | .getByTestId("icon-AlertTriangle") |
| | .count(); |
| | while (outdatedComponents > 0) { |
| | await page.getByTestId("icon-AlertTriangle").first().click(); |
| | await page.waitForTimeout(1000); |
| | outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); |
| | } |
| | let filledApiKey = await page.getByTestId("remove-icon-badge").count(); |
| | while (filledApiKey > 0) { |
| | await page.getByTestId("remove-icon-badge").first().click(); |
| | await page.waitForTimeout(1000); |
| | filledApiKey = await page.getByTestId("remove-icon-badge").count(); |
| | } |
| | const apiKeyInput = page.getByTestId("popover-anchor-input-api_key"); |
| | const isApiKeyInputVisible = await apiKeyInput.isVisible(); |
| | if (isApiKeyInputVisible) { |
| | await apiKeyInput.fill(process.env.OPENAI_API_KEY ?? ""); |
| | } |
| | await page.getByTestId("dropdown_str_model_name").click(); |
| | await page.getByTestId("gpt-4o-1-option").click(); |
| | await page.waitForTimeout(1000); |
| | await page.getByText("Playground", { exact: true }).last().click(); |
| | await page.getByTestId("button_run_text_output").click(); |
| | await page |
| | .getByTestId(/^rf__node-TextOutput-[a-zA-Z0-9]+$/) |
| | .getByTestId("output-inspection-text") |
| | .click(); |
| | await page.getByText("Run Flow", { exact: true }).click(); |
| | await page.waitForTimeout(5000); |
| | let textInputContent = await page |
| | .getByPlaceholder("Enter text...") |
| | .textContent(); |
| | expect(textInputContent).toBe("This is a test!"); |
| | await page.getByText("Outputs", { exact: true }).nth(1).click(); |
| | await page.getByText("Text Output", { exact: true }).nth(2).click(); |
| | let contentOutput = await page |
| | .getByPlaceholder("Enter text...") |
| | .inputValue(); |
| | expect(contentOutput).not.toBe(null); |
| | await page.keyboard.press("Escape"); |
| | await page |
| | .getByTestId(/^rf__node-TextInput-[a-zA-Z0-9]+$/) |
| | .getByTestId("textarea_str_input_value") |
| | .fill("This is a test, again just to be sure!"); |
| | await page.getByText("Playground", { exact: true }).last().click(); |
| | await page.getByText("Run Flow", { exact: true }).click(); |
| | await page.waitForTimeout(5000); |
| | textInputContent = await page |
| | .getByPlaceholder("Enter text...") |
| | .textContent(); |
| | expect(textInputContent).toBe("This is a test, again just to be sure!"); |
| | await page.getByText("Outputs", { exact: true }).nth(1).click(); |
| | await page.getByText("Text Output", { exact: true }).nth(2).click(); |
| | contentOutput = await page.getByPlaceholder("Enter text...").inputValue(); |
| | expect(contentOutput).not.toBe(null); |
| | }, |
| | ); |
| |
|