import { expect, Page, test } from "@playwright/test"; import uaParser from "ua-parser-js"; // TODO: This component doesn't have slider needs updating test( "user should be able to use slider input", { tag: ["@release", "@workspace"], }, async ({ page }) => { 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.waitForSelector('[data-testid="modal-title"]', { timeout: 3000, }); modalCount = await page.getByTestId("modal-title")?.count(); } const getUA = await page.evaluate(() => navigator.userAgent); const userAgentInfo = uaParser(getUA); 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("ollama"); await page.waitForSelector('[data-testid="modelsOllama"]', { timeout: 3000, }); await page .getByTestId("modelsOllama") .dragTo(page.locator('//*[@id="react-flow-id"]')); await page.mouse.up(); await page.mouse.down(); await page.getByTestId("fit_view").click(); await page.getByTestId("zoom_out").click(); await page.getByTestId("zoom_out").click(); await page.getByTestId("title-Ollama").click(); await page.getByTestId("code-button-modal").click(); let cleanCode = await extractAndCleanCode(page); // Replace the import statement cleanCode = cleanCode.replace("FloatInput(", "SliderInput("); cleanCode = cleanCode.replace( "from langflow.io import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, StrInput", "from langflow.io import BoolInput, DictInput, DropdownInput, FloatInput, IntInput, StrInput, SliderInput", ); cleanCode = cleanCode.replace( "value=0.2,", "value=0.2, range_spec=RangeSpec(min=3, max=30, step=1), min_label='test', max_label='test2', min_label_icon='pencil-ruler', max_label_icon='palette', slider_buttons=False, slider_buttons_options=[], slider_input=False,", ); await page.locator("textarea").last().press(`ControlOrMeta+a`); await page.keyboard.press("Backspace"); await page.locator("textarea").last().fill(cleanCode); await page.locator('//*[@id="checkAndSaveBtn"]').click(); await page.getByTestId("fit_view").click(); await mutualValidation(page); await moveSlider(page, "right", false); // wait for the slider to update await page.waitForTimeout(500); await page.getByTestId("zoom_out").click(); await page.getByTestId("more-options-modal").click(); await page.getByText("Controls", { exact: true }).last().click(); await expect( page.getByTestId("default_slider_display_value_advanced"), ).toHaveText("19.00"); await moveSlider(page, "left", true); // Wait for any potential updates await page.waitForTimeout(500); await expect( page.getByTestId("default_slider_display_value_advanced"), ).toHaveText("14.00"); await page.getByText("Close").last().click(); await expect(page.getByTestId("default_slider_display_value")).toHaveText( "14.00", ); }, ); async function extractAndCleanCode(page: Page): Promise { const outerHTML = await page .locator('//*[@id="codeValue"]') .evaluate((el) => el.outerHTML); const valueMatch = outerHTML.match(/value="([\s\S]*?)"/); if (!valueMatch) { throw new Error("Could not find value attribute in the HTML"); } let codeContent = valueMatch[1] .replace(/"/g, '"') .replace(/&/g, "&") .replace(/</g, "<") .replace(/>/g, ">") .replace(/'/g, "'") .replace(///g, "/"); return codeContent; } async function mutualValidation(page: Page) { await expect(page.getByTestId("default_slider_display_value")).toHaveText( "3.00", ); await expect(page.getByTestId("min_label")).toHaveText("test"); await expect(page.getByTestId("max_label")).toHaveText("test2"); await expect(page.getByTestId("icon-pencil-ruler")).toBeVisible(); await expect(page.getByTestId("icon-palette")).toBeVisible(); } async function moveSlider( page: Page, side: "left" | "right", advanced: boolean = false, ) { const thumbSelector = `slider_thumb${advanced ? "_advanced" : ""}`; const trackSelector = `slider_track${advanced ? "_advanced" : ""}`; await page.getByTestId(thumbSelector).click(); const trackBoundingBox = await page.getByTestId(trackSelector).boundingBox(); if (trackBoundingBox) { const moveDistance = trackBoundingBox.width * 0.1 * (side === "left" ? -1 : 1); const centerX = trackBoundingBox.x + trackBoundingBox.width / 2; const centerY = trackBoundingBox.y + trackBoundingBox.height / 2; await page.mouse.move(centerX + moveDistance, centerY); await page.mouse.down(); await page.mouse.up(); } }