From fcafd995efb1e974f2d06c5e08b09fcaee0f8441 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Wed, 18 Oct 2023 15:42:39 -0300 Subject: [PATCH] moved group tests to only front --- src/frontend/tests/onlyFront/assets/flow.json | 403 ++++++++++++++++-- src/frontend/tests/onlyFront/group.spec.ts | 170 ++++++++ 2 files changed, 533 insertions(+), 40 deletions(-) create mode 100644 src/frontend/tests/onlyFront/group.spec.ts diff --git a/src/frontend/tests/onlyFront/assets/flow.json b/src/frontend/tests/onlyFront/assets/flow.json index f214a9f74..efc60fb75 100644 --- a/src/frontend/tests/onlyFront/assets/flow.json +++ b/src/frontend/tests/onlyFront/assets/flow.json @@ -1,56 +1,252 @@ { - "description": "Engineered for Excellence, Built for Business.", - "name": "Fluffy Sinoussi", + "description": "Use this Tool on every query", + "name": "Getting Started: Simple python function applied to each output", "data": { "nodes": [ { - "id": "AgentInitializer-Zza0A", + "width": 384, + "height": 631, + "id": "ChatOpenAI-tRw3A", "type": "genericNode", - "position": { "x": 595, "y": 224.25 }, + "position": { + "x": 543.1816229116944, + "y": 942.891611351432 + }, "data": { - "type": "AgentInitializer", + "type": "ChatOpenAI", "node": { "template": { - "llm": { - "required": true, + "lc_kwargs": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "lc_kwargs", + "advanced": true, + "type": "code", + "list": false + }, + "verbose": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "value": false, + "password": false, + "name": "verbose", + "advanced": false, + "type": "bool", + "list": false + }, + "callbacks": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "callbacks", + "advanced": false, + "type": "langchain.callbacks.base.BaseCallbackHandler", + "list": true + }, + "client": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "client", + "advanced": false, + "type": "Any", + "list": false + }, + "model_name": { + "required": false, "placeholder": "", "show": true, "multiline": false, + "value": "gpt-3.5-turbo", "password": false, - "name": "llm", - "display_name": "LLM", + "options": [ + "gpt-3.5-turbo-0613", + "gpt-3.5-turbo", + "gpt-3.5-turbo-16k-0613", + "gpt-3.5-turbo-16k", + "gpt-4-0613", + "gpt-4-32k-0613", + "gpt-4", + "gpt-4-32k" + ], + "name": "model_name", "advanced": false, - "dynamic": false, - "info": "", - "type": "BaseLanguageModel", + "type": "str", + "list": true + }, + "temperature": { + "required": false, + "placeholder": "", + "show": true, + "multiline": false, + "value": "0.2", + "password": false, + "name": "temperature", + "advanced": false, + "type": "float", "list": false }, - "memory": { + "model_kwargs": { "required": false, "placeholder": "", "show": true, "multiline": false, "password": false, - "name": "memory", - "advanced": false, - "dynamic": false, - "info": "", - "type": "BaseChatMemory", + "name": "model_kwargs", + "advanced": true, + "type": "code", "list": false }, - "tools": { - "required": true, + "openai_api_key": { + "required": false, + "placeholder": "", + "show": true, + "multiline": false, + "value": "", + "password": true, + "name": "openai_api_key", + "display_name": "OpenAI API Key", + "advanced": false, + "type": "str", + "list": false + }, + "openai_api_base": { + "required": false, "placeholder": "", "show": true, "multiline": false, "password": false, - "name": "tools", + "name": "openai_api_base", + "display_name": "OpenAI API Base", "advanced": false, - "dynamic": false, - "info": "", - "type": "Tool", - "list": true + "type": "str", + "list": false }, + "openai_organization": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "openai_organization", + "display_name": "OpenAI Organization", + "advanced": false, + "type": "str", + "list": false + }, + "openai_proxy": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "openai_proxy", + "display_name": "OpenAI Proxy", + "advanced": false, + "type": "str", + "list": false + }, + "request_timeout": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "password": false, + "name": "request_timeout", + "advanced": false, + "type": "float", + "list": false + }, + "max_retries": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "value": 6, + "password": false, + "name": "max_retries", + "advanced": false, + "type": "int", + "list": false + }, + "streaming": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "value": false, + "password": false, + "name": "streaming", + "advanced": false, + "type": "bool", + "list": false + }, + "n": { + "required": false, + "placeholder": "", + "show": false, + "multiline": false, + "value": 1, + "password": false, + "name": "n", + "advanced": false, + "type": "int", + "list": false + }, + "max_tokens": { + "required": false, + "placeholder": "", + "show": true, + "multiline": false, + "password": true, + "name": "max_tokens", + "advanced": false, + "type": "int", + "list": false + }, + "_type": "ChatOpenAI" + }, + "description": "Wrapper around OpenAI Chat large language models.", + "base_classes": [ + "Serializable", + "BaseChatModel", + "ChatOpenAI", + "BaseLanguageModel" + ], + "display_name": "ChatOpenAI" + }, + "id": "ChatOpenAI-tRw3A", + "value": null + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 543.1816229116944, + "y": 942.891611351432 + } + }, + { + "width": 384, + "height": 387, + "id": "AgentInitializer-KcVTt", + "type": "genericNode", + "position": { + "x": 1036.6064439140812, + "y": 645.1919693466587 + }, + "data": { + "type": "AgentInitializer", + "node": { + "template": { "agent": { "required": true, "placeholder": "", @@ -63,34 +259,161 @@ "react-docstore", "self-ask-with-search", "conversational-react-description", - "openai-functions", - "openai-multi-functions" + "openai-functions" ], "name": "agent", "advanced": false, - "dynamic": false, - "info": "", "type": "str", "list": true }, + "memory": { + "required": false, + "placeholder": "", + "show": true, + "multiline": false, + "password": false, + "name": "memory", + "advanced": false, + "type": "BaseChatMemory", + "list": false + }, + "tools": { + "required": false, + "placeholder": "", + "show": true, + "multiline": false, + "password": false, + "name": "tools", + "advanced": false, + "type": "Tool", + "list": true + }, + "llm": { + "required": true, + "placeholder": "", + "show": true, + "multiline": false, + "password": false, + "name": "llm", + "display_name": "LLM", + "advanced": false, + "type": "BaseLanguageModel", + "list": false + }, "_type": "initialize_agent" }, "description": "Construct a zero shot agent from an LLM and tools.", "base_classes": ["AgentExecutor", "function"], - "display_name": "AgentInitializer", - "custom_fields": {}, - "output_types": [], - "documentation": "https://python.langchain.com/docs/modules/agents/agent_types/", - "beta": false, - "error": null + "display_name": "AgentInitializer" }, - "id": "AgentInitializer-Zza0A" + "id": "AgentInitializer-KcVTt", + "value": null }, - "positionAbsolute": { "x": 595, "y": 224.25 } + "selected": false, + "positionAbsolute": { + "x": 1036.6064439140812, + "y": 645.1919693466587 + } + }, + { + "width": 384, + "height": 437, + "id": "PythonFunctionTool-FwZVF", + "type": "genericNode", + "position": { + "x": 553.050119331742, + "y": 412.9533535948685 + }, + "data": { + "type": "PythonFunctionTool", + "node": { + "template": { + "name": { + "required": true, + "placeholder": "", + "show": true, + "multiline": false, + "value": "PythonFunction", + "password": false, + "name": "name", + "advanced": false, + "type": "str", + "list": false + }, + "description": { + "required": true, + "placeholder": "", + "show": true, + "multiline": true, + "value": "Returns the Text you send. This is a testing tool.", + "password": false, + "name": "description", + "advanced": false, + "type": "str", + "list": false + }, + "code": { + "required": true, + "placeholder": "", + "show": true, + "multiline": true, + "value": "\ndef python_function(text: str) -> str:\n \"\"\"This is a default python function that returns the input text\"\"\"\n return text\n", + "password": false, + "name": "code", + "advanced": false, + "type": "code", + "list": false + }, + "_type": "PythonFunctionTool" + }, + "description": "Python function to be executed.", + "base_classes": ["Tool"], + "display_name": "PythonFunctionTool" + }, + "id": "PythonFunctionTool-FwZVF", + "value": null + }, + "selected": false, + "dragging": false, + "positionAbsolute": { + "x": 553.050119331742, + "y": 412.9533535948685 + } } ], - "edges": [], - "viewport": { "x": 0, "y": 0, "zoom": 1 } + "edges": [ + { + "source": "ChatOpenAI-tRw3A", + "sourceHandle": "ChatOpenAI|ChatOpenAI-tRw3A|Serializable|BaseChatModel|ChatOpenAI|BaseLanguageModel", + "target": "AgentInitializer-KcVTt", + "targetHandle": "BaseLanguageModel|llm|AgentInitializer-KcVTt", + "style": { + "stroke": "inherit" + }, + "className": "stroke-gray-900 dark:stroke-gray-200", + "animated": false, + "id": "reactflow__edge-ChatOpenAI-tRw3AChatOpenAI|ChatOpenAI-tRw3A|Serializable|BaseChatModel|ChatOpenAI|BaseLanguageModel-AgentInitializer-KcVTtBaseLanguageModel|llm|AgentInitializer-KcVTt", + "selected": false + }, + { + "source": "PythonFunctionTool-FwZVF", + "sourceHandle": "PythonFunctionTool|PythonFunctionTool-FwZVF|Tool", + "target": "AgentInitializer-KcVTt", + "targetHandle": "Tool|tools|AgentInitializer-KcVTt", + "style": { + "stroke": "inherit" + }, + "className": "stroke-gray-900 dark:stroke-gray-200", + "animated": false, + "id": "reactflow__edge-PythonFunctionTool-FwZVFPythonFunctionTool|PythonFunctionTool-FwZVF|Tool-AgentInitializer-KcVTtTool|tools|AgentInitializer-KcVTt", + "selected": false + } + ], + "viewport": { + "x": 4.748095479939138, + "y": -155.65184647754464, + "zoom": 0.6079953565987085 + } }, - "id": "84c4b46f-063b-4d48-bf7f-6c668013064f" + "id": "15030b3c-570d-4658-8473-58138077e9b0" } diff --git a/src/frontend/tests/onlyFront/group.spec.ts b/src/frontend/tests/onlyFront/group.spec.ts new file mode 100644 index 000000000..ef102192a --- /dev/null +++ b/src/frontend/tests/onlyFront/group.spec.ts @@ -0,0 +1,170 @@ +import { expect, test } from "@playwright/test"; +import { readFileSync } from "fs"; + +test.describe("drag and drop test", () => { + /// + test("drop collection", async ({ page }) => { + await page.routeFromHAR("harFiles/langflow.har", { + url: "**/api/v1/**", + update: false, + }); + await page.route("**/api/v1/flows/", async (route) => { + const json = { + id: "e9ac1bdc-429b-475d-ac03-d26f9a2a3210", + }; + await route.fulfill({ json, status: 201 }); + }); + await page.goto("http:localhost:3000/"); + await page.locator("span").filter({ hasText: "My Collection" }).isVisible(); + // Read your file into a buffer. + const jsonContent = readFileSync( + "tests/onlyFront/assets/collection.json", + "utf-8" + ); + + // Create the DataTransfer and File + const dataTransfer = await page.evaluateHandle((data) => { + const dt = new DataTransfer(); + // Convert the buffer to a hex array + const file = new File([data], "collection.json", { + type: "application/json", + }); + dt.items.add(file); + return dt; + }, jsonContent); + + // Now dispatch + await page.dispatchEvent('//*[@id="root"]/div/div[2]/div[2]', "drop", { + dataTransfer, + }); + expect( + await page + .locator(".main-page-flows-display") + .evaluate((el) => el.children) + ).toBeTruthy(); + }); + + test("drop flow", async ({ page }) => { + await page.routeFromHAR("harFiles/langflow.har", { + url: "**/api/v1/**", + update: false, + }); + await page.route("**/api/v1/flows/", async (route) => { + const json = { + id: "e9ac1bdc-429b-475d-ac03-d26f9a2a3210", + }; + await route.fulfill({ json, status: 201 }); + }); + await page.goto("http:localhost:3000/"); + await page.locator("span").filter({ hasText: "My Collection" }).isVisible(); + // Read your file into a buffer. + const jsonContent = readFileSync( + "tests/onlyFront/assets/flow.json", + "utf-8" + ); + + // Create the DataTransfer and File + const dataTransfer = await page.evaluateHandle((data) => { + const dt = new DataTransfer(); + // Convert the buffer to a hex array + const file = new File([data], "flow.json", { + type: "application/json", + }); + dt.items.add(file); + return dt; + }, jsonContent); + + // Now dispatch + await page.dispatchEvent('//*[@id="root"]/div/div[2]/div[2]', "drop", { + dataTransfer, + }); + expect( + await page + .locator(".main-page-flows-display") + .evaluate((el) => el.children) + ).toBeTruthy(); + await page.getByRole("button", { name: "Edit Flow" }).click(); + //inside the flow + await page + .locator( + "//html/body/div/div/div[2]/div/main/div/div/div/div[1]/div[1]/div[1]/div/div[2]/div[1]/div/div[1]/div" + ) + .click({ + modifiers: ["Control"], + }); + await page + .locator( + "//html/body/div/div/div[2]/div/main/div/div/div/div[1]/div[1]/div[1]/div/div[2]/div[2]/div/div[1]/div" + ) + .click({ + modifiers: ["Control"], + }); + await page + .locator( + "//html/body/div/div/div[2]/div/main/div/div/div/div[1]/div[1]/div[1]/div/div[2]/div[3]/div/div[1]/div" + ) + .click({ + modifiers: ["Control"], + }); + await page.getByRole("button", { name: "Group" }).click(); + expect( + await page + .locator( + "//html/body/div/div/div[2]/div/main/div/div/div/div[1]/div[1]/div[1]/div/div[2]/div/div" + ) + .isVisible() + ).toBeTruthy(); + await page.getByPlaceholder("Type something...").first().click(); + await page.getByPlaceholder("Type something...").first().fill("test"); + await page.locator(".side-bar-buttons-arrangement").click(); + expect( + await page + .locator( + "//html/body/div/div/div[2]/div/main/div/div/div/div[1]/div[1]/div/div/div[2]/div/div/div[1]/div/div[1]/div/div" + ) + .textContent() + ).toBe("test"); + await page + .locator( + "//html/body/div/div/div[2]/div/main/div/div/div/div[1]/div[1]/div[1]/div/div[2]/div/div" + ) + .locator('input[type="text"]') + .click(); + await page + .locator( + "//html/body/div/div/div[2]/div/main/div/div/div/div[1]/div[1]/div[1]/div/div[2]/div/div" + ) + .locator('input[type="text"]') + .fill("fieldValue"); + await page.locator(".side-bar-buttons-arrangement").click(); + await page + .locator( + "//html/body/div/div/div[2]/div/main/div/div/div/div[1]/div[1]/div[1]/div/div[2]/div/div/div[1]/div" + ) + .click(); + + await page + .locator( + "//html/body/div/div/div[2]/div/main/div/div/div/div[1]/div[1]/div[2]/div/span/button[3]/div/div" + ) + .click(); + await page.getByLabel("Edit").click(); + await page + .getByRole("button", { name: "zero-shot-react-description" }) + .click(); + await page.getByText("openai-functions").click(); + await page.getByRole("button", { name: "Save Changes" }).click(); + await page + .locator( + "//html/body/div/div/div[2]/div/main/div/div/div/div[1]/div[1]/div[2]/div/span/button[3]/div/div" + ) + .click(); + await page.getByLabel("Ungroup").click(); + await expect(page.locator("#input-0")).toHaveValue("fieldValue"); + expect( + await page + .locator('//*[@id="headlessui-listbox-button-:r4a:"]/span[1]') + .textContent() + ).toBe("openai-functions"); + }); +});