From 989cefd0ac501706915d0b8c7fadfbeebbe8fba6 Mon Sep 17 00:00:00 2001 From: Cristhian Zanforlin Lousa Date: Mon, 25 Nov 2024 17:55:03 -0300 Subject: [PATCH] tests: organize playwright tests by feature suites and optimize CI runtime (#4687) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * starting realocating components FE * tagging tests * 📝 (.github/workflows/typescript_test.yml): remove unnecessary comment before the Playwright test execution step to improve readability and maintainability * 📝 (.github/changes-filter.yaml): Update paths in changes-filter.yaml to categorize different sections of the project for testing purposes 🔧 (.github/workflows/typescript_test.yml): Refactor workflow to use paths-filter action for determining test suites based on changes in different project sections * ✨ (changes-filter.yaml): reorganize and update paths for test categories, starter projects, components, workspace, api, and database ✨ (components): add new components for GradientWrapper, pageLayout, and paginatorComponent 🔧 (MainPage): update import path for PageLayout component 🔧 (SettingsPage): update import path for PageLayout component 🔧 (StorePage): update import path for PageLayout component * ✨ (frontend): Update import paths for components to use common directory instead of core directory for better organization and consistency 🔧 (frontend): Remove duplicate import of PaginatorComponent in various files and import it from the common directory to reduce redundancy and improve maintainability * 🔧 (changes-filter.yaml): remove unnecessary release section from changes-filter.yaml 🔧 (typescript_test.yml): refactor workflow to support input suites and release flag for test runs * 📝 (changes-filter.yaml): remove unnecessary entries from components section and add missing entries to workspace section for better organization and filtering of changes 🔧 (changes-filter.yaml): update changes-filter.yaml to include missing utils files in the frontend/src/utils directory 🔧 (typescript_test.yml): remove redundant code block that sets SUITES variable to default values as it is no longer needed due to changes in the changes-filter.yaml file * ✨ (actionsMainPage-shard-1.spec.ts): Update test tags to remove unnecessary tags for better organization and clarity 📝 (store-shard-2.spec.ts): Update test tags to remove unnecessary tags for better organization and clarity 📝 (generalBugs-shard-4.spec.ts): Update test tags to remove unnecessary tags for better organization and clarity 📝 (generalBugs-shard-9.spec.ts): Update test tags to remove unnecessary tags for better organization and clarity 📝 (deleteComponents.spec.ts): Update test tags to remove unnecessary tags for better organization and clarity 📝 (deleteFlows.spec.ts): Update test tags to remove unnecessary tags for better organization and clarity ✨ (dragAndDrop.spec.ts): Refactor drag and drop test to improve readability and maintainability ✨ (flowPage.spec.ts): Refactor save test in Flow Page to improve readability and maintainability ✨ (store-shard-0.spec.ts): Refactor Store test to improve readability and maintainability ✨ (store-shard-1.spec.ts): Refactor Store test to improve readability and maintainability ✨ (store-shard-3.spec.ts): Remove unnecessary tags from test descriptions to improve clarity and consistency ✨ (userSettings.spec.ts): Remove unnecessary tags from test descriptions to improve clarity and consistency ✨ (general-bugs-shard-3909.spec.ts): Remove unnecessary tags from test descriptions to improve clarity and consistency 📝 (frontend): Update test tags in regression tests to remove unnecessary tags for better organization and clarity 📝 (frontend): Update test file paths in tsconfig.json to match the new file structure for consistency and maintainability * [autofix.ci] apply automated fixes * [autofix.ci] apply automated fixes * Update paths-filter action to v3 and adjust filter configuration file * Add logging to matrix setup in TypeScript test workflow * Refactor decisionFlow.spec.ts to improve test setup and execution flow * Refactor import paths for genericIconComponent and shadTooltipComponent in PlaygroundButton component * feat: add release input to CI workflows for enhanced deployment control * Fix: Correct 'release' input type in CI workflow configuration * [autofix.ci] apply automated fixes * Refactor Blog Writer test: streamline setup and interaction steps * Refactor test cases to improve modal handling and streamline API key input logic * Add test grep pattern to GitHub Actions workflow for targeted test execution - Introduced `test_grep` output in the `determine-test-suite` job to generate a grep pattern based on changed files or input suites. - Updated Playwright test execution to use the generated grep pattern, allowing for more targeted test runs. - Enhanced the `Set Matrix` step to include tag processing for test filtering. * Enhance tag filtering in test workflow with regex lookaheads * Fix syntax for default suite input in GitHub Actions workflow * Update GitHub Actions to handle empty suite input for release builds * Escape regex lookaheads and quotes for GitHub Actions in test workflow * Update regex pattern and quote escaping in TypeScript test workflow * Use single quotes for echo command in GitHub Actions script * Refactor tag handling in GitHub Actions to use OR logic for grep patterns * 🔧 (FlowPage/index.tsx): Remove unnecessary empty line to improve code readability and consistency * 📝 (FlowPage/index.tsx): add missing line break for better code readability * Refactor import path and reorder CSS classes for consistency in UpdateAllComponents component * [autofix.ci] apply automated fixes * Update import path for PaginatorComponent in AdminPage index.tsx * ✨ (logs.spec.ts): introduce a new variable 'modalCount' to keep track of the number of modals opened in the test suite * 📝 (filterSidebar.spec.ts): remove unnecessary test steps related to filter removal and sidebar interactions to simplify and improve test focus on main functionality * ✅ (logs.spec.ts): add tests to ensure proper interaction with logs feature in the frontend application * ✅ (similarity.spec.ts): add a test tag for release and components to categorize the test case 💡 (similarity.spec.ts): add a comment to explain the purpose of the test case and the condition for skipping the test * ✅ (decisionFlow.spec.ts): add missing newline before async function declaration to improve code readability * ✅ (textInputOutput.spec.ts): skip the test for TextInputOutputComponent to exclude it from the test suite temporarily --------- Co-authored-by: Gabriel Luiz Freitas Almeida Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- .github/changes-filter.yaml | 36 + .github/workflows/ci.yml | 7 + .github/workflows/release.yml | 1 + .github/workflows/typescript_test.yml | 130 +++- .../HandleTooltipComponent/index.tsx | 2 +- .../components/NodeInputField/index.tsx | 4 +- .../components/NodeOutputfield/index.tsx | 4 +- .../components/NodeStatus/index.tsx | 4 +- .../components/OutputComponent/index.tsx | 2 +- .../handleRenderComponent/index.tsx | 2 +- .../GenericNode/components/nodeIcon/index.tsx | 2 +- .../components/switchOutputView/index.tsx | 4 +- .../src/CustomNodes/GenericNode/index.tsx | 4 +- .../NoteNode/NoteToolbarComponent/index.tsx | 4 +- .../CustomNodes/hooks/use-icons-status.tsx | 2 +- .../components/singleAlertComponent/index.tsx | 2 +- .../src/alerts/alertDropDown/index.tsx | 2 +- src/frontend/src/alerts/error/index.tsx | 2 +- src/frontend/src/alerts/notice/index.tsx | 2 +- src/frontend/src/alerts/success/index.tsx | 2 +- .../authAdminGuard/index.tsx | 2 +- .../{ => authorization}/authGuard/index.tsx | 0 .../authLoginGuard/index.tsx | 0 .../authSettingsGuard/index.tsx | 0 .../{ => authorization}/storeGuard/index.tsx | 2 +- .../{ => common}/GradientWrapper/index.tsx | 0 .../{ => common}/ImageViewer/index.tsx | 9 +- .../folderAccordionComponent/index.tsx | 2 +- .../{ => common}/accordionComponent/index.tsx | 8 +- .../{ => common}/animatedNumbers/index.tsx | 0 .../arrayReaderComponent/index.tsx | 0 .../{ => common}/catchAllRoutes/index.tsx | 0 .../crashErrorComponent/index.tsx | 6 +- .../fetchErrorComponent/index.tsx | 4 +- .../genericIconComponent/index.tsx | 8 +- .../horizontalScrollFadeComponent/index.tsx | 0 .../{ => common}/loadingComponent/index.tsx | 2 +- .../{ => common}/numberReader/index.tsx | 0 .../{ => common}/objectRender/index.tsx | 2 +- .../{ => common}/pageLayout/index.tsx | 4 +- .../{ => common}/paginatorComponent/index.tsx | 8 +- .../components/renderKey/index.tsx | 2 +- .../renderIconComponent/index.tsx | 0 .../sanitizedHTMLWrapper/index.tsx | 2 +- .../shadTooltipComponent/index.tsx | 6 +- .../skeletonCardComponent/index.tsx | 2 +- .../hooks/use-data-effect.tsx | 2 +- .../hooks/use-handle-install.tsx | 6 +- .../{ => common}/storeCardComponent/index.tsx | 30 +- .../utils/convert-test-name.tsx | 0 .../stringReaderComponent/index.tsx | 2 +- .../tagsSelectorComponent/index.tsx | 4 +- .../timeoutErrorComponent/index.tsx | 6 +- .../{ => common}/viewTriggers/chat/index.tsx | 0 .../GlobalVariableModal.tsx | 21 +- .../utils/sort-by-name.tsx | 0 .../components/AccountMenu/index.tsx | 2 +- .../components/FlowMenu/index.tsx | 4 +- .../components/GithubStarButton/index.tsx | 2 +- .../components/HeaderMenu/index.tsx | 2 +- .../components/ProfileIcon/index.tsx | 0 .../components/ThemeButtons/index.tsx | 2 +- .../{ => core}/appHeaderComponent/index.tsx | 8 +- .../canvasControlsComponent/index.tsx | 4 +- .../components/dragCardComponent/index.tsx | 8 +- .../hooks/use-handle-install.tsx | 6 +- .../cardComponent/hooks/use-on-drag-start.tsx | 4 +- .../{ => core}/cardComponent/index.tsx | 24 +- .../utils/convert-test-name.tsx | 0 .../{ => core}/cardsWrapComponent/index.tsx | 4 +- .../chatComponents/ContentBlockDisplay.tsx | 4 +- .../chatComponents/ContentDisplay.tsx | 2 +- .../chatComponents/DurationDisplay.tsx | 6 +- .../ChatCodeTabComponent.tsx | 6 +- .../components/tweakComponent/index.tsx | 4 +- .../components/tweaksComponent/index.tsx | 0 .../{ => core}/codeTabsComponent/index.tsx | 21 +- .../helpers/convert-data-function.ts | 0 .../{ => core}/csvOutputComponent/index.tsx | 14 +- .../{ => core}/dataOutputComponent/index.tsx | 4 +- .../{ => core}/dateReaderComponent/index.tsx | 0 .../dropdownButtonComponent/index.tsx | 8 +- .../{ => core}/dropdownComponent/index.tsx | 14 +- .../editFlowSettingsComponent/index.tsx | 10 +- .../{ => core}/flowToolbarComponent/index.tsx | 19 +- .../components/sideBarFolderButtons/index.tsx | 20 +- .../sidebarFolderSkeleton/index.tsx | 0 .../hooks/use-on-file-drop.tsx | 10 +- .../folderSidebarComponent/index.tsx | 2 +- .../components/TableNodeComponent/index.tsx | 4 +- .../components/codeAreaComponent/index.tsx | 6 +- .../components/dictComponent/index.tsx | 8 +- .../components/dropdownComponent/index.tsx | 0 .../emptyParameterComponent/index.tsx | 0 .../components/floatComponent/index.tsx | 2 +- .../components/helpers/get-icon-name.ts | 0 .../helpers/get-input-class-name.ts | 0 .../components/popover/index.tsx | 2 +- .../components/popoverObject/index.tsx | 12 +- .../components}/inputComponent/index.tsx | 10 +- .../components/inputFileComponent/index.tsx | 10 +- .../components/inputGlobalComponent/index.tsx | 12 +- .../components/inputListComponent/index.tsx | 8 +- .../components/intComponent/index.tsx | 2 +- .../components/keypairListComponent/index.tsx | 2 +- .../components/linkComponent/index.tsx | 6 +- .../components/multiselectComponent/index.tsx | 12 +- .../components/promptComponent/index.tsx | 6 +- .../refreshParameterComponent/index.tsx | 0 .../components}/sliderComponent/index.tsx | 8 +- .../utils/get-min-max-value.ts | 0 .../components/strRenderComponent/index.tsx | 0 .../components/ResetColumns/index.tsx | 0 .../components/TableOptions/index.tsx | 8 +- .../components/loadingOverlay/index.tsx | 0 .../tableAdvancedToggleCellRender/index.tsx | 4 +- .../components/tableAutoCellRender/index.tsx | 12 +- .../components/tableNodeCellRender/index.tsx | 6 +- .../components/tableTooltipRender/index.tsx | 0 .../components}/tableComponent/index.tsx | 22 +- .../utils/reset-grid-columns.tsx | 0 .../components/textAreaComponent/index.tsx | 8 +- .../components}/textInputComponent/index.tsx | 0 .../components/toggleShadComponent/index.tsx | 2 +- .../helpers/get-placeholder-disabled.ts | 0 .../helpers/get-textarea-content-class.ts | 0 .../parameterRenderComponent/index.tsx | 6 +- .../parameterRenderComponent/types.ts | 0 .../{ => core}/pdfViewer/Error/index.tsx | 7 +- .../components/{ => core}/pdfViewer/index.tsx | 4 +- .../{ => core}/pdfViewer/noData/index.tsx | 2 +- .../{ => core}/sidebarComponent/index.tsx | 2 +- .../{ => core}/textOutputComponent/index.tsx | 0 .../components/playground-button.tsx | 4 +- src/frontend/src/components/ui/accordion.tsx | 2 +- src/frontend/src/components/ui/button.tsx | 2 +- src/frontend/src/components/ui/checkbox.tsx | 2 +- src/frontend/src/components/ui/dialog.tsx | 2 +- .../src/components/ui/dropdown-menu.tsx | 2 +- src/frontend/src/components/ui/input.tsx | 2 +- src/frontend/src/components/ui/menubar.tsx | 2 +- .../src/components/ui/refreshButton.tsx | 2 +- src/frontend/src/components/ui/sidebar.tsx | 2 +- src/frontend/src/contexts/index.tsx | 2 +- .../components/custom-parameter.tsx | 2 +- .../src/icons/GradientSparkles/index.tsx | 2 +- .../components/FileInput/index.tsx | 2 +- .../components/keyPairInput/index.tsx | 2 +- .../components/sessionSelector/index.tsx | 4 +- .../sessionSelector/newSessionSelector.tsx | 4 +- .../IOModal/components/IOFieldView/index.tsx | 10 +- .../IOModal/components/SessionView/index.tsx | 2 +- .../components/buttonSendWrapper/index.tsx | 2 +- .../components/uploadFileButton/index.tsx | 2 +- .../uploadFileButton/newUploadFileButton.tsx | 4 +- .../components/editMessageButton/index.tsx | 2 +- .../editMessageButton/newMessageOptions.tsx | 4 +- .../components/fileCardWrapper/index.tsx | 2 +- .../components/chatView/chatMessage/index.tsx | 8 +- .../chatView/chatMessage/newChatMessage.tsx | 10 +- .../downloadButton/downloadButton.tsx | 2 +- .../chatView/fileComponent/index.tsx | 2 +- .../chatView/filePreviewChat/index.tsx | 2 +- .../filePreviewChat/newFilePreview.tsx | 2 +- .../IOModal/components/chatView/index.tsx | 2 +- src/frontend/src/modals/IOModal/index.tsx | 4 +- src/frontend/src/modals/IOModal/newModal.tsx | 4 +- src/frontend/src/modals/apiModal/index.tsx | 4 +- .../src/modals/codeAreaModal/index.tsx | 2 +- .../src/modals/confirmationModal/index.tsx | 4 +- .../src/modals/dictAreaModal/index.tsx | 2 +- .../components/editNodeComponent/index.tsx | 2 +- .../editNodeModal/hooks/use-column-defs.tsx | 4 +- src/frontend/src/modals/exportModal/index.tsx | 4 +- .../src/modals/flowLogsModal/index.tsx | 8 +- .../src/modals/flowSettingsModal/index.tsx | 4 +- src/frontend/src/modals/promptModal/index.tsx | 6 +- .../src/modals/saveChangesModal/index.tsx | 2 +- .../src/modals/secretKeyModal/index.tsx | 2 +- src/frontend/src/modals/shareModal/index.tsx | 6 +- src/frontend/src/modals/tableModal/index.tsx | 4 +- .../TemplateCardComponent/index.tsx | 4 +- .../TemplateContentComponent/index.tsx | 2 +- .../TemplateGetStartedCardComponent/index.tsx | 2 +- .../components/navComponent/index.tsx | 4 +- .../src/modals/templatesModal/index.tsx | 2 +- .../src/modals/textAreaModal/index.tsx | 2 +- src/frontend/src/modals/textModal/index.tsx | 2 +- src/frontend/src/pages/AdminPage/index.tsx | 8 +- .../GenericErrorComponent/index.tsx | 4 +- .../src/pages/AppWrapperPage/index.tsx | 2 +- .../src/pages/DashboardWrapperPage/index.tsx | 2 +- .../components/DisclosureComponent/index.tsx | 2 +- .../components/PageComponent/index.tsx | 9 +- .../ParentDisclosureComponent/index.tsx | 2 +- .../SelectionMenuComponent/index.tsx | 2 +- .../components/UpdateAllComponents/index.tsx | 2 +- .../SidebarCategoryComponent/index.tsx | 2 +- .../extraSidebarComponent/index.tsx | 2 +- .../sideBarDraggableComponent/index.tsx | 2 +- .../sideBarNoteComponent/index.tsx | 2 +- .../sidebarFilterComponent/index.tsx | 4 +- .../sidebarDraggableComponent/index.tsx | 4 +- .../components/sidebarFooterButtons/index.tsx | 2 +- .../components/sidebarItemsList/index.tsx | 2 +- .../components/flowSidebarComponent/index.tsx | 4 +- .../components/nodeToolbarComponent/index.tsx | 6 +- .../shortcutDisplay/index.tsx | 2 +- .../toolbarSelectItem/index.tsx | 4 +- src/frontend/src/pages/LoadingPage/index.tsx | 2 +- src/frontend/src/pages/LoginPage/index.tsx | 2 +- .../MainPage/components/dropdown/index.tsx | 2 +- .../pages/MainPage/components/grid/index.tsx | 4 +- .../MainPage/components/header/index.tsx | 4 +- .../pages/MainPage/components/list/index.tsx | 4 +- .../components/collectionCard/index.tsx | 2 +- .../componentsComponent/index.tsx | 6 +- .../oldComponents/headerComponent/index.tsx | 4 +- .../components/inputSearchComponent/index.tsx | 2 +- .../MainPage/oldPages/mainPage/index.tsx | 6 +- .../MainPage/pages/emptyFolder/index.tsx | 2 +- .../pages/MainPage/pages/emptyPage/index.tsx | 2 +- .../pages/MainPage/pages/homePage/index.tsx | 4 +- .../src/pages/MainPage/pages/index.tsx | 6 +- .../src/pages/ProfileSettingsPage/index.tsx | 2 +- src/frontend/src/pages/SettingsPage/index.tsx | 6 +- .../components/ApiKeyHeader/index.tsx | 2 +- .../pages/ApiKeysPage/helpers/column-defs.ts | 2 +- .../SettingsPage/pages/ApiKeysPage/index.tsx | 2 +- .../components/GeneralPageHeader/index.tsx | 2 +- .../components/PasswordForm/index.tsx | 2 +- .../components/StoreApiKeyForm/index.tsx | 2 +- .../pages/GlobalVariablesPage/index.tsx | 11 +- .../ShortcutsPage/CellRenderWrapper/index.tsx | 2 +- .../EditShortcutButton/index.tsx | 4 +- .../pages/ShortcutsPage/index.tsx | 4 +- .../components/headerMessages/index.tsx | 2 +- src/frontend/src/pages/StorePage/index.tsx | 14 +- src/frontend/src/routes.tsx | 10 +- src/frontend/src/utils/utils.ts | 2 +- .../features/actionsMainPage-shard-1.spec.ts | 104 +-- .../core/features/auto-login-off.spec.ts | 432 +++++------ .../chatInputOutputUser-shard-0.spec.ts | 228 +++--- .../core/features/componentHoverAdd.spec.ts | 123 ++-- .../core/features/filterEdge-shard-0.spec.ts | 296 ++++---- .../tests/core/features/filterSidebar.spec.ts | 277 ++++---- .../tests/core/features/folders.spec.ts | 153 ++-- .../tests/core/features/freeze-path.spec.ts | 303 ++++---- .../tests/core/features/freeze.spec.ts | 599 ++++++++-------- .../core/features/globalVariables.spec.ts | 172 ++--- .../tests/core/features/group.spec.ts | 68 +- .../features/keyboardComponentSearch.spec.ts | 160 ++--- src/frontend/tests/core/features/logs.spec.ts | 191 ++--- .../tests/core/features/playground.spec.ts | 504 ++++++------- .../core/features/saveComponents.spec.ts | 221 +++--- .../tests/core/features/stop-building.spec.ts | 488 ++++++------- .../tests/core/features/store-shard-2.spec.ts | 94 +-- .../tests/core/features/tweaksTest.spec.ts | 113 +-- .../core/integrations/Basic Prompting.spec.ts | 202 +++--- .../core/integrations/Blog Writer.spec.ts | 188 ++--- .../core/integrations/Document QA.spec.ts | 216 +++--- .../core/integrations/Dynamic Agent.spec.ts | 190 ++--- .../integrations/Hierarchical Agent.spec.ts | 194 ++--- .../core/integrations/Memory Chatbot.spec.ts | 214 +++--- .../Sequential Task Agent.spec.ts | 158 +++-- .../core/integrations/Simple Agent.spec.ts | 151 ++-- .../Travel Planning Agent.spec.ts | 250 +++---- .../core/integrations/Vector Store.spec.ts | 359 +++++----- .../core/integrations/decisionFlow.spec.ts | 669 +++++++++--------- .../core/integrations/similarity.spec.ts | 603 ++++++++-------- .../integrations/starter-projects.spec.ts | 164 ++--- .../core/integrations/textInputOutput.spec.ts | 382 +++++----- .../regression/generalBugs-shard-4.spec.ts | 232 +++--- .../regression/generalBugs-shard-5.spec.ts | 570 +++++++-------- .../regression/generalBugs-shard-9.spec.ts | 298 ++++---- .../tests/core/unit/chatInputOutput.spec.ts | 2 +- .../core/unit/codeAreaModalComponent.spec.ts | 128 ++-- .../tests/core/unit/dropdownComponent.spec.ts | 250 +++---- .../core/unit/fileUploadComponent.spec.ts | 320 +++++---- .../tests/core/unit/floatComponent.spec.ts | 250 +++---- .../tests/core/unit/inputComponent.spec.ts | 278 ++++---- .../core/unit/inputListComponent.spec.ts | 248 +++---- .../tests/core/unit/intComponent.spec.ts | 2 +- .../core/unit/keyPairListComponent.spec.ts | 220 +++--- .../tests/core/unit/linkComponent.spec.ts | 146 ++-- .../tests/core/unit/nestedComponent.spec.ts | 178 ++--- .../core/unit/promptModalComponent.spec.ts | 356 +++++----- .../tests/core/unit/sliderComponent.spec.ts | 160 +++-- .../core/unit/tableInputComponent.spec.ts | 206 +++--- .../core/unit/textAreaModalComponent.spec.ts | 138 ++-- .../tests/core/unit/toggleComponent.spec.ts | 366 +++++----- .../features/actionsMainPage-shard-0.spec.ts | 324 ++++----- .../extended/features/auto-save-off.spec.ts | 288 ++++---- .../tests/extended/features/autoLogin.spec.ts | 53 +- .../features/curlApiGeneration.spec.ts | 58 +- .../features/deleteComponents.spec.ts | 86 +-- .../extended/features/deleteFlows.spec.ts | 100 +-- .../extended/features/dragAndDrop.spec.ts | 2 +- .../features/filterEdge-shard-1.spec.ts | 324 ++++----- .../tests/extended/features/flowPage.spec.ts | 2 +- .../extended/features/flowSettings.spec.ts | 130 ++-- .../features/integration-side-bar.spec.ts | 170 ++--- .../features/langflowShortcuts.spec.ts | 179 ++--- .../features/limit-file-size-upload.spec.ts | 244 +++---- .../tests/extended/features/minimize.spec.ts | 140 ++-- .../features/pythonApiGeneration.spec.ts | 70 +- .../features/starter-projects.spec.ts | 123 ++-- .../extended/features/sticky-notes.spec.ts | 219 +++--- .../features/stop-button-playground.spec.ts | 166 ++--- .../extended/features/store-shard-0.spec.ts | 4 +- .../extended/features/store-shard-1.spec.ts | 248 +++---- .../extended/features/store-shard-3.spec.ts | 68 +- .../tests/extended/features/twoEdges.spec.ts | 94 +-- .../extended/features/userSettings.spec.ts | 204 +++--- .../chatInputOutputUser-shard-1.spec.ts | 152 ++-- .../chatInputOutputUser-shard-2.spec.ts | 286 ++++---- .../extended/integrations/duckduckgo.spec.ts | 136 ++-- .../integrations/youtube-transcripts.spec.ts | 112 +-- .../general-bugs-shard-3836.spec.ts | 192 ++--- .../general-bugs-shard-3909.spec.ts | 130 ++-- .../regression/generalBugs-shard-1.spec.ts | 174 ++--- .../regression/generalBugs-shard-10.spec.ts | 168 ++--- .../regression/generalBugs-shard-11.spec.ts | 212 +++--- .../regression/generalBugs-shard-12.spec.ts | 162 ++--- .../regression/generalBugs-shard-13.spec.ts | 206 +++--- .../regression/generalBugs-shard-2.spec.ts | 126 ++-- .../regression/generalBugs-shard-3.spec.ts | 476 +++++++------ .../regression/generalBugs-shard-6.spec.ts | 74 +- .../regression/generalBugs-shard-7.spec.ts | 139 ++-- .../regression/generalBugs-shard-8.spec.ts | 74 +- src/frontend/tsconfig.json | 20 +- 331 files changed, 10386 insertions(+), 9694 deletions(-) rename src/frontend/src/components/{ => authorization}/authAdminGuard/index.tsx (92%) rename src/frontend/src/components/{ => authorization}/authGuard/index.tsx (100%) rename src/frontend/src/components/{ => authorization}/authLoginGuard/index.tsx (100%) rename src/frontend/src/components/{ => authorization}/authSettingsGuard/index.tsx (100%) rename src/frontend/src/components/{ => authorization}/storeGuard/index.tsx (82%) rename src/frontend/src/components/{ => common}/GradientWrapper/index.tsx (100%) rename src/frontend/src/components/{ => common}/ImageViewer/index.tsx (96%) rename src/frontend/src/components/{ => common}/accordionComponent/composite/folderAccordionComponent/index.tsx (95%) rename src/frontend/src/components/{ => common}/accordionComponent/index.tsx (91%) rename src/frontend/src/components/{ => common}/animatedNumbers/index.tsx (100%) rename src/frontend/src/components/{ => common}/arrayReaderComponent/index.tsx (100%) rename src/frontend/src/components/{ => common}/catchAllRoutes/index.tsx (100%) rename src/frontend/src/components/{ => common}/crashErrorComponent/index.tsx (91%) rename src/frontend/src/components/{ => common}/fetchErrorComponent/index.tsx (89%) rename src/frontend/src/components/{ => common}/genericIconComponent/index.tsx (90%) rename src/frontend/src/components/{ => common}/horizontalScrollFadeComponent/index.tsx (100%) rename src/frontend/src/components/{ => common}/loadingComponent/index.tsx (96%) rename src/frontend/src/components/{ => common}/numberReader/index.tsx (100%) rename src/frontend/src/components/{ => common}/objectRender/index.tsx (91%) rename src/frontend/src/components/{ => common}/pageLayout/index.tsx (95%) rename src/frontend/src/components/{ => common}/paginatorComponent/index.tsx (94%) rename src/frontend/src/components/{ => common}/renderIconComponent/components/renderKey/index.tsx (91%) rename src/frontend/src/components/{ => common}/renderIconComponent/index.tsx (100%) rename src/frontend/src/components/{ => common}/sanitizedHTMLWrapper/index.tsx (90%) rename src/frontend/src/components/{ => common}/shadTooltipComponent/index.tsx (82%) rename src/frontend/src/components/{ => common}/skeletonCardComponent/index.tsx (90%) rename src/frontend/src/components/{ => common}/storeCardComponent/hooks/use-data-effect.tsx (90%) rename src/frontend/src/components/{ => common}/storeCardComponent/hooks/use-handle-install.tsx (88%) rename src/frontend/src/components/{ => common}/storeCardComponent/index.tsx (94%) rename src/frontend/src/components/{cardComponent => common/storeCardComponent}/utils/convert-test-name.tsx (100%) rename src/frontend/src/components/{ => common}/stringReaderComponent/index.tsx (89%) rename src/frontend/src/components/{ => common}/tagsSelectorComponent/index.tsx (95%) rename src/frontend/src/components/{ => common}/timeoutErrorComponent/index.tsx (83%) rename src/frontend/src/components/{ => common}/viewTriggers/chat/index.tsx (100%) rename src/frontend/src/components/{ => core}/GlobalVariableModal/GlobalVariableModal.tsx (92%) rename src/frontend/src/components/{ => core}/GlobalVariableModal/utils/sort-by-name.tsx (100%) rename src/frontend/src/components/{ => core}/appHeaderComponent/components/AccountMenu/index.tsx (98%) rename src/frontend/src/components/{ => core}/appHeaderComponent/components/FlowMenu/index.tsx (98%) rename src/frontend/src/components/{ => core}/appHeaderComponent/components/GithubStarButton/index.tsx (93%) rename src/frontend/src/components/{ => core}/appHeaderComponent/components/HeaderMenu/index.tsx (97%) rename src/frontend/src/components/{ => core}/appHeaderComponent/components/ProfileIcon/index.tsx (100%) rename src/frontend/src/components/{ => core}/appHeaderComponent/components/ThemeButtons/index.tsx (97%) rename src/frontend/src/components/{ => core}/appHeaderComponent/index.tsx (96%) rename src/frontend/src/components/{ => core}/canvasControlsComponent/index.tsx (95%) rename src/frontend/src/components/{ => core}/cardComponent/components/dragCardComponent/index.tsx (81%) rename src/frontend/src/components/{ => core}/cardComponent/hooks/use-handle-install.tsx (89%) rename src/frontend/src/components/{ => core}/cardComponent/hooks/use-on-drag-start.tsx (88%) rename src/frontend/src/components/{ => core}/cardComponent/index.tsx (90%) rename src/frontend/src/components/{storeCardComponent => core/cardComponent}/utils/convert-test-name.tsx (100%) rename src/frontend/src/components/{ => core}/cardsWrapComponent/index.tsx (95%) rename src/frontend/src/components/{ => core}/chatComponents/ContentBlockDisplay.tsx (98%) rename src/frontend/src/components/{ => core}/chatComponents/ContentDisplay.tsx (99%) rename src/frontend/src/components/{ => core}/chatComponents/DurationDisplay.tsx (90%) rename src/frontend/src/components/{ => core}/codeTabsComponent/ChatCodeTabComponent.tsx (91%) rename src/frontend/src/components/{ => core}/codeTabsComponent/components/tweakComponent/index.tsx (89%) rename src/frontend/src/components/{ => core}/codeTabsComponent/components/tweaksComponent/index.tsx (100%) rename src/frontend/src/components/{ => core}/codeTabsComponent/index.tsx (92%) rename src/frontend/src/components/{ => core}/csvOutputComponent/helpers/convert-data-function.ts (100%) rename src/frontend/src/components/{ => core}/csvOutputComponent/index.tsx (90%) rename src/frontend/src/components/{ => core}/dataOutputComponent/index.tsx (87%) rename src/frontend/src/components/{ => core}/dateReaderComponent/index.tsx (100%) rename src/frontend/src/components/{ => core}/dropdownButtonComponent/index.tsx (91%) rename src/frontend/src/components/{ => core}/dropdownComponent/index.tsx (93%) rename src/frontend/src/components/{ => core}/editFlowSettingsComponent/index.tsx (94%) rename src/frontend/src/components/{ => core}/flowToolbarComponent/index.tsx (90%) rename src/frontend/src/components/{ => core}/folderSidebarComponent/components/sideBarFolderButtons/index.tsx (96%) rename src/frontend/src/components/{ => core}/folderSidebarComponent/components/sidebarFolderSkeleton/index.tsx (100%) rename src/frontend/src/components/{ => core}/folderSidebarComponent/hooks/use-on-file-drop.tsx (91%) rename src/frontend/src/components/{ => core}/folderSidebarComponent/index.tsx (90%) rename src/frontend/src/components/{ => core}/parameterRenderComponent/components/TableNodeComponent/index.tsx (97%) rename src/frontend/src/components/{ => core}/parameterRenderComponent/components/codeAreaComponent/index.tsx (95%) rename src/frontend/src/components/{ => core}/parameterRenderComponent/components/dictComponent/index.tsx (85%) rename src/frontend/src/components/{ => core}/parameterRenderComponent/components/dropdownComponent/index.tsx (100%) rename src/frontend/src/components/{ => core}/parameterRenderComponent/components/emptyParameterComponent/index.tsx (100%) rename src/frontend/src/components/{ => core}/parameterRenderComponent/components/floatComponent/index.tsx (97%) rename src/frontend/src/components/{ => core/parameterRenderComponent/components}/inputComponent/components/helpers/get-icon-name.ts (100%) rename src/frontend/src/components/{ => core/parameterRenderComponent/components}/inputComponent/components/helpers/get-input-class-name.ts (100%) rename src/frontend/src/components/{ => core/parameterRenderComponent/components}/inputComponent/components/popover/index.tsx (99%) rename src/frontend/src/components/{ => core/parameterRenderComponent/components}/inputComponent/components/popoverObject/index.tsx (95%) rename src/frontend/src/components/{ => core/parameterRenderComponent/components}/inputComponent/index.tsx (96%) rename src/frontend/src/components/{ => core}/parameterRenderComponent/components/inputFileComponent/index.tsx (93%) rename src/frontend/src/components/{ => core}/parameterRenderComponent/components/inputGlobalComponent/index.tsx (91%) rename src/frontend/src/components/{ => core}/parameterRenderComponent/components/inputListComponent/index.tsx (94%) rename src/frontend/src/components/{ => core}/parameterRenderComponent/components/intComponent/index.tsx (98%) rename src/frontend/src/components/{ => core}/parameterRenderComponent/components/keypairListComponent/index.tsx (98%) rename src/frontend/src/components/{ => core}/parameterRenderComponent/components/linkComponent/index.tsx (88%) rename src/frontend/src/components/{ => core}/parameterRenderComponent/components/multiselectComponent/index.tsx (95%) rename src/frontend/src/components/{ => core}/parameterRenderComponent/components/promptComponent/index.tsx (95%) rename src/frontend/src/components/{ => core}/parameterRenderComponent/components/refreshParameterComponent/index.tsx (100%) rename src/frontend/src/components/{ => core/parameterRenderComponent/components}/sliderComponent/index.tsx (95%) rename src/frontend/src/components/{ => core/parameterRenderComponent/components}/sliderComponent/utils/get-min-max-value.ts (100%) rename src/frontend/src/components/{ => core}/parameterRenderComponent/components/strRenderComponent/index.tsx (100%) rename src/frontend/src/components/{ => core/parameterRenderComponent/components}/tableComponent/components/ResetColumns/index.tsx (100%) rename src/frontend/src/components/{ => core/parameterRenderComponent/components}/tableComponent/components/TableOptions/index.tsx (92%) rename src/frontend/src/components/{ => core/parameterRenderComponent/components}/tableComponent/components/loadingOverlay/index.tsx (100%) rename src/frontend/src/components/{ => core/parameterRenderComponent/components}/tableComponent/components/tableAdvancedToggleCellRender/index.tsx (89%) rename src/frontend/src/components/{ => core/parameterRenderComponent/components}/tableComponent/components/tableAutoCellRender/index.tsx (84%) rename src/frontend/src/components/{ => core/parameterRenderComponent/components}/tableComponent/components/tableNodeCellRender/index.tsx (88%) rename src/frontend/src/components/{ => core/parameterRenderComponent/components}/tableComponent/components/tableTooltipRender/index.tsx (100%) rename src/frontend/src/components/{ => core/parameterRenderComponent/components}/tableComponent/index.tsx (95%) rename src/frontend/src/components/{ => core/parameterRenderComponent/components}/tableComponent/utils/reset-grid-columns.tsx (100%) rename src/frontend/src/components/{ => core}/parameterRenderComponent/components/textAreaComponent/index.tsx (95%) rename src/frontend/src/components/{ => core/parameterRenderComponent/components}/textInputComponent/index.tsx (100%) rename src/frontend/src/components/{ => core}/parameterRenderComponent/components/toggleShadComponent/index.tsx (95%) rename src/frontend/src/components/{ => core}/parameterRenderComponent/helpers/get-placeholder-disabled.ts (100%) rename src/frontend/src/components/{ => core}/parameterRenderComponent/helpers/get-textarea-content-class.ts (100%) rename src/frontend/src/components/{ => core}/parameterRenderComponent/index.tsx (95%) rename src/frontend/src/components/{ => core}/parameterRenderComponent/types.ts (100%) rename src/frontend/src/components/{ => core}/pdfViewer/Error/index.tsx (77%) rename src/frontend/src/components/{ => core}/pdfViewer/index.tsx (97%) rename src/frontend/src/components/{ => core}/pdfViewer/noData/index.tsx (85%) rename src/frontend/src/components/{ => core}/sidebarComponent/index.tsx (98%) rename src/frontend/src/components/{ => core}/textOutputComponent/index.tsx (100%) diff --git a/.github/changes-filter.yaml b/.github/changes-filter.yaml index 36eb19a62..b8cc1f450 100644 --- a/.github/changes-filter.yaml +++ b/.github/changes-filter.yaml @@ -16,3 +16,39 @@ frontend: - "**/typescript_test.yml" docs: - "docs/**" + +# Test categories and their associated paths +starter-projects: + - "src/backend/base/langflow/initial_setup/**" + - "src/frontend/src/pages/MainPage/**" + - "src/frontend/src/utils/reactflowUtils.ts" + +components: + - "src/frontend/src/components/**" + - "src/frontend/src/modals/**" + - "src/frontend/src/pages/FlowPage/**" + - "src/frontend/src/shared/**" + - "src/frontend/src/hooks/**" + - "src/frontend/src/CustomNodes/**" + - "src/frontend/src/style/**" + - "src/frontend/src/utils/styleUtils.ts" + - "src/backend/base/langflow/components/**" + +workspace: + - "src/backend/base/langflow/inputs/**" + - "src/frontend/src/components/core/parameterRenderComponent/**" + - "src/frontend/src/CustomNodes/**" + - "src/frontend/src/modals/**" + - "src/frontend/src/style/**" + - "src/frontend/src/CustomEdges/**" + - "src/frontend/src/utils/reactflowUtils.ts" + - "src/frontend/src/utils/buildUtils.ts" + +api: + - "src/backend/base/langflow/api/**" + - "src/frontend/src/controllers/**" + +database: + - "src/backend/base/langflow/services/database/**" + - "src/backend/base/langflow/alembic/**" + - "src/frontend/src/controllers/**" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a53481d2b..80c9b9290 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,6 +13,11 @@ on: required: false type: string default: "tests/core" + release: + description: "Release" + required: false + type: boolean + default: false workflow_dispatch: inputs: branch: @@ -89,6 +94,7 @@ jobs: uses: ./.github/workflows/typescript_test.yml with: tests_folder: ${{ inputs.frontend-tests-folder }} + release: ${{ inputs.release || false }} secrets: OPENAI_API_KEY: "${{ secrets.OPENAI_API_KEY }}" STORE_API_KEY: "${{ secrets.STORE_API_KEY }}" @@ -99,6 +105,7 @@ jobs: name: Lint Backend uses: ./.github/workflows/lint-py.yml + test-docs-build: needs: path-filter if: ${{ needs.path-filter.outputs.docs == 'true' }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8ba112256..a25578adc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -49,6 +49,7 @@ jobs: with: python-versions: "['3.10', '3.11', '3.12']" frontend-tests-folder: "tests" + release: true release-base: name: Release Langflow Base diff --git a/.github/workflows/typescript_test.yml b/.github/workflows/typescript_test.yml index 2ef7e6579..9ce03ca6c 100644 --- a/.github/workflows/typescript_test.yml +++ b/.github/workflows/typescript_test.yml @@ -8,6 +8,16 @@ on: STORE_API_KEY: required: true inputs: + suites: + description: "Test suites to run (JSON array)" + required: false + type: string + default: '["starter-projects", "components", "workspace", "api", "database"]' + release: + description: "Whether this is a release build" + required: false + type: boolean + default: false tests_folder: description: "(Optional) Tests to run" required: false @@ -19,6 +29,16 @@ on: type: string workflow_dispatch: inputs: + suites: + description: "Test suites to run (JSON array)" + required: false + type: string + default: '["starter-projects", "components", "workspace", "api", "database"]' + release: + description: "Whether this is a release build" + required: false + type: boolean + default: false tests_folder: description: "(Optional) Tests to run" required: false @@ -33,9 +53,114 @@ env: PLAYWRIGHT_BROWSERS_PATH: "ms-playwright" jobs: + determine-test-suite: + runs-on: ubuntu-latest + outputs: + suites: ${{ steps.set-matrix.outputs.matrix }} + test_grep: ${{ steps.set-matrix.outputs.test_grep }} + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref || github.ref }} + fetch-depth: 0 + + - name: Paths Filter + id: filter + uses: dorny/paths-filter@v3 + with: + filters: .github/changes-filter.yaml + + - name: Set Matrix and Test Grep + id: set-matrix + run: | + # Start with input suites if provided, otherwise empty array + SUITES='${{ inputs.suites }}' + echo "Initial suites: $SUITES" + TEST_GREP="" + + RELEASE="${{ inputs.release || 'false' }}" + echo "Release build: $RELEASE" + + if [[ "$RELEASE" == "true" || "$SUITES" == "[]" ]]; then + SUITES='["release"]' + echo "Release build detected - setting suites to: $SUITES" + # No grep pattern for release - run all tests + TEST_GREP="" + else + # If input suites were not provided, determine based on changes + if [[ "$SUITES" == "[]" ]]; then + echo "No input suites provided - determining from changes" + TAGS=() + # Add suites and tags based on changed files + if [[ "${{ steps.filter.outputs.components }}" == "true" ]]; then + SUITES=$(echo $SUITES | jq '. += ["components"]') + TAGS+=("@components") + echo "Added components suite" + fi + if [[ "${{ steps.filter.outputs.starter-projects }}" == "true" ]]; then + SUITES=$(echo $SUITES | jq '. += ["starter-projects"]') + TAGS+=("@starter-projects") + echo "Added starter-projects suite" + fi + if [[ "${{ steps.filter.outputs.workspace }}" == "true" ]]; then + SUITES=$(echo $SUITES | jq '. += ["workspace"]') + TAGS+=("@workspace") + echo "Added workspace suite" + fi + if [[ "${{ steps.filter.outputs.api }}" == "true" ]]; then + SUITES=$(echo $SUITES | jq '. += ["api"]') + TAGS+=("@api") + echo "Added api suite" + fi + if [[ "${{ steps.filter.outputs.database }}" == "true" ]]; then + SUITES=$(echo $SUITES | jq '. += ["database"]') + TAGS+=("@database") + echo "Added database suite" + fi + + # Create grep pattern if we have tags + if [ ${#TAGS[@]} -gt 0 ]; then + # Join tags with | for OR logic + REGEX_PATTERN=$(IFS='|'; echo "${TAGS[*]}") + TEST_GREP="--grep=\"${REGEX_PATTERN}\"" + fi + else + # Process input suites to tags + TAGS=() + if echo "$SUITES" | jq -e 'contains(["components"])' > /dev/null; then + TAGS+=("@components") + fi + if echo "$SUITES" | jq -e 'contains(["starter-projects"])' > /dev/null; then + TAGS+=("@starter-projects") + fi + if echo "$SUITES" | jq -e 'contains(["workspace"])' > /dev/null; then + TAGS+=("@workspace") + fi + if echo "$SUITES" | jq -e 'contains(["api"])' > /dev/null; then + TAGS+=("@api") + fi + if echo "$SUITES" | jq -e 'contains(["database"])' > /dev/null; then + TAGS+=("@database") + fi + + if [ ${#TAGS[@]} -gt 0 ]; then + # Join tags with | for OR logic + REGEX_PATTERN=$(IFS='|'; echo "${TAGS[*]}") + TEST_GREP="--grep=\"${REGEX_PATTERN}\"" + fi + fi + fi + + echo "Final test suites to run: $SUITES" + echo "Test grep pattern: $TEST_GREP" + echo "matrix=$SUITES" >> $GITHUB_OUTPUT + echo "test_grep=$TEST_GREP" >> $GITHUB_OUTPUT + setup-and-test: name: Playwright Tests - Group ${{ matrix.shardIndex }} runs-on: ubuntu-latest + needs: determine-test-suite + if: ${{ fromJson(needs.determine-test-suite.outputs.suites)[0] != null }} strategy: fail-fast: false matrix: @@ -120,8 +245,9 @@ jobs: max_attempts: 2 command: | cd src/frontend - npx playwright test ${{ inputs.tests_folder }} --shard ${{ matrix.shardIndex }}/${{ matrix.shardTotal }} --list - npx playwright test ${{ inputs.tests_folder }} --trace on --shard ${{ matrix.shardIndex }}/${{ matrix.shardTotal }} --workers 2 + echo 'Running tests with pattern: ${{ needs.determine-test-suite.outputs.test_grep }}' + npx playwright test ${{ inputs.tests_folder }} ${{ needs.determine-test-suite.outputs.test_grep }} --shard ${{ matrix.shardIndex }}/${{ matrix.shardTotal }} --list + npx playwright test ${{ inputs.tests_folder }} ${{ needs.determine-test-suite.outputs.test_grep }} --trace on --shard ${{ matrix.shardIndex }}/${{ matrix.shardTotal }} --workers 2 - name: Upload blob report to GitHub Actions Artifacts if: always() diff --git a/src/frontend/src/CustomNodes/GenericNode/components/HandleTooltipComponent/index.tsx b/src/frontend/src/CustomNodes/GenericNode/components/HandleTooltipComponent/index.tsx index 83e43a7a4..0ff2e040d 100644 --- a/src/frontend/src/CustomNodes/GenericNode/components/HandleTooltipComponent/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/components/HandleTooltipComponent/index.tsx @@ -1,4 +1,4 @@ -import { convertTestName } from "@/components/storeCardComponent/utils/convert-test-name"; +import { convertTestName } from "@/components/common/storeCardComponent/utils/convert-test-name"; import { Badge } from "@/components/ui/badge"; export default function HandleTooltipComponent({ diff --git a/src/frontend/src/CustomNodes/GenericNode/components/NodeInputField/index.tsx b/src/frontend/src/CustomNodes/GenericNode/components/NodeInputField/index.tsx index 316618516..ad5cc66f5 100644 --- a/src/frontend/src/CustomNodes/GenericNode/components/NodeInputField/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/components/NodeInputField/index.tsx @@ -7,8 +7,8 @@ import { } from "@/customization/components/custom-parameter"; import { cn } from "@/utils/utils"; import { useEffect, useRef } from "react"; -import { default as IconComponent } from "../../../../components/genericIconComponent"; -import ShadTooltip from "../../../../components/shadTooltipComponent"; +import { default as IconComponent } from "../../../../components/common/genericIconComponent"; +import ShadTooltip from "../../../../components/common/shadTooltipComponent"; import { DEFAULT_TOOLSET_PLACEHOLDER, FLEX_VIEW_TYPES, diff --git a/src/frontend/src/CustomNodes/GenericNode/components/NodeOutputfield/index.tsx b/src/frontend/src/CustomNodes/GenericNode/components/NodeOutputfield/index.tsx index ad98de12b..c08bea5e9 100644 --- a/src/frontend/src/CustomNodes/GenericNode/components/NodeOutputfield/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/components/NodeOutputfield/index.tsx @@ -2,8 +2,8 @@ import { ICON_STROKE_WIDTH } from "@/constants/constants"; import { cloneDeep } from "lodash"; import { useEffect, useRef } from "react"; import { useUpdateNodeInternals } from "reactflow"; -import { default as IconComponent } from "../../../../components/genericIconComponent"; -import ShadTooltip from "../../../../components/shadTooltipComponent"; +import { default as IconComponent } from "../../../../components/common/genericIconComponent"; +import ShadTooltip from "../../../../components/common/shadTooltipComponent"; import { Button } from "../../../../components/ui/button"; import useFlowStore from "../../../../stores/flowStore"; import { useTypesStore } from "../../../../stores/typesStore"; diff --git a/src/frontend/src/CustomNodes/GenericNode/components/NodeStatus/index.tsx b/src/frontend/src/CustomNodes/GenericNode/components/NodeStatus/index.tsx index 304ddb6cb..bdd1ec358 100644 --- a/src/frontend/src/CustomNodes/GenericNode/components/NodeStatus/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/components/NodeStatus/index.tsx @@ -2,7 +2,7 @@ import { getSpecificClassFromBuildStatus } from "@/CustomNodes/helpers/get-class import useIconStatus from "@/CustomNodes/hooks/use-icons-status"; import useUpdateValidationStatus from "@/CustomNodes/hooks/use-update-validation-status"; import useValidationStatusString from "@/CustomNodes/hooks/use-validation-status-string"; -import ShadTooltip from "@/components/shadTooltipComponent"; +import ShadTooltip from "@/components/common/shadTooltipComponent"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { @@ -24,7 +24,7 @@ import { classNames, cn } from "@/utils/utils"; import { Check } from "lucide-react"; import { useEffect, useRef, useState } from "react"; import { useHotkeys } from "react-hotkeys-hook"; -import IconComponent from "../../../../components/genericIconComponent"; +import IconComponent from "../../../../components/common/genericIconComponent"; import { normalizeTimeString } from "./utils/format-run-time"; export default function NodeStatus({ diff --git a/src/frontend/src/CustomNodes/GenericNode/components/OutputComponent/index.tsx b/src/frontend/src/CustomNodes/GenericNode/components/OutputComponent/index.tsx index a5eaa3e43..8d96b02fd 100644 --- a/src/frontend/src/CustomNodes/GenericNode/components/OutputComponent/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/components/OutputComponent/index.tsx @@ -1,4 +1,4 @@ -import ShadTooltip from "../../../../components/shadTooltipComponent"; +import ShadTooltip from "../../../../components/common/shadTooltipComponent"; import { outputComponentType } from "../../../../types/components"; import { cn } from "../../../../utils/utils"; diff --git a/src/frontend/src/CustomNodes/GenericNode/components/handleRenderComponent/index.tsx b/src/frontend/src/CustomNodes/GenericNode/components/handleRenderComponent/index.tsx index 9d3572882..896ab726e 100644 --- a/src/frontend/src/CustomNodes/GenericNode/components/handleRenderComponent/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/components/handleRenderComponent/index.tsx @@ -2,7 +2,7 @@ import { useDarkStore } from "@/stores/darkStore"; import useFlowStore from "@/stores/flowStore"; import { useEffect, useMemo, useRef, useState } from "react"; import { Handle, Position } from "reactflow"; -import ShadTooltip from "../../../../components/shadTooltipComponent"; +import ShadTooltip from "../../../../components/common/shadTooltipComponent"; import { isValidConnection, scapedJSONStringfy, diff --git a/src/frontend/src/CustomNodes/GenericNode/components/nodeIcon/index.tsx b/src/frontend/src/CustomNodes/GenericNode/components/nodeIcon/index.tsx index 55238a944..c165122c9 100644 --- a/src/frontend/src/CustomNodes/GenericNode/components/nodeIcon/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/components/nodeIcon/index.tsx @@ -10,7 +10,7 @@ import emojiRegex from "emoji-regex"; import { ICON_STROKE_WIDTH } from "@/constants/constants"; import { checkLucideIcons } from "@/CustomNodes/helpers/check-lucide-icons"; import { cn } from "@/utils/utils"; -import IconComponent from "../../../../components/genericIconComponent"; +import IconComponent from "../../../../components/common/genericIconComponent"; export function NodeIcon({ icon, diff --git a/src/frontend/src/CustomNodes/GenericNode/components/outputModal/components/switchOutputView/index.tsx b/src/frontend/src/CustomNodes/GenericNode/components/outputModal/components/switchOutputView/index.tsx index 4cfb192ca..0986df108 100644 --- a/src/frontend/src/CustomNodes/GenericNode/components/outputModal/components/switchOutputView/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/components/outputModal/components/switchOutputView/index.tsx @@ -1,8 +1,8 @@ import { MAX_TEXT_LENGTH } from "@/constants/constants"; import { LogsLogType, OutputLogType } from "@/types/api"; import { useMemo } from "react"; -import DataOutputComponent from "../../../../../../components/dataOutputComponent"; -import ForwardedIconComponent from "../../../../../../components/genericIconComponent"; +import ForwardedIconComponent from "../../../../../../components/common/genericIconComponent"; +import DataOutputComponent from "../../../../../../components/core/dataOutputComponent"; import { Alert, AlertDescription, diff --git a/src/frontend/src/CustomNodes/GenericNode/index.tsx b/src/frontend/src/CustomNodes/GenericNode/index.tsx index f971b1f7c..b14d25fce 100644 --- a/src/frontend/src/CustomNodes/GenericNode/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/index.tsx @@ -1,9 +1,9 @@ +import ForwardedIconComponent from "@/components/common/genericIconComponent"; +import ShadTooltip from "@/components/common/shadTooltipComponent"; import { usePostValidateComponentCode } from "@/controllers/API/queries/nodes/use-post-validate-component-code"; import { useEffect, useMemo, useState } from "react"; import { useHotkeys } from "react-hotkeys-hook"; import { useUpdateNodeInternals } from "reactflow"; -import { ForwardedIconComponent } from "../../components/genericIconComponent"; -import ShadTooltip from "../../components/shadTooltipComponent"; import { Button } from "../../components/ui/button"; import { TOOLTIP_HIDDEN_OUTPUTS, diff --git a/src/frontend/src/CustomNodes/NoteNode/NoteToolbarComponent/index.tsx b/src/frontend/src/CustomNodes/NoteNode/NoteToolbarComponent/index.tsx index add508068..160da7b58 100644 --- a/src/frontend/src/CustomNodes/NoteNode/NoteToolbarComponent/index.tsx +++ b/src/frontend/src/CustomNodes/NoteNode/NoteToolbarComponent/index.tsx @@ -1,4 +1,4 @@ -import ShadTooltip from "@/components/shadTooltipComponent"; +import ShadTooltip from "@/components/common/shadTooltipComponent"; import { Button } from "@/components/ui/button"; import { Popover, @@ -20,7 +20,7 @@ import { useShortcutsStore } from "@/stores/shortcuts"; import { noteDataType } from "@/types/flow"; import { classNames, cn, openInNewTab } from "@/utils/utils"; import { cloneDeep } from "lodash"; -import IconComponent from "../../../components/genericIconComponent"; +import IconComponent from "../../../components/common/genericIconComponent"; export default function NoteToolbarComponent({ data, diff --git a/src/frontend/src/CustomNodes/hooks/use-icons-status.tsx b/src/frontend/src/CustomNodes/hooks/use-icons-status.tsx index 5841a17f3..5c8464c63 100644 --- a/src/frontend/src/CustomNodes/hooks/use-icons-status.tsx +++ b/src/frontend/src/CustomNodes/hooks/use-icons-status.tsx @@ -1,4 +1,4 @@ -import ForwardedIconComponent from "../../components/genericIconComponent"; +import ForwardedIconComponent from "../../components/common/genericIconComponent"; import Checkmark from "../../components/ui/checkmark"; import Loading from "../../components/ui/loading"; import Xmark from "../../components/ui/xmark"; diff --git a/src/frontend/src/alerts/alertDropDown/components/singleAlertComponent/index.tsx b/src/frontend/src/alerts/alertDropDown/components/singleAlertComponent/index.tsx index 1aea8b0f2..5cae3a091 100644 --- a/src/frontend/src/alerts/alertDropDown/components/singleAlertComponent/index.tsx +++ b/src/frontend/src/alerts/alertDropDown/components/singleAlertComponent/index.tsx @@ -1,6 +1,6 @@ import { CustomLink } from "@/customization/components/custom-link"; import { useState } from "react"; -import IconComponent from "../../../../components/genericIconComponent"; +import IconComponent from "../../../../components/common/genericIconComponent"; import { SingleAlertComponentType } from "../../../../types/alerts"; export default function SingleAlert({ diff --git a/src/frontend/src/alerts/alertDropDown/index.tsx b/src/frontend/src/alerts/alertDropDown/index.tsx index 4054eec02..12fb8beee 100644 --- a/src/frontend/src/alerts/alertDropDown/index.tsx +++ b/src/frontend/src/alerts/alertDropDown/index.tsx @@ -1,6 +1,6 @@ import { Cross2Icon } from "@radix-ui/react-icons"; import { useEffect, useState } from "react"; -import IconComponent from "../../components/genericIconComponent"; +import IconComponent from "../../components/common/genericIconComponent"; import { Popover, PopoverContent, diff --git a/src/frontend/src/alerts/error/index.tsx b/src/frontend/src/alerts/error/index.tsx index 1bbf35a37..1e4e54b10 100644 --- a/src/frontend/src/alerts/error/index.tsx +++ b/src/frontend/src/alerts/error/index.tsx @@ -1,6 +1,6 @@ import { Transition } from "@headlessui/react"; import { useEffect, useState } from "react"; -import IconComponent from "../../components/genericIconComponent"; +import IconComponent from "../../components/common/genericIconComponent"; import { ErrorAlertType } from "../../types/alerts"; export default function ErrorAlert({ diff --git a/src/frontend/src/alerts/notice/index.tsx b/src/frontend/src/alerts/notice/index.tsx index 053e382d4..540deec0d 100644 --- a/src/frontend/src/alerts/notice/index.tsx +++ b/src/frontend/src/alerts/notice/index.tsx @@ -1,7 +1,7 @@ import { CustomLink } from "@/customization/components/custom-link"; import { Transition } from "@headlessui/react"; import { useEffect, useState } from "react"; -import IconComponent from "../../components/genericIconComponent"; +import IconComponent from "../../components/common/genericIconComponent"; import { NoticeAlertType } from "../../types/alerts"; export default function NoticeAlert({ diff --git a/src/frontend/src/alerts/success/index.tsx b/src/frontend/src/alerts/success/index.tsx index 3ec0008e6..7fa95e9c3 100644 --- a/src/frontend/src/alerts/success/index.tsx +++ b/src/frontend/src/alerts/success/index.tsx @@ -1,6 +1,6 @@ import { Transition } from "@headlessui/react"; import { useEffect, useState } from "react"; -import IconComponent from "../../components/genericIconComponent"; +import IconComponent from "../../components/common/genericIconComponent"; import { SuccessAlertType } from "../../types/alerts"; export default function SuccessAlert({ diff --git a/src/frontend/src/components/authAdminGuard/index.tsx b/src/frontend/src/components/authorization/authAdminGuard/index.tsx similarity index 92% rename from src/frontend/src/components/authAdminGuard/index.tsx rename to src/frontend/src/components/authorization/authAdminGuard/index.tsx index 86a562515..0478e8bf0 100644 --- a/src/frontend/src/components/authAdminGuard/index.tsx +++ b/src/frontend/src/components/authorization/authAdminGuard/index.tsx @@ -1,8 +1,8 @@ +import { AuthContext } from "@/contexts/authContext"; import { CustomNavigate } from "@/customization/components/custom-navigate"; import { LoadingPage } from "@/pages/LoadingPage"; import useAuthStore from "@/stores/authStore"; import { useContext } from "react"; -import { AuthContext } from "../../contexts/authContext"; export const ProtectedAdminRoute = ({ children }) => { const { userData } = useContext(AuthContext); diff --git a/src/frontend/src/components/authGuard/index.tsx b/src/frontend/src/components/authorization/authGuard/index.tsx similarity index 100% rename from src/frontend/src/components/authGuard/index.tsx rename to src/frontend/src/components/authorization/authGuard/index.tsx diff --git a/src/frontend/src/components/authLoginGuard/index.tsx b/src/frontend/src/components/authorization/authLoginGuard/index.tsx similarity index 100% rename from src/frontend/src/components/authLoginGuard/index.tsx rename to src/frontend/src/components/authorization/authLoginGuard/index.tsx diff --git a/src/frontend/src/components/authSettingsGuard/index.tsx b/src/frontend/src/components/authorization/authSettingsGuard/index.tsx similarity index 100% rename from src/frontend/src/components/authSettingsGuard/index.tsx rename to src/frontend/src/components/authorization/authSettingsGuard/index.tsx diff --git a/src/frontend/src/components/storeGuard/index.tsx b/src/frontend/src/components/authorization/storeGuard/index.tsx similarity index 82% rename from src/frontend/src/components/storeGuard/index.tsx rename to src/frontend/src/components/authorization/storeGuard/index.tsx index 08354e8a3..41e05f377 100644 --- a/src/frontend/src/components/storeGuard/index.tsx +++ b/src/frontend/src/components/authorization/storeGuard/index.tsx @@ -1,5 +1,5 @@ import { CustomNavigate } from "@/customization/components/custom-navigate"; -import { useStoreStore } from "../../stores/storeStore"; +import { useStoreStore } from "../../../stores/storeStore"; export const StoreGuard = ({ children }) => { const hasStore = useStoreStore((state) => state.hasStore); diff --git a/src/frontend/src/components/GradientWrapper/index.tsx b/src/frontend/src/components/common/GradientWrapper/index.tsx similarity index 100% rename from src/frontend/src/components/GradientWrapper/index.tsx rename to src/frontend/src/components/common/GradientWrapper/index.tsx diff --git a/src/frontend/src/components/ImageViewer/index.tsx b/src/frontend/src/components/common/ImageViewer/index.tsx similarity index 96% rename from src/frontend/src/components/ImageViewer/index.tsx rename to src/frontend/src/components/common/ImageViewer/index.tsx index 6e2c340fd..0923d7633 100644 --- a/src/frontend/src/components/ImageViewer/index.tsx +++ b/src/frontend/src/components/common/ImageViewer/index.tsx @@ -1,10 +1,13 @@ import { saveAs } from "file-saver"; import OpenSeadragon from "openseadragon"; import { useEffect, useRef, useState } from "react"; -import { IMGViewErrorMSG, IMGViewErrorTitle } from "../../constants/constants"; -import useAlertStore from "../../stores/alertStore"; +import { + IMGViewErrorMSG, + IMGViewErrorTitle, +} from "../../../constants/constants"; +import useAlertStore from "../../../stores/alertStore"; +import { Separator } from "../../ui/separator"; import ForwardedIconComponent from "../genericIconComponent"; -import { Separator } from "../ui/separator"; export default function ImageViewer({ image }: { image: string }) { const viewerRef = useRef(null); diff --git a/src/frontend/src/components/accordionComponent/composite/folderAccordionComponent/index.tsx b/src/frontend/src/components/common/accordionComponent/composite/folderAccordionComponent/index.tsx similarity index 95% rename from src/frontend/src/components/accordionComponent/composite/folderAccordionComponent/index.tsx rename to src/frontend/src/components/common/accordionComponent/composite/folderAccordionComponent/index.tsx index d4fb95b5c..cf8571daa 100644 --- a/src/frontend/src/components/accordionComponent/composite/folderAccordionComponent/index.tsx +++ b/src/frontend/src/components/common/accordionComponent/composite/folderAccordionComponent/index.tsx @@ -1,6 +1,6 @@ import { useState } from "react"; -import IconComponent from "../../../../components/genericIconComponent"; import { AccordionComponentType } from "../../../../types/components"; +import IconComponent from "../../../common/genericIconComponent"; import { Accordion, AccordionContent, diff --git a/src/frontend/src/components/accordionComponent/index.tsx b/src/frontend/src/components/common/accordionComponent/index.tsx similarity index 91% rename from src/frontend/src/components/accordionComponent/index.tsx rename to src/frontend/src/components/common/accordionComponent/index.tsx index c9c21b8b2..3cdeb7496 100644 --- a/src/frontend/src/components/accordionComponent/index.tsx +++ b/src/frontend/src/components/common/accordionComponent/index.tsx @@ -1,12 +1,12 @@ -import { useState } from "react"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, -} from "../../components/ui/accordion"; -import { AccordionComponentType } from "../../types/components"; -import { cn } from "../../utils/utils"; +} from "@/components/ui/accordion"; +import { AccordionComponentType } from "@/types/components"; +import { cn } from "@/utils/utils"; +import { useState } from "react"; export default function AccordionComponent({ trigger, diff --git a/src/frontend/src/components/animatedNumbers/index.tsx b/src/frontend/src/components/common/animatedNumbers/index.tsx similarity index 100% rename from src/frontend/src/components/animatedNumbers/index.tsx rename to src/frontend/src/components/common/animatedNumbers/index.tsx diff --git a/src/frontend/src/components/arrayReaderComponent/index.tsx b/src/frontend/src/components/common/arrayReaderComponent/index.tsx similarity index 100% rename from src/frontend/src/components/arrayReaderComponent/index.tsx rename to src/frontend/src/components/common/arrayReaderComponent/index.tsx diff --git a/src/frontend/src/components/catchAllRoutes/index.tsx b/src/frontend/src/components/common/catchAllRoutes/index.tsx similarity index 100% rename from src/frontend/src/components/catchAllRoutes/index.tsx rename to src/frontend/src/components/common/catchAllRoutes/index.tsx diff --git a/src/frontend/src/components/crashErrorComponent/index.tsx b/src/frontend/src/components/common/crashErrorComponent/index.tsx similarity index 91% rename from src/frontend/src/components/crashErrorComponent/index.tsx rename to src/frontend/src/components/common/crashErrorComponent/index.tsx index 538564119..e9d00f9ab 100644 --- a/src/frontend/src/components/crashErrorComponent/index.tsx +++ b/src/frontend/src/components/common/crashErrorComponent/index.tsx @@ -1,7 +1,7 @@ import { XCircle } from "lucide-react"; -import { crashComponentPropsType } from "../../types/components"; -import { Button } from "../ui/button"; -import { Card, CardContent, CardFooter, CardHeader } from "../ui/card"; +import { crashComponentPropsType } from "../../../types/components"; +import { Button } from "../../ui/button"; +import { Card, CardContent, CardFooter, CardHeader } from "../../ui/card"; export default function CrashErrorComponent({ error, diff --git a/src/frontend/src/components/fetchErrorComponent/index.tsx b/src/frontend/src/components/common/fetchErrorComponent/index.tsx similarity index 89% rename from src/frontend/src/components/fetchErrorComponent/index.tsx rename to src/frontend/src/components/common/fetchErrorComponent/index.tsx index e58dc82ad..15b32b938 100644 --- a/src/frontend/src/components/fetchErrorComponent/index.tsx +++ b/src/frontend/src/components/common/fetchErrorComponent/index.tsx @@ -1,5 +1,5 @@ -import BaseModal from "../../modals/baseModal"; -import { fetchErrorComponentType } from "../../types/components"; +import BaseModal from "../../../modals/baseModal"; +import { fetchErrorComponentType } from "../../../types/components"; import IconComponent from "../genericIconComponent"; export default function FetchErrorComponent({ diff --git a/src/frontend/src/components/genericIconComponent/index.tsx b/src/frontend/src/components/common/genericIconComponent/index.tsx similarity index 90% rename from src/frontend/src/components/genericIconComponent/index.tsx rename to src/frontend/src/components/common/genericIconComponent/index.tsx index 39dab1d0d..9b40cb6ff 100644 --- a/src/frontend/src/components/genericIconComponent/index.tsx +++ b/src/frontend/src/components/common/genericIconComponent/index.tsx @@ -1,9 +1,9 @@ import dynamicIconImports from "lucide-react/dynamicIconImports"; import { Suspense, forwardRef, lazy, memo } from "react"; -import { IconComponentProps } from "../../types/components"; -import { nodeIconsLucide } from "../../utils/styleUtils"; -import { cn } from "../../utils/utils"; -import Loading from "../ui/loading"; +import { IconComponentProps } from "../../../types/components"; +import { nodeIconsLucide } from "../../../utils/styleUtils"; +import { cn } from "../../../utils/utils"; +import Loading from "../../ui/loading"; import { useEffect, useState } from "react"; diff --git a/src/frontend/src/components/horizontalScrollFadeComponent/index.tsx b/src/frontend/src/components/common/horizontalScrollFadeComponent/index.tsx similarity index 100% rename from src/frontend/src/components/horizontalScrollFadeComponent/index.tsx rename to src/frontend/src/components/common/horizontalScrollFadeComponent/index.tsx diff --git a/src/frontend/src/components/loadingComponent/index.tsx b/src/frontend/src/components/common/loadingComponent/index.tsx similarity index 96% rename from src/frontend/src/components/loadingComponent/index.tsx rename to src/frontend/src/components/common/loadingComponent/index.tsx index d7f261f93..0d803205f 100644 --- a/src/frontend/src/components/loadingComponent/index.tsx +++ b/src/frontend/src/components/common/loadingComponent/index.tsx @@ -1,4 +1,4 @@ -import { LoadingComponentProps } from "../../types/components"; +import { LoadingComponentProps } from "../../../types/components"; export default function LoadingComponent({ remSize, diff --git a/src/frontend/src/components/numberReader/index.tsx b/src/frontend/src/components/common/numberReader/index.tsx similarity index 100% rename from src/frontend/src/components/numberReader/index.tsx rename to src/frontend/src/components/common/numberReader/index.tsx diff --git a/src/frontend/src/components/objectRender/index.tsx b/src/frontend/src/components/common/objectRender/index.tsx similarity index 91% rename from src/frontend/src/components/objectRender/index.tsx rename to src/frontend/src/components/common/objectRender/index.tsx index 2527e7235..75b542f00 100644 --- a/src/frontend/src/components/objectRender/index.tsx +++ b/src/frontend/src/components/common/objectRender/index.tsx @@ -1,4 +1,4 @@ -import DictAreaModal from "../../modals/dictAreaModal"; +import DictAreaModal from "../../../modals/dictAreaModal"; export default function ObjectRender({ object, diff --git a/src/frontend/src/components/pageLayout/index.tsx b/src/frontend/src/components/common/pageLayout/index.tsx similarity index 95% rename from src/frontend/src/components/pageLayout/index.tsx rename to src/frontend/src/components/common/pageLayout/index.tsx index 5e9152de2..ca6f3c3b1 100644 --- a/src/frontend/src/components/pageLayout/index.tsx +++ b/src/frontend/src/components/common/pageLayout/index.tsx @@ -1,8 +1,8 @@ import { CustomBanner } from "@/customization/components/custom-banner"; import { useCustomNavigate } from "@/customization/hooks/use-custom-navigate"; +import { Button } from "../../ui/button"; +import { Separator } from "../../ui/separator"; import ForwardedIconComponent from "../genericIconComponent"; -import { Button } from "../ui/button"; -import { Separator } from "../ui/separator"; export default function PageLayout({ title, diff --git a/src/frontend/src/components/paginatorComponent/index.tsx b/src/frontend/src/components/common/paginatorComponent/index.tsx similarity index 94% rename from src/frontend/src/components/paginatorComponent/index.tsx rename to src/frontend/src/components/common/paginatorComponent/index.tsx index 46825997a..a66d7bf93 100644 --- a/src/frontend/src/components/paginatorComponent/index.tsx +++ b/src/frontend/src/components/common/paginatorComponent/index.tsx @@ -4,16 +4,16 @@ import { PAGINATION_SIZE, } from "@/constants/constants"; import { useEffect, useState } from "react"; -import { PaginatorComponentType } from "../../types/components"; -import IconComponent from "../genericIconComponent"; -import { Button } from "../ui/button"; +import { PaginatorComponentType } from "../../../types/components"; +import IconComponent from "../../common/genericIconComponent"; +import { Button } from "../../ui/button"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, -} from "../ui/select"; +} from "../../ui/select"; export default function PaginatorComponent({ pageSize = PAGINATION_SIZE, diff --git a/src/frontend/src/components/renderIconComponent/components/renderKey/index.tsx b/src/frontend/src/components/common/renderIconComponent/components/renderKey/index.tsx similarity index 91% rename from src/frontend/src/components/renderIconComponent/components/renderKey/index.tsx rename to src/frontend/src/components/common/renderIconComponent/components/renderKey/index.tsx index cce339eb2..384ce5f22 100644 --- a/src/frontend/src/components/renderIconComponent/components/renderKey/index.tsx +++ b/src/frontend/src/components/common/renderIconComponent/components/renderKey/index.tsx @@ -1,4 +1,4 @@ -import ForwardedIconComponent from "@/components/genericIconComponent"; +import ForwardedIconComponent from "@/components/common/genericIconComponent"; import { IS_MAC } from "@/constants/constants"; import { cn } from "@/utils/utils"; diff --git a/src/frontend/src/components/renderIconComponent/index.tsx b/src/frontend/src/components/common/renderIconComponent/index.tsx similarity index 100% rename from src/frontend/src/components/renderIconComponent/index.tsx rename to src/frontend/src/components/common/renderIconComponent/index.tsx diff --git a/src/frontend/src/components/sanitizedHTMLWrapper/index.tsx b/src/frontend/src/components/common/sanitizedHTMLWrapper/index.tsx similarity index 90% rename from src/frontend/src/components/sanitizedHTMLWrapper/index.tsx rename to src/frontend/src/components/common/sanitizedHTMLWrapper/index.tsx index e33596cde..975028f54 100644 --- a/src/frontend/src/components/sanitizedHTMLWrapper/index.tsx +++ b/src/frontend/src/components/common/sanitizedHTMLWrapper/index.tsx @@ -1,6 +1,6 @@ import DOMPurify from "dompurify"; import { forwardRef } from "react"; -import { SanitizedHTMLWrapperType } from "../../types/components"; +import { SanitizedHTMLWrapperType } from "../../../types/components"; const SanitizedHTMLWrapper = forwardRef< HTMLDivElement, diff --git a/src/frontend/src/components/shadTooltipComponent/index.tsx b/src/frontend/src/components/common/shadTooltipComponent/index.tsx similarity index 82% rename from src/frontend/src/components/shadTooltipComponent/index.tsx rename to src/frontend/src/components/common/shadTooltipComponent/index.tsx index 8fb831d5f..8f0a2c888 100644 --- a/src/frontend/src/components/shadTooltipComponent/index.tsx +++ b/src/frontend/src/components/common/shadTooltipComponent/index.tsx @@ -1,7 +1,7 @@ import React from "react"; -import { ShadToolTipType } from "../../types/components"; -import { cn } from "../../utils/utils"; -import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/tooltip"; +import { ShadToolTipType } from "../../../types/components"; +import { cn } from "../../../utils/utils"; +import { Tooltip, TooltipContent, TooltipTrigger } from "../../ui/tooltip"; const ShadTooltip: React.FC = ({ content, diff --git a/src/frontend/src/components/skeletonCardComponent/index.tsx b/src/frontend/src/components/common/skeletonCardComponent/index.tsx similarity index 90% rename from src/frontend/src/components/skeletonCardComponent/index.tsx rename to src/frontend/src/components/common/skeletonCardComponent/index.tsx index 6fe086973..817f04298 100644 --- a/src/frontend/src/components/skeletonCardComponent/index.tsx +++ b/src/frontend/src/components/common/skeletonCardComponent/index.tsx @@ -1,4 +1,4 @@ -import { Skeleton } from "../ui/skeleton"; +import { Skeleton } from "../../ui/skeleton"; export const SkeletonCardComponent = (): JSX.Element => { return ( diff --git a/src/frontend/src/components/storeCardComponent/hooks/use-data-effect.tsx b/src/frontend/src/components/common/storeCardComponent/hooks/use-data-effect.tsx similarity index 90% rename from src/frontend/src/components/storeCardComponent/hooks/use-data-effect.tsx rename to src/frontend/src/components/common/storeCardComponent/hooks/use-data-effect.tsx index 21d29049a..f3b0380a8 100644 --- a/src/frontend/src/components/storeCardComponent/hooks/use-data-effect.tsx +++ b/src/frontend/src/components/common/storeCardComponent/hooks/use-data-effect.tsx @@ -1,5 +1,5 @@ import { useEffect } from "react"; -import { storeComponent } from "../../../types/store"; +import { storeComponent } from "../../../../types/store"; const useDataEffect = ( data: storeComponent, diff --git a/src/frontend/src/components/storeCardComponent/hooks/use-handle-install.tsx b/src/frontend/src/components/common/storeCardComponent/hooks/use-handle-install.tsx similarity index 88% rename from src/frontend/src/components/storeCardComponent/hooks/use-handle-install.tsx rename to src/frontend/src/components/common/storeCardComponent/hooks/use-handle-install.tsx index 2b5269348..3d05e6379 100644 --- a/src/frontend/src/components/storeCardComponent/hooks/use-handle-install.tsx +++ b/src/frontend/src/components/common/storeCardComponent/hooks/use-handle-install.tsx @@ -1,7 +1,7 @@ import useAddFlow from "@/hooks/flows/use-add-flow"; -import { getComponent } from "../../../controllers/API"; -import { storeComponent } from "../../../types/store"; -import cloneFlowWithParent from "../../../utils/storeUtils"; +import { getComponent } from "../../../../controllers/API"; +import { storeComponent } from "../../../../types/store"; +import cloneFlowWithParent from "../../../../utils/storeUtils"; const useInstallComponent = ( data: storeComponent, diff --git a/src/frontend/src/components/storeCardComponent/index.tsx b/src/frontend/src/components/common/storeCardComponent/index.tsx similarity index 94% rename from src/frontend/src/components/storeCardComponent/index.tsx rename to src/frontend/src/components/common/storeCardComponent/index.tsx index 49bc07288..4f4445145 100644 --- a/src/frontend/src/components/storeCardComponent/index.tsx +++ b/src/frontend/src/components/common/storeCardComponent/index.tsx @@ -1,28 +1,28 @@ import { usePostLikeComponent } from "@/controllers/API/queries/store"; import { useState } from "react"; -import { getComponent } from "../../controllers/API"; -import IOModalOld from "../../modals/IOModal"; -import IOModalNew from "../../modals/IOModal/newModal"; -import useAlertStore from "../../stores/alertStore"; -import useFlowsManagerStore from "../../stores/flowsManagerStore"; -import { useStoreStore } from "../../stores/storeStore"; -import { FlowType } from "../../types/flow"; -import { storeComponent } from "../../types/store"; +import { getComponent } from "../../../controllers/API"; +import IOModalOld from "../../../modals/IOModal"; +import IOModalNew from "../../../modals/IOModal/newModal"; +import useAlertStore from "../../../stores/alertStore"; +import useFlowsManagerStore from "../../../stores/flowsManagerStore"; +import { useStoreStore } from "../../../stores/storeStore"; +import { FlowType } from "../../../types/flow"; +import { storeComponent } from "../../../types/store"; import cloneFLowWithParent, { getInputsAndOutputs, -} from "../../utils/storeUtils"; -import { cn } from "../../utils/utils"; -import IconComponent from "../genericIconComponent"; -import ShadTooltip from "../shadTooltipComponent"; -import { Button } from "../ui/button"; +} from "../../../utils/storeUtils"; +import { cn } from "../../../utils/utils"; +import { Button } from "../../ui/button"; import { Card, CardDescription, CardFooter, CardHeader, CardTitle, -} from "../ui/card"; -import Loading from "../ui/loading"; +} from "../../ui/card"; +import Loading from "../../ui/loading"; +import IconComponent from "../genericIconComponent"; +import ShadTooltip from "../shadTooltipComponent"; import useDataEffect from "./hooks/use-data-effect"; import useInstallComponent from "./hooks/use-handle-install"; import { convertTestName } from "./utils/convert-test-name"; diff --git a/src/frontend/src/components/cardComponent/utils/convert-test-name.tsx b/src/frontend/src/components/common/storeCardComponent/utils/convert-test-name.tsx similarity index 100% rename from src/frontend/src/components/cardComponent/utils/convert-test-name.tsx rename to src/frontend/src/components/common/storeCardComponent/utils/convert-test-name.tsx diff --git a/src/frontend/src/components/stringReaderComponent/index.tsx b/src/frontend/src/components/common/stringReaderComponent/index.tsx similarity index 89% rename from src/frontend/src/components/stringReaderComponent/index.tsx rename to src/frontend/src/components/common/stringReaderComponent/index.tsx index 877ed899c..e759225e7 100644 --- a/src/frontend/src/components/stringReaderComponent/index.tsx +++ b/src/frontend/src/components/common/stringReaderComponent/index.tsx @@ -1,4 +1,4 @@ -import TextModal from "../../modals/textModal"; +import TextModal from "../../../modals/textModal"; export default function StringReader({ string, diff --git a/src/frontend/src/components/tagsSelectorComponent/index.tsx b/src/frontend/src/components/common/tagsSelectorComponent/index.tsx similarity index 95% rename from src/frontend/src/components/tagsSelectorComponent/index.tsx rename to src/frontend/src/components/common/tagsSelectorComponent/index.tsx index b3a79a86e..d4307c6a7 100644 --- a/src/frontend/src/components/tagsSelectorComponent/index.tsx +++ b/src/frontend/src/components/common/tagsSelectorComponent/index.tsx @@ -1,6 +1,6 @@ -import { cn } from "../../utils/utils"; +import { cn } from "../../../utils/utils"; +import { Badge } from "../../ui/badge"; import HorizontalScrollFadeComponent from "../horizontalScrollFadeComponent"; -import { Badge } from "../ui/badge"; export function TagsSelector({ tags, diff --git a/src/frontend/src/components/timeoutErrorComponent/index.tsx b/src/frontend/src/components/common/timeoutErrorComponent/index.tsx similarity index 83% rename from src/frontend/src/components/timeoutErrorComponent/index.tsx rename to src/frontend/src/components/common/timeoutErrorComponent/index.tsx index d6df5e95f..ffc58a046 100644 --- a/src/frontend/src/components/timeoutErrorComponent/index.tsx +++ b/src/frontend/src/components/common/timeoutErrorComponent/index.tsx @@ -1,7 +1,7 @@ -import BaseModal from "../../modals/baseModal"; -import { fetchErrorComponentType } from "../../types/components"; +import BaseModal from "../../../modals/baseModal"; +import { fetchErrorComponentType } from "../../../types/components"; +import Loading from "../../ui/loading"; import IconComponent from "../genericIconComponent"; -import Loading from "../ui/loading"; export default function TimeoutErrorComponent({ message, diff --git a/src/frontend/src/components/viewTriggers/chat/index.tsx b/src/frontend/src/components/common/viewTriggers/chat/index.tsx similarity index 100% rename from src/frontend/src/components/viewTriggers/chat/index.tsx rename to src/frontend/src/components/common/viewTriggers/chat/index.tsx diff --git a/src/frontend/src/components/GlobalVariableModal/GlobalVariableModal.tsx b/src/frontend/src/components/core/GlobalVariableModal/GlobalVariableModal.tsx similarity index 92% rename from src/frontend/src/components/GlobalVariableModal/GlobalVariableModal.tsx rename to src/frontend/src/components/core/GlobalVariableModal/GlobalVariableModal.tsx index bda803f07..8ccdd0b53 100644 --- a/src/frontend/src/components/GlobalVariableModal/GlobalVariableModal.tsx +++ b/src/frontend/src/components/core/GlobalVariableModal/GlobalVariableModal.tsx @@ -6,22 +6,23 @@ import { import getUnavailableFields from "@/stores/globalVariablesStore/utils/get-unavailable-fields"; import { GlobalVariable } from "@/types/global_variables"; import { useEffect, useState } from "react"; -import BaseModal from "../../modals/baseModal"; -import useAlertStore from "../../stores/alertStore"; -import { useTypesStore } from "../../stores/typesStore"; -import { ResponseErrorDetailAPI } from "../../types/api"; -import ForwardedIconComponent from "../genericIconComponent"; -import InputComponent from "../inputComponent"; -import { Input } from "../ui/input"; -import { Label } from "../ui/label"; + +import ForwardedIconComponent from "@/components/common/genericIconComponent"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, -} from "../ui/select"; -import { Textarea } from "../ui/textarea"; +} from "@/components/ui/select"; +import { Textarea } from "@/components/ui/textarea"; +import BaseModal from "@/modals/baseModal"; +import useAlertStore from "@/stores/alertStore"; +import { useTypesStore } from "@/stores/typesStore"; +import { ResponseErrorDetailAPI } from "@/types/api"; +import InputComponent from "../parameterRenderComponent/components/inputComponent"; import sortByName from "./utils/sort-by-name"; //TODO IMPLEMENT FORM LOGIC diff --git a/src/frontend/src/components/GlobalVariableModal/utils/sort-by-name.tsx b/src/frontend/src/components/core/GlobalVariableModal/utils/sort-by-name.tsx similarity index 100% rename from src/frontend/src/components/GlobalVariableModal/utils/sort-by-name.tsx rename to src/frontend/src/components/core/GlobalVariableModal/utils/sort-by-name.tsx diff --git a/src/frontend/src/components/appHeaderComponent/components/AccountMenu/index.tsx b/src/frontend/src/components/core/appHeaderComponent/components/AccountMenu/index.tsx similarity index 98% rename from src/frontend/src/components/appHeaderComponent/components/AccountMenu/index.tsx rename to src/frontend/src/components/core/appHeaderComponent/components/AccountMenu/index.tsx index 1e00a0607..bb18866b2 100644 --- a/src/frontend/src/components/appHeaderComponent/components/AccountMenu/index.tsx +++ b/src/frontend/src/components/core/appHeaderComponent/components/AccountMenu/index.tsx @@ -1,4 +1,4 @@ -import ForwardedIconComponent from "@/components/genericIconComponent"; +import ForwardedIconComponent from "@/components/common/genericIconComponent"; import { useLogout } from "@/controllers/API/queries/auth"; import { CustomFeedbackDialog } from "@/customization/components/custom-feedback-dialog"; import { CustomHeaderMenuItemsTitle } from "@/customization/components/custom-header-menu-items-title"; diff --git a/src/frontend/src/components/appHeaderComponent/components/FlowMenu/index.tsx b/src/frontend/src/components/core/appHeaderComponent/components/FlowMenu/index.tsx similarity index 98% rename from src/frontend/src/components/appHeaderComponent/components/FlowMenu/index.tsx rename to src/frontend/src/components/core/appHeaderComponent/components/FlowMenu/index.tsx index 09ee6adf3..271c9a616 100644 --- a/src/frontend/src/components/appHeaderComponent/components/FlowMenu/index.tsx +++ b/src/frontend/src/components/core/appHeaderComponent/components/FlowMenu/index.tsx @@ -7,8 +7,8 @@ import useUploadFlow from "@/hooks/flows/use-upload-flow"; import { customStringify } from "@/utils/reactflowUtils"; import { useHotkeys } from "react-hotkeys-hook"; -import IconComponent from "@/components/genericIconComponent"; -import ShadTooltip from "@/components/shadTooltipComponent"; +import IconComponent from "@/components/common/genericIconComponent"; +import ShadTooltip from "@/components/common/shadTooltipComponent"; import { Button } from "@/components/ui/button"; import { DropdownMenu, diff --git a/src/frontend/src/components/appHeaderComponent/components/GithubStarButton/index.tsx b/src/frontend/src/components/core/appHeaderComponent/components/GithubStarButton/index.tsx similarity index 93% rename from src/frontend/src/components/appHeaderComponent/components/GithubStarButton/index.tsx rename to src/frontend/src/components/core/appHeaderComponent/components/GithubStarButton/index.tsx index bde60e462..08d1f2ed4 100644 --- a/src/frontend/src/components/appHeaderComponent/components/GithubStarButton/index.tsx +++ b/src/frontend/src/components/core/appHeaderComponent/components/GithubStarButton/index.tsx @@ -1,4 +1,4 @@ -import ShadTooltip from "@/components/shadTooltipComponent"; +import ShadTooltip from "@/components/common/shadTooltipComponent"; import { useDarkStore } from "@/stores/darkStore"; import { FaGithub } from "react-icons/fa"; diff --git a/src/frontend/src/components/appHeaderComponent/components/HeaderMenu/index.tsx b/src/frontend/src/components/core/appHeaderComponent/components/HeaderMenu/index.tsx similarity index 97% rename from src/frontend/src/components/appHeaderComponent/components/HeaderMenu/index.tsx rename to src/frontend/src/components/core/appHeaderComponent/components/HeaderMenu/index.tsx index 24572b2df..48a7d42e6 100644 --- a/src/frontend/src/components/appHeaderComponent/components/HeaderMenu/index.tsx +++ b/src/frontend/src/components/core/appHeaderComponent/components/HeaderMenu/index.tsx @@ -1,4 +1,4 @@ -import ForwardedIconComponent from "@/components/genericIconComponent"; +import ForwardedIconComponent from "@/components/common/genericIconComponent"; import { DropdownMenu, DropdownMenuContent, diff --git a/src/frontend/src/components/appHeaderComponent/components/ProfileIcon/index.tsx b/src/frontend/src/components/core/appHeaderComponent/components/ProfileIcon/index.tsx similarity index 100% rename from src/frontend/src/components/appHeaderComponent/components/ProfileIcon/index.tsx rename to src/frontend/src/components/core/appHeaderComponent/components/ProfileIcon/index.tsx diff --git a/src/frontend/src/components/appHeaderComponent/components/ThemeButtons/index.tsx b/src/frontend/src/components/core/appHeaderComponent/components/ThemeButtons/index.tsx similarity index 97% rename from src/frontend/src/components/appHeaderComponent/components/ThemeButtons/index.tsx rename to src/frontend/src/components/core/appHeaderComponent/components/ThemeButtons/index.tsx index 35ae89d60..697b78468 100644 --- a/src/frontend/src/components/appHeaderComponent/components/ThemeButtons/index.tsx +++ b/src/frontend/src/components/core/appHeaderComponent/components/ThemeButtons/index.tsx @@ -1,4 +1,4 @@ -import ForwardedIconComponent from "@/components/genericIconComponent"; +import ForwardedIconComponent from "@/components/common/genericIconComponent"; import { Button } from "@/components/ui/button"; import useTheme from "@/customization/hooks/use-custom-theme"; import { useEffect, useState } from "react"; diff --git a/src/frontend/src/components/appHeaderComponent/index.tsx b/src/frontend/src/components/core/appHeaderComponent/index.tsx similarity index 96% rename from src/frontend/src/components/appHeaderComponent/index.tsx rename to src/frontend/src/components/core/appHeaderComponent/index.tsx index feccf23e2..c95496799 100644 --- a/src/frontend/src/components/appHeaderComponent/index.tsx +++ b/src/frontend/src/components/core/appHeaderComponent/index.tsx @@ -1,7 +1,10 @@ import AlertDropdown from "@/alerts/alertDropDown"; import DataStaxLogo from "@/assets/DataStaxLogo.svg?react"; import LangflowLogo from "@/assets/LangflowLogo.svg?react"; -import ShadTooltip from "@/components/shadTooltipComponent"; +import ForwardedIconComponent from "@/components/common/genericIconComponent"; +import ShadTooltip from "@/components/common/shadTooltipComponent"; +import { Button } from "@/components/ui/button"; +import { Separator } from "@/components/ui/separator"; import { CustomOrgSelector } from "@/customization/components/custom-org-selector"; import { CustomProductSelector } from "@/customization/components/custom-product-selector"; import { @@ -12,9 +15,6 @@ import { useCustomNavigate } from "@/customization/hooks/use-custom-navigate"; import useTheme from "@/customization/hooks/use-custom-theme"; import useAlertStore from "@/stores/alertStore"; import { useEffect, useRef, useState } from "react"; -import ForwardedIconComponent from "../genericIconComponent"; -import { Button } from "../ui/button"; -import { Separator } from "../ui/separator"; import { AccountMenu } from "./components/AccountMenu"; import FlowMenu from "./components/FlowMenu"; import GithubStarComponent from "./components/GithubStarButton"; diff --git a/src/frontend/src/components/canvasControlsComponent/index.tsx b/src/frontend/src/components/core/canvasControlsComponent/index.tsx similarity index 95% rename from src/frontend/src/components/canvasControlsComponent/index.tsx rename to src/frontend/src/components/core/canvasControlsComponent/index.tsx index b4a8e29c4..22c699d3a 100644 --- a/src/frontend/src/components/canvasControlsComponent/index.tsx +++ b/src/frontend/src/components/core/canvasControlsComponent/index.tsx @@ -1,5 +1,5 @@ -import IconComponent from "@/components/genericIconComponent"; -import ShadTooltip from "@/components/shadTooltipComponent"; +import IconComponent from "@/components/common/genericIconComponent"; +import ShadTooltip from "@/components/common/shadTooltipComponent"; import { cn } from "@/utils/utils"; import { ControlButton, diff --git a/src/frontend/src/components/cardComponent/components/dragCardComponent/index.tsx b/src/frontend/src/components/core/cardComponent/components/dragCardComponent/index.tsx similarity index 81% rename from src/frontend/src/components/cardComponent/components/dragCardComponent/index.tsx rename to src/frontend/src/components/core/cardComponent/components/dragCardComponent/index.tsx index 9d24f9e26..f7bc5095f 100644 --- a/src/frontend/src/components/cardComponent/components/dragCardComponent/index.tsx +++ b/src/frontend/src/components/core/cardComponent/components/dragCardComponent/index.tsx @@ -1,8 +1,8 @@ import { FlowType } from "@/types/flow"; -import { storeComponent } from "../../../../types/store"; -import { cn } from "../../../../utils/utils"; -import ForwardedIconComponent from "../../../genericIconComponent"; -import { Card, CardHeader, CardTitle } from "../../../ui/card"; +import { storeComponent } from "../../../../../types/store"; +import { cn } from "../../../../../utils/utils"; +import ForwardedIconComponent from "../../../../common/genericIconComponent"; +import { Card, CardHeader, CardTitle } from "../../../../ui/card"; export default function DragCardComponent({ data }: { data: FlowType }) { return ( diff --git a/src/frontend/src/components/cardComponent/hooks/use-handle-install.tsx b/src/frontend/src/components/core/cardComponent/hooks/use-handle-install.tsx similarity index 89% rename from src/frontend/src/components/cardComponent/hooks/use-handle-install.tsx rename to src/frontend/src/components/core/cardComponent/hooks/use-handle-install.tsx index 991b21c6f..a86b37d89 100644 --- a/src/frontend/src/components/cardComponent/hooks/use-handle-install.tsx +++ b/src/frontend/src/components/core/cardComponent/hooks/use-handle-install.tsx @@ -1,7 +1,7 @@ import useAddFlow from "@/hooks/flows/use-add-flow"; -import { getComponent } from "../../../controllers/API"; -import { storeComponent } from "../../../types/store"; -import cloneFlowWithParent from "../../../utils/storeUtils"; +import { getComponent } from "../../../../controllers/API"; +import { storeComponent } from "../../../../types/store"; +import cloneFlowWithParent from "../../../../utils/storeUtils"; const useInstallComponent = ( data: storeComponent, diff --git a/src/frontend/src/components/cardComponent/hooks/use-on-drag-start.tsx b/src/frontend/src/components/core/cardComponent/hooks/use-on-drag-start.tsx similarity index 88% rename from src/frontend/src/components/cardComponent/hooks/use-on-drag-start.tsx rename to src/frontend/src/components/core/cardComponent/hooks/use-on-drag-start.tsx index ba44890a6..2beb534e2 100644 --- a/src/frontend/src/components/cardComponent/hooks/use-on-drag-start.tsx +++ b/src/frontend/src/components/core/cardComponent/hooks/use-on-drag-start.tsx @@ -1,8 +1,8 @@ import { FlowType } from "@/types/flow"; import { useCallback } from "react"; import { createRoot } from "react-dom/client"; -import useFlowsManagerStore from "../../../stores/flowsManagerStore"; -import { storeComponent } from "../../../types/store"; +import useFlowsManagerStore from "../../../../stores/flowsManagerStore"; +import { storeComponent } from "../../../../types/store"; import DragCardComponent from "../components/dragCardComponent"; const useDragStart = (data: FlowType) => { diff --git a/src/frontend/src/components/cardComponent/index.tsx b/src/frontend/src/components/core/cardComponent/index.tsx similarity index 90% rename from src/frontend/src/components/cardComponent/index.tsx rename to src/frontend/src/components/core/cardComponent/index.tsx index 6e1edbfc2..231602533 100644 --- a/src/frontend/src/components/cardComponent/index.tsx +++ b/src/frontend/src/components/core/cardComponent/index.tsx @@ -1,24 +1,24 @@ import { track } from "@/customization/utils/analytics"; import { useState } from "react"; import { Control } from "react-hook-form"; -import useAlertStore from "../../stores/alertStore"; -import useFlowsManagerStore from "../../stores/flowsManagerStore"; -import { FlowType } from "../../types/flow"; -import { getInputsAndOutputs } from "../../utils/storeUtils"; -import { cn } from "../../utils/utils"; -import IconComponent from "../genericIconComponent"; -import ShadTooltip from "../shadTooltipComponent"; -import { Button } from "../ui/button"; +import useAlertStore from "../../../stores/alertStore"; +import useFlowsManagerStore from "../../../stores/flowsManagerStore"; +import { FlowType } from "../../../types/flow"; +import { getInputsAndOutputs } from "../../../utils/storeUtils"; +import { cn } from "../../../utils/utils"; +import IconComponent from "../../common/genericIconComponent"; +import ShadTooltip from "../../common/shadTooltipComponent"; +import { Button } from "../../ui/button"; import { Card, CardDescription, CardFooter, CardHeader, CardTitle, -} from "../ui/card"; -import { Checkbox } from "../ui/checkbox"; -import { FormControl, FormField } from "../ui/form"; -import Loading from "../ui/loading"; +} from "../../ui/card"; +import { Checkbox } from "../../ui/checkbox"; +import { FormControl, FormField } from "../../ui/form"; +import Loading from "../../ui/loading"; import useDragStart from "./hooks/use-on-drag-start"; import { convertTestName } from "./utils/convert-test-name"; diff --git a/src/frontend/src/components/storeCardComponent/utils/convert-test-name.tsx b/src/frontend/src/components/core/cardComponent/utils/convert-test-name.tsx similarity index 100% rename from src/frontend/src/components/storeCardComponent/utils/convert-test-name.tsx rename to src/frontend/src/components/core/cardComponent/utils/convert-test-name.tsx diff --git a/src/frontend/src/components/cardsWrapComponent/index.tsx b/src/frontend/src/components/core/cardsWrapComponent/index.tsx similarity index 95% rename from src/frontend/src/components/cardsWrapComponent/index.tsx rename to src/frontend/src/components/core/cardsWrapComponent/index.tsx index 3dec7c8e2..e5853a788 100644 --- a/src/frontend/src/components/cardsWrapComponent/index.tsx +++ b/src/frontend/src/components/core/cardsWrapComponent/index.tsx @@ -1,7 +1,7 @@ import useFlowsManagerStore from "@/stores/flowsManagerStore"; import { useEffect, useState } from "react"; -import IconComponent from "../../components/genericIconComponent"; -import { cn } from "../../utils/utils"; +import { cn } from "../../../utils/utils"; +import IconComponent from "../../common/genericIconComponent"; export default function CardsWrapComponent({ onFileDrop, diff --git a/src/frontend/src/components/chatComponents/ContentBlockDisplay.tsx b/src/frontend/src/components/core/chatComponents/ContentBlockDisplay.tsx similarity index 98% rename from src/frontend/src/components/chatComponents/ContentBlockDisplay.tsx rename to src/frontend/src/components/core/chatComponents/ContentBlockDisplay.tsx index a14257735..e95f85c7e 100644 --- a/src/frontend/src/components/chatComponents/ContentBlockDisplay.tsx +++ b/src/frontend/src/components/core/chatComponents/ContentBlockDisplay.tsx @@ -8,8 +8,8 @@ import { useState } from "react"; import Markdown from "react-markdown"; import rehypeMathjax from "rehype-mathjax"; import remarkGfm from "remark-gfm"; -import ForwardedIconComponent from "../genericIconComponent"; -import { Separator } from "../ui/separator"; +import ForwardedIconComponent from "../../common/genericIconComponent"; +import { Separator } from "../../ui/separator"; import ContentDisplay from "./ContentDisplay"; import DurationDisplay from "./DurationDisplay"; diff --git a/src/frontend/src/components/chatComponents/ContentDisplay.tsx b/src/frontend/src/components/core/chatComponents/ContentDisplay.tsx similarity index 99% rename from src/frontend/src/components/chatComponents/ContentDisplay.tsx rename to src/frontend/src/components/core/chatComponents/ContentDisplay.tsx index 0870ae453..861c73949 100644 --- a/src/frontend/src/components/chatComponents/ContentDisplay.tsx +++ b/src/frontend/src/components/core/chatComponents/ContentDisplay.tsx @@ -4,8 +4,8 @@ import { ReactNode } from "react"; import Markdown from "react-markdown"; import rehypeMathjax from "rehype-mathjax"; import remarkGfm from "remark-gfm"; +import ForwardedIconComponent from "../../common/genericIconComponent"; import SimplifiedCodeTabComponent from "../codeTabsComponent/ChatCodeTabComponent"; -import ForwardedIconComponent from "../genericIconComponent"; import DurationDisplay from "./DurationDisplay"; export default function ContentDisplay({ diff --git a/src/frontend/src/components/chatComponents/DurationDisplay.tsx b/src/frontend/src/components/core/chatComponents/DurationDisplay.tsx similarity index 90% rename from src/frontend/src/components/chatComponents/DurationDisplay.tsx rename to src/frontend/src/components/core/chatComponents/DurationDisplay.tsx index 0a408a190..e1b172643 100644 --- a/src/frontend/src/components/chatComponents/DurationDisplay.tsx +++ b/src/frontend/src/components/core/chatComponents/DurationDisplay.tsx @@ -1,8 +1,8 @@ import { useDurationStore } from "@/stores/durationStore"; import { useEffect } from "react"; -import { AnimatedNumber } from "../animatedNumbers"; -import ForwardedIconComponent from "../genericIconComponent"; -import Loading from "../ui/loading"; +import { AnimatedNumber } from "../../common/animatedNumbers"; +import ForwardedIconComponent from "../../common/genericIconComponent"; +import Loading from "../../ui/loading"; interface DurationDisplayProps { duration?: number; diff --git a/src/frontend/src/components/codeTabsComponent/ChatCodeTabComponent.tsx b/src/frontend/src/components/core/codeTabsComponent/ChatCodeTabComponent.tsx similarity index 91% rename from src/frontend/src/components/codeTabsComponent/ChatCodeTabComponent.tsx rename to src/frontend/src/components/core/codeTabsComponent/ChatCodeTabComponent.tsx index 129d42d01..8c2cf5c42 100644 --- a/src/frontend/src/components/codeTabsComponent/ChatCodeTabComponent.tsx +++ b/src/frontend/src/components/core/codeTabsComponent/ChatCodeTabComponent.tsx @@ -1,9 +1,9 @@ import { useState } from "react"; import { Prism as SyntaxHighlighter } from "react-syntax-highlighter"; import { tomorrow } from "react-syntax-highlighter/dist/cjs/styles/prism"; -import { useDarkStore } from "../../stores/darkStore"; -import IconComponent from "../genericIconComponent"; -import { Button } from "../ui/button"; +import { useDarkStore } from "../../../stores/darkStore"; +import IconComponent from "../../common/genericIconComponent"; +import { Button } from "../../ui/button"; type SimplifiedCodeTabProps = { code: string; diff --git a/src/frontend/src/components/codeTabsComponent/components/tweakComponent/index.tsx b/src/frontend/src/components/core/codeTabsComponent/components/tweakComponent/index.tsx similarity index 89% rename from src/frontend/src/components/codeTabsComponent/components/tweakComponent/index.tsx rename to src/frontend/src/components/core/codeTabsComponent/components/tweakComponent/index.tsx index d3fa1eada..0d0176043 100644 --- a/src/frontend/src/components/codeTabsComponent/components/tweakComponent/index.tsx +++ b/src/frontend/src/components/core/codeTabsComponent/components/tweakComponent/index.tsx @@ -1,5 +1,5 @@ -import AccordionComponent from "@/components/accordionComponent"; -import ShadTooltip from "@/components/shadTooltipComponent"; +import AccordionComponent from "@/components/common/accordionComponent"; +import ShadTooltip from "@/components/common/shadTooltipComponent"; import { EditNodeComponent } from "@/modals/editNodeModal/components/editNodeComponent"; import { APIClassType } from "@/types/api"; import { NodeType } from "@/types/flow"; diff --git a/src/frontend/src/components/codeTabsComponent/components/tweaksComponent/index.tsx b/src/frontend/src/components/core/codeTabsComponent/components/tweaksComponent/index.tsx similarity index 100% rename from src/frontend/src/components/codeTabsComponent/components/tweaksComponent/index.tsx rename to src/frontend/src/components/core/codeTabsComponent/components/tweaksComponent/index.tsx diff --git a/src/frontend/src/components/codeTabsComponent/index.tsx b/src/frontend/src/components/core/codeTabsComponent/index.tsx similarity index 92% rename from src/frontend/src/components/codeTabsComponent/index.tsx rename to src/frontend/src/components/core/codeTabsComponent/index.tsx index 2f726c23a..a3b563c56 100644 --- a/src/frontend/src/components/codeTabsComponent/index.tsx +++ b/src/frontend/src/components/core/codeTabsComponent/index.tsx @@ -1,20 +1,15 @@ -import ShadTooltip from "@/components/shadTooltipComponent"; +import ShadTooltip from "@/components/common/shadTooltipComponent"; import { useTweaksStore } from "@/stores/tweaksStore"; import { useState } from "react"; import { Prism as SyntaxHighlighter } from "react-syntax-highlighter"; import { oneDark } from "react-syntax-highlighter/dist/cjs/styles/prism"; -import { - Tabs, - TabsContent, - TabsList, - TabsTrigger, -} from "../../components/ui/tabs"; -import { useDarkStore } from "../../stores/darkStore"; -import { codeTabsPropsType } from "../../types/components"; -import IconComponent from "../genericIconComponent"; -import { Button } from "../ui/button"; -import { Label } from "../ui/label"; -import { Switch } from "../ui/switch"; +import { useDarkStore } from "../../../stores/darkStore"; +import { codeTabsPropsType } from "../../../types/components"; +import IconComponent from "../../common/genericIconComponent"; +import { Button } from "../../ui/button"; +import { Label } from "../../ui/label"; +import { Switch } from "../../ui/switch"; +import { Tabs, TabsContent, TabsList, TabsTrigger } from "../../ui/tabs"; import { TweaksComponent } from "./components/tweaksComponent"; export default function CodeTabsComponent({ diff --git a/src/frontend/src/components/csvOutputComponent/helpers/convert-data-function.ts b/src/frontend/src/components/core/csvOutputComponent/helpers/convert-data-function.ts similarity index 100% rename from src/frontend/src/components/csvOutputComponent/helpers/convert-data-function.ts rename to src/frontend/src/components/core/csvOutputComponent/helpers/convert-data-function.ts diff --git a/src/frontend/src/components/csvOutputComponent/index.tsx b/src/frontend/src/components/core/csvOutputComponent/index.tsx similarity index 90% rename from src/frontend/src/components/csvOutputComponent/index.tsx rename to src/frontend/src/components/core/csvOutputComponent/index.tsx index 78f5e22a9..0ce8bfd38 100644 --- a/src/frontend/src/components/csvOutputComponent/index.tsx +++ b/src/frontend/src/components/core/csvOutputComponent/index.tsx @@ -5,13 +5,13 @@ import { CSVError, CSVNoDataError, CSVViewErrorTitle, -} from "../../constants/constants"; -import { useDarkStore } from "../../stores/darkStore"; -import { VertexBuildTypeAPI } from "../../types/api"; -import { NodeType } from "../../types/flow"; -import ForwardedIconComponent from "../genericIconComponent"; -import TableComponent from "../tableComponent"; -import Loading from "../ui/loading"; +} from "../../../constants/constants"; +import { useDarkStore } from "../../../stores/darkStore"; +import { VertexBuildTypeAPI } from "../../../types/api"; +import { NodeType } from "../../../types/flow"; +import ForwardedIconComponent from "../../common/genericIconComponent"; +import Loading from "../../ui/loading"; +import TableComponent from "../parameterRenderComponent/components/tableComponent"; import { convertCSVToData } from "./helpers/convert-data-function"; function CsvOutputComponent({ diff --git a/src/frontend/src/components/dataOutputComponent/index.tsx b/src/frontend/src/components/core/dataOutputComponent/index.tsx similarity index 87% rename from src/frontend/src/components/dataOutputComponent/index.tsx rename to src/frontend/src/components/core/dataOutputComponent/index.tsx index cc42be4e3..500c7a48f 100644 --- a/src/frontend/src/components/dataOutputComponent/index.tsx +++ b/src/frontend/src/components/core/dataOutputComponent/index.tsx @@ -1,8 +1,8 @@ +import TableComponent from "@/components/core/parameterRenderComponent/components/tableComponent"; import { ColDef, ColGroupDef } from "ag-grid-community"; import "ag-grid-community/styles/ag-grid.css"; // Mandatory CSS required by the grid import "ag-grid-community/styles/ag-theme-balham.css"; // Optional Theme applied to the grid -import { extractColumnsFromRows } from "../../utils/utils"; -import TableComponent from "../tableComponent"; +import { extractColumnsFromRows } from "../../../utils/utils"; function DataOutputComponent({ pagination, diff --git a/src/frontend/src/components/dateReaderComponent/index.tsx b/src/frontend/src/components/core/dateReaderComponent/index.tsx similarity index 100% rename from src/frontend/src/components/dateReaderComponent/index.tsx rename to src/frontend/src/components/core/dateReaderComponent/index.tsx diff --git a/src/frontend/src/components/dropdownButtonComponent/index.tsx b/src/frontend/src/components/core/dropdownButtonComponent/index.tsx similarity index 91% rename from src/frontend/src/components/dropdownButtonComponent/index.tsx rename to src/frontend/src/components/core/dropdownButtonComponent/index.tsx index eae8e41ef..db0d4a512 100644 --- a/src/frontend/src/components/dropdownButtonComponent/index.tsx +++ b/src/frontend/src/components/core/dropdownButtonComponent/index.tsx @@ -1,13 +1,13 @@ import { useState } from "react"; -import { dropdownButtonPropsType } from "../../types/components"; -import IconComponent from "../genericIconComponent"; -import { Button } from "../ui/button"; +import { dropdownButtonPropsType } from "../../../types/components"; +import IconComponent from "../../common/genericIconComponent"; +import { Button } from "../../ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, -} from "../ui/dropdown-menu"; +} from "../../ui/dropdown-menu"; export default function DropdownButton({ firstButtonName, diff --git a/src/frontend/src/components/dropdownComponent/index.tsx b/src/frontend/src/components/core/dropdownComponent/index.tsx similarity index 93% rename from src/frontend/src/components/dropdownComponent/index.tsx rename to src/frontend/src/components/core/dropdownComponent/index.tsx index a60b1de4b..744a07bfc 100644 --- a/src/frontend/src/components/dropdownComponent/index.tsx +++ b/src/frontend/src/components/core/dropdownComponent/index.tsx @@ -2,24 +2,24 @@ import { PopoverAnchor } from "@radix-ui/react-popover"; import Fuse from "fuse.js"; import { cloneDeep } from "lodash"; import { ChangeEvent, useEffect, useRef, useState } from "react"; -import { DropDownComponent } from "../../types/components"; -import { cn, formatPlaceholderName } from "../../utils/utils"; -import { default as ForwardedIconComponent } from "../genericIconComponent"; -import ShadTooltip from "../shadTooltipComponent"; -import { Button } from "../ui/button"; +import { DropDownComponent } from "../../../types/components"; +import { cn, formatPlaceholderName } from "../../../utils/utils"; +import { default as ForwardedIconComponent } from "../../common/genericIconComponent"; +import ShadTooltip from "../../common/shadTooltipComponent"; +import { Button } from "../../ui/button"; import { Command, CommandEmpty, CommandGroup, CommandItem, CommandList, -} from "../ui/command"; +} from "../../ui/command"; import { Popover, PopoverContent, PopoverContentWithoutPortal, PopoverTrigger, -} from "../ui/popover"; +} from "../../ui/popover"; export default function Dropdown({ disabled, diff --git a/src/frontend/src/components/editFlowSettingsComponent/index.tsx b/src/frontend/src/components/core/editFlowSettingsComponent/index.tsx similarity index 94% rename from src/frontend/src/components/editFlowSettingsComponent/index.tsx rename to src/frontend/src/components/core/editFlowSettingsComponent/index.tsx index c3016ed3e..7545e867c 100644 --- a/src/frontend/src/components/editFlowSettingsComponent/index.tsx +++ b/src/frontend/src/components/core/editFlowSettingsComponent/index.tsx @@ -1,9 +1,9 @@ import React, { ChangeEvent, useState } from "react"; -import { Input } from "../../components/ui/input"; -import { Label } from "../../components/ui/label"; -import { Textarea } from "../../components/ui/textarea"; -import { InputProps } from "../../types/components"; -import { cn, isEndpointNameValid } from "../../utils/utils"; +import { InputProps } from "../../../types/components"; +import { cn, isEndpointNameValid } from "../../../utils/utils"; +import { Input } from "../../ui/input"; +import { Label } from "../../ui/label"; +import { Textarea } from "../../ui/textarea"; export const EditFlowSettings: React.FC = ({ name, diff --git a/src/frontend/src/components/flowToolbarComponent/index.tsx b/src/frontend/src/components/core/flowToolbarComponent/index.tsx similarity index 90% rename from src/frontend/src/components/flowToolbarComponent/index.tsx rename to src/frontend/src/components/core/flowToolbarComponent/index.tsx index fedc7f259..fbed6d4b9 100644 --- a/src/frontend/src/components/flowToolbarComponent/index.tsx +++ b/src/frontend/src/components/core/flowToolbarComponent/index.tsx @@ -1,21 +1,20 @@ -import ShadTooltip from "@/components/shadTooltipComponent"; +import ShadTooltip from "@/components/common/shadTooltipComponent"; +import PlaygroundButton from "@/components/flowToolbarComponent/components/playground-button"; import { ENABLE_API, ENABLE_LANGFLOW_STORE, } from "@/customization/feature-flags"; import { track } from "@/customization/utils/analytics"; -import IOModal from "@/modals/IOModal/newModal"; import { useEffect, useMemo, useState } from "react"; import { useHotkeys } from "react-hotkeys-hook"; import { Panel } from "reactflow"; -import ApiModal from "../../modals/apiModal"; -import ShareModal from "../../modals/shareModal"; -import useFlowStore from "../../stores/flowStore"; -import { useShortcutsStore } from "../../stores/shortcuts"; -import { useStoreStore } from "../../stores/storeStore"; -import { classNames, isThereModal } from "../../utils/utils"; -import ForwardedIconComponent from "../genericIconComponent"; -import PlaygroundButton from "./components/playground-button"; +import ApiModal from "../../../modals/apiModal"; +import ShareModal from "../../../modals/shareModal"; +import useFlowStore from "../../../stores/flowStore"; +import { useShortcutsStore } from "../../../stores/shortcuts"; +import { useStoreStore } from "../../../stores/storeStore"; +import { classNames, isThereModal } from "../../../utils/utils"; +import ForwardedIconComponent from "../../common/genericIconComponent"; export default function FlowToolbar(): JSX.Element { const preventDefault = true; diff --git a/src/frontend/src/components/folderSidebarComponent/components/sideBarFolderButtons/index.tsx b/src/frontend/src/components/core/folderSidebarComponent/components/sideBarFolderButtons/index.tsx similarity index 96% rename from src/frontend/src/components/folderSidebarComponent/components/sideBarFolderButtons/index.tsx rename to src/frontend/src/components/core/folderSidebarComponent/components/sideBarFolderButtons/index.tsx index 4a56c832c..0ff42f03b 100644 --- a/src/frontend/src/components/folderSidebarComponent/components/sideBarFolderButtons/index.tsx +++ b/src/frontend/src/components/core/folderSidebarComponent/components/sideBarFolderButtons/index.tsx @@ -1,4 +1,4 @@ -import ShadTooltip from "@/components/shadTooltipComponent"; +import ShadTooltip from "@/components/common/shadTooltipComponent"; import { Select, SelectContent, @@ -31,15 +31,15 @@ import { useIsMobile } from "@/hooks/use-mobile"; import { useIsFetching, useIsMutating } from "@tanstack/react-query"; import { useEffect, useRef, useState } from "react"; import { useLocation, useParams } from "react-router-dom"; -import { FolderType } from "../../../../pages/MainPage/entities"; -import useAlertStore from "../../../../stores/alertStore"; -import useFlowsManagerStore from "../../../../stores/flowsManagerStore"; -import { useFolderStore } from "../../../../stores/foldersStore"; -import { handleKeyDown } from "../../../../utils/reactflowUtils"; -import { cn } from "../../../../utils/utils"; -import IconComponent from "../../../genericIconComponent"; -import { Button } from "../../../ui/button"; -import { Input } from "../../../ui/input"; +import { FolderType } from "../../../../../pages/MainPage/entities"; +import useAlertStore from "../../../../../stores/alertStore"; +import useFlowsManagerStore from "../../../../../stores/flowsManagerStore"; +import { useFolderStore } from "../../../../../stores/foldersStore"; +import { handleKeyDown } from "../../../../../utils/reactflowUtils"; +import { cn } from "../../../../../utils/utils"; +import IconComponent from "../../../../common/genericIconComponent"; +import { Button } from "../../../../ui/button"; +import { Input } from "../../../../ui/input"; import useFileDrop from "../../hooks/use-on-file-drop"; import { SidebarFolderSkeleton } from "../sidebarFolderSkeleton"; diff --git a/src/frontend/src/components/folderSidebarComponent/components/sidebarFolderSkeleton/index.tsx b/src/frontend/src/components/core/folderSidebarComponent/components/sidebarFolderSkeleton/index.tsx similarity index 100% rename from src/frontend/src/components/folderSidebarComponent/components/sidebarFolderSkeleton/index.tsx rename to src/frontend/src/components/core/folderSidebarComponent/components/sidebarFolderSkeleton/index.tsx diff --git a/src/frontend/src/components/folderSidebarComponent/hooks/use-on-file-drop.tsx b/src/frontend/src/components/core/folderSidebarComponent/hooks/use-on-file-drop.tsx similarity index 91% rename from src/frontend/src/components/folderSidebarComponent/hooks/use-on-file-drop.tsx rename to src/frontend/src/components/core/folderSidebarComponent/hooks/use-on-file-drop.tsx index 070ec084a..b877a6ab8 100644 --- a/src/frontend/src/components/folderSidebarComponent/hooks/use-on-file-drop.tsx +++ b/src/frontend/src/components/core/folderSidebarComponent/hooks/use-on-file-drop.tsx @@ -3,11 +3,11 @@ import useSaveFlow from "@/hooks/flows/use-save-flow"; import { UPLOAD_ALERT_LIST, WRONG_FILE_ERROR_ALERT, -} from "../../../constants/alerts_constants"; -import useAlertStore from "../../../stores/alertStore"; -import useFlowsManagerStore from "../../../stores/flowsManagerStore"; -import { useFolderStore } from "../../../stores/foldersStore"; -import { addVersionToDuplicates } from "../../../utils/reactflowUtils"; +} from "../../../../constants/alerts_constants"; +import useAlertStore from "../../../../stores/alertStore"; +import useFlowsManagerStore from "../../../../stores/flowsManagerStore"; +import { useFolderStore } from "../../../../stores/foldersStore"; +import { addVersionToDuplicates } from "../../../../utils/reactflowUtils"; const useFileDrop = (folderId: string) => { const setFolderDragging = useFolderStore((state) => state.setFolderDragging); diff --git a/src/frontend/src/components/folderSidebarComponent/index.tsx b/src/frontend/src/components/core/folderSidebarComponent/index.tsx similarity index 90% rename from src/frontend/src/components/folderSidebarComponent/index.tsx rename to src/frontend/src/components/core/folderSidebarComponent/index.tsx index e975c96be..9bff28496 100644 --- a/src/frontend/src/components/folderSidebarComponent/index.tsx +++ b/src/frontend/src/components/core/folderSidebarComponent/index.tsx @@ -1,5 +1,5 @@ import { useLocation } from "react-router-dom"; -import { FolderType } from "../../pages/MainPage/entities"; +import { FolderType } from "../../../pages/MainPage/entities"; import SideBarFoldersButtonsComponent from "./components/sideBarFolderButtons"; type SidebarNavProps = { diff --git a/src/frontend/src/components/parameterRenderComponent/components/TableNodeComponent/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/TableNodeComponent/index.tsx similarity index 97% rename from src/frontend/src/components/parameterRenderComponent/components/TableNodeComponent/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/TableNodeComponent/index.tsx index 78d084496..cd90d60f0 100644 --- a/src/frontend/src/components/parameterRenderComponent/components/TableNodeComponent/index.tsx +++ b/src/frontend/src/components/core/parameterRenderComponent/components/TableNodeComponent/index.tsx @@ -4,8 +4,8 @@ import { DataTypeDefinition, SelectionChangedEvent } from "ag-grid-community"; import { AgGridReact } from "ag-grid-react"; import { cloneDeep } from "lodash"; import { useMemo, useRef, useState } from "react"; -import { ForwardedIconComponent } from "../../../genericIconComponent"; -import { Button } from "../../../ui/button"; +import { ForwardedIconComponent } from "../../../../common/genericIconComponent"; +import { Button } from "../../../../ui/button"; import { InputProps, TableComponentType } from "../../types"; export default function TableNodeComponent({ diff --git a/src/frontend/src/components/parameterRenderComponent/components/codeAreaComponent/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/codeAreaComponent/index.tsx similarity index 95% rename from src/frontend/src/components/parameterRenderComponent/components/codeAreaComponent/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/codeAreaComponent/index.tsx index 80ae2ee95..068202291 100644 --- a/src/frontend/src/components/parameterRenderComponent/components/codeAreaComponent/index.tsx +++ b/src/frontend/src/components/core/parameterRenderComponent/components/codeAreaComponent/index.tsx @@ -1,8 +1,8 @@ import { GRADIENT_CLASS } from "@/constants/constants"; import CodeAreaModal from "@/modals/codeAreaModal"; -import { cn } from "../../../../utils/utils"; -import IconComponent from "../../../genericIconComponent"; -import { Button } from "../../../ui/button"; +import { cn } from "../../../../../utils/utils"; +import IconComponent from "../../../../common/genericIconComponent"; +import { Button } from "../../../../ui/button"; import { getPlaceholder } from "../../helpers/get-placeholder-disabled"; import { InputProps } from "../../types"; diff --git a/src/frontend/src/components/parameterRenderComponent/components/dictComponent/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/dictComponent/index.tsx similarity index 85% rename from src/frontend/src/components/parameterRenderComponent/components/dictComponent/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/dictComponent/index.tsx index 728d5ac27..5ae20db39 100644 --- a/src/frontend/src/components/parameterRenderComponent/components/dictComponent/index.tsx +++ b/src/frontend/src/components/core/parameterRenderComponent/components/dictComponent/index.tsx @@ -1,10 +1,10 @@ import { useEffect } from "react"; import { ICON_STROKE_WIDTH } from "@/constants/constants"; -import DictAreaModal from "../../../../modals/dictAreaModal"; -import { classNames, cn, toTitleCase } from "../../../../utils/utils"; -import ForwardedIconComponent from "../../../genericIconComponent"; -import { Button } from "../../../ui/button"; +import DictAreaModal from "../../../../../modals/dictAreaModal"; +import { classNames, cn, toTitleCase } from "../../../../../utils/utils"; +import ForwardedIconComponent from "../../../../common/genericIconComponent"; +import { Button } from "../../../../ui/button"; import { InputProps } from "../../types"; export default function DictComponent({ diff --git a/src/frontend/src/components/parameterRenderComponent/components/dropdownComponent/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/dropdownComponent/index.tsx similarity index 100% rename from src/frontend/src/components/parameterRenderComponent/components/dropdownComponent/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/dropdownComponent/index.tsx diff --git a/src/frontend/src/components/parameterRenderComponent/components/emptyParameterComponent/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/emptyParameterComponent/index.tsx similarity index 100% rename from src/frontend/src/components/parameterRenderComponent/components/emptyParameterComponent/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/emptyParameterComponent/index.tsx diff --git a/src/frontend/src/components/parameterRenderComponent/components/floatComponent/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/floatComponent/index.tsx similarity index 97% rename from src/frontend/src/components/parameterRenderComponent/components/floatComponent/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/floatComponent/index.tsx index d23945b66..a37eb9cf9 100644 --- a/src/frontend/src/components/parameterRenderComponent/components/floatComponent/index.tsx +++ b/src/frontend/src/components/core/parameterRenderComponent/components/floatComponent/index.tsx @@ -8,7 +8,7 @@ import { } from "@chakra-ui/number-input"; import { MinusIcon, PlusIcon } from "lucide-react"; import { useEffect, useRef, useState } from "react"; -import { handleKeyDown } from "../../../../utils/reactflowUtils"; +import { handleKeyDown } from "../../../../../utils/reactflowUtils"; import { FloatComponentType, InputProps } from "../../types"; export default function FloatComponent({ diff --git a/src/frontend/src/components/inputComponent/components/helpers/get-icon-name.ts b/src/frontend/src/components/core/parameterRenderComponent/components/inputComponent/components/helpers/get-icon-name.ts similarity index 100% rename from src/frontend/src/components/inputComponent/components/helpers/get-icon-name.ts rename to src/frontend/src/components/core/parameterRenderComponent/components/inputComponent/components/helpers/get-icon-name.ts diff --git a/src/frontend/src/components/inputComponent/components/helpers/get-input-class-name.ts b/src/frontend/src/components/core/parameterRenderComponent/components/inputComponent/components/helpers/get-input-class-name.ts similarity index 100% rename from src/frontend/src/components/inputComponent/components/helpers/get-input-class-name.ts rename to src/frontend/src/components/core/parameterRenderComponent/components/inputComponent/components/helpers/get-input-class-name.ts diff --git a/src/frontend/src/components/inputComponent/components/popover/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/inputComponent/components/popover/index.tsx similarity index 99% rename from src/frontend/src/components/inputComponent/components/popover/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/inputComponent/components/popover/index.tsx index 5a071f388..75ed3d5a5 100644 --- a/src/frontend/src/components/inputComponent/components/popover/index.tsx +++ b/src/frontend/src/components/core/parameterRenderComponent/components/inputComponent/components/popover/index.tsx @@ -1,4 +1,4 @@ -import ForwardedIconComponent from "@/components/genericIconComponent"; +import ForwardedIconComponent from "@/components/common/genericIconComponent"; import { Badge } from "@/components/ui/badge"; import { Command, diff --git a/src/frontend/src/components/inputComponent/components/popoverObject/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/inputComponent/components/popoverObject/index.tsx similarity index 95% rename from src/frontend/src/components/inputComponent/components/popoverObject/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/inputComponent/components/popoverObject/index.tsx index fffd1c196..75a4f21d7 100644 --- a/src/frontend/src/components/inputComponent/components/popoverObject/index.tsx +++ b/src/frontend/src/components/core/parameterRenderComponent/components/inputComponent/components/popoverObject/index.tsx @@ -1,19 +1,19 @@ -import { PopoverAnchor } from "@radix-ui/react-popover"; -import { classNames, cn } from "../../../../utils/utils"; -import ForwardedIconComponent from "../../../genericIconComponent"; +import ForwardedIconComponent from "@/components/common/genericIconComponent"; import { Command, CommandGroup, CommandInput, CommandItem, CommandList, -} from "../../../ui/command"; -import { Input } from "../../../ui/input"; +} from "@/components/ui/command"; +import { Input } from "@/components/ui/input"; import { Popover, PopoverContent, PopoverContentWithoutPortal, -} from "../../../ui/popover"; +} from "@/components/ui/popover"; +import { classNames, cn } from "@/utils/utils"; +import { PopoverAnchor } from "@radix-ui/react-popover"; const CustomInputPopoverObject = ({ id, refInput, diff --git a/src/frontend/src/components/inputComponent/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/inputComponent/index.tsx similarity index 96% rename from src/frontend/src/components/inputComponent/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/inputComponent/index.tsx index a4e86b4cf..bd5258693 100644 --- a/src/frontend/src/components/inputComponent/index.tsx +++ b/src/frontend/src/components/core/parameterRenderComponent/components/inputComponent/index.tsx @@ -1,11 +1,11 @@ +import ForwardedIconComponent from "@/components/common/genericIconComponent"; +import { Input } from "@/components/ui/input"; import { ICON_STROKE_WIDTH } from "@/constants/constants"; +import { InputComponentType } from "@/types/components"; +import { handleKeyDown } from "@/utils/reactflowUtils"; +import { classNames, cn } from "@/utils/utils"; import * as Form from "@radix-ui/react-form"; import { useEffect, useRef, useState } from "react"; -import { InputComponentType } from "../../types/components"; -import { handleKeyDown } from "../../utils/reactflowUtils"; -import { classNames, cn } from "../../utils/utils"; -import ForwardedIconComponent from "../genericIconComponent"; -import { Input } from "../ui/input"; import { getIconName } from "./components/helpers/get-icon-name"; import CustomInputPopover from "./components/popover"; import CustomInputPopoverObject from "./components/popoverObject"; diff --git a/src/frontend/src/components/parameterRenderComponent/components/inputFileComponent/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/inputFileComponent/index.tsx similarity index 93% rename from src/frontend/src/components/parameterRenderComponent/components/inputFileComponent/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/inputFileComponent/index.tsx index 67f195d71..28eabb240 100644 --- a/src/frontend/src/components/parameterRenderComponent/components/inputFileComponent/index.tsx +++ b/src/frontend/src/components/core/parameterRenderComponent/components/inputFileComponent/index.tsx @@ -6,11 +6,11 @@ import { useEffect } from "react"; import { CONSOLE_ERROR_MSG, INVALID_FILE_ALERT, -} from "../../../../constants/alerts_constants"; -import useAlertStore from "../../../../stores/alertStore"; -import useFlowsManagerStore from "../../../../stores/flowsManagerStore"; -import IconComponent from "../../../genericIconComponent"; -import { Button } from "../../../ui/button"; +} from "../../../../../constants/alerts_constants"; +import useAlertStore from "../../../../../stores/alertStore"; +import useFlowsManagerStore from "../../../../../stores/flowsManagerStore"; +import IconComponent from "../../../../common/genericIconComponent"; +import { Button } from "../../../../ui/button"; import { FileComponentType, InputProps } from "../../types"; export default function InputFileComponent({ diff --git a/src/frontend/src/components/parameterRenderComponent/components/inputGlobalComponent/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/inputGlobalComponent/index.tsx similarity index 91% rename from src/frontend/src/components/parameterRenderComponent/components/inputGlobalComponent/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/inputGlobalComponent/index.tsx index 560382b18..8decc5aaa 100644 --- a/src/frontend/src/components/parameterRenderComponent/components/inputGlobalComponent/index.tsx +++ b/src/frontend/src/components/core/parameterRenderComponent/components/inputGlobalComponent/index.tsx @@ -3,15 +3,15 @@ import { useGetGlobalVariables, } from "@/controllers/API/queries/variables"; import { useEffect } from "react"; -import DeleteConfirmationModal from "../../../../modals/deleteConfirmationModal"; -import useAlertStore from "../../../../stores/alertStore"; -import { cn } from "../../../../utils/utils"; +import DeleteConfirmationModal from "../../../../../modals/deleteConfirmationModal"; +import useAlertStore from "../../../../../stores/alertStore"; +import { cn } from "../../../../../utils/utils"; +import ForwardedIconComponent from "../../../../common/genericIconComponent"; +import { CommandItem } from "../../../../ui/command"; import GlobalVariableModal from "../../../GlobalVariableModal/GlobalVariableModal"; -import ForwardedIconComponent from "../../../genericIconComponent"; -import InputComponent from "../../../inputComponent"; -import { CommandItem } from "../../../ui/command"; import { getPlaceholder } from "../../helpers/get-placeholder-disabled"; import { InputGlobalComponentType, InputProps } from "../../types"; +import InputComponent from "../inputComponent"; export default function InputGlobalComponent({ disabled, diff --git a/src/frontend/src/components/parameterRenderComponent/components/inputListComponent/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/inputListComponent/index.tsx similarity index 94% rename from src/frontend/src/components/parameterRenderComponent/components/inputListComponent/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/inputListComponent/index.tsx index 5905a4683..6984feab4 100644 --- a/src/frontend/src/components/parameterRenderComponent/components/inputListComponent/index.tsx +++ b/src/frontend/src/components/core/parameterRenderComponent/components/inputListComponent/index.tsx @@ -2,10 +2,10 @@ import { useEffect } from "react"; import { ICON_STROKE_WIDTH } from "@/constants/constants"; import _ from "lodash"; -import { classNames, cn } from "../../../../utils/utils"; -import IconComponent from "../../../genericIconComponent"; -import { Button } from "../../../ui/button"; -import { Input } from "../../../ui/input"; +import { classNames, cn } from "../../../../../utils/utils"; +import IconComponent from "../../../../common/genericIconComponent"; +import { Button } from "../../../../ui/button"; +import { Input } from "../../../../ui/input"; import { getPlaceholder } from "../../helpers/get-placeholder-disabled"; import { InputListComponentType, InputProps } from "../../types"; diff --git a/src/frontend/src/components/parameterRenderComponent/components/intComponent/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/intComponent/index.tsx similarity index 98% rename from src/frontend/src/components/parameterRenderComponent/components/intComponent/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/intComponent/index.tsx index 45f0d9a5f..4570c3529 100644 --- a/src/frontend/src/components/parameterRenderComponent/components/intComponent/index.tsx +++ b/src/frontend/src/components/core/parameterRenderComponent/components/intComponent/index.tsx @@ -9,7 +9,7 @@ import { } from "@chakra-ui/number-input"; import { MinusIcon, PlusIcon } from "lucide-react"; import { useEffect, useRef, useState } from "react"; -import { handleKeyDown } from "../../../../utils/reactflowUtils"; +import { handleKeyDown } from "../../../../../utils/reactflowUtils"; import { InputProps, IntComponentType } from "../../types"; export default function IntComponent({ diff --git a/src/frontend/src/components/parameterRenderComponent/components/keypairListComponent/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/keypairListComponent/index.tsx similarity index 98% rename from src/frontend/src/components/parameterRenderComponent/components/keypairListComponent/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/keypairListComponent/index.tsx index 82ac85cd0..b49aed78b 100644 --- a/src/frontend/src/components/parameterRenderComponent/components/keypairListComponent/index.tsx +++ b/src/frontend/src/components/core/parameterRenderComponent/components/keypairListComponent/index.tsx @@ -8,7 +8,7 @@ import { import { cn } from "@/utils/utils"; import { cloneDeep } from "lodash"; import React, { useEffect, useState } from "react"; -import IconComponent from "../../../genericIconComponent"; +import IconComponent from "../../../../common/genericIconComponent"; const KeypairListComponent = ({ value, diff --git a/src/frontend/src/components/parameterRenderComponent/components/linkComponent/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/linkComponent/index.tsx similarity index 88% rename from src/frontend/src/components/parameterRenderComponent/components/linkComponent/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/linkComponent/index.tsx index 95a8b72d0..fdfd4fe5f 100644 --- a/src/frontend/src/components/parameterRenderComponent/components/linkComponent/index.tsx +++ b/src/frontend/src/components/core/parameterRenderComponent/components/linkComponent/index.tsx @@ -1,6 +1,6 @@ -import { classNames } from "../../../../utils/utils"; -import IconComponent from "../../../genericIconComponent"; -import { Button } from "../../../ui/button"; +import { classNames } from "../../../../../utils/utils"; +import IconComponent from "../../../../common/genericIconComponent"; +import { Button } from "../../../../ui/button"; import { InputProps, LinkComponentType } from "../../types"; const DEFAULT_ICON = "ExternalLink"; diff --git a/src/frontend/src/components/parameterRenderComponent/components/multiselectComponent/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/multiselectComponent/index.tsx similarity index 95% rename from src/frontend/src/components/parameterRenderComponent/components/multiselectComponent/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/multiselectComponent/index.tsx index 0bbba80a3..5b14afa7a 100644 --- a/src/frontend/src/components/parameterRenderComponent/components/multiselectComponent/index.tsx +++ b/src/frontend/src/components/core/parameterRenderComponent/components/multiselectComponent/index.tsx @@ -1,23 +1,23 @@ import { PopoverAnchor } from "@radix-ui/react-popover"; import Fuse from "fuse.js"; import { useEffect, useRef, useState } from "react"; -import { cn } from "../../../../utils/utils"; -import { default as ForwardedIconComponent } from "../../../genericIconComponent"; -import ShadTooltip from "../../../shadTooltipComponent"; -import { Button } from "../../../ui/button"; +import { cn } from "../../../../../utils/utils"; +import { default as ForwardedIconComponent } from "../../../../common/genericIconComponent"; +import ShadTooltip from "../../../../common/shadTooltipComponent"; +import { Button } from "../../../../ui/button"; import { Command, CommandEmpty, CommandGroup, CommandItem, CommandList, -} from "../../../ui/command"; +} from "../../../../ui/command"; import { Popover, PopoverContent, PopoverContentWithoutPortal, PopoverTrigger, -} from "../../../ui/popover"; +} from "../../../../ui/popover"; import { InputProps, MultiselectComponentType } from "../../types"; export default function MultiselectComponent({ diff --git a/src/frontend/src/components/parameterRenderComponent/components/promptComponent/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/promptComponent/index.tsx similarity index 95% rename from src/frontend/src/components/parameterRenderComponent/components/promptComponent/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/promptComponent/index.tsx index 0ffcccdd5..e8da54b77 100644 --- a/src/frontend/src/components/parameterRenderComponent/components/promptComponent/index.tsx +++ b/src/frontend/src/components/core/parameterRenderComponent/components/promptComponent/index.tsx @@ -1,8 +1,8 @@ import { GRADIENT_CLASS } from "@/constants/constants"; import PromptModal from "@/modals/promptModal"; -import { cn } from "../../../../utils/utils"; -import IconComponent from "../../../genericIconComponent"; -import { Button } from "../../../ui/button"; +import { cn } from "../../../../../utils/utils"; +import IconComponent from "../../../../common/genericIconComponent"; +import { Button } from "../../../../ui/button"; import { getPlaceholder } from "../../helpers/get-placeholder-disabled"; import { InputProps, PromptAreaComponentType } from "../../types"; diff --git a/src/frontend/src/components/parameterRenderComponent/components/refreshParameterComponent/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/refreshParameterComponent/index.tsx similarity index 100% rename from src/frontend/src/components/parameterRenderComponent/components/refreshParameterComponent/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/refreshParameterComponent/index.tsx diff --git a/src/frontend/src/components/sliderComponent/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/sliderComponent/index.tsx similarity index 95% rename from src/frontend/src/components/sliderComponent/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/sliderComponent/index.tsx index 6455a9fcc..5a835b78f 100644 --- a/src/frontend/src/components/sliderComponent/index.tsx +++ b/src/frontend/src/components/core/parameterRenderComponent/components/sliderComponent/index.tsx @@ -1,12 +1,12 @@ +import IconComponent from "@/components/common/genericIconComponent"; +import { getMinOrMaxValue } from "@/components/core/parameterRenderComponent/components/sliderComponent/utils/get-min-max-value"; +import { InputProps } from "@/components/core/parameterRenderComponent/types"; import { Case } from "@/shared/components/caseComponent"; import { useDarkStore } from "@/stores/darkStore"; +import { SliderComponentType } from "@/types/components"; import * as SliderPrimitive from "@radix-ui/react-slider"; import clsx from "clsx"; import { useEffect } from "react"; -import { SliderComponentType } from "../../types/components"; -import IconComponent from "../genericIconComponent"; -import { InputProps } from "../parameterRenderComponent/types"; -import { getMinOrMaxValue } from "./utils/get-min-max-value"; const THRESHOLDS = [0.25, 0.5, 0.75, 1]; const BACKGROUND_COLORS = ["#4f46e5", "#7c3aed", "#a21caf", "#c026d3"]; diff --git a/src/frontend/src/components/sliderComponent/utils/get-min-max-value.ts b/src/frontend/src/components/core/parameterRenderComponent/components/sliderComponent/utils/get-min-max-value.ts similarity index 100% rename from src/frontend/src/components/sliderComponent/utils/get-min-max-value.ts rename to src/frontend/src/components/core/parameterRenderComponent/components/sliderComponent/utils/get-min-max-value.ts diff --git a/src/frontend/src/components/parameterRenderComponent/components/strRenderComponent/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/strRenderComponent/index.tsx similarity index 100% rename from src/frontend/src/components/parameterRenderComponent/components/strRenderComponent/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/strRenderComponent/index.tsx diff --git a/src/frontend/src/components/tableComponent/components/ResetColumns/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/tableComponent/components/ResetColumns/index.tsx similarity index 100% rename from src/frontend/src/components/tableComponent/components/ResetColumns/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/tableComponent/components/ResetColumns/index.tsx diff --git a/src/frontend/src/components/tableComponent/components/TableOptions/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/tableComponent/components/TableOptions/index.tsx similarity index 92% rename from src/frontend/src/components/tableComponent/components/TableOptions/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/tableComponent/components/TableOptions/index.tsx index f73b23bb0..9a446227b 100644 --- a/src/frontend/src/components/tableComponent/components/TableOptions/index.tsx +++ b/src/frontend/src/components/core/parameterRenderComponent/components/tableComponent/components/TableOptions/index.tsx @@ -1,7 +1,7 @@ -import { cn } from "../../../../utils/utils"; -import IconComponent from "../../../genericIconComponent"; -import ShadTooltip from "../../../shadTooltipComponent"; -import { Button } from "../../../ui/button"; +import IconComponent from "@/components/common/genericIconComponent"; +import ShadTooltip from "@/components/common/shadTooltipComponent"; +import { Button } from "@/components/ui/button"; +import { cn } from "@/utils/utils"; export default function TableOptions({ resetGrid, diff --git a/src/frontend/src/components/tableComponent/components/loadingOverlay/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/tableComponent/components/loadingOverlay/index.tsx similarity index 100% rename from src/frontend/src/components/tableComponent/components/loadingOverlay/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/tableComponent/components/loadingOverlay/index.tsx diff --git a/src/frontend/src/components/tableComponent/components/tableAdvancedToggleCellRender/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/tableComponent/components/tableAdvancedToggleCellRender/index.tsx similarity index 89% rename from src/frontend/src/components/tableComponent/components/tableAdvancedToggleCellRender/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/tableComponent/components/tableAdvancedToggleCellRender/index.tsx index 09b9d2c22..48f1c9b37 100644 --- a/src/frontend/src/components/tableComponent/components/tableAdvancedToggleCellRender/index.tsx +++ b/src/frontend/src/components/core/parameterRenderComponent/components/tableComponent/components/tableAdvancedToggleCellRender/index.tsx @@ -1,9 +1,9 @@ import useHandleOnNewValue from "@/CustomNodes/hooks/use-handle-new-value"; -import ShadTooltip from "@/components/shadTooltipComponent"; +import ShadTooltip from "@/components/common/shadTooltipComponent"; import useFlowStore from "@/stores/flowStore"; import { isTargetHandleConnected } from "@/utils/reactflowUtils"; import { CustomCellRendererProps } from "ag-grid-react"; -import ToggleShadComponent from "../../../parameterRenderComponent/components/toggleShadComponent"; +import ToggleShadComponent from "../../../toggleShadComponent"; export default function TableAdvancedToggleCellRender({ value: { nodeId, parameterId }, diff --git a/src/frontend/src/components/tableComponent/components/tableAutoCellRender/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/tableComponent/components/tableAutoCellRender/index.tsx similarity index 84% rename from src/frontend/src/components/tableComponent/components/tableAutoCellRender/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/tableComponent/components/tableAutoCellRender/index.tsx index fff408ba6..26d252a3b 100644 --- a/src/frontend/src/components/tableComponent/components/tableAutoCellRender/index.tsx +++ b/src/frontend/src/components/core/parameterRenderComponent/components/tableComponent/components/tableAutoCellRender/index.tsx @@ -1,10 +1,10 @@ +import NumberReader from "@/components/common/numberReader"; +import ObjectRender from "@/components/common/objectRender"; +import StringReader from "@/components/common/stringReaderComponent"; +import DateReader from "@/components/core/dateReaderComponent"; +import { Badge } from "@/components/ui/badge"; +import { cn, isTimeStampString } from "@/utils/utils"; import { CustomCellRendererProps } from "ag-grid-react"; -import { cn, isTimeStampString } from "../../../../utils/utils"; -import DateReader from "../../../dateReaderComponent"; -import NumberReader from "../../../numberReader"; -import ObjectRender from "../../../objectRender"; -import StringReader from "../../../stringReaderComponent"; -import { Badge } from "../../../ui/badge"; interface CustomCellRender extends CustomCellRendererProps { formatter?: "json" | "text"; diff --git a/src/frontend/src/components/tableComponent/components/tableNodeCellRender/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/tableComponent/components/tableNodeCellRender/index.tsx similarity index 88% rename from src/frontend/src/components/tableComponent/components/tableNodeCellRender/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/tableComponent/components/tableNodeCellRender/index.tsx index 9b6275700..a8949b292 100644 --- a/src/frontend/src/components/tableComponent/components/tableNodeCellRender/index.tsx +++ b/src/frontend/src/components/core/parameterRenderComponent/components/tableComponent/components/tableNodeCellRender/index.tsx @@ -1,10 +1,10 @@ import useHandleOnNewValue from "@/CustomNodes/hooks/use-handle-new-value"; import useHandleNodeClass from "@/CustomNodes/hooks/use-handle-node-class"; -import { ParameterRenderComponent } from "@/components/parameterRenderComponent"; +import { ParameterRenderComponent } from "@/components/core/parameterRenderComponent"; +import useFlowStore from "@/stores/flowStore"; import { useTweaksStore } from "@/stores/tweaksStore"; +import { isTargetHandleConnected } from "@/utils/reactflowUtils"; import { CustomCellRendererProps } from "ag-grid-react"; -import useFlowStore from "../../../../stores/flowStore"; -import { isTargetHandleConnected } from "../../../../utils/reactflowUtils"; export default function TableNodeCellRender({ value: { nodeId, parameterId, isTweaks }, diff --git a/src/frontend/src/components/tableComponent/components/tableTooltipRender/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/tableComponent/components/tableTooltipRender/index.tsx similarity index 100% rename from src/frontend/src/components/tableComponent/components/tableTooltipRender/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/tableComponent/components/tableTooltipRender/index.tsx diff --git a/src/frontend/src/components/tableComponent/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/tableComponent/index.tsx similarity index 95% rename from src/frontend/src/components/tableComponent/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/tableComponent/index.tsx index 6eb138d97..6ac83c87e 100644 --- a/src/frontend/src/components/tableComponent/index.tsx +++ b/src/frontend/src/components/core/parameterRenderComponent/components/tableComponent/index.tsx @@ -1,20 +1,20 @@ +import ForwardedIconComponent from "@/components/common/genericIconComponent"; +import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; +import { + DEFAULT_TABLE_ALERT_MSG, + DEFAULT_TABLE_ALERT_TITLE, + NO_COLUMN_DEFINITION_ALERT_DESCRIPTION, + NO_COLUMN_DEFINITION_ALERT_TITLE, +} from "@/constants/constants"; +import { useDarkStore } from "@/stores/darkStore"; +import "@/style/ag-theme-shadcn.css"; // Custom CSS applied to the grid +import { cn } from "@/utils/utils"; import { ColDef } from "ag-grid-community"; import "ag-grid-community/styles/ag-grid.css"; // Mandatory CSS required by the grid import "ag-grid-community/styles/ag-theme-quartz.css"; // Optional Theme applied to the grid import { AgGridReact, AgGridReactProps } from "ag-grid-react"; import cloneDeep from "lodash"; import { ElementRef, forwardRef, useRef, useState } from "react"; -import { - DEFAULT_TABLE_ALERT_MSG, - DEFAULT_TABLE_ALERT_TITLE, - NO_COLUMN_DEFINITION_ALERT_DESCRIPTION, - NO_COLUMN_DEFINITION_ALERT_TITLE, -} from "../../constants/constants"; -import { useDarkStore } from "../../stores/darkStore"; -import "../../style/ag-theme-shadcn.css"; // Custom CSS applied to the grid -import { cn } from "../../utils/utils"; -import ForwardedIconComponent from "../genericIconComponent"; -import { Alert, AlertDescription, AlertTitle } from "../ui/alert"; import TableOptions from "./components/TableOptions"; import resetGrid from "./utils/reset-grid-columns"; diff --git a/src/frontend/src/components/tableComponent/utils/reset-grid-columns.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/tableComponent/utils/reset-grid-columns.tsx similarity index 100% rename from src/frontend/src/components/tableComponent/utils/reset-grid-columns.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/tableComponent/utils/reset-grid-columns.tsx diff --git a/src/frontend/src/components/parameterRenderComponent/components/textAreaComponent/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/textAreaComponent/index.tsx similarity index 95% rename from src/frontend/src/components/parameterRenderComponent/components/textAreaComponent/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/textAreaComponent/index.tsx index 67aea3d9e..8d796d369 100644 --- a/src/frontend/src/components/parameterRenderComponent/components/textAreaComponent/index.tsx +++ b/src/frontend/src/components/core/parameterRenderComponent/components/textAreaComponent/index.tsx @@ -1,12 +1,12 @@ -import { getIconName } from "@/components/inputComponent/components/helpers/get-icon-name"; import { GRADIENT_CLASS } from "@/constants/constants"; import ComponentTextModal from "@/modals/textAreaModal"; import { useRef, useState } from "react"; -import { cn } from "../../../../utils/utils"; -import IconComponent from "../../../genericIconComponent"; -import { Input } from "../../../ui/input"; +import { cn } from "../../../../../utils/utils"; +import IconComponent from "../../../../common/genericIconComponent"; +import { Input } from "../../../../ui/input"; import { getPlaceholder } from "../../helpers/get-placeholder-disabled"; import { InputProps, TextAreaComponentType } from "../../types"; +import { getIconName } from "../inputComponent/components/helpers/get-icon-name"; const inputClasses = { base: ({ isFocused, password }: { isFocused: boolean; password: boolean }) => diff --git a/src/frontend/src/components/textInputComponent/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/textInputComponent/index.tsx similarity index 100% rename from src/frontend/src/components/textInputComponent/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/textInputComponent/index.tsx diff --git a/src/frontend/src/components/parameterRenderComponent/components/toggleShadComponent/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/toggleShadComponent/index.tsx similarity index 95% rename from src/frontend/src/components/parameterRenderComponent/components/toggleShadComponent/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/components/toggleShadComponent/index.tsx index 6a8eea4a1..0b42f3990 100644 --- a/src/frontend/src/components/parameterRenderComponent/components/toggleShadComponent/index.tsx +++ b/src/frontend/src/components/core/parameterRenderComponent/components/toggleShadComponent/index.tsx @@ -1,4 +1,4 @@ -import { Switch } from "../../../ui/switch"; +import { Switch } from "../../../../ui/switch"; import { InputProps, ToggleComponentType } from "../../types"; export default function ToggleShadComponent({ diff --git a/src/frontend/src/components/parameterRenderComponent/helpers/get-placeholder-disabled.ts b/src/frontend/src/components/core/parameterRenderComponent/helpers/get-placeholder-disabled.ts similarity index 100% rename from src/frontend/src/components/parameterRenderComponent/helpers/get-placeholder-disabled.ts rename to src/frontend/src/components/core/parameterRenderComponent/helpers/get-placeholder-disabled.ts diff --git a/src/frontend/src/components/parameterRenderComponent/helpers/get-textarea-content-class.ts b/src/frontend/src/components/core/parameterRenderComponent/helpers/get-textarea-content-class.ts similarity index 100% rename from src/frontend/src/components/parameterRenderComponent/helpers/get-textarea-content-class.ts rename to src/frontend/src/components/core/parameterRenderComponent/helpers/get-textarea-content-class.ts diff --git a/src/frontend/src/components/parameterRenderComponent/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/index.tsx similarity index 95% rename from src/frontend/src/components/parameterRenderComponent/index.tsx rename to src/frontend/src/components/core/parameterRenderComponent/index.tsx index 4793bdd59..95bdd0c7f 100644 --- a/src/frontend/src/components/parameterRenderComponent/index.tsx +++ b/src/frontend/src/components/core/parameterRenderComponent/index.tsx @@ -1,10 +1,10 @@ import { handleOnNewValueType } from "@/CustomNodes/hooks/use-handle-new-value"; +import TableNodeComponent from "@/components/core/parameterRenderComponent/components/TableNodeComponent"; +import CodeAreaComponent from "@/components/core/parameterRenderComponent/components/codeAreaComponent"; +import SliderComponent from "@/components/core/parameterRenderComponent/components/sliderComponent"; import { TEXT_FIELD_TYPES } from "@/constants/constants"; import { APIClassType, InputFieldType } from "@/types/api"; import { useMemo } from "react"; -import SliderComponent from "../sliderComponent"; -import TableNodeComponent from "./components/TableNodeComponent"; -import CodeAreaComponent from "./components/codeAreaComponent"; import DictComponent from "./components/dictComponent"; import { EmptyParameterComponent } from "./components/emptyParameterComponent"; import FloatComponent from "./components/floatComponent"; diff --git a/src/frontend/src/components/parameterRenderComponent/types.ts b/src/frontend/src/components/core/parameterRenderComponent/types.ts similarity index 100% rename from src/frontend/src/components/parameterRenderComponent/types.ts rename to src/frontend/src/components/core/parameterRenderComponent/types.ts diff --git a/src/frontend/src/components/pdfViewer/Error/index.tsx b/src/frontend/src/components/core/pdfViewer/Error/index.tsx similarity index 77% rename from src/frontend/src/components/pdfViewer/Error/index.tsx rename to src/frontend/src/components/core/pdfViewer/Error/index.tsx index c0a621664..4b28fbcf2 100644 --- a/src/frontend/src/components/pdfViewer/Error/index.tsx +++ b/src/frontend/src/components/core/pdfViewer/Error/index.tsx @@ -1,5 +1,8 @@ -import { PDFCheckFlow, PDFLoadErrorTitle } from "../../../constants/constants"; -import IconComponent from "../../genericIconComponent"; +import { + PDFCheckFlow, + PDFLoadErrorTitle, +} from "../../../../constants/constants"; +import IconComponent from "../../../common/genericIconComponent"; export default function Error(): JSX.Element { return ( diff --git a/src/frontend/src/components/pdfViewer/index.tsx b/src/frontend/src/components/core/pdfViewer/index.tsx similarity index 97% rename from src/frontend/src/components/pdfViewer/index.tsx rename to src/frontend/src/components/core/pdfViewer/index.tsx index 4c2d2d816..044a15247 100644 --- a/src/frontend/src/components/pdfViewer/index.tsx +++ b/src/frontend/src/components/core/pdfViewer/index.tsx @@ -2,8 +2,8 @@ import { useEffect, useRef, useState } from "react"; import { Document, Page, pdfjs } from "react-pdf"; import "react-pdf/dist/esm/Page/AnnotationLayer.css"; import "react-pdf/dist/esm/Page/TextLayer.css"; -import IconComponent from "../genericIconComponent"; -import Loading from "../ui/loading"; +import IconComponent from "../../common/genericIconComponent"; +import Loading from "../../ui/loading"; import Error from "./Error"; import NoDataPdf from "./noData"; diff --git a/src/frontend/src/components/pdfViewer/noData/index.tsx b/src/frontend/src/components/core/pdfViewer/noData/index.tsx similarity index 85% rename from src/frontend/src/components/pdfViewer/noData/index.tsx rename to src/frontend/src/components/core/pdfViewer/noData/index.tsx index b5edee0bb..133e85183 100644 --- a/src/frontend/src/components/pdfViewer/noData/index.tsx +++ b/src/frontend/src/components/core/pdfViewer/noData/index.tsx @@ -1,4 +1,4 @@ -import { PDFErrorTitle, PDFLoadError } from "../../../constants/constants"; +import { PDFErrorTitle, PDFLoadError } from "../../../../constants/constants"; export default function NoDataPdf(): JSX.Element { return ( diff --git a/src/frontend/src/components/sidebarComponent/index.tsx b/src/frontend/src/components/core/sidebarComponent/index.tsx similarity index 98% rename from src/frontend/src/components/sidebarComponent/index.tsx rename to src/frontend/src/components/core/sidebarComponent/index.tsx index 542c6b2f4..e058d1116 100644 --- a/src/frontend/src/components/sidebarComponent/index.tsx +++ b/src/frontend/src/components/core/sidebarComponent/index.tsx @@ -9,7 +9,7 @@ import { SidebarMenu, SidebarMenuButton, SidebarMenuItem, -} from "../ui/sidebar"; +} from "../../ui/sidebar"; type SideBarButtonsComponentProps = { items: { diff --git a/src/frontend/src/components/textOutputComponent/index.tsx b/src/frontend/src/components/core/textOutputComponent/index.tsx similarity index 100% rename from src/frontend/src/components/textOutputComponent/index.tsx rename to src/frontend/src/components/core/textOutputComponent/index.tsx diff --git a/src/frontend/src/components/flowToolbarComponent/components/playground-button.tsx b/src/frontend/src/components/flowToolbarComponent/components/playground-button.tsx index 261dfe56f..8bc3806e5 100644 --- a/src/frontend/src/components/flowToolbarComponent/components/playground-button.tsx +++ b/src/frontend/src/components/flowToolbarComponent/components/playground-button.tsx @@ -1,5 +1,5 @@ -import ForwardedIconComponent from "@/components/genericIconComponent"; -import ShadTooltip from "@/components/shadTooltipComponent"; +import ForwardedIconComponent from "@/components/common/genericIconComponent"; +import ShadTooltip from "@/components/common/shadTooltipComponent"; import IOModal from "@/modals/IOModal/newModal"; const PlaygroundButton = ({ hasIO, open, setOpen, canvasOpen }) => { diff --git a/src/frontend/src/components/ui/accordion.tsx b/src/frontend/src/components/ui/accordion.tsx index d7862e1e5..0e04d6f3f 100644 --- a/src/frontend/src/components/ui/accordion.tsx +++ b/src/frontend/src/components/ui/accordion.tsx @@ -4,7 +4,7 @@ import * as AccordionPrimitive from "@radix-ui/react-accordion"; import { ChevronDownIcon } from "@radix-ui/react-icons"; import * as React from "react"; import { cn } from "../../utils/utils"; -import ShadTooltip from "../shadTooltipComponent"; +import ShadTooltip from "../common/shadTooltipComponent"; const Accordion = AccordionPrimitive.Root; diff --git a/src/frontend/src/components/ui/button.tsx b/src/frontend/src/components/ui/button.tsx index 0e190a42e..2c9d0a14c 100644 --- a/src/frontend/src/components/ui/button.tsx +++ b/src/frontend/src/components/ui/button.tsx @@ -2,7 +2,7 @@ import { Slot } from "@radix-ui/react-slot"; import { cva, type VariantProps } from "class-variance-authority"; import * as React from "react"; import { cn } from "../../utils/utils"; -import ForwardedIconComponent from "../genericIconComponent"; +import ForwardedIconComponent from "../common/genericIconComponent"; const buttonVariants = cva( "noflow nowheel nopan nodelete nodrag inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-100 disabled:disabled-state [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", diff --git a/src/frontend/src/components/ui/checkbox.tsx b/src/frontend/src/components/ui/checkbox.tsx index f673c5933..a4740184e 100644 --- a/src/frontend/src/components/ui/checkbox.tsx +++ b/src/frontend/src/components/ui/checkbox.tsx @@ -3,7 +3,7 @@ import * as CheckboxPrimitive from "@radix-ui/react-checkbox"; import * as React from "react"; import { cn } from "../../utils/utils"; -import IconComponent from "../genericIconComponent"; +import IconComponent from "../common/genericIconComponent"; const Checkbox = React.forwardRef< React.ElementRef, diff --git a/src/frontend/src/components/ui/dialog.tsx b/src/frontend/src/components/ui/dialog.tsx index c823595fa..37b8789c9 100644 --- a/src/frontend/src/components/ui/dialog.tsx +++ b/src/frontend/src/components/ui/dialog.tsx @@ -2,7 +2,7 @@ import * as DialogPrimitive from "@radix-ui/react-dialog"; import { Cross2Icon } from "@radix-ui/react-icons"; import * as React from "react"; import { cn } from "../../utils/utils"; -import ShadTooltip from "../shadTooltipComponent"; +import ShadTooltip from "../common/shadTooltipComponent"; const Dialog = DialogPrimitive.Root; diff --git a/src/frontend/src/components/ui/dropdown-menu.tsx b/src/frontend/src/components/ui/dropdown-menu.tsx index 0f81e59c5..fc6a315d1 100644 --- a/src/frontend/src/components/ui/dropdown-menu.tsx +++ b/src/frontend/src/components/ui/dropdown-menu.tsx @@ -3,7 +3,7 @@ import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"; import * as React from "react"; import { cn } from "../../utils/utils"; -import IconComponent from "../genericIconComponent"; +import IconComponent from "../common/genericIconComponent"; const DropdownMenu = DropdownMenuPrimitive.Root; diff --git a/src/frontend/src/components/ui/input.tsx b/src/frontend/src/components/ui/input.tsx index 3d6915b00..9452fcb0c 100644 --- a/src/frontend/src/components/ui/input.tsx +++ b/src/frontend/src/components/ui/input.tsx @@ -1,6 +1,6 @@ import * as React from "react"; import { cn } from "../../utils/utils"; -import ForwardedIconComponent from "../genericIconComponent"; +import ForwardedIconComponent from "../common/genericIconComponent"; export interface InputProps extends React.InputHTMLAttributes { diff --git a/src/frontend/src/components/ui/menubar.tsx b/src/frontend/src/components/ui/menubar.tsx index e71efe5e9..08af45e52 100644 --- a/src/frontend/src/components/ui/menubar.tsx +++ b/src/frontend/src/components/ui/menubar.tsx @@ -4,7 +4,7 @@ import * as MenubarPrimitive from "@radix-ui/react-menubar"; import * as React from "react"; import { cn } from "../../utils/utils"; -import IconComponent from "../genericIconComponent"; +import IconComponent from "../common/genericIconComponent"; const MenubarMenu = MenubarPrimitive.Menu; diff --git a/src/frontend/src/components/ui/refreshButton.tsx b/src/frontend/src/components/ui/refreshButton.tsx index 09eb9cf7b..f0797f5d3 100644 --- a/src/frontend/src/components/ui/refreshButton.tsx +++ b/src/frontend/src/components/ui/refreshButton.tsx @@ -1,6 +1,6 @@ import { ICON_STROKE_WIDTH } from "@/constants/constants"; -import IconComponent from "../../components/genericIconComponent"; import { cn } from "../../utils/utils"; +import IconComponent from "../common/genericIconComponent"; import { Button } from "./button"; function RefreshButton({ diff --git a/src/frontend/src/components/ui/sidebar.tsx b/src/frontend/src/components/ui/sidebar.tsx index 977fbb4e8..4563a45b2 100644 --- a/src/frontend/src/components/ui/sidebar.tsx +++ b/src/frontend/src/components/ui/sidebar.tsx @@ -7,7 +7,7 @@ import * as React from "react"; import { useIsMobile } from "@/hooks/use-mobile"; import { cn } from "../../utils/utils"; -import ShadTooltip from "../shadTooltipComponent"; +import ShadTooltip from "../common/shadTooltipComponent"; import { Button } from "./button"; import { Input } from "./input"; import { Separator } from "./separator"; diff --git a/src/frontend/src/contexts/index.tsx b/src/frontend/src/contexts/index.tsx index 39c669fc7..8ad3aa7e1 100644 --- a/src/frontend/src/contexts/index.tsx +++ b/src/frontend/src/contexts/index.tsx @@ -1,4 +1,4 @@ -import { GradientWrapper } from "@/components/GradientWrapper"; +import { GradientWrapper } from "@/components/common/GradientWrapper"; import { CustomWrapper } from "@/customization/custom-wrapper"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { ReactNode } from "react"; diff --git a/src/frontend/src/customization/components/custom-parameter.tsx b/src/frontend/src/customization/components/custom-parameter.tsx index eb0bc99f6..ff7a095ae 100644 --- a/src/frontend/src/customization/components/custom-parameter.tsx +++ b/src/frontend/src/customization/components/custom-parameter.tsx @@ -1,4 +1,4 @@ -import { ParameterRenderComponent } from "@/components/parameterRenderComponent"; +import { ParameterRenderComponent } from "@/components/core/parameterRenderComponent"; import { handleOnNewValueType } from "@/CustomNodes/hooks/use-handle-new-value"; import { APIClassType, InputFieldType } from "@/types/api"; import { cn } from "@/utils/utils"; diff --git a/src/frontend/src/icons/GradientSparkles/index.tsx b/src/frontend/src/icons/GradientSparkles/index.tsx index 33bf7f988..0cb6b3f43 100644 --- a/src/frontend/src/icons/GradientSparkles/index.tsx +++ b/src/frontend/src/icons/GradientSparkles/index.tsx @@ -1,6 +1,6 @@ import { Code } from "lucide-react"; import { forwardRef } from "react"; -import ForwardedIconComponent from "../../components/genericIconComponent"; +import ForwardedIconComponent from "../../components/common/genericIconComponent"; export const GradientInfinity = forwardRef< SVGSVGElement, diff --git a/src/frontend/src/modals/IOModal/components/IOFieldView/components/FileInput/index.tsx b/src/frontend/src/modals/IOModal/components/IOFieldView/components/FileInput/index.tsx index 67526aac0..100260cc7 100644 --- a/src/frontend/src/modals/IOModal/components/IOFieldView/components/FileInput/index.tsx +++ b/src/frontend/src/modals/IOModal/components/IOFieldView/components/FileInput/index.tsx @@ -5,7 +5,7 @@ import { createFileUpload } from "@/helpers/create-file-upload"; import useFileSizeValidator from "@/shared/hooks/use-file-size-validator"; import useAlertStore from "@/stores/alertStore"; import { useEffect, useState } from "react"; -import IconComponent from "../../../../../../components/genericIconComponent"; +import IconComponent from "../../../../../../components/common/genericIconComponent"; import { ALLOWED_IMAGE_INPUT_EXTENSIONS, BASE_URL_API, diff --git a/src/frontend/src/modals/IOModal/components/IOFieldView/components/keyPairInput/index.tsx b/src/frontend/src/modals/IOModal/components/IOFieldView/components/keyPairInput/index.tsx index 2e95e78ef..0b5244b5f 100644 --- a/src/frontend/src/modals/IOModal/components/IOFieldView/components/keyPairInput/index.tsx +++ b/src/frontend/src/modals/IOModal/components/IOFieldView/components/keyPairInput/index.tsx @@ -1,6 +1,6 @@ import _ from "lodash"; import { useRef } from "react"; -import IconComponent from "../../../../../../components/genericIconComponent"; +import IconComponent from "../../../../../../components/common/genericIconComponent"; import { Input } from "../../../../../../components/ui/input"; import { classNames } from "../../../../../../utils/utils"; diff --git a/src/frontend/src/modals/IOModal/components/IOFieldView/components/sessionSelector/index.tsx b/src/frontend/src/modals/IOModal/components/IOFieldView/components/sessionSelector/index.tsx index 0e489737b..2294d61cf 100644 --- a/src/frontend/src/modals/IOModal/components/IOFieldView/components/sessionSelector/index.tsx +++ b/src/frontend/src/modals/IOModal/components/IOFieldView/components/sessionSelector/index.tsx @@ -1,5 +1,5 @@ -import IconComponent from "@/components/genericIconComponent"; -import ShadTooltip from "@/components/shadTooltipComponent"; +import IconComponent from "@/components/common/genericIconComponent"; +import ShadTooltip from "@/components/common/shadTooltipComponent"; import { Badge } from "@/components/ui/badge"; import { Input } from "@/components/ui/input"; import { diff --git a/src/frontend/src/modals/IOModal/components/IOFieldView/components/sessionSelector/newSessionSelector.tsx b/src/frontend/src/modals/IOModal/components/IOFieldView/components/sessionSelector/newSessionSelector.tsx index b6051de38..f6de50d7b 100644 --- a/src/frontend/src/modals/IOModal/components/IOFieldView/components/sessionSelector/newSessionSelector.tsx +++ b/src/frontend/src/modals/IOModal/components/IOFieldView/components/sessionSelector/newSessionSelector.tsx @@ -1,5 +1,5 @@ -import IconComponent from "@/components/genericIconComponent"; -import ShadTooltip from "@/components/shadTooltipComponent"; +import IconComponent from "@/components/common/genericIconComponent"; +import ShadTooltip from "@/components/common/shadTooltipComponent"; import { Badge } from "@/components/ui/badge"; import { Input } from "@/components/ui/input"; import { diff --git a/src/frontend/src/modals/IOModal/components/IOFieldView/index.tsx b/src/frontend/src/modals/IOModal/components/IOFieldView/index.tsx index f106b7709..972c2ba80 100644 --- a/src/frontend/src/modals/IOModal/components/IOFieldView/index.tsx +++ b/src/frontend/src/modals/IOModal/components/IOFieldView/index.tsx @@ -2,11 +2,11 @@ import useHandleNewValue from "@/CustomNodes/hooks/use-handle-new-value"; import { NodeType } from "@/types/flow"; import { cloneDeep } from "lodash"; import { useState } from "react"; -import ImageViewer from "../../../../components/ImageViewer"; -import CsvOutputComponent from "../../../../components/csvOutputComponent"; -import DataOutputComponent from "../../../../components/dataOutputComponent"; -import InputListComponent from "../../../../components/parameterRenderComponent/components/inputListComponent"; -import PdfViewer from "../../../../components/pdfViewer"; +import ImageViewer from "../../../../components/common/ImageViewer"; +import CsvOutputComponent from "../../../../components/core/csvOutputComponent"; +import DataOutputComponent from "../../../../components/core/dataOutputComponent"; +import InputListComponent from "../../../../components/core/parameterRenderComponent/components/inputListComponent"; +import PdfViewer from "../../../../components/core/pdfViewer"; import { Textarea } from "../../../../components/ui/textarea"; import { PDFViewConstant } from "../../../../constants/constants"; import { diff --git a/src/frontend/src/modals/IOModal/components/SessionView/index.tsx b/src/frontend/src/modals/IOModal/components/SessionView/index.tsx index e3212b690..382eb86ee 100644 --- a/src/frontend/src/modals/IOModal/components/SessionView/index.tsx +++ b/src/frontend/src/modals/IOModal/components/SessionView/index.tsx @@ -7,7 +7,7 @@ import { useIsFetching } from "@tanstack/react-query"; import { NewValueParams, SelectionChangedEvent } from "ag-grid-community"; import cloneDeep from "lodash/cloneDeep"; import { useMemo, useState } from "react"; -import TableComponent from "../../../../components/tableComponent"; +import TableComponent from "../../../../components/core/parameterRenderComponent/components/tableComponent"; import useAlertStore from "../../../../stores/alertStore"; import { useMessagesStore } from "../../../../stores/messagesStore"; import { diff --git a/src/frontend/src/modals/IOModal/components/chatView/chatInput/components/buttonSendWrapper/index.tsx b/src/frontend/src/modals/IOModal/components/chatView/chatInput/components/buttonSendWrapper/index.tsx index bfc7b65c9..c8993dbfe 100644 --- a/src/frontend/src/modals/IOModal/components/chatView/chatInput/components/buttonSendWrapper/index.tsx +++ b/src/frontend/src/modals/IOModal/components/chatView/chatInput/components/buttonSendWrapper/index.tsx @@ -1,5 +1,5 @@ import useFlowStore from "@/stores/flowStore"; -import IconComponent from "../../../../../../../components/genericIconComponent"; +import IconComponent from "../../../../../../../components/common/genericIconComponent"; import { Button } from "../../../../../../../components/ui/button"; import { Case } from "../../../../../../../shared/components/caseComponent"; import { FilePreviewType } from "../../../../../../../types/components"; diff --git a/src/frontend/src/modals/IOModal/components/chatView/chatInput/components/uploadFileButton/index.tsx b/src/frontend/src/modals/IOModal/components/chatView/chatInput/components/uploadFileButton/index.tsx index d91ef8bad..c8c4c2f7d 100644 --- a/src/frontend/src/modals/IOModal/components/chatView/chatInput/components/uploadFileButton/index.tsx +++ b/src/frontend/src/modals/IOModal/components/chatView/chatInput/components/uploadFileButton/index.tsx @@ -1,4 +1,4 @@ -import ForwardedIconComponent from "../../../../../../../components/genericIconComponent"; +import ForwardedIconComponent from "../../../../../../../components/common/genericIconComponent"; import { Button } from "../../../../../../../components/ui/button"; const UploadFileButton = ({ diff --git a/src/frontend/src/modals/IOModal/components/chatView/chatInput/components/uploadFileButton/newUploadFileButton.tsx b/src/frontend/src/modals/IOModal/components/chatView/chatInput/components/uploadFileButton/newUploadFileButton.tsx index 22502fb5e..35e649897 100644 --- a/src/frontend/src/modals/IOModal/components/chatView/chatInput/components/uploadFileButton/newUploadFileButton.tsx +++ b/src/frontend/src/modals/IOModal/components/chatView/chatInput/components/uploadFileButton/newUploadFileButton.tsx @@ -1,5 +1,5 @@ -import ShadTooltip from "@/components/shadTooltipComponent"; -import ForwardedIconComponent from "../../../../../../../components/genericIconComponent"; +import ShadTooltip from "@/components/common/shadTooltipComponent"; +import ForwardedIconComponent from "../../../../../../../components/common/genericIconComponent"; import { Button } from "../../../../../../../components/ui/button"; const UploadFileButton = ({ diff --git a/src/frontend/src/modals/IOModal/components/chatView/chatMessage/components/editMessageButton/index.tsx b/src/frontend/src/modals/IOModal/components/chatView/chatMessage/components/editMessageButton/index.tsx index b8f8b8fba..7ac1d04da 100644 --- a/src/frontend/src/modals/IOModal/components/chatView/chatMessage/components/editMessageButton/index.tsx +++ b/src/frontend/src/modals/IOModal/components/chatView/chatMessage/components/editMessageButton/index.tsx @@ -1,4 +1,4 @@ -import IconComponent from "@/components/genericIconComponent"; +import IconComponent from "@/components/common/genericIconComponent"; import { Button } from "@/components/ui/button"; import { ButtonHTMLAttributes } from "react"; diff --git a/src/frontend/src/modals/IOModal/components/chatView/chatMessage/components/editMessageButton/newMessageOptions.tsx b/src/frontend/src/modals/IOModal/components/chatView/chatMessage/components/editMessageButton/newMessageOptions.tsx index dc87c362e..4a6cfb70f 100644 --- a/src/frontend/src/modals/IOModal/components/chatView/chatMessage/components/editMessageButton/newMessageOptions.tsx +++ b/src/frontend/src/modals/IOModal/components/chatView/chatMessage/components/editMessageButton/newMessageOptions.tsx @@ -1,5 +1,5 @@ -import IconComponent from "@/components/genericIconComponent"; -import ShadTooltip from "@/components/shadTooltipComponent"; +import IconComponent from "@/components/common/genericIconComponent"; +import ShadTooltip from "@/components/common/shadTooltipComponent"; import { Button } from "@/components/ui/button"; import { diff --git a/src/frontend/src/modals/IOModal/components/chatView/chatMessage/components/fileCardWrapper/index.tsx b/src/frontend/src/modals/IOModal/components/chatView/chatMessage/components/fileCardWrapper/index.tsx index a9fa4e12b..503e452ae 100644 --- a/src/frontend/src/modals/IOModal/components/chatView/chatMessage/components/fileCardWrapper/index.tsx +++ b/src/frontend/src/modals/IOModal/components/chatView/chatMessage/components/fileCardWrapper/index.tsx @@ -1,5 +1,5 @@ import { useState } from "react"; -import ForwardedIconComponent from "../../../../../../../components/genericIconComponent"; +import ForwardedIconComponent from "../../../../../../../components/common/genericIconComponent"; import FileCard from "../../../fileComponent"; import formatFileName from "../../../filePreviewChat/utils/format-file-name"; diff --git a/src/frontend/src/modals/IOModal/components/chatView/chatMessage/index.tsx b/src/frontend/src/modals/IOModal/components/chatView/chatMessage/index.tsx index 3721a91c9..314501c4e 100644 --- a/src/frontend/src/modals/IOModal/components/chatView/chatMessage/index.tsx +++ b/src/frontend/src/modals/IOModal/components/chatView/chatMessage/index.tsx @@ -1,4 +1,4 @@ -import ShadTooltip from "@/components/shadTooltipComponent"; +import ShadTooltip from "@/components/common/shadTooltipComponent"; import { useUpdateMessage } from "@/controllers/API/queries/messages"; import useFlowsManagerStore from "@/stores/flowsManagerStore"; import { useUtilityStore } from "@/stores/utilityStore"; @@ -9,9 +9,9 @@ import rehypeMathjax from "rehype-mathjax"; import remarkGfm from "remark-gfm"; import MaleTechnology from "../../../../../assets/male-technologist.png"; import Robot from "../../../../../assets/robot.png"; -import CodeTabsComponent from "../../../../../components/codeTabsComponent"; -import IconComponent from "../../../../../components/genericIconComponent"; -import SanitizedHTMLWrapper from "../../../../../components/sanitizedHTMLWrapper"; +import IconComponent from "../../../../../components/common/genericIconComponent"; +import SanitizedHTMLWrapper from "../../../../../components/common/sanitizedHTMLWrapper"; +import CodeTabsComponent from "../../../../../components/core/codeTabsComponent"; import { EMPTY_INPUT_SEND_MESSAGE, EMPTY_OUTPUT_SEND_MESSAGE, diff --git a/src/frontend/src/modals/IOModal/components/chatView/chatMessage/newChatMessage.tsx b/src/frontend/src/modals/IOModal/components/chatView/chatMessage/newChatMessage.tsx index ff3fa8939..46de81ac8 100644 --- a/src/frontend/src/modals/IOModal/components/chatView/chatMessage/newChatMessage.tsx +++ b/src/frontend/src/modals/IOModal/components/chatView/chatMessage/newChatMessage.tsx @@ -1,5 +1,5 @@ -import { ProfileIcon } from "@/components/appHeaderComponent/components/ProfileIcon"; -import { ContentBlockDisplay } from "@/components/chatComponents/ContentBlockDisplay"; +import { ProfileIcon } from "@/components/core/appHeaderComponent/components/ProfileIcon"; +import { ContentBlockDisplay } from "@/components/core/chatComponents/ContentBlockDisplay"; import { TextShimmer } from "@/components/ui/TextShimmer"; import { useUpdateMessage } from "@/controllers/API/queries/messages"; import useFlowsManagerStore from "@/stores/flowsManagerStore"; @@ -12,11 +12,11 @@ import Markdown from "react-markdown"; import rehypeMathjax from "rehype-mathjax"; import remarkGfm from "remark-gfm"; import Robot from "../../../../../assets/robot.png"; -import CodeTabsComponent from "../../../../../components/codeTabsComponent/ChatCodeTabComponent"; import IconComponent, { ForwardedIconComponent, -} from "../../../../../components/genericIconComponent"; -import SanitizedHTMLWrapper from "../../../../../components/sanitizedHTMLWrapper"; +} from "../../../../../components/common/genericIconComponent"; +import SanitizedHTMLWrapper from "../../../../../components/common/sanitizedHTMLWrapper"; +import CodeTabsComponent from "../../../../../components/core/codeTabsComponent/ChatCodeTabComponent"; import { EMPTY_INPUT_SEND_MESSAGE, EMPTY_OUTPUT_SEND_MESSAGE, diff --git a/src/frontend/src/modals/IOModal/components/chatView/fileComponent/components/downloadButton/downloadButton.tsx b/src/frontend/src/modals/IOModal/components/chatView/fileComponent/components/downloadButton/downloadButton.tsx index 1fdca0395..8f356bbe9 100644 --- a/src/frontend/src/modals/IOModal/components/chatView/fileComponent/components/downloadButton/downloadButton.tsx +++ b/src/frontend/src/modals/IOModal/components/chatView/fileComponent/components/downloadButton/downloadButton.tsx @@ -1,4 +1,4 @@ -import ForwardedIconComponent from "../../../../../../../components/genericIconComponent"; +import ForwardedIconComponent from "../../../../../../../components/common/genericIconComponent"; import { Button } from "../../../../../../../components/ui/button"; export default function DownloadButton({ diff --git a/src/frontend/src/modals/IOModal/components/chatView/fileComponent/index.tsx b/src/frontend/src/modals/IOModal/components/chatView/fileComponent/index.tsx index 7af61165b..475501dcd 100644 --- a/src/frontend/src/modals/IOModal/components/chatView/fileComponent/index.tsx +++ b/src/frontend/src/modals/IOModal/components/chatView/fileComponent/index.tsx @@ -1,6 +1,6 @@ import { useGetDownloadFileMutation } from "@/controllers/API/queries/files"; import { useState } from "react"; -import { ForwardedIconComponent } from "../../../../../components/genericIconComponent"; +import { ForwardedIconComponent } from "../../../../../components/common/genericIconComponent"; import { BASE_URL_API } from "../../../../../constants/constants"; import { fileCardPropsType } from "../../../../../types/components"; import formatFileName from "../filePreviewChat/utils/format-file-name"; diff --git a/src/frontend/src/modals/IOModal/components/chatView/filePreviewChat/index.tsx b/src/frontend/src/modals/IOModal/components/chatView/filePreviewChat/index.tsx index 2da6b76b3..542852511 100644 --- a/src/frontend/src/modals/IOModal/components/chatView/filePreviewChat/index.tsx +++ b/src/frontend/src/modals/IOModal/components/chatView/filePreviewChat/index.tsx @@ -1,7 +1,7 @@ import { useState } from "react"; import IconComponent, { ForwardedIconComponent, -} from "../../../../../components/genericIconComponent"; +} from "../../../../../components/common/genericIconComponent"; import { Skeleton } from "../../../../../components/ui/skeleton"; import formatFileName from "./utils/format-file-name"; diff --git a/src/frontend/src/modals/IOModal/components/chatView/filePreviewChat/newFilePreview.tsx b/src/frontend/src/modals/IOModal/components/chatView/filePreviewChat/newFilePreview.tsx index a76fe330d..fdf77e8d6 100644 --- a/src/frontend/src/modals/IOModal/components/chatView/filePreviewChat/newFilePreview.tsx +++ b/src/frontend/src/modals/IOModal/components/chatView/filePreviewChat/newFilePreview.tsx @@ -1,7 +1,7 @@ import { useState } from "react"; import IconComponent, { ForwardedIconComponent, -} from "../../../../../components/genericIconComponent"; +} from "../../../../../components/common/genericIconComponent"; import { Skeleton } from "../../../../../components/ui/skeleton"; import formatFileName from "./utils/format-file-name"; diff --git a/src/frontend/src/modals/IOModal/components/chatView/index.tsx b/src/frontend/src/modals/IOModal/components/chatView/index.tsx index 1a97ea7a8..f60ad4a5b 100644 --- a/src/frontend/src/modals/IOModal/components/chatView/index.tsx +++ b/src/frontend/src/modals/IOModal/components/chatView/index.tsx @@ -6,7 +6,7 @@ import { useMessagesStore } from "@/stores/messagesStore"; import { useUtilityStore } from "@/stores/utilityStore"; import { useEffect, useRef, useState } from "react"; import ShortUniqueId from "short-unique-id"; -import IconComponent from "../../../../components/genericIconComponent"; +import IconComponent from "../../../../components/common/genericIconComponent"; import { ALLOWED_IMAGE_INPUT_EXTENSIONS, CHAT_FIRST_INITIAL_TEXT, diff --git a/src/frontend/src/modals/IOModal/index.tsx b/src/frontend/src/modals/IOModal/index.tsx index d92a135b9..8ffc9b73f 100644 --- a/src/frontend/src/modals/IOModal/index.tsx +++ b/src/frontend/src/modals/IOModal/index.tsx @@ -7,8 +7,8 @@ import { someFlowTemplateFields } from "@/utils/reactflowUtils"; import { useEffect, useState } from "react"; import ShortUniqueId from "short-unique-id"; import AccordionComponent from "../../components/accordionComponent"; -import IconComponent from "../../components/genericIconComponent"; -import ShadTooltip from "../../components/shadTooltipComponent"; +import IconComponent from "../../components/common/genericIconComponent"; +import ShadTooltip from "../../components/common/shadTooltipComponent"; import { Badge } from "../../components/ui/badge"; import { Button } from "../../components/ui/button"; import { diff --git a/src/frontend/src/modals/IOModal/newModal.tsx b/src/frontend/src/modals/IOModal/newModal.tsx index 818553390..f4985051e 100644 --- a/src/frontend/src/modals/IOModal/newModal.tsx +++ b/src/frontend/src/modals/IOModal/newModal.tsx @@ -5,8 +5,8 @@ import { } from "@/controllers/API/queries/messages"; import { useUtilityStore } from "@/stores/utilityStore"; import { useEffect, useState } from "react"; -import IconComponent from "../../components/genericIconComponent"; -import ShadTooltip from "../../components/shadTooltipComponent"; +import IconComponent from "../../components/common/genericIconComponent"; +import ShadTooltip from "../../components/common/shadTooltipComponent"; import { Button } from "../../components/ui/button"; import { InputOutput } from "../../constants/enums"; import useAlertStore from "../../stores/alertStore"; diff --git a/src/frontend/src/modals/apiModal/index.tsx b/src/frontend/src/modals/apiModal/index.tsx index 44c71bc5f..c6feedd00 100644 --- a/src/frontend/src/modals/apiModal/index.tsx +++ b/src/frontend/src/modals/apiModal/index.tsx @@ -6,8 +6,8 @@ import "ace-builds/src-noconflict/mode-python"; import "ace-builds/src-noconflict/theme-github"; import "ace-builds/src-noconflict/theme-twilight"; import { ReactNode, useEffect, useState } from "react"; -import CodeTabsComponent from "../../components/codeTabsComponent"; -import IconComponent from "../../components/genericIconComponent"; +import IconComponent from "../../components/common/genericIconComponent"; +import CodeTabsComponent from "../../components/core/codeTabsComponent"; import { EXPORT_CODE_DIALOG } from "../../constants/constants"; import { useTweaksStore } from "../../stores/tweaksStore"; import { FlowType } from "../../types/flow/index"; diff --git a/src/frontend/src/modals/codeAreaModal/index.tsx b/src/frontend/src/modals/codeAreaModal/index.tsx index d2371d406..06a78fdba 100644 --- a/src/frontend/src/modals/codeAreaModal/index.tsx +++ b/src/frontend/src/modals/codeAreaModal/index.tsx @@ -11,7 +11,7 @@ import { cloneDeep } from "lodash"; import { useEffect, useRef, useState } from "react"; import AceEditor from "react-ace"; import ReactAce from "react-ace/lib/ace"; -import IconComponent from "../../components/genericIconComponent"; +import IconComponent from "../../components/common/genericIconComponent"; import { Button } from "../../components/ui/button"; import { Input } from "../../components/ui/input"; import { diff --git a/src/frontend/src/modals/confirmationModal/index.tsx b/src/frontend/src/modals/confirmationModal/index.tsx index 76f7be2bd..992e0ec58 100644 --- a/src/frontend/src/modals/confirmationModal/index.tsx +++ b/src/frontend/src/modals/confirmationModal/index.tsx @@ -1,7 +1,7 @@ -import GenericIconComponent from "@/components/genericIconComponent"; +import GenericIconComponent from "@/components/common/genericIconComponent"; import { DialogClose } from "@radix-ui/react-dialog"; import React, { useEffect, useState } from "react"; -import ShadTooltip from "../../components/shadTooltipComponent"; +import ShadTooltip from "../../components/common/shadTooltipComponent"; import { Button } from "../../components/ui/button"; import { ConfirmationModalType, diff --git a/src/frontend/src/modals/dictAreaModal/index.tsx b/src/frontend/src/modals/dictAreaModal/index.tsx index 41a2e2a70..e6e9a2e9f 100644 --- a/src/frontend/src/modals/dictAreaModal/index.tsx +++ b/src/frontend/src/modals/dictAreaModal/index.tsx @@ -9,7 +9,7 @@ import { useEffect, useState } from "react"; import JsonView from "react18-json-view"; import "react18-json-view/src/dark.css"; import "react18-json-view/src/style.css"; -import IconComponent from "../../components/genericIconComponent"; +import IconComponent from "../../components/common/genericIconComponent"; import { CODE_DICT_DIALOG_SUBTITLE } from "../../constants/constants"; import { useDarkStore } from "../../stores/darkStore"; import BaseModal from "../baseModal"; diff --git a/src/frontend/src/modals/editNodeModal/components/editNodeComponent/index.tsx b/src/frontend/src/modals/editNodeModal/components/editNodeComponent/index.tsx index a52c66867..5e7f23596 100644 --- a/src/frontend/src/modals/editNodeModal/components/editNodeComponent/index.tsx +++ b/src/frontend/src/modals/editNodeModal/components/editNodeComponent/index.tsx @@ -1,4 +1,4 @@ -import TableComponent from "@/components/tableComponent"; +import TableComponent from "@/components/core/parameterRenderComponent/components/tableComponent"; import { APIClassType } from "@/types/api"; import { ColDef } from "ag-grid-community"; import { useMemo } from "react"; diff --git a/src/frontend/src/modals/editNodeModal/hooks/use-column-defs.tsx b/src/frontend/src/modals/editNodeModal/hooks/use-column-defs.tsx index d0f111ebe..7c28ee52d 100644 --- a/src/frontend/src/modals/editNodeModal/hooks/use-column-defs.tsx +++ b/src/frontend/src/modals/editNodeModal/hooks/use-column-defs.tsx @@ -1,7 +1,7 @@ -import TableAdvancedToggleCellRender from "@/components/tableComponent/components/tableAdvancedToggleCellRender"; +import TableAdvancedToggleCellRender from "@/components/core/parameterRenderComponent/components/tableComponent/components/tableAdvancedToggleCellRender"; +import TableNodeCellRender from "@/components/core/parameterRenderComponent/components/tableComponent/components/tableNodeCellRender"; import { ColDef, ValueGetterParams } from "ag-grid-community"; import { useMemo } from "react"; -import TableNodeCellRender from "../../../components/tableComponent/components/tableNodeCellRender"; const useColumnDefs = ( nodeId: string, diff --git a/src/frontend/src/modals/exportModal/index.tsx b/src/frontend/src/modals/exportModal/index.tsx index c4cb29613..c7ccd927a 100644 --- a/src/frontend/src/modals/exportModal/index.tsx +++ b/src/frontend/src/modals/exportModal/index.tsx @@ -1,8 +1,8 @@ import { track } from "@/customization/utils/analytics"; import useFlowStore from "@/stores/flowStore"; import { ReactNode, forwardRef, useEffect, useState } from "react"; -import EditFlowSettings from "../../components/editFlowSettingsComponent"; -import IconComponent from "../../components/genericIconComponent"; +import IconComponent from "../../components/common/genericIconComponent"; +import EditFlowSettings from "../../components/core/editFlowSettingsComponent"; import { Checkbox } from "../../components/ui/checkbox"; import { API_WARNING_NOTICE_ALERT } from "../../constants/alerts_constants"; import { diff --git a/src/frontend/src/modals/flowLogsModal/index.tsx b/src/frontend/src/modals/flowLogsModal/index.tsx index 31debbf71..7b54200c7 100644 --- a/src/frontend/src/modals/flowLogsModal/index.tsx +++ b/src/frontend/src/modals/flowLogsModal/index.tsx @@ -1,10 +1,10 @@ +import IconComponent from "@/components/common/genericIconComponent"; +import TableComponent from "@/components/core/parameterRenderComponent/components/tableComponent"; import { useGetTransactionsQuery } from "@/controllers/API/queries/transactions"; +import useFlowsManagerStore from "@/stores/flowsManagerStore"; +import { FlowSettingsPropsType } from "@/types/components"; import { ColDef, ColGroupDef } from "ag-grid-community"; import { useEffect, useState } from "react"; -import IconComponent from "../../components/genericIconComponent"; -import TableComponent from "../../components/tableComponent"; -import useFlowsManagerStore from "../../stores/flowsManagerStore"; -import { FlowSettingsPropsType } from "../../types/components"; import BaseModal from "../baseModal"; export default function FlowLogsModal({ diff --git a/src/frontend/src/modals/flowSettingsModal/index.tsx b/src/frontend/src/modals/flowSettingsModal/index.tsx index 15e2672d2..a1bab19f8 100644 --- a/src/frontend/src/modals/flowSettingsModal/index.tsx +++ b/src/frontend/src/modals/flowSettingsModal/index.tsx @@ -3,8 +3,8 @@ import useAlertStore from "@/stores/alertStore"; import useFlowStore from "@/stores/flowStore"; import { cloneDeep } from "lodash"; import { useEffect, useState } from "react"; -import EditFlowSettings from "../../components/editFlowSettingsComponent"; -import IconComponent from "../../components/genericIconComponent"; +import IconComponent from "../../components/common/genericIconComponent"; +import EditFlowSettings from "../../components/core/editFlowSettingsComponent"; import { SETTINGS_DIALOG_SUBTITLE } from "../../constants/constants"; import useFlowsManagerStore from "../../stores/flowsManagerStore"; import { FlowSettingsPropsType } from "../../types/components"; diff --git a/src/frontend/src/modals/promptModal/index.tsx b/src/frontend/src/modals/promptModal/index.tsx index c27b530ed..9c761f9c4 100644 --- a/src/frontend/src/modals/promptModal/index.tsx +++ b/src/frontend/src/modals/promptModal/index.tsx @@ -1,8 +1,8 @@ import { usePostValidatePrompt } from "@/controllers/API/queries/nodes/use-post-validate-prompt"; import React, { useEffect, useRef, useState } from "react"; -import IconComponent from "../../components/genericIconComponent"; -import SanitizedHTMLWrapper from "../../components/sanitizedHTMLWrapper"; -import ShadTooltip from "../../components/shadTooltipComponent"; +import IconComponent from "../../components/common/genericIconComponent"; +import SanitizedHTMLWrapper from "../../components/common/sanitizedHTMLWrapper"; +import ShadTooltip from "../../components/common/shadTooltipComponent"; import { Badge } from "../../components/ui/badge"; import { Button } from "../../components/ui/button"; import { Textarea } from "../../components/ui/textarea"; diff --git a/src/frontend/src/modals/saveChangesModal/index.tsx b/src/frontend/src/modals/saveChangesModal/index.tsx index 40a6f2a2e..b8842ed11 100644 --- a/src/frontend/src/modals/saveChangesModal/index.tsx +++ b/src/frontend/src/modals/saveChangesModal/index.tsx @@ -1,4 +1,4 @@ -import ForwardedIconComponent from "@/components/genericIconComponent"; +import ForwardedIconComponent from "@/components/common/genericIconComponent"; import Loading from "@/components/ui/loading"; import { truncate } from "lodash"; import { useState } from "react"; diff --git a/src/frontend/src/modals/secretKeyModal/index.tsx b/src/frontend/src/modals/secretKeyModal/index.tsx index 43d4d59f9..12b4a1097 100644 --- a/src/frontend/src/modals/secretKeyModal/index.tsx +++ b/src/frontend/src/modals/secretKeyModal/index.tsx @@ -1,6 +1,6 @@ import * as Form from "@radix-ui/react-form"; import { useEffect, useRef, useState } from "react"; -import IconComponent from "../../components/genericIconComponent"; +import IconComponent from "../../components/common/genericIconComponent"; import { Button } from "../../components/ui/button"; import { Input } from "../../components/ui/input"; import { COPIED_NOTICE_ALERT } from "../../constants/alerts_constants"; diff --git a/src/frontend/src/modals/shareModal/index.tsx b/src/frontend/src/modals/shareModal/index.tsx index 8e20cfc91..a7eb6e1d5 100644 --- a/src/frontend/src/modals/shareModal/index.tsx +++ b/src/frontend/src/modals/shareModal/index.tsx @@ -2,9 +2,9 @@ import useSaveFlow from "@/hooks/flows/use-save-flow"; import { useUtilityStore } from "@/stores/utilityStore"; import { cloneDeep } from "lodash"; import { ReactNode, useEffect, useMemo, useState } from "react"; -import EditFlowSettings from "../../components/editFlowSettingsComponent"; -import IconComponent from "../../components/genericIconComponent"; -import { TagsSelector } from "../../components/tagsSelectorComponent"; +import IconComponent from "../../components/common/genericIconComponent"; +import { TagsSelector } from "../../components/common/tagsSelectorComponent"; +import EditFlowSettings from "../../components/core/editFlowSettingsComponent"; import { Button } from "../../components/ui/button"; import { Checkbox } from "../../components/ui/checkbox"; import { diff --git a/src/frontend/src/modals/tableModal/index.tsx b/src/frontend/src/modals/tableModal/index.tsx index 6937d661c..470990457 100644 --- a/src/frontend/src/modals/tableModal/index.tsx +++ b/src/frontend/src/modals/tableModal/index.tsx @@ -1,7 +1,7 @@ -import ForwardedIconComponent from "@/components/genericIconComponent"; +import ForwardedIconComponent from "@/components/common/genericIconComponent"; import TableComponent, { TableComponentProps, -} from "@/components/tableComponent"; +} from "@/components/core/parameterRenderComponent/components/tableComponent"; import { Button } from "@/components/ui/button"; import { DialogClose } from "@radix-ui/react-dialog"; import { ElementRef, forwardRef, useState } from "react"; diff --git a/src/frontend/src/modals/templatesModal/components/TemplateCardComponent/index.tsx b/src/frontend/src/modals/templatesModal/components/TemplateCardComponent/index.tsx index 3680a531f..6ac9fe927 100644 --- a/src/frontend/src/modals/templatesModal/components/TemplateCardComponent/index.tsx +++ b/src/frontend/src/modals/templatesModal/components/TemplateCardComponent/index.tsx @@ -1,9 +1,9 @@ -import { convertTestName } from "@/components/storeCardComponent/utils/convert-test-name"; +import { convertTestName } from "@/components/common/storeCardComponent/utils/convert-test-name"; import { swatchColors } from "@/utils/styleUtils"; import { cn, getNumberFromString } from "@/utils/utils"; import IconComponent, { ForwardedIconComponent, -} from "../../../../components/genericIconComponent"; +} from "../../../../components/common/genericIconComponent"; import { TemplateCardComponentProps } from "../../../../types/templates/types"; export default function TemplateCardComponent({ diff --git a/src/frontend/src/modals/templatesModal/components/TemplateContentComponent/index.tsx b/src/frontend/src/modals/templatesModal/components/TemplateContentComponent/index.tsx index f4f2b019c..efae84552 100644 --- a/src/frontend/src/modals/templatesModal/components/TemplateContentComponent/index.tsx +++ b/src/frontend/src/modals/templatesModal/components/TemplateContentComponent/index.tsx @@ -5,7 +5,7 @@ import useFlowsManagerStore from "@/stores/flowsManagerStore"; import Fuse from "fuse.js"; import { useEffect, useMemo, useRef, useState } from "react"; import { useParams } from "react-router-dom"; -import { ForwardedIconComponent } from "../../../../components/genericIconComponent"; +import { ForwardedIconComponent } from "../../../../components/common/genericIconComponent"; import { Input } from "../../../../components/ui/input"; import { useFolderStore } from "../../../../stores/foldersStore"; import { TemplateContentProps } from "../../../../types/templates/types"; diff --git a/src/frontend/src/modals/templatesModal/components/TemplateGetStartedCardComponent/index.tsx b/src/frontend/src/modals/templatesModal/components/TemplateGetStartedCardComponent/index.tsx index 0696629f1..1bd07f928 100644 --- a/src/frontend/src/modals/templatesModal/components/TemplateGetStartedCardComponent/index.tsx +++ b/src/frontend/src/modals/templatesModal/components/TemplateGetStartedCardComponent/index.tsx @@ -1,4 +1,4 @@ -import ForwardedIconComponent from "@/components/genericIconComponent"; +import ForwardedIconComponent from "@/components/common/genericIconComponent"; import { useCustomNavigate } from "@/customization/hooks/use-custom-navigate"; import { track } from "@/customization/utils/analytics"; import useAddFlow from "@/hooks/flows/use-add-flow"; diff --git a/src/frontend/src/modals/templatesModal/components/navComponent/index.tsx b/src/frontend/src/modals/templatesModal/components/navComponent/index.tsx index a6ba5a59c..3a1707c0b 100644 --- a/src/frontend/src/modals/templatesModal/components/navComponent/index.tsx +++ b/src/frontend/src/modals/templatesModal/components/navComponent/index.tsx @@ -1,5 +1,5 @@ -import ForwardedIconComponent from "@/components/genericIconComponent"; -import { convertTestName } from "@/components/storeCardComponent/utils/convert-test-name"; +import ForwardedIconComponent from "@/components/common/genericIconComponent"; +import { convertTestName } from "@/components/common/storeCardComponent/utils/convert-test-name"; import { Sidebar, SidebarContent, diff --git a/src/frontend/src/modals/templatesModal/index.tsx b/src/frontend/src/modals/templatesModal/index.tsx index b14c4f350..e7d577843 100644 --- a/src/frontend/src/modals/templatesModal/index.tsx +++ b/src/frontend/src/modals/templatesModal/index.tsx @@ -1,4 +1,4 @@ -import ForwardedIconComponent from "@/components/genericIconComponent"; +import ForwardedIconComponent from "@/components/common/genericIconComponent"; import { Button } from "@/components/ui/button"; import { SidebarProvider } from "@/components/ui/sidebar"; import { useCustomNavigate } from "@/customization/hooks/use-custom-navigate"; diff --git a/src/frontend/src/modals/textAreaModal/index.tsx b/src/frontend/src/modals/textAreaModal/index.tsx index fade00b87..6bae59a37 100644 --- a/src/frontend/src/modals/textAreaModal/index.tsx +++ b/src/frontend/src/modals/textAreaModal/index.tsx @@ -1,5 +1,5 @@ import { useEffect, useRef, useState } from "react"; -import IconComponent from "../../components/genericIconComponent"; +import IconComponent from "../../components/common/genericIconComponent"; import { Button } from "../../components/ui/button"; import { Textarea } from "../../components/ui/textarea"; import { diff --git a/src/frontend/src/modals/textModal/index.tsx b/src/frontend/src/modals/textModal/index.tsx index 715747072..16a99e39b 100644 --- a/src/frontend/src/modals/textModal/index.tsx +++ b/src/frontend/src/modals/textModal/index.tsx @@ -9,7 +9,7 @@ import { useEffect, useState } from "react"; import JsonView from "react18-json-view"; import "react18-json-view/src/dark.css"; import "react18-json-view/src/style.css"; -import IconComponent from "../../components/genericIconComponent"; +import IconComponent from "../../components/common/genericIconComponent"; import { Button } from "../../components/ui/button"; import { CODE_DICT_DIALOG_SUBTITLE, diff --git a/src/frontend/src/pages/AdminPage/index.tsx b/src/frontend/src/pages/AdminPage/index.tsx index 6d0c37b81..ce29a3a44 100644 --- a/src/frontend/src/pages/AdminPage/index.tsx +++ b/src/frontend/src/pages/AdminPage/index.tsx @@ -1,3 +1,4 @@ +import PaginatorComponent from "@/components/common/paginatorComponent"; import { useAddUser, useDeleteUsers, @@ -6,10 +7,9 @@ import { } from "@/controllers/API/queries/auth"; import { cloneDeep } from "lodash"; import { useContext, useEffect, useRef, useState } from "react"; -import IconComponent from "../../components/genericIconComponent"; -import LoadingComponent from "../../components/loadingComponent"; -import PaginatorComponent from "../../components/paginatorComponent"; -import ShadTooltip from "../../components/shadTooltipComponent"; +import IconComponent from "../../components/common/genericIconComponent"; +import LoadingComponent from "../../components/common/loadingComponent"; +import ShadTooltip from "../../components/common/shadTooltipComponent"; import { Button } from "../../components/ui/button"; import { CheckBoxDiv } from "../../components/ui/checkbox"; import { Input } from "../../components/ui/input"; diff --git a/src/frontend/src/pages/AppWrapperPage/components/GenericErrorComponent/index.tsx b/src/frontend/src/pages/AppWrapperPage/components/GenericErrorComponent/index.tsx index 1eb730122..5d652a7ab 100644 --- a/src/frontend/src/pages/AppWrapperPage/components/GenericErrorComponent/index.tsx +++ b/src/frontend/src/pages/AppWrapperPage/components/GenericErrorComponent/index.tsx @@ -1,5 +1,5 @@ -import FetchErrorComponent from "@/components/fetchErrorComponent"; -import TimeoutErrorComponent from "@/components/timeoutErrorComponent"; +import FetchErrorComponent from "@/components/common/fetchErrorComponent"; +import TimeoutErrorComponent from "@/components/common/timeoutErrorComponent"; import { FETCH_ERROR_DESCRIPION, FETCH_ERROR_MESSAGE, diff --git a/src/frontend/src/pages/AppWrapperPage/index.tsx b/src/frontend/src/pages/AppWrapperPage/index.tsx index 3fa919d1b..5fbdd8b71 100644 --- a/src/frontend/src/pages/AppWrapperPage/index.tsx +++ b/src/frontend/src/pages/AppWrapperPage/index.tsx @@ -1,5 +1,5 @@ import AlertDisplayArea from "@/alerts/displayArea"; -import CrashErrorComponent from "@/components/crashErrorComponent"; +import CrashErrorComponent from "@/components/common/crashErrorComponent"; import { ErrorBoundary } from "react-error-boundary"; import { Outlet } from "react-router-dom"; import { GenericErrorComponent } from "./components/GenericErrorComponent"; diff --git a/src/frontend/src/pages/DashboardWrapperPage/index.tsx b/src/frontend/src/pages/DashboardWrapperPage/index.tsx index 43b64566b..d07dc9d44 100644 --- a/src/frontend/src/pages/DashboardWrapperPage/index.tsx +++ b/src/frontend/src/pages/DashboardWrapperPage/index.tsx @@ -1,4 +1,4 @@ -import AppHeader from "@/components/appHeaderComponent"; +import AppHeader from "@/components/core/appHeaderComponent"; import useTheme from "@/customization/hooks/use-custom-theme"; import { Outlet } from "react-router-dom"; diff --git a/src/frontend/src/pages/FlowPage/components/DisclosureComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/DisclosureComponent/index.tsx index 145ffbb08..ef0c0f03b 100644 --- a/src/frontend/src/pages/FlowPage/components/DisclosureComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/DisclosureComponent/index.tsx @@ -1,5 +1,5 @@ import { Disclosure } from "@headlessui/react"; -import IconComponent from "../../../../components/genericIconComponent"; +import IconComponent from "../../../../components/common/genericIconComponent"; import { DisclosureComponentType } from "../../../../types/components"; export default function DisclosureComponent({ diff --git a/src/frontend/src/pages/FlowPage/components/PageComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/PageComponent/index.tsx index 566a96382..6f6e64e85 100644 --- a/src/frontend/src/pages/FlowPage/components/PageComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/PageComponent/index.tsx @@ -1,11 +1,12 @@ import { DefaultEdge } from "@/CustomEdges"; import NoteNode from "@/CustomNodes/NoteNode"; + +import ForwardedIconComponent from "@/components/common/genericIconComponent"; +import LoadingComponent from "@/components/common/loadingComponent"; import CanvasControls, { CustomControlButton, -} from "@/components/canvasControlsComponent"; -import FlowToolbar from "@/components/flowToolbarComponent"; -import ForwardedIconComponent from "@/components/genericIconComponent"; -import LoadingComponent from "@/components/loadingComponent"; +} from "@/components/core/canvasControlsComponent"; +import FlowToolbar from "@/components/core/flowToolbarComponent"; import { SidebarTrigger } from "@/components/ui/sidebar"; import { COLOR_OPTIONS, diff --git a/src/frontend/src/pages/FlowPage/components/ParentDisclosureComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/ParentDisclosureComponent/index.tsx index 2f5bd7602..adf2286f8 100644 --- a/src/frontend/src/pages/FlowPage/components/ParentDisclosureComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/ParentDisclosureComponent/index.tsx @@ -1,5 +1,5 @@ import { Disclosure } from "@headlessui/react"; -import IconComponent from "../../../../components/genericIconComponent"; +import IconComponent from "../../../../components/common/genericIconComponent"; import { DisclosureComponentType } from "../../../../types/components"; export default function ParentDisclosureComponent({ diff --git a/src/frontend/src/pages/FlowPage/components/SelectionMenuComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/SelectionMenuComponent/index.tsx index 8bf20a376..f548481da 100644 --- a/src/frontend/src/pages/FlowPage/components/SelectionMenuComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/SelectionMenuComponent/index.tsx @@ -1,7 +1,7 @@ import { useEffect, useState } from "react"; import { useHotkeys } from "react-hotkeys-hook"; import { NodeToolbar } from "reactflow"; -import ShadTooltip from "../../../../components/shadTooltipComponent"; +import ShadTooltip from "../../../../components/common/shadTooltipComponent"; import { Button } from "../../../../components/ui/button"; import { GradientGroup } from "../../../../icons/GradientSparkles"; import useFlowStore from "../../../../stores/flowStore"; diff --git a/src/frontend/src/pages/FlowPage/components/UpdateAllComponents/index.tsx b/src/frontend/src/pages/FlowPage/components/UpdateAllComponents/index.tsx index 1ad53504c..89f98f212 100644 --- a/src/frontend/src/pages/FlowPage/components/UpdateAllComponents/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/UpdateAllComponents/index.tsx @@ -1,4 +1,4 @@ -import { ForwardedIconComponent } from "@/components/genericIconComponent"; +import ForwardedIconComponent from "@/components/common/genericIconComponent"; import { Button } from "@/components/ui/button"; import { usePostValidateComponentCode } from "@/controllers/API/queries/nodes/use-post-validate-component-code"; import { processNodeAdvancedFields } from "@/CustomNodes/helpers/process-node-advanced-fields"; diff --git a/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/SidebarCategoryComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/SidebarCategoryComponent/index.tsx index afcda7268..dc7b47c2c 100644 --- a/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/SidebarCategoryComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/SidebarCategoryComponent/index.tsx @@ -1,4 +1,4 @@ -import ShadTooltip from "@/components/shadTooltipComponent"; +import ShadTooltip from "@/components/common/shadTooltipComponent"; import { nodeColors, nodeIconsLucide, nodeNames } from "@/utils/styleUtils"; import { removeCountFromString } from "@/utils/utils"; import DisclosureComponent from "../../DisclosureComponent"; diff --git a/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/index.tsx index 70d391ff7..0d89b4668 100644 --- a/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/index.tsx @@ -5,7 +5,7 @@ import { import { useStoreStore } from "@/stores/storeStore"; import { cloneDeep } from "lodash"; import { useEffect, useState } from "react"; -import IconComponent from "../../../../components/genericIconComponent"; +import IconComponent from "../../../../components/common/genericIconComponent"; import { Input } from "../../../../components/ui/input"; import { Separator } from "../../../../components/ui/separator"; import { diff --git a/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/sideBarDraggableComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/sideBarDraggableComponent/index.tsx index fe4cab3c1..1e85821bc 100644 --- a/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/sideBarDraggableComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/sideBarDraggableComponent/index.tsx @@ -1,6 +1,6 @@ import useDeleteFlow from "@/hooks/flows/use-delete-flow"; import { DragEventHandler, forwardRef, useRef, useState } from "react"; -import IconComponent from "../../../../../components/genericIconComponent"; +import IconComponent from "../../../../../components/common/genericIconComponent"; import { Select, SelectContent, diff --git a/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/sideBarNoteComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/sideBarNoteComponent/index.tsx index 91bb8d784..2dc88b74d 100644 --- a/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/sideBarNoteComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/sideBarNoteComponent/index.tsx @@ -1,5 +1,5 @@ import { APIClassType } from "@/types/api"; -import IconComponent from "../../../../../components/genericIconComponent"; +import IconComponent from "../../../../../components/common/genericIconComponent"; export default function NoteDraggableComponent() { function onDragStart(event: React.DragEvent): void { const noteNode: APIClassType = { diff --git a/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/sidebarFilterComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/sidebarFilterComponent/index.tsx index 9e6294858..e3e8a0626 100644 --- a/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/sidebarFilterComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/extraSidebarComponent/sidebarFilterComponent/index.tsx @@ -1,5 +1,5 @@ -import ForwardedIconComponent from "@/components/genericIconComponent"; -import ShadTooltip from "@/components/shadTooltipComponent"; +import ForwardedIconComponent from "@/components/common/genericIconComponent"; +import ShadTooltip from "@/components/common/shadTooltipComponent"; import { Button } from "@/components/ui/button"; export function SidebarFilterComponent({ diff --git a/src/frontend/src/pages/FlowPage/components/flowSidebarComponent/components/sidebarDraggableComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/flowSidebarComponent/components/sidebarDraggableComponent/index.tsx index 883c87dd8..ab3c6bb73 100644 --- a/src/frontend/src/pages/FlowPage/components/flowSidebarComponent/components/sidebarDraggableComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/flowSidebarComponent/components/sidebarDraggableComponent/index.tsx @@ -5,8 +5,8 @@ import { useAddComponent } from "@/hooks/useAddComponent"; import { DragEventHandler, forwardRef, useRef, useState } from "react"; import IconComponent, { ForwardedIconComponent, -} from "../../../../../../components/genericIconComponent"; -import ShadTooltip from "../../../../../../components/shadTooltipComponent"; +} from "../../../../../../components/common/genericIconComponent"; +import ShadTooltip from "../../../../../../components/common/shadTooltipComponent"; import { Select, SelectContent, diff --git a/src/frontend/src/pages/FlowPage/components/flowSidebarComponent/components/sidebarFooterButtons/index.tsx b/src/frontend/src/pages/FlowPage/components/flowSidebarComponent/components/sidebarFooterButtons/index.tsx index 6ad8d4965..0b4b1abd7 100644 --- a/src/frontend/src/pages/FlowPage/components/flowSidebarComponent/components/sidebarFooterButtons/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/flowSidebarComponent/components/sidebarFooterButtons/index.tsx @@ -1,4 +1,4 @@ -import ForwardedIconComponent from "@/components/genericIconComponent"; +import ForwardedIconComponent from "@/components/common/genericIconComponent"; import { Button } from "@/components/ui/button"; import { SidebarMenuButton } from "@/components/ui/sidebar"; import { CustomLink } from "@/customization/components/custom-link"; diff --git a/src/frontend/src/pages/FlowPage/components/flowSidebarComponent/components/sidebarItemsList/index.tsx b/src/frontend/src/pages/FlowPage/components/flowSidebarComponent/components/sidebarItemsList/index.tsx index b9ed0d4c1..0456c1e77 100644 --- a/src/frontend/src/pages/FlowPage/components/flowSidebarComponent/components/sidebarItemsList/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/flowSidebarComponent/components/sidebarItemsList/index.tsx @@ -1,4 +1,4 @@ -import ShadTooltip from "@/components/shadTooltipComponent"; +import ShadTooltip from "@/components/common/shadTooltipComponent"; import { removeCountFromString } from "@/utils/utils"; import SidebarDraggableComponent from "../sidebarDraggableComponent"; diff --git a/src/frontend/src/pages/FlowPage/components/flowSidebarComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/flowSidebarComponent/index.tsx index 07d5587d8..869e643d8 100644 --- a/src/frontend/src/pages/FlowPage/components/flowSidebarComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/flowSidebarComponent/index.tsx @@ -2,8 +2,8 @@ import Fuse from "fuse.js"; import { useEffect, useMemo, useRef, useState } from "react"; import { useHotkeys } from "react-hotkeys-hook"; // Import useHotkeys -import ForwardedIconComponent from "@/components/genericIconComponent"; -import ShadTooltip from "@/components/shadTooltipComponent"; +import ForwardedIconComponent from "@/components/common/genericIconComponent"; +import ShadTooltip from "@/components/common/shadTooltipComponent"; import { Button } from "@/components/ui/button"; import { Disclosure, diff --git a/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx index 9d1e365e2..de1ae5fa2 100644 --- a/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/index.tsx @@ -2,7 +2,8 @@ import { countHandlesFn } from "@/CustomNodes/helpers/count-handles"; import { mutateTemplate } from "@/CustomNodes/helpers/mutate-template"; import useHandleOnNewValue from "@/CustomNodes/hooks/use-handle-new-value"; import useHandleNodeClass from "@/CustomNodes/hooks/use-handle-node-class"; -import ToggleShadComponent from "@/components/parameterRenderComponent/components/toggleShadComponent"; +import ShadTooltip from "@/components/common/shadTooltipComponent"; +import ToggleShadComponent from "@/components/core/parameterRenderComponent/components/toggleShadComponent"; import { Button } from "@/components/ui/button"; import { usePostTemplateValue } from "@/controllers/API/queries/nodes/use-post-template-value"; import { usePostRetrieveVertexOrder } from "@/controllers/API/queries/vertex"; @@ -12,8 +13,7 @@ import { APIClassType } from "@/types/api"; import _, { cloneDeep } from "lodash"; import { useEffect, useRef, useState } from "react"; import { useUpdateNodeInternals } from "reactflow"; -import IconComponent from "../../../../components/genericIconComponent"; -import ShadTooltip from "../../../../components/shadTooltipComponent"; +import IconComponent from "../../../../components/common/genericIconComponent"; import { Select, SelectContentWithoutPortal, diff --git a/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/shortcutDisplay/index.tsx b/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/shortcutDisplay/index.tsx index 24860b26c..f10b4d283 100644 --- a/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/shortcutDisplay/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/shortcutDisplay/index.tsx @@ -1,4 +1,4 @@ -import RenderIcons from "@/components/renderIconComponent"; +import RenderIcons from "@/components/common/renderIconComponent"; import { cn } from "@/utils/utils"; export default function ShortcutDisplay({ diff --git a/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/toolbarSelectItem/index.tsx b/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/toolbarSelectItem/index.tsx index 0733c53ab..14aa5f06a 100644 --- a/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/toolbarSelectItem/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/nodeToolbarComponent/toolbarSelectItem/index.tsx @@ -1,5 +1,5 @@ -import ForwardedIconComponent from "../../../../../components/genericIconComponent"; -import RenderIcons from "../../../../../components/renderIconComponent"; +import ForwardedIconComponent from "../../../../../components/common/genericIconComponent"; +import RenderIcons from "../../../../../components/common/renderIconComponent"; import { IS_MAC } from "../../../../../constants/constants"; import { toolbarSelectItemProps } from "../../../../../types/components"; diff --git a/src/frontend/src/pages/LoadingPage/index.tsx b/src/frontend/src/pages/LoadingPage/index.tsx index 8f2e9e858..57eba0cef 100644 --- a/src/frontend/src/pages/LoadingPage/index.tsx +++ b/src/frontend/src/pages/LoadingPage/index.tsx @@ -1,4 +1,4 @@ -import LoadingComponent from "@/components/loadingComponent"; +import LoadingComponent from "@/components/common/loadingComponent"; import { cn } from "@/utils/utils"; export function LoadingPage({ overlay = false }: { overlay?: boolean }) { diff --git a/src/frontend/src/pages/LoginPage/index.tsx b/src/frontend/src/pages/LoginPage/index.tsx index 4352dd8f9..ba4c3592c 100644 --- a/src/frontend/src/pages/LoginPage/index.tsx +++ b/src/frontend/src/pages/LoginPage/index.tsx @@ -4,7 +4,7 @@ import { CustomLink } from "@/customization/components/custom-link"; import { ENABLE_NEW_LOGO } from "@/customization/feature-flags"; import * as Form from "@radix-ui/react-form"; import { useContext, useState } from "react"; -import InputComponent from "../../components/inputComponent"; +import InputComponent from "../../components/core/parameterRenderComponent/components/inputComponent"; import { Button } from "../../components/ui/button"; import { Input } from "../../components/ui/input"; import { SIGNIN_ERROR_ALERT } from "../../constants/alerts_constants"; diff --git a/src/frontend/src/pages/MainPage/components/dropdown/index.tsx b/src/frontend/src/pages/MainPage/components/dropdown/index.tsx index 843854224..60592c57d 100644 --- a/src/frontend/src/pages/MainPage/components/dropdown/index.tsx +++ b/src/frontend/src/pages/MainPage/components/dropdown/index.tsx @@ -1,4 +1,4 @@ -import ForwardedIconComponent from "@/components/genericIconComponent"; +import ForwardedIconComponent from "@/components/common/genericIconComponent"; import { DropdownMenuItem } from "@/components/ui/dropdown-menu"; import useAlertStore from "@/stores/alertStore"; import { FlowType } from "@/types/flow"; diff --git a/src/frontend/src/pages/MainPage/components/grid/index.tsx b/src/frontend/src/pages/MainPage/components/grid/index.tsx index 6079ebfa8..d8d8d56b9 100644 --- a/src/frontend/src/pages/MainPage/components/grid/index.tsx +++ b/src/frontend/src/pages/MainPage/components/grid/index.tsx @@ -1,5 +1,5 @@ -import useDragStart from "@/components/cardComponent/hooks/use-on-drag-start"; -import ForwardedIconComponent from "@/components/genericIconComponent"; +import ForwardedIconComponent from "@/components/common/genericIconComponent"; +import useDragStart from "@/components/core/cardComponent/hooks/use-on-drag-start"; import { Button } from "@/components/ui/button"; import { Card } from "@/components/ui/card"; import { diff --git a/src/frontend/src/pages/MainPage/components/header/index.tsx b/src/frontend/src/pages/MainPage/components/header/index.tsx index bfc2e4600..024ea8917 100644 --- a/src/frontend/src/pages/MainPage/components/header/index.tsx +++ b/src/frontend/src/pages/MainPage/components/header/index.tsx @@ -1,5 +1,5 @@ -import ForwardedIconComponent from "@/components/genericIconComponent"; -import ShadTooltip from "@/components/shadTooltipComponent"; +import ForwardedIconComponent from "@/components/common/genericIconComponent"; +import ShadTooltip from "@/components/common/shadTooltipComponent"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { SidebarTrigger } from "@/components/ui/sidebar"; diff --git a/src/frontend/src/pages/MainPage/components/list/index.tsx b/src/frontend/src/pages/MainPage/components/list/index.tsx index a1ab295da..ed4371de4 100644 --- a/src/frontend/src/pages/MainPage/components/list/index.tsx +++ b/src/frontend/src/pages/MainPage/components/list/index.tsx @@ -1,5 +1,5 @@ -import useDragStart from "@/components/cardComponent/hooks/use-on-drag-start"; -import ForwardedIconComponent from "@/components/genericIconComponent"; +import ForwardedIconComponent from "@/components/common/genericIconComponent"; +import useDragStart from "@/components/core/cardComponent/hooks/use-on-drag-start"; import { Button } from "@/components/ui/button"; import { Card } from "@/components/ui/card"; import { diff --git a/src/frontend/src/pages/MainPage/oldComponents/componentsComponent/components/collectionCard/index.tsx b/src/frontend/src/pages/MainPage/oldComponents/componentsComponent/components/collectionCard/index.tsx index badce36b2..8168816c4 100644 --- a/src/frontend/src/pages/MainPage/oldComponents/componentsComponent/components/collectionCard/index.tsx +++ b/src/frontend/src/pages/MainPage/oldComponents/componentsComponent/components/collectionCard/index.tsx @@ -1,7 +1,7 @@ import { useCustomNavigate } from "@/customization/hooks/use-custom-navigate"; import useFlowsManagerStore from "@/stores/flowsManagerStore"; import { useParams } from "react-router-dom"; -import CollectionCardComponent from "../../../../../../components/cardComponent"; +import CollectionCardComponent from "../../../../../../components/core/cardComponent"; const CollectionCard = ({ item, type, isLoading, control }) => { const navigate = useCustomNavigate(); const isComponent = item.is_component ?? false; diff --git a/src/frontend/src/pages/MainPage/oldComponents/componentsComponent/index.tsx b/src/frontend/src/pages/MainPage/oldComponents/componentsComponent/index.tsx index 8a323ba61..1ceacf3ea 100644 --- a/src/frontend/src/pages/MainPage/oldComponents/componentsComponent/index.tsx +++ b/src/frontend/src/pages/MainPage/oldComponents/componentsComponent/index.tsx @@ -1,3 +1,4 @@ +import PaginatorComponent from "@/components/common/paginatorComponent"; import { PAGINATION_PAGE, PAGINATION_SIZE } from "@/constants/constants"; import { usePostDownloadMultipleFlows } from "@/controllers/API/queries/flows"; import TemplatesModal from "@/modals/templatesModal"; @@ -5,9 +6,8 @@ import { Pagination } from "@/types/utils/types"; import { useEffect, useMemo, useState } from "react"; import { FormProvider, useForm, useWatch } from "react-hook-form"; import { useLocation, useParams } from "react-router-dom"; -import CardsWrapComponent from "../../../../components/cardsWrapComponent"; -import PaginatorComponent from "../../../../components/paginatorComponent"; -import { SkeletonCardComponent } from "../../../../components/skeletonCardComponent"; +import { SkeletonCardComponent } from "../../../../components/common/skeletonCardComponent"; +import CardsWrapComponent from "../../../../components/core/cardsWrapComponent"; import DeleteConfirmationModal from "../../../../modals/deleteConfirmationModal"; import useAlertStore from "../../../../stores/alertStore"; import useFlowsManagerStore from "../../../../stores/flowsManagerStore"; diff --git a/src/frontend/src/pages/MainPage/oldComponents/headerComponent/index.tsx b/src/frontend/src/pages/MainPage/oldComponents/headerComponent/index.tsx index e36853831..7bdc16f3f 100644 --- a/src/frontend/src/pages/MainPage/oldComponents/headerComponent/index.tsx +++ b/src/frontend/src/pages/MainPage/oldComponents/headerComponent/index.tsx @@ -1,5 +1,5 @@ -import IconComponent from "../../../../components/genericIconComponent"; -import ShadTooltip from "../../../../components/shadTooltipComponent"; +import IconComponent from "../../../../components/common/genericIconComponent"; +import ShadTooltip from "../../../../components/common/shadTooltipComponent"; import { Button } from "../../../../components/ui/button"; import { Checkbox } from "../../../../components/ui/checkbox"; import { cn } from "../../../../utils/utils"; diff --git a/src/frontend/src/pages/MainPage/oldComponents/myCollectionComponent/components/inputSearchComponent/index.tsx b/src/frontend/src/pages/MainPage/oldComponents/myCollectionComponent/components/inputSearchComponent/index.tsx index 9f319547e..64e702ca8 100644 --- a/src/frontend/src/pages/MainPage/oldComponents/myCollectionComponent/components/inputSearchComponent/index.tsx +++ b/src/frontend/src/pages/MainPage/oldComponents/myCollectionComponent/components/inputSearchComponent/index.tsx @@ -1,5 +1,5 @@ import { ChangeEvent, KeyboardEvent } from "react"; -import ForwardedIconComponent from "../../../../../../components/genericIconComponent"; +import ForwardedIconComponent from "../../../../../../components/common/genericIconComponent"; import { Input } from "../../../../../../components/ui/input"; type InputSearchComponentProps = { diff --git a/src/frontend/src/pages/MainPage/oldPages/mainPage/index.tsx b/src/frontend/src/pages/MainPage/oldPages/mainPage/index.tsx index 54d1bea81..44bc11d87 100644 --- a/src/frontend/src/pages/MainPage/oldPages/mainPage/index.tsx +++ b/src/frontend/src/pages/MainPage/oldPages/mainPage/index.tsx @@ -1,4 +1,4 @@ -import FolderSidebarNav from "@/components/folderSidebarComponent"; +import FolderSidebarNav from "@/components/core/folderSidebarComponent"; import { SidebarProvider } from "@/components/ui/sidebar"; import { useDeleteFolders } from "@/controllers/API/queries/folders"; import { useCustomNavigate } from "@/customization/hooks/use-custom-navigate"; @@ -7,8 +7,8 @@ import useAlertStore from "@/stores/alertStore"; import { useIsFetching, useQueryClient } from "@tanstack/react-query"; import { useEffect, useState } from "react"; import { Outlet, useLocation } from "react-router-dom"; -import DropdownButton from "../../../../components/dropdownButtonComponent"; -import PageLayout from "../../../../components/pageLayout"; +import PageLayout from "../../../../components/common/pageLayout"; +import DropdownButton from "../../../../components/core/dropdownButtonComponent"; import { MY_COLLECTION_DESC, USER_PROJECTS_HEADER, diff --git a/src/frontend/src/pages/MainPage/pages/emptyFolder/index.tsx b/src/frontend/src/pages/MainPage/pages/emptyFolder/index.tsx index f08e63a80..fb6405691 100644 --- a/src/frontend/src/pages/MainPage/pages/emptyFolder/index.tsx +++ b/src/frontend/src/pages/MainPage/pages/emptyFolder/index.tsx @@ -1,4 +1,4 @@ -import ForwardedIconComponent from "@/components/genericIconComponent"; +import ForwardedIconComponent from "@/components/common/genericIconComponent"; import { Button } from "@/components/ui/button"; import { useFolderStore } from "@/stores/foldersStore"; diff --git a/src/frontend/src/pages/MainPage/pages/emptyPage/index.tsx b/src/frontend/src/pages/MainPage/pages/emptyPage/index.tsx index a2b17d209..cda0fe9d7 100644 --- a/src/frontend/src/pages/MainPage/pages/emptyPage/index.tsx +++ b/src/frontend/src/pages/MainPage/pages/emptyPage/index.tsx @@ -1,5 +1,5 @@ import LangflowLogo from "@/assets/LangflowLogo.svg?react"; -import ForwardedIconComponent from "@/components/genericIconComponent"; +import ForwardedIconComponent from "@/components/common/genericIconComponent"; import { Button } from "@/components/ui/button"; import { ENABLE_NEW_LOGO } from "@/customization/feature-flags"; import { useFolderStore } from "@/stores/foldersStore"; diff --git a/src/frontend/src/pages/MainPage/pages/homePage/index.tsx b/src/frontend/src/pages/MainPage/pages/homePage/index.tsx index 00ea63d47..58982af23 100644 --- a/src/frontend/src/pages/MainPage/pages/homePage/index.tsx +++ b/src/frontend/src/pages/MainPage/pages/homePage/index.tsx @@ -1,5 +1,5 @@ -import CardsWrapComponent from "@/components/cardsWrapComponent"; -import PaginatorComponent from "@/components/paginatorComponent"; +import PaginatorComponent from "@/components/common/paginatorComponent"; +import CardsWrapComponent from "@/components/core/cardsWrapComponent"; import { useGetFolderQuery } from "@/controllers/API/queries/folders/use-get-folder"; import { CustomBanner } from "@/customization/components/custom-banner"; import { ENABLE_DATASTAX_LANGFLOW } from "@/customization/feature-flags"; diff --git a/src/frontend/src/pages/MainPage/pages/index.tsx b/src/frontend/src/pages/MainPage/pages/index.tsx index baf0fca98..6ec08188b 100644 --- a/src/frontend/src/pages/MainPage/pages/index.tsx +++ b/src/frontend/src/pages/MainPage/pages/index.tsx @@ -1,6 +1,6 @@ -import CardsWrapComponent from "@/components/cardsWrapComponent"; -import SideBarFoldersButtonsComponent from "@/components/folderSidebarComponent/components/sideBarFolderButtons"; -import LoadingComponent from "@/components/loadingComponent"; +import LoadingComponent from "@/components/common/loadingComponent"; +import CardsWrapComponent from "@/components/core/cardsWrapComponent"; +import SideBarFoldersButtonsComponent from "@/components/core/folderSidebarComponent/components/sideBarFolderButtons"; import { SidebarProvider } from "@/components/ui/sidebar"; import { useDeleteFolders } from "@/controllers/API/queries/folders"; import { useCustomNavigate } from "@/customization/hooks/use-custom-navigate"; diff --git a/src/frontend/src/pages/ProfileSettingsPage/index.tsx b/src/frontend/src/pages/ProfileSettingsPage/index.tsx index d0b9e2a39..434a9c2d7 100644 --- a/src/frontend/src/pages/ProfileSettingsPage/index.tsx +++ b/src/frontend/src/pages/ProfileSettingsPage/index.tsx @@ -5,7 +5,7 @@ import { import * as Form from "@radix-ui/react-form"; import { cloneDeep } from "lodash"; import { useContext, useState } from "react"; -import IconComponent from "../../components/genericIconComponent"; +import IconComponent from "../../components/common/genericIconComponent"; import Header from "../../components/headerComponent"; import InputComponent from "../../components/inputComponent"; import { Button } from "../../components/ui/button"; diff --git a/src/frontend/src/pages/SettingsPage/index.tsx b/src/frontend/src/pages/SettingsPage/index.tsx index 9b5e6cb0a..0e6e19606 100644 --- a/src/frontend/src/pages/SettingsPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/index.tsx @@ -1,11 +1,11 @@ -import SideBarButtonsComponent from "@/components/sidebarComponent"; +import SideBarButtonsComponent from "@/components/core/sidebarComponent"; import { SidebarProvider } from "@/components/ui/sidebar"; import { ENABLE_PROFILE_ICONS } from "@/customization/feature-flags"; import useAuthStore from "@/stores/authStore"; import { useStoreStore } from "@/stores/storeStore"; import { Outlet } from "react-router-dom"; -import ForwardedIconComponent from "../../components/genericIconComponent"; -import PageLayout from "../../components/pageLayout"; +import ForwardedIconComponent from "../../components/common/genericIconComponent"; +import PageLayout from "../../components/common/pageLayout"; export default function SettingsPage(): JSX.Element { const autoLogin = useAuthStore((state) => state.autoLogin); diff --git a/src/frontend/src/pages/SettingsPage/pages/ApiKeysPage/components/ApiKeyHeader/index.tsx b/src/frontend/src/pages/SettingsPage/pages/ApiKeysPage/components/ApiKeyHeader/index.tsx index 1879f1b36..c98155605 100644 --- a/src/frontend/src/pages/SettingsPage/pages/ApiKeysPage/components/ApiKeyHeader/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/ApiKeysPage/components/ApiKeyHeader/index.tsx @@ -1,4 +1,4 @@ -import ForwardedIconComponent from "../../../../../../components/genericIconComponent"; +import ForwardedIconComponent from "../../../../../../components/common/genericIconComponent"; import { Button } from "../../../../../../components/ui/button"; import { API_PAGE_PARAGRAPH } from "../../../../../../constants/constants"; import SecretKeyModal from "../../../../../../modals/secretKeyModal"; diff --git a/src/frontend/src/pages/SettingsPage/pages/ApiKeysPage/helpers/column-defs.ts b/src/frontend/src/pages/SettingsPage/pages/ApiKeysPage/helpers/column-defs.ts index 9ea7af469..83fa218e7 100644 --- a/src/frontend/src/pages/SettingsPage/pages/ApiKeysPage/helpers/column-defs.ts +++ b/src/frontend/src/pages/SettingsPage/pages/ApiKeysPage/helpers/column-defs.ts @@ -1,4 +1,4 @@ -import TableAutoCellRender from "../../../../../components/tableComponent/components/tableAutoCellRender"; +import TableAutoCellRender from "@/components/core/parameterRenderComponent/components/tableComponent/components/tableAutoCellRender"; export const getColumnDefs = () => { return [ diff --git a/src/frontend/src/pages/SettingsPage/pages/ApiKeysPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/ApiKeysPage/index.tsx index 73b484d5f..9454e6e55 100644 --- a/src/frontend/src/pages/SettingsPage/pages/ApiKeysPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/ApiKeysPage/index.tsx @@ -11,7 +11,7 @@ import { } from "@/controllers/API/queries/api-keys"; import { SelectionChangedEvent } from "ag-grid-community"; import { useContext, useEffect, useRef, useState } from "react"; -import TableComponent from "../../../../components/tableComponent"; +import TableComponent from "../../../../components/core/parameterRenderComponent/components/tableComponent"; import { AuthContext } from "../../../../contexts/authContext"; import useAlertStore from "../../../../stores/alertStore"; import ApiKeyHeaderComponent from "./components/ApiKeyHeader"; diff --git a/src/frontend/src/pages/SettingsPage/pages/GeneralPage/components/GeneralPageHeader/index.tsx b/src/frontend/src/pages/SettingsPage/pages/GeneralPage/components/GeneralPageHeader/index.tsx index cb65942bd..13e5161ac 100644 --- a/src/frontend/src/pages/SettingsPage/pages/GeneralPage/components/GeneralPageHeader/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/GeneralPage/components/GeneralPageHeader/index.tsx @@ -1,4 +1,4 @@ -import ForwardedIconComponent from "../../../../../../components/genericIconComponent"; +import ForwardedIconComponent from "../../../../../../components/common/genericIconComponent"; const GeneralPageHeaderComponent = () => { return ( diff --git a/src/frontend/src/pages/SettingsPage/pages/GeneralPage/components/PasswordForm/index.tsx b/src/frontend/src/pages/SettingsPage/pages/GeneralPage/components/PasswordForm/index.tsx index 28edb2f09..dfc0898a3 100644 --- a/src/frontend/src/pages/SettingsPage/pages/GeneralPage/components/PasswordForm/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/GeneralPage/components/PasswordForm/index.tsx @@ -1,5 +1,5 @@ import * as Form from "@radix-ui/react-form"; -import InputComponent from "../../../../../../components/inputComponent"; +import InputComponent from "../../../../../../components/core/parameterRenderComponent/components/inputComponent"; import { Button } from "../../../../../../components/ui/button"; import { Card, diff --git a/src/frontend/src/pages/SettingsPage/pages/GeneralPage/components/StoreApiKeyForm/index.tsx b/src/frontend/src/pages/SettingsPage/pages/GeneralPage/components/StoreApiKeyForm/index.tsx index 5bc5ea38b..f8038aeff 100644 --- a/src/frontend/src/pages/SettingsPage/pages/GeneralPage/components/StoreApiKeyForm/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/GeneralPage/components/StoreApiKeyForm/index.tsx @@ -1,5 +1,5 @@ import * as Form from "@radix-ui/react-form"; -import InputComponent from "../../../../../../components/inputComponent"; +import InputComponent from "../../../../../../components/core/parameterRenderComponent/components/inputComponent"; import { Button } from "../../../../../../components/ui/button"; import { Card, diff --git a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx index 247e278f9..374e4da31 100644 --- a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx @@ -1,6 +1,11 @@ -import IconComponent from "../../../../components/genericIconComponent"; +import IconComponent, { + ForwardedIconComponent, +} from "../../../../components/common/genericIconComponent"; import { Button } from "../../../../components/ui/button"; +import Dropdown from "@/components/core/dropdownComponent"; +import GlobalVariableModal from "@/components/core/GlobalVariableModal/GlobalVariableModal"; +import TableComponent from "@/components/core/parameterRenderComponent/components/tableComponent"; import { useDeleteGlobalVariables, useGetGlobalVariables, @@ -12,10 +17,6 @@ import { SelectionChangedEvent, } from "ag-grid-community"; import { useRef, useState } from "react"; -import GlobalVariableModal from "../../../../components/GlobalVariableModal/GlobalVariableModal"; -import Dropdown from "../../../../components/dropdownComponent"; -import ForwardedIconComponent from "../../../../components/genericIconComponent"; -import TableComponent from "../../../../components/tableComponent"; import { Badge } from "../../../../components/ui/badge"; import useAlertStore from "../../../../stores/alertStore"; diff --git a/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/CellRenderWrapper/index.tsx b/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/CellRenderWrapper/index.tsx index 100475205..0f8139147 100644 --- a/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/CellRenderWrapper/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/CellRenderWrapper/index.tsx @@ -1,4 +1,4 @@ -import RenderIcons from "@/components/renderIconComponent"; +import RenderIcons from "@/components/common/renderIconComponent"; import { CustomCellRendererProps } from "ag-grid-react"; export default function CellRenderShortcuts(params: CustomCellRendererProps) { diff --git a/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/EditShortcutButton/index.tsx b/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/EditShortcutButton/index.tsx index 3df817d56..44883d07c 100644 --- a/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/EditShortcutButton/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/EditShortcutButton/index.tsx @@ -1,8 +1,8 @@ import { useEffect, useState } from "react"; import useAlertStore from "../../../../../stores/alertStore"; -import RenderKey from "@/components/renderIconComponent/components/renderKey"; -import ForwardedIconComponent from "../../../../../components/genericIconComponent"; +import RenderKey from "@/components/common/renderIconComponent/components/renderKey"; +import ForwardedIconComponent from "../../../../../components/common/genericIconComponent"; import { Button } from "../../../../../components/ui/button"; import BaseModal from "../../../../../modals/baseModal"; import { useShortcutsStore } from "../../../../../stores/shortcuts"; diff --git a/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx index a914595f7..4e292c68e 100644 --- a/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx @@ -1,7 +1,7 @@ import { ColDef } from "ag-grid-community"; import { useEffect, useState } from "react"; -import ForwardedIconComponent from "../../../../components/genericIconComponent"; -import TableComponent from "../../../../components/tableComponent"; +import ForwardedIconComponent from "../../../../components/common/genericIconComponent"; +import TableComponent from "../../../../components/core/parameterRenderComponent/components/tableComponent"; import { Button } from "../../../../components/ui/button"; import { defaultShortcuts } from "../../../../constants/constants"; import { useShortcutsStore } from "../../../../stores/shortcuts"; diff --git a/src/frontend/src/pages/SettingsPage/pages/messagesPage/components/headerMessages/index.tsx b/src/frontend/src/pages/SettingsPage/pages/messagesPage/components/headerMessages/index.tsx index f7802fe41..528f81b1f 100644 --- a/src/frontend/src/pages/SettingsPage/pages/messagesPage/components/headerMessages/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/messagesPage/components/headerMessages/index.tsx @@ -1,4 +1,4 @@ -import ForwardedIconComponent from "../../../../../../components/genericIconComponent"; +import ForwardedIconComponent from "../../../../../../components/common/genericIconComponent"; const HeaderMessagesComponent = () => { return ( diff --git a/src/frontend/src/pages/StorePage/index.tsx b/src/frontend/src/pages/StorePage/index.tsx index 2bbd93041..d6b08917c 100644 --- a/src/frontend/src/pages/StorePage/index.tsx +++ b/src/frontend/src/pages/StorePage/index.tsx @@ -1,18 +1,18 @@ import { uniqueId } from "lodash"; import { useContext, useEffect, useState } from "react"; -import IconComponent from "../../components/genericIconComponent"; -import PageLayout from "../../components/pageLayout"; -import ShadTooltip from "../../components/shadTooltipComponent"; -import { SkeletonCardComponent } from "../../components/skeletonCardComponent"; +import IconComponent from "../../components/common/genericIconComponent"; +import PageLayout from "../../components/common/pageLayout"; +import ShadTooltip from "../../components/common/shadTooltipComponent"; +import { SkeletonCardComponent } from "../../components/common/skeletonCardComponent"; import { Button } from "../../components/ui/button"; -import StoreCardComponent from "@/components/storeCardComponent"; +import PaginatorComponent from "@/components/common/paginatorComponent"; +import StoreCardComponent from "@/components/common/storeCardComponent"; import { CustomLink } from "@/customization/components/custom-link"; import { useCustomNavigate } from "@/customization/hooks/use-custom-navigate"; import { useUtilityStore } from "@/stores/utilityStore"; import { useParams } from "react-router-dom"; -import PaginatorComponent from "../../components/paginatorComponent"; -import { TagsSelector } from "../../components/tagsSelectorComponent"; +import { TagsSelector } from "../../components/common/tagsSelectorComponent"; import { Badge } from "../../components/ui/badge"; import { Select, diff --git a/src/frontend/src/routes.tsx b/src/frontend/src/routes.tsx index 12100fe95..e236a8210 100644 --- a/src/frontend/src/routes.tsx +++ b/src/frontend/src/routes.tsx @@ -5,11 +5,11 @@ import { Outlet, Route, } from "react-router-dom"; -import { ProtectedAdminRoute } from "./components/authAdminGuard"; -import { ProtectedRoute } from "./components/authGuard"; -import { ProtectedLoginRoute } from "./components/authLoginGuard"; -import { AuthSettingsGuard } from "./components/authSettingsGuard"; -import { StoreGuard } from "./components/storeGuard"; +import { ProtectedAdminRoute } from "./components/authorization/authAdminGuard"; +import { ProtectedRoute } from "./components/authorization/authGuard"; +import { ProtectedLoginRoute } from "./components/authorization/authLoginGuard"; +import { AuthSettingsGuard } from "./components/authorization/authSettingsGuard"; +import { StoreGuard } from "./components/authorization/storeGuard"; import ContextWrapper from "./contexts"; import { CustomNavigate } from "./customization/components/custom-navigate"; import { BASENAME } from "./customization/config-constants"; diff --git a/src/frontend/src/utils/utils.ts b/src/frontend/src/utils/utils.ts index cb423bec3..880875cdd 100644 --- a/src/frontend/src/utils/utils.ts +++ b/src/frontend/src/utils/utils.ts @@ -1,8 +1,8 @@ +import TableAutoCellRender from "@/components/core/parameterRenderComponent/components/tableComponent/components/tableAutoCellRender"; import { ColumnField, FormatterType } from "@/types/utils/functions"; import { ColDef, ColGroupDef } from "ag-grid-community"; import clsx, { ClassValue } from "clsx"; import { twMerge } from "tailwind-merge"; -import TableAutoCellRender from "../components/tableComponent/components/tableAutoCellRender"; import { DRAG_EVENTS_CUSTOM_TYPESS, MESSAGES_TABLE_ORDER, diff --git a/src/frontend/tests/core/features/actionsMainPage-shard-1.spec.ts b/src/frontend/tests/core/features/actionsMainPage-shard-1.spec.ts index a97c159e4..ca6b1a4dc 100644 --- a/src/frontend/tests/core/features/actionsMainPage-shard-1.spec.ts +++ b/src/frontend/tests/core/features/actionsMainPage-shard-1.spec.ts @@ -1,62 +1,66 @@ import { test } from "@playwright/test"; -test("select and delete a flow", 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, +test( + "select and delete a flow", + { tag: ["@release", "@api"] }, + async ({ page }) => { + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, }); - modalCount = await page.getByTestId("modal-title")?.count(); - } - await page.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Basic Prompting" }).click(); - await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { - timeout: 100000, - }); + await page.waitForSelector('[id="new-project-btn"]', { + timeout: 30000, + }); - await page.getByTestId("icon-ChevronLeft").first().click(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; + } - await page.waitForSelector('[data-testid="home-dropdown-menu"]', { - timeout: 5000, - }); + 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(); + } + await page.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Basic Prompting" }).click(); - await page.getByTestId("home-dropdown-menu").first().click(); - await page.waitForSelector('[data-testid="icon-Trash2"]', { - timeout: 1000, - }); - // click on the delete button - await page.getByText("Delete").last().click(); - await page.getByText("Note: This action is irreversible.").isVisible({ - timeout: 1000, - }); + await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { + timeout: 100000, + }); - //confirm the deletion in the modal - await page.getByText("Delete").last().click(); + await page.getByTestId("icon-ChevronLeft").first().click(); - await page.getByText("Selected items deleted successfully").isVisible(); -}); + await page.waitForSelector('[data-testid="home-dropdown-menu"]', { + timeout: 5000, + }); -test("search flows", async ({ page }) => { + await page.getByTestId("home-dropdown-menu").first().click(); + await page.waitForSelector('[data-testid="icon-Trash2"]', { + timeout: 1000, + }); + // click on the delete button + await page.getByText("Delete").last().click(); + await page.getByText("Note: This action is irreversible.").isVisible({ + timeout: 1000, + }); + + //confirm the deletion in the modal + await page.getByText("Delete").last().click(); + + await page.getByText("Selected items deleted successfully").isVisible(); + }, +); + +test("search flows", { tag: ["@release"] }, async ({ page }) => { await page.goto("/"); await page.waitForSelector('[data-testid="mainpage_title"]', { timeout: 30000, @@ -117,7 +121,7 @@ test("search flows", async ({ page }) => { await page.getByText("Basic Prompting", { exact: true }).isHidden(); }); -test("search components", async ({ page }) => { +test("search components", { tag: ["@release"] }, async ({ page }) => { await page.goto("/"); await page.waitForSelector('[data-testid="mainpage_title"]', { timeout: 30000, diff --git a/src/frontend/tests/core/features/auto-login-off.spec.ts b/src/frontend/tests/core/features/auto-login-off.spec.ts index 06248555d..01a568532 100644 --- a/src/frontend/tests/core/features/auto-login-off.spec.ts +++ b/src/frontend/tests/core/features/auto-login-off.spec.ts @@ -1,282 +1,286 @@ import { expect, test } from "@playwright/test"; -test("when auto_login is false, admin can CRUD user's and should see just your own flows", async ({ - page, -}) => { - await page.route("**/api/v1/auto_login", (route) => { - route.fulfill({ - status: 500, - contentType: "application/json", - body: JSON.stringify({ - detail: { auto_login: false }, - }), +test( + "when auto_login is false, admin can CRUD user's and should see just your own flows", + { tag: ["@release", "@api", "@database"] }, + async ({ page }) => { + await page.route("**/api/v1/auto_login", (route) => { + route.fulfill({ + status: 500, + contentType: "application/json", + body: JSON.stringify({ + detail: { auto_login: false }, + }), + }); }); - }); - const randomName = Math.random().toString(36).substring(5); - const randomPassword = Math.random().toString(36).substring(5); - const secondRandomName = Math.random().toString(36).substring(5); - const randomFlowName = Math.random().toString(36).substring(5); - const secondRandomFlowName = Math.random().toString(36).substring(5); + const randomName = Math.random().toString(36).substring(5); + const randomPassword = Math.random().toString(36).substring(5); + const secondRandomName = Math.random().toString(36).substring(5); + const randomFlowName = Math.random().toString(36).substring(5); + const secondRandomFlowName = Math.random().toString(36).substring(5); - await page.goto("/"); + await page.goto("/"); - await page.waitForSelector("text=sign in to langflow", { timeout: 30000 }); + await page.waitForSelector("text=sign in to langflow", { timeout: 30000 }); - await page.getByPlaceholder("Username").fill("langflow"); - await page.getByPlaceholder("Password").fill("langflow"); + await page.getByPlaceholder("Username").fill("langflow"); + await page.getByPlaceholder("Password").fill("langflow"); - await page.getByRole("button", { name: "Sign In" }).click(); + await page.getByRole("button", { name: "Sign In" }).click(); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - await page.waitForSelector('[id="new-project-btn"]', { - timeout: 30000, - }); + await page.waitForSelector('[id="new-project-btn"]', { + timeout: 30000, + }); - await page.getByTestId("user-profile-settings").click(); + await page.getByTestId("user-profile-settings").click(); - await page.getByText("Admin Page", { exact: true }).click(); + await page.getByText("Admin Page", { exact: true }).click(); - //CRUD an user - await page.getByText("New User", { exact: true }).click(); + //CRUD an user + await page.getByText("New User", { exact: true }).click(); - await page.getByPlaceholder("Username").last().fill(randomName); - await page.locator('input[name="password"]').fill(randomPassword); - await page.locator('input[name="confirmpassword"]').fill(randomPassword); + await page.getByPlaceholder("Username").last().fill(randomName); + await page.locator('input[name="password"]').fill(randomPassword); + await page.locator('input[name="confirmpassword"]').fill(randomPassword); - await page.waitForSelector("#is_active", { - timeout: 1500, - }); + await page.waitForSelector("#is_active", { + timeout: 1500, + }); - await page.locator("#is_active").click(); + await page.locator("#is_active").click(); - await page.getByText("Save", { exact: true }).click(); + await page.getByText("Save", { exact: true }).click(); - await page.waitForSelector("text=new user added", { timeout: 30000 }); + await page.waitForSelector("text=new user added", { timeout: 30000 }); - await expect(page.getByText(randomName, { exact: true })).toBeVisible({ - timeout: 2000, - }); + await expect(page.getByText(randomName, { exact: true })).toBeVisible({ + timeout: 2000, + }); - await page.getByTestId("icon-Trash2").last().click(); - await page.getByText("Delete", { exact: true }).last().click(); + await page.getByTestId("icon-Trash2").last().click(); + await page.getByText("Delete", { exact: true }).last().click(); - await page.waitForSelector("text=user deleted", { timeout: 30000 }); + await page.waitForSelector("text=user deleted", { timeout: 30000 }); - await expect(page.getByText(randomName, { exact: true })).toBeVisible({ - timeout: 2000, - visible: false, - }); + await expect(page.getByText(randomName, { exact: true })).toBeVisible({ + timeout: 2000, + visible: false, + }); - await page.getByText("New User", { exact: true }).click(); + await page.getByText("New User", { exact: true }).click(); - await page.getByPlaceholder("Username").last().fill(randomName); - await page.locator('input[name="password"]').fill(randomPassword); - await page.locator('input[name="confirmpassword"]').fill(randomPassword); + await page.getByPlaceholder("Username").last().fill(randomName); + await page.locator('input[name="password"]').fill(randomPassword); + await page.locator('input[name="confirmpassword"]').fill(randomPassword); - await page.waitForSelector("#is_active", { - timeout: 1500, - }); + await page.waitForSelector("#is_active", { + timeout: 1500, + }); - await page.locator("#is_active").click(); + await page.locator("#is_active").click(); - await page.getByText("Save", { exact: true }).click(); + await page.getByText("Save", { exact: true }).click(); - await page.waitForSelector("text=new user added", { timeout: 30000 }); + await page.waitForSelector("text=new user added", { timeout: 30000 }); - await page.getByPlaceholder("Username").last().fill(randomName); + await page.getByPlaceholder("Username").last().fill(randomName); - await page.getByTestId("icon-Pencil").last().click(); + await page.getByTestId("icon-Pencil").last().click(); - await page.getByPlaceholder("Username").last().fill(secondRandomName); + await page.getByPlaceholder("Username").last().fill(secondRandomName); - await page.getByText("Save", { exact: true }).click(); + await page.getByText("Save", { exact: true }).click(); - await page.waitForSelector("text=user edited", { timeout: 30000 }); + await page.waitForSelector("text=user edited", { timeout: 30000 }); - await expect(page.getByText(secondRandomName, { exact: true })).toBeVisible({ - timeout: 2000, - }); + await expect(page.getByText(secondRandomName, { exact: true })).toBeVisible( + { + timeout: 2000, + }, + ); - //user must see just your own flows - await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { - timeout: 100000, - }); + //user must see just your own flows + await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { + timeout: 100000, + }); - await page.getByTestId("icon-ChevronLeft").first().click(); + await page.getByTestId("icon-ChevronLeft").first().click(); - await page.waitForSelector('[id="new-project-btn"]', { - 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(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } catch (error) { - modalCount = 0; - } - while (modalCount === 0) { - await page.getByText("New Flow", { exact: true }).click(); - await page.waitForSelector('[data-testid="modal-title"]', { + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForSelector('[data-testid="modal-title"]', { + timeout: 30000, + }); + modalCount = await page.getByTestId("modal-title")?.count(); + } + + await page.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Basic Prompting" }).click(); + + await page.waitForSelector('[data-testid="fit_view"]', { + timeout: 100000, + }); + + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); + + await page.getByTestId("flow-configuration-button").click(); + await page.getByText("Flow Settings", { exact: true }).last().click(); + + await page.getByPlaceholder("Flow Name").fill(randomFlowName); + + await page.getByText("Save", { exact: true }).click(); + + await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { + timeout: 100000, + state: "visible", + }); + + await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { + timeout: 1500, + }); + + await page.getByTestId("icon-ChevronLeft").first().click(); + + await page.waitForSelector('[data-testid="search-store-input"]:enabled', { + timeout: 30000, + state: "visible", + }); + + await expect(page.getByText(randomFlowName, { exact: true })).toBeVisible({ + timeout: 2000, + }); + + await page.waitForSelector("[data-testid='user-profile-settings']", { + timeout: 1500, + }); + + await page.getByTestId("user-profile-settings").click(); + + await page.getByText("Logout", { exact: true }).click(); + + await page.waitForSelector("text=sign in to langflow", { timeout: 30000 }); + + await page.getByPlaceholder("Username").fill(secondRandomName); + await page.getByPlaceholder("Password").fill(randomPassword); + + await page.waitForSelector("text=Sign in", { + timeout: 1500, + }); + + await page.getByRole("button", { name: "Sign In" }).click(); + + await page.waitForSelector('[id="new-project-btn"]', { timeout: 30000, }); - modalCount = await page.getByTestId("modal-title")?.count(); - } - await page.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Basic Prompting" }).click(); + expect( + ( + await page.waitForSelector( + "text=Begin with a template, or start from scratch.", + { + timeout: 30000, + }, + ) + ).isVisible(), + ); - await page.waitForSelector('[data-testid="fit_view"]', { - timeout: 100000, - }); + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForSelector('[data-testid="modal-title"]', { + timeout: 30000, + }); + modalCount = await page.getByTestId("modal-title")?.count(); + } - await page.getByTestId("fit_view").click(); - await page.getByTestId("zoom_out").click(); - - await page.getByTestId("flow-configuration-button").click(); - await page.getByText("Flow Settings", { exact: true }).last().click(); - - await page.getByPlaceholder("Flow Name").fill(randomFlowName); - - await page.getByText("Save", { exact: true }).click(); - - await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { - timeout: 100000, - state: "visible", - }); - - await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { - timeout: 1500, - }); - - await page.getByTestId("icon-ChevronLeft").first().click(); - - await page.waitForSelector('[data-testid="search-store-input"]:enabled', { - timeout: 30000, - state: "visible", - }); - - await expect(page.getByText(randomFlowName, { exact: true })).toBeVisible({ - timeout: 2000, - }); - - await page.waitForSelector("[data-testid='user-profile-settings']", { - timeout: 1500, - }); - - await page.getByTestId("user-profile-settings").click(); - - await page.getByText("Logout", { exact: true }).click(); - - await page.waitForSelector("text=sign in to langflow", { timeout: 30000 }); - - await page.getByPlaceholder("Username").fill(secondRandomName); - await page.getByPlaceholder("Password").fill(randomPassword); - - await page.waitForSelector("text=Sign in", { - timeout: 1500, - }); - - await page.getByRole("button", { name: "Sign In" }).click(); - - await page.waitForSelector('[id="new-project-btn"]', { - timeout: 30000, - }); - - expect( - ( - await page.waitForSelector( - "text=Begin with a template, or start from scratch.", - { - timeout: 30000, - }, - ) - ).isVisible(), - ); - - while (modalCount === 0) { - await page.getByText("New Flow", { exact: true }).click(); - await page.waitForSelector('[data-testid="modal-title"]', { + await page.waitForSelector('[id="new-project-btn"]', { timeout: 30000, }); - modalCount = await page.getByTestId("modal-title")?.count(); - } - await page.waitForSelector('[id="new-project-btn"]', { - timeout: 30000, - }); + await page.getByText("New Flow", { exact: true }).click(); - await page.getByText("New Flow", { exact: true }).click(); + await page.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Basic Prompting" }).click(); - await page.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Basic Prompting" }).click(); + await page.waitForSelector('[data-testid="fit_view"]', { + timeout: 100000, + }); - await page.waitForSelector('[data-testid="fit_view"]', { - timeout: 100000, - }); + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); - await page.getByTestId("fit_view").click(); - await page.getByTestId("zoom_out").click(); + await page.getByTestId("flow-configuration-button").click(); + await page.getByText("Flow Settings", { exact: true }).last().click(); - await page.getByTestId("flow-configuration-button").click(); - await page.getByText("Flow Settings", { exact: true }).last().click(); + await page.getByPlaceholder("Flow Name").fill(secondRandomFlowName); - await page.getByPlaceholder("Flow Name").fill(secondRandomFlowName); + await page.getByText("Save", { exact: true }).click(); - await page.getByText("Save", { exact: true }).click(); + await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { + timeout: 100000, + }); - await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { - timeout: 100000, - }); + await page.getByTestId("icon-ChevronLeft").first().click(); - await page.getByTestId("icon-ChevronLeft").first().click(); + await page.waitForSelector('[data-testid="search-store-input"]:enabled', { + timeout: 30000, + }); - await page.waitForSelector('[data-testid="search-store-input"]:enabled', { - timeout: 30000, - }); + await expect( + page.getByText(secondRandomFlowName, { exact: true }), + ).toBeVisible({ + timeout: 2000, + }); - await expect( - page.getByText(secondRandomFlowName, { exact: true }), - ).toBeVisible({ - timeout: 2000, - }); + await expect(page.getByText(randomFlowName, { exact: true })).toBeVisible({ + timeout: 2000, + visible: false, + }); - await expect(page.getByText(randomFlowName, { exact: true })).toBeVisible({ - timeout: 2000, - visible: false, - }); + await page.getByTestId("user-profile-settings").click(); - await page.getByTestId("user-profile-settings").click(); + await page.getByText("Logout", { exact: true }).click(); - await page.getByText("Logout", { exact: true }).click(); + await page.waitForSelector("text=sign in to langflow", { timeout: 30000 }); - await page.waitForSelector("text=sign in to langflow", { timeout: 30000 }); + await page.getByPlaceholder("Username").fill("langflow"); + await page.getByPlaceholder("Password").fill("langflow"); - await page.getByPlaceholder("Username").fill("langflow"); - await page.getByPlaceholder("Password").fill("langflow"); + await page.getByRole("button", { name: "Sign In" }).click(); - await page.getByRole("button", { name: "Sign In" }).click(); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); + await page.waitForSelector('[data-testid="search-store-input"]:enabled', { + timeout: 30000, + }); - await page.waitForSelector('[data-testid="search-store-input"]:enabled', { - timeout: 30000, - }); + expect( + await page.getByText(secondRandomFlowName, { exact: true }).isVisible(), + ).toBe(false); - expect( - await page.getByText(secondRandomFlowName, { exact: true }).isVisible(), - ).toBe(false); - - await expect(page.getByText(randomFlowName, { exact: true })).toBeVisible({ - timeout: 2000, - }); -}); + await expect(page.getByText(randomFlowName, { exact: true })).toBeVisible({ + timeout: 2000, + }); + }, +); diff --git a/src/frontend/tests/core/features/chatInputOutputUser-shard-0.spec.ts b/src/frontend/tests/core/features/chatInputOutputUser-shard-0.spec.ts index 37fc45ddc..fa18117a1 100644 --- a/src/frontend/tests/core/features/chatInputOutputUser-shard-0.spec.ts +++ b/src/frontend/tests/core/features/chatInputOutputUser-shard-0.spec.ts @@ -3,130 +3,136 @@ import * as dotenv from "dotenv"; import { readFileSync } from "fs"; import path from "path"; -test("user must be able to send an image on chat", async ({ page }) => { - test.skip( - !process?.env?.OPENAI_API_KEY, - "OPENAI_API_KEY required to run this test", - ); +test( + "user must be able to send an image on chat", + { tag: ["@release", "@workspace", "@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("/"); - - let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); + if (!process.env.CI) { + dotenv.config({ path: path.resolve(__dirname, "../../.env") }); } - } 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(); - } + await page.goto("/"); - await page.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Basic Prompting" }).click(); - 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 outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); - - while (outdatedComponents > 0) { - await page.getByTestId("icon-AlertTriangle").first().click(); - await page.waitForSelector('[data-testid="icon-AlertTriangle"]', { - timeout: 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(); - 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.waitForSelector("text=Chat Input", { timeout: 30000 }); - - await page.getByText("Chat Input", { exact: true }).click(); - await page.getByTestId("more-options-modal").click(); - await page.getByTestId("advanced-button-modal").click(); - await page.getByText("Close").last().click(); - - await page.getByText("Playground", { exact: true }).last().click(); - - // Read the image file as a binary string - const filePath = "tests/assets/chain.png"; - const fileContent = readFileSync(filePath, "base64"); - - // Create the DataTransfer and File objects within the browser context - const dataTransfer = await page.evaluateHandle( - ({ fileContent }) => { - const dt = new DataTransfer(); - const byteCharacters = atob(fileContent); - const byteNumbers = new Array(byteCharacters.length); - for (let i = 0; i < byteCharacters.length; i++) { - byteNumbers[i] = byteCharacters.charCodeAt(i); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); } - const byteArray = new Uint8Array(byteNumbers); - const file = new File([byteArray], "chain.png", { type: "image/png" }); - dt.items.add(file); - return dt; - }, - { fileContent }, - ); + } catch (error) { + modalCount = 0; + } - await page.waitForSelector('[data-testid="input-chat-playground"]', { - timeout: 100000, - }); + 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(); + } - // Locate the target element - const element = await page.getByTestId("input-chat-playground"); + await page.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Basic Prompting" }).click(); + await page.waitForSelector('[data-testid="fit_view"]', { + timeout: 100000, + }); - // Dispatch the drop event on the target element - await element.dispatchEvent("drop", { dataTransfer }); + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); - await page.waitForSelector('[data-testid="button-send"]', { - timeout: 100000, - }); + let outdatedComponents = await page + .getByTestId("icon-AlertTriangle") + .count(); - await page.getByTestId("button-send").click(); + while (outdatedComponents > 0) { + await page.getByTestId("icon-AlertTriangle").first().click(); + await page.waitForSelector('[data-testid="icon-AlertTriangle"]', { + timeout: 1000, + }); + outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); + } - await page.waitForSelector("text=chain.png", { timeout: 30000 }); + let filledApiKey = await page.getByTestId("remove-icon-badge").count(); + while (filledApiKey > 0) { + await page.getByTestId("remove-icon-badge").first().click(); + filledApiKey = await page.getByTestId("remove-icon-badge").count(); + } - await page.getByText("chain.png").isVisible(); + const apiKeyInput = page.getByTestId("popover-anchor-input-api_key"); + const isApiKeyInputVisible = await apiKeyInput.isVisible(); - await page.getByText("Close", { exact: true }).click(); + if (isApiKeyInputVisible) { + await apiKeyInput.fill(process.env.OPENAI_API_KEY ?? ""); + } - await page.waitForSelector('[data-testid="icon-ScanEye"]', { - timeout: 30000, - }); + await page.getByTestId("dropdown_str_model_name").click(); + await page.getByTestId("gpt-4o-1-option").click(); - await page.getByTestId("icon-ScanEye").nth(4).click(); + await page.waitForSelector("text=Chat Input", { timeout: 30000 }); - await page.getByText("Restart").isHidden(); -}); + await page.getByText("Chat Input", { exact: true }).click(); + await page.getByTestId("more-options-modal").click(); + await page.getByTestId("advanced-button-modal").click(); + await page.getByText("Close").last().click(); + + await page.getByText("Playground", { exact: true }).last().click(); + + // Read the image file as a binary string + const filePath = "tests/assets/chain.png"; + const fileContent = readFileSync(filePath, "base64"); + + // Create the DataTransfer and File objects within the browser context + const dataTransfer = await page.evaluateHandle( + ({ fileContent }) => { + const dt = new DataTransfer(); + const byteCharacters = atob(fileContent); + const byteNumbers = new Array(byteCharacters.length); + for (let i = 0; i < byteCharacters.length; i++) { + byteNumbers[i] = byteCharacters.charCodeAt(i); + } + const byteArray = new Uint8Array(byteNumbers); + const file = new File([byteArray], "chain.png", { type: "image/png" }); + dt.items.add(file); + return dt; + }, + { fileContent }, + ); + + await page.waitForSelector('[data-testid="input-chat-playground"]', { + timeout: 100000, + }); + + // Locate the target element + const element = await page.getByTestId("input-chat-playground"); + + // Dispatch the drop event on the target element + await element.dispatchEvent("drop", { dataTransfer }); + + await page.waitForSelector('[data-testid="button-send"]', { + timeout: 100000, + }); + + await page.getByTestId("button-send").click(); + + await page.waitForSelector("text=chain.png", { timeout: 30000 }); + + await page.getByText("chain.png").isVisible(); + + await page.getByText("Close", { exact: true }).click(); + + await page.waitForSelector('[data-testid="icon-ScanEye"]', { + timeout: 30000, + }); + + await page.getByTestId("icon-ScanEye").nth(4).click(); + + await page.getByText("Restart").isHidden(); + }, +); diff --git a/src/frontend/tests/core/features/componentHoverAdd.spec.ts b/src/frontend/tests/core/features/componentHoverAdd.spec.ts index 0114e79b6..74f6d65e4 100644 --- a/src/frontend/tests/core/features/componentHoverAdd.spec.ts +++ b/src/frontend/tests/core/features/componentHoverAdd.spec.ts @@ -1,77 +1,80 @@ import { expect, test } from "@playwright/test"; -test("user can add components by hovering and clicking the plus icon", async ({ - page, -}) => { - // Navigate to homepage and handle initial modal - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +test( + "user can add components by hovering and clicking the plus icon", + { tag: ["@release", "@components", "@workspace"] }, - let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); + async ({ page }) => { + // Navigate to homepage and handle initial modal + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); + + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } catch (error) { - modalCount = 0; - } - while (modalCount === 0) { - await page.getByText("New Flow", { exact: true }).click(); - await page.waitForSelector('[data-testid="modal-title"]', { + 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(); + } + + // Start with blank flow + await page.getByTestId("blank-flow").click(); + await page.waitForSelector('[data-testid="sidebar-search-input"]', { timeout: 3000, }); - modalCount = await page.getByTestId("modal-title")?.count(); - } - // Start with blank flow - await page.getByTestId("blank-flow").click(); - await page.waitForSelector('[data-testid="sidebar-search-input"]', { - timeout: 3000, - }); + // Search for a component + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("chat input"); - // Search for a component - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("chat input"); + await page.waitForSelector('[data-testid="inputsChat Input"]', { + timeout: 2000, + }); + // Hover over the component and verify plus icon + const componentLocator = page.getByTestId("inputsChat Input"); + // Find the plus icon within the specific component container + const plusIcon = componentLocator.getByTestId("icon-Plus"); - await page.waitForSelector('[data-testid="inputsChat Input"]', { - timeout: 2000, - }); - // Hover over the component and verify plus icon - const componentLocator = page.getByTestId("inputsChat Input"); - // Find the plus icon within the specific component container - const plusIcon = componentLocator.getByTestId("icon-Plus"); + // Get the opacity + const opacity = await plusIcon.evaluate((el) => + window.getComputedStyle(el).getPropertyValue("opacity"), + ); - // Get the opacity - const opacity = await plusIcon.evaluate((el) => - window.getComputedStyle(el).getPropertyValue("opacity"), - ); + await expect(plusIcon).toBeVisible(); - await expect(plusIcon).toBeVisible(); + await expect(opacity).toBe("0"); - await expect(opacity).toBe("0"); + await componentLocator.hover(); + // Hover over the component + await expect(plusIcon).toBeVisible(); + // Wait for the animation to change the opacity + await page.waitForTimeout(500); - await componentLocator.hover(); - // Hover over the component - await expect(plusIcon).toBeVisible(); - // Wait for the animation to change the opacity - await page.waitForTimeout(500); + const opacityAfterHover = await plusIcon.evaluate((el) => + window.getComputedStyle(el).getPropertyValue("opacity"), + ); - const opacityAfterHover = await plusIcon.evaluate((el) => - window.getComputedStyle(el).getPropertyValue("opacity"), - ); + expect(Number(opacityAfterHover)).toBeGreaterThan(0); - expect(Number(opacityAfterHover)).toBeGreaterThan(0); + // Click the plus icon associated with this component + await plusIcon.click(); + // Wait for the component to be added to the flow + await page.waitForSelector(".react-flow__node", { timeout: 1000 }); - // Click the plus icon associated with this component - await plusIcon.click(); - // Wait for the component to be added to the flow - await page.waitForSelector(".react-flow__node", { timeout: 1000 }); - - // Verify component was added to the flow - const addedComponent = page.locator(".react-flow__node").first(); - await expect(addedComponent).toBeVisible(); -}); + // Verify component was added to the flow + const addedComponent = page.locator(".react-flow__node").first(); + await expect(addedComponent).toBeVisible(); + }, +); diff --git a/src/frontend/tests/core/features/filterEdge-shard-0.spec.ts b/src/frontend/tests/core/features/filterEdge-shard-0.spec.ts index f0a6fca31..2fce3ca0c 100644 --- a/src/frontend/tests/core/features/filterEdge-shard-0.spec.ts +++ b/src/frontend/tests/core/features/filterEdge-shard-0.spec.ts @@ -1,176 +1,180 @@ import { expect, test } from "@playwright/test"; -test("user must see on handle hover a tooltip with possibility connections", async ({ - page, -}) => { - await page.goto("/"); - await page.waitForTimeout(1000); +test( + "user must see on handle hover a tooltip with possibility connections", + { tag: ["@release", "@components", "@api"] }, + async ({ page }) => { + await page.goto("/"); + await page.waitForTimeout(1000); - let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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.getByTestId("blank-flow").click(); - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("retrievalqa"); - - await page.getByTestId("sidebar-options-trigger").click(); - await page.getByTestId("sidebar-legacy-switch").isVisible({ timeout: 5000 }); - await page.getByTestId("sidebar-legacy-switch").click(); - await expect(page.getByTestId("sidebar-legacy-switch")).toBeChecked(); - await page.getByTestId("sidebar-options-trigger").click(); - - await page.waitForTimeout(1000); - await page - .getByTestId("langchain_utilitiesRetrieval QA") - .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("zoom_out").click(); - - const outputElements = await page - .getByTestId("handle-retrievalqa-shownode-text-right") - .all(); - let visibleElementHandle; - - for (const element of outputElements) { - if (await element.isVisible()) { - visibleElementHandle = element; - break; + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); } - } - await visibleElementHandle.hover().then(async () => { - await expect( - page.getByText("Drag to connect compatible inputs").first(), - ).toBeVisible(); + await page.getByTestId("blank-flow").click(); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("retrievalqa"); - await expect( - page - .getByText("Select to filter compatible inputs and components") - .first(), - ).toBeVisible(); + await page.getByTestId("sidebar-options-trigger").click(); + await page + .getByTestId("sidebar-legacy-switch") + .isVisible({ timeout: 5000 }); + await page.getByTestId("sidebar-legacy-switch").click(); + await expect(page.getByTestId("sidebar-legacy-switch")).toBeChecked(); + await page.getByTestId("sidebar-options-trigger").click(); - await expect(page.getByText("Output type:").first()).toBeVisible(); + await page.waitForTimeout(1000); + await page + .getByTestId("langchain_utilitiesRetrieval QA") + .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("zoom_out").click(); - await expect( - page.getByTestId("output-tooltip-message").first(), - ).toBeVisible(); - }); + const outputElements = await page + .getByTestId("handle-retrievalqa-shownode-text-right") + .all(); + let visibleElementHandle; - await page.getByTestId("fit_view").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); - - const rqaChainInputElements1 = await page - .getByTestId("handle-retrievalqa-shownode-language model-left") - .all(); - - for (const element of rqaChainInputElements1) { - if (await element.isVisible()) { - visibleElementHandle = element; - break; + for (const element of outputElements) { + if (await element.isVisible()) { + visibleElementHandle = element; + break; + } } - } - await visibleElementHandle.hover().then(async () => { - await expect( - page.getByText("Drag to connect compatible outputs").first(), - ).toBeVisible(); + await visibleElementHandle.hover().then(async () => { + await expect( + page.getByText("Drag to connect compatible inputs").first(), + ).toBeVisible(); - await expect( - page - .getByText("Select to filter compatible outputs and components") - .first(), - ).toBeVisible(); + await expect( + page + .getByText("Select to filter compatible inputs and components") + .first(), + ).toBeVisible(); - await expect(page.getByText("Input type:").first()).toBeVisible(); + await expect(page.getByText("Output type:").first()).toBeVisible(); - await expect( - page.getByTestId("input-tooltip-languagemodel").first(), - ).toBeVisible(); - }); - await page.getByTestId("fit_view").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); + await expect( + page.getByTestId("output-tooltip-message").first(), + ).toBeVisible(); + }); - const rqaChainInputElements0 = await page - .getByTestId("handle-retrievalqa-shownode-retriever-left") - .all(); + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); - for (const element of rqaChainInputElements0) { - if (await element.isVisible()) { - visibleElementHandle = element; - break; + const rqaChainInputElements1 = await page + .getByTestId("handle-retrievalqa-shownode-language model-left") + .all(); + + for (const element of rqaChainInputElements1) { + if (await element.isVisible()) { + visibleElementHandle = element; + break; + } } - } - await visibleElementHandle.hover().then(async () => { - await expect( - page.getByText("Drag to connect compatible outputs").first(), - ).toBeVisible(); + await visibleElementHandle.hover().then(async () => { + await expect( + page.getByText("Drag to connect compatible outputs").first(), + ).toBeVisible(); - await expect( - page - .getByText("Select to filter compatible outputs and components") - .first(), - ).toBeVisible(); + await expect( + page + .getByText("Select to filter compatible outputs and components") + .first(), + ).toBeVisible(); - await expect(page.getByText("Input type:").first()).toBeVisible(); + await expect(page.getByText("Input type:").first()).toBeVisible(); - await expect( - page.getByTestId("input-tooltip-retriever").first(), - ).toBeVisible(); - }); + await expect( + page.getByTestId("input-tooltip-languagemodel").first(), + ).toBeVisible(); + }); + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); - await page.getByTestId("fit_view").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); + const rqaChainInputElements0 = await page + .getByTestId("handle-retrievalqa-shownode-retriever-left") + .all(); - const rqaChainInputElements2 = await page - .getByTestId("handle-retrievalqa-shownode-memory-left") - .all(); - - for (const element of rqaChainInputElements2) { - if (await element.isVisible()) { - visibleElementHandle = element; - break; + for (const element of rqaChainInputElements0) { + if (await element.isVisible()) { + visibleElementHandle = element; + break; + } } - } - await visibleElementHandle.hover().then(async () => { - await expect( - page.getByText("Drag to connect compatible outputs").first(), - ).toBeVisible(); + await visibleElementHandle.hover().then(async () => { + await expect( + page.getByText("Drag to connect compatible outputs").first(), + ).toBeVisible(); - await expect( - page - .getByText("Select to filter compatible outputs and components") - .first(), - ).toBeVisible(); + await expect( + page + .getByText("Select to filter compatible outputs and components") + .first(), + ).toBeVisible(); - await expect(page.getByText("Input type:").first()).toBeVisible(); + await expect(page.getByText("Input type:").first()).toBeVisible(); - await expect( - page.getByTestId("input-tooltip-basechatmemory").first(), - ).toBeVisible(); - }); -}); + await expect( + page.getByTestId("input-tooltip-retriever").first(), + ).toBeVisible(); + }); + + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); + + const rqaChainInputElements2 = await page + .getByTestId("handle-retrievalqa-shownode-memory-left") + .all(); + + for (const element of rqaChainInputElements2) { + if (await element.isVisible()) { + visibleElementHandle = element; + break; + } + } + + await visibleElementHandle.hover().then(async () => { + await expect( + page.getByText("Drag to connect compatible outputs").first(), + ).toBeVisible(); + + await expect( + page + .getByText("Select to filter compatible outputs and components") + .first(), + ).toBeVisible(); + + await expect(page.getByText("Input type:").first()).toBeVisible(); + + await expect( + page.getByTestId("input-tooltip-basechatmemory").first(), + ).toBeVisible(); + }); + }, +); diff --git a/src/frontend/tests/core/features/filterSidebar.spec.ts b/src/frontend/tests/core/features/filterSidebar.spec.ts index ee3840544..52f2dea71 100644 --- a/src/frontend/tests/core/features/filterSidebar.spec.ts +++ b/src/frontend/tests/core/features/filterSidebar.spec.ts @@ -1,164 +1,171 @@ import { expect, test } from "@playwright/test"; -test("user must see on handle click the possibility connections - LLMChain", async ({ - page, -}) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +test( + "user must see on handle click the possibility connections", + { tag: ["@release", "@components", "@api"] }, - await page.waitForSelector('[id="new-project-btn"]', { - timeout: 30000, - }); + async ({ page }) => { + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); + 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; } - } catch (error) { - modalCount = 0; - } - while (modalCount === 0) { - await page.getByText("New Flow", { exact: true }).click(); - await page.waitForSelector('[data-testid="modal-title"]', { + 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(); + } + await page.waitForSelector('[data-testid="blank-flow"]', { timeout: 3000, }); - modalCount = await page.getByTestId("modal-title")?.count(); - } - await page.waitForSelector('[data-testid="blank-flow"]', { - timeout: 3000, - }); - await page.getByTestId("blank-flow").click(); - await page.waitForSelector('[data-testid="sidebar-search-input"]', { - timeout: 3000, - }); - - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("api request"); - - await page.waitForSelector('[data-testid="dataAPI Request"]', { - timeout: 3000, - }); - await page - .getByTestId("dataAPI Request") - .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("zoom_out").click(); - await page.waitForSelector( - '[data-testid="handle-apirequest-shownode-urls-left"]', - { + await page.getByTestId("blank-flow").click(); + await page.waitForSelector('[data-testid="sidebar-search-input"]', { timeout: 3000, - }, - ); - await page.getByTestId("handle-apirequest-shownode-urls-left").click(); - - await page.waitForTimeout(500); - - expect(await page.getByTestId("icon-ListFilter").first()).toBeVisible(); - - await page - .getByTestId("icon-X") - .first() - .hover() - .then(async () => { - await page - .getByText("Remove filter", { - exact: false, - }) - .first() - .isVisible(); }); - await expect(page.getByTestId("disclosure-inputs")).toBeVisible(); - await expect(page.getByTestId("disclosure-outputs")).toBeVisible(); - await expect(page.getByTestId("disclosure-prompts")).toBeVisible(); - await expect(page.getByTestId("disclosure-models")).toBeVisible(); - await expect(page.getByTestId("disclosure-helpers")).toBeVisible(); - await expect(page.getByTestId("disclosure-agents")).toBeVisible(); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("api request"); - await page.getByTestId("sidebar-options-trigger").click(); - await page.getByTestId("sidebar-legacy-switch").isVisible({ timeout: 5000 }); - await page.getByTestId("sidebar-legacy-switch").click(); - await page.getByTestId("sidebar-options-trigger").click(); + await page.waitForSelector('[data-testid="dataAPI Request"]', { + timeout: 3000, + }); + await page + .getByTestId("dataAPI Request") + .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("zoom_out").click(); + await page.waitForSelector( + '[data-testid="handle-apirequest-shownode-urls-left"]', + { + timeout: 3000, + }, + ); + await page.getByTestId("handle-apirequest-shownode-urls-left").click(); - await expect(page.getByTestId("disclosure-prototypes")).toBeVisible(); + await page.waitForTimeout(500); - await expect(page.getByTestId("inputsChat Input")).toBeVisible(); - await expect(page.getByTestId("outputsChat Output")).toBeVisible(); - await expect(page.getByTestId("promptsPrompt")).toBeVisible(); - await expect(page.getByTestId("modelsAmazon Bedrock")).toBeVisible(); - await expect(page.getByTestId("helpersMessage History")).toBeVisible(); - await expect(page.getByTestId("langchain_utilitiesCSVAgent")).toBeVisible(); - await expect( - page.getByTestId("langchain_utilitiesConversationChain"), - ).toBeVisible(); + expect(await page.getByTestId("icon-ListFilter").first()).toBeVisible(); - await expect(page.getByTestId("helpersCurrent Date")).toBeVisible(); + await page + .getByTestId("icon-X") + .first() + .hover() + .then(async () => { + await page + .getByText("Remove filter", { + exact: false, + }) + .first() + .isVisible(); + }); - await page.getByTestId("sidebar-options-trigger").click(); - await page.getByTestId("sidebar-beta-switch").isVisible({ timeout: 5000 }); - await page.getByTestId("sidebar-beta-switch").click(); - await expect(page.getByTestId("sidebar-beta-switch")).not.toBeChecked(); - await page.getByTestId("sidebar-options-trigger").click(); + await expect(page.getByTestId("disclosure-inputs")).toBeVisible(); + await expect(page.getByTestId("disclosure-outputs")).toBeVisible(); + await expect(page.getByTestId("disclosure-prompts")).toBeVisible(); + await expect(page.getByTestId("disclosure-models")).toBeVisible(); + await expect(page.getByTestId("disclosure-helpers")).toBeVisible(); + await expect(page.getByTestId("disclosure-agents")).toBeVisible(); - await expect(page.getByTestId("helpersCurrent Date")).not.toBeVisible(); + await page.getByTestId("sidebar-options-trigger").click(); + await page + .getByTestId("sidebar-legacy-switch") + .isVisible({ timeout: 5000 }); + await page.getByTestId("sidebar-legacy-switch").click(); + await page.getByTestId("sidebar-options-trigger").click(); - await page.getByTestId("sidebar-filter-reset").click(); + await expect(page.getByTestId("disclosure-prototypes")).toBeVisible(); - await expect(page.getByTestId("inputsChat Input")).not.toBeVisible(); - await expect(page.getByTestId("outputsChat Output")).not.toBeVisible(); - await expect(page.getByTestId("promptsPrompt")).not.toBeVisible(); - await expect(page.getByTestId("modelsAmazon Bedrock")).not.toBeVisible(); - await expect(page.getByTestId("helpersMessage History")).not.toBeVisible(); - await expect(page.getByTestId("agentsTool Calling Agent")).not.toBeVisible(); - await expect( - page.getByTestId("langchain_utilitiesConversationChain"), - ).not.toBeVisible(); - await expect(page.getByTestId("logicCondition")).not.toBeVisible(); + await expect(page.getByTestId("inputsChat Input")).toBeVisible(); + await expect(page.getByTestId("outputsChat Output")).toBeVisible(); + await expect(page.getByTestId("promptsPrompt")).toBeVisible(); + await expect(page.getByTestId("modelsAmazon Bedrock")).toBeVisible(); + await expect(page.getByTestId("helpersMessage History")).toBeVisible(); + await expect(page.getByTestId("langchain_utilitiesCSVAgent")).toBeVisible(); + await expect( + page.getByTestId("langchain_utilitiesConversationChain"), + ).toBeVisible(); - await page.getByTestId("handle-apirequest-shownode-headers-left").click(); + await expect(page.getByTestId("helpersCurrent Date")).toBeVisible(); - await expect(page.getByTestId("disclosure-data")).toBeVisible(); - await expect(page.getByTestId("disclosure-helpers")).toBeVisible(); - await expect(page.getByTestId("disclosure-vector stores")).toBeVisible(); - await expect(page.getByTestId("disclosure-prototypes")).toBeVisible(); - await expect(page.getByTestId("disclosure-embeddings")).toBeVisible(); - await expect(page.getByTestId("disclosure-tools")).toBeVisible(); + await page.getByTestId("sidebar-options-trigger").click(); + await page.getByTestId("sidebar-beta-switch").isVisible({ timeout: 5000 }); + await page.getByTestId("sidebar-beta-switch").click(); + await expect(page.getByTestId("sidebar-beta-switch")).not.toBeChecked(); + await page.getByTestId("sidebar-options-trigger").click(); - await expect(page.getByTestId("dataAPI Request")).toBeVisible(); - await expect(page.getByTestId("helpersMessage History")).toBeVisible(); - await expect(page.getByTestId("vectorstoresAstra DB")).toBeVisible(); - await expect(page.getByTestId("toolsSearch API")).toBeVisible(); - await expect(page.getByTestId("logicSub Flow")).not.toBeVisible(); + await expect(page.getByTestId("helpersCurrent Date")).not.toBeVisible(); - await page.getByTestId("sidebar-options-trigger").click(); - await page.getByTestId("sidebar-beta-switch").isVisible({ timeout: 5000 }); - await page.getByTestId("sidebar-beta-switch").click(); - await expect(page.getByTestId("sidebar-beta-switch")).toBeChecked(); - await page.getByTestId("sidebar-options-trigger").click(); + await page.getByTestId("sidebar-filter-reset").click(); - await expect(page.getByTestId("logicSub Flow")).toBeVisible(); + await expect(page.getByTestId("inputsChat Input")).not.toBeVisible(); + await expect(page.getByTestId("outputsChat Output")).not.toBeVisible(); + await expect(page.getByTestId("promptsPrompt")).not.toBeVisible(); + await expect(page.getByTestId("modelsAmazon Bedrock")).not.toBeVisible(); + await expect(page.getByTestId("helpersMessage History")).not.toBeVisible(); + await expect( + page.getByTestId("agentsTool Calling Agent"), + ).not.toBeVisible(); + await expect( + page.getByTestId("langchain_utilitiesConversationChain"), + ).not.toBeVisible(); + await expect(page.getByTestId("logicCondition")).not.toBeVisible(); - await expect(page.getByTestId("processingSplit Text")).toBeVisible(); - await expect(page.getByTestId("toolsSearch API")).toBeVisible(); + await page.getByTestId("handle-apirequest-shownode-headers-left").click(); - await page.getByTestId("icon-X").first().click(); + await expect(page.getByTestId("disclosure-data")).toBeVisible(); + await expect(page.getByTestId("disclosure-helpers")).toBeVisible(); + await expect(page.getByTestId("disclosure-vector stores")).toBeVisible(); + await expect(page.getByTestId("disclosure-prototypes")).toBeVisible(); + await expect(page.getByTestId("disclosure-embeddings")).toBeVisible(); + await expect(page.getByTestId("disclosure-tools")).toBeVisible(); - await expect(page.getByTestId("dataAPI Request")).not.toBeVisible(); - await expect(page.getByTestId("helpersMessage History")).not.toBeVisible(); - await expect(page.getByTestId("vectorstoresAstra DB")).not.toBeVisible(); - await expect(page.getByTestId("toolsSearch API")).not.toBeVisible(); - await expect(page.getByTestId("logicSub Flow")).not.toBeVisible(); + await expect(page.getByTestId("dataAPI Request")).toBeVisible(); + await expect(page.getByTestId("helpersMessage History")).toBeVisible(); + await expect(page.getByTestId("vectorstoresAstra DB")).toBeVisible(); + await expect(page.getByTestId("toolsSearch API")).toBeVisible(); + await expect(page.getByTestId("logicSub Flow")).not.toBeVisible(); - await expect(page.getByTestId("processingSplit Text")).not.toBeVisible(); - await expect(page.getByTestId("toolsSearch API")).not.toBeVisible(); -}); + await page.getByTestId("sidebar-options-trigger").click(); + await page.getByTestId("sidebar-beta-switch").isVisible({ timeout: 5000 }); + await page.getByTestId("sidebar-beta-switch").click(); + await expect(page.getByTestId("sidebar-beta-switch")).toBeChecked(); + await page.getByTestId("sidebar-options-trigger").click(); + + await expect(page.getByTestId("logicSub Flow")).toBeVisible(); + + await expect(page.getByTestId("processingSplit Text")).toBeVisible(); + await expect(page.getByTestId("toolsSearch API")).toBeVisible(); + + await page.getByTestId("icon-X").first().click(); + + await expect(page.getByTestId("dataAPI Request")).not.toBeVisible(); + await expect(page.getByTestId("helpersMessage History")).not.toBeVisible(); + await expect(page.getByTestId("vectorstoresAstra DB")).not.toBeVisible(); + await expect(page.getByTestId("toolsSearch API")).not.toBeVisible(); + await expect(page.getByTestId("logicSub Flow")).not.toBeVisible(); + + await expect(page.getByTestId("processingSplit Text")).not.toBeVisible(); + await expect(page.getByTestId("toolsSearch API")).not.toBeVisible(); + }, +); diff --git a/src/frontend/tests/core/features/folders.spec.ts b/src/frontend/tests/core/features/folders.spec.ts index bbc325c7d..251f60d6d 100644 --- a/src/frontend/tests/core/features/folders.spec.ts +++ b/src/frontend/tests/core/features/folders.spec.ts @@ -1,86 +1,91 @@ import { expect, test } from "@playwright/test"; import { readFileSync } from "fs"; -test("CRUD folders", async ({ page }) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +test( + "CRUD folders", + { tag: ["@release", "@api"] }, - await page.waitForSelector('[id="new-project-btn"]', { - timeout: 30000, - }); + async ({ page }) => { + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); + 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; } - } catch (error) { - modalCount = 0; - } - while (modalCount === 0) { - await page.getByText("New Flow", { exact: true }).click(); - await page.waitForSelector('[data-testid="modal-title"]', { + 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(); + } + await page.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Basic Prompting" }).click(); + + await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { + timeout: 100000, + }); + + await page.getByTestId("icon-ChevronLeft").first().click(); + await page.getByPlaceholder("Search flows").first().isVisible(); + await page.getByText("Flows").first().isVisible(); + await page.getByText("Components").first().isVisible(); + await page.getByText("All").first().isVisible(); + await page.getByText("Select All").first().isVisible(); + + await page.getByTestId("add-folder-button").click(); + await page + .locator("[data-testid='folder-sidebar']") + .getByText("New Folder") + .last() + .isVisible(); + + await page + .locator("[data-testid='folder-sidebar']") + .getByText("New Folder") + .last() + .dblclick(); + + const element = await page.getByTestId("input-folder"); + await element.fill("new folder test name"); + + await page.getByText("My Projects").last().click({ + force: true, + }); + + await page.getByText("new folder test name").last().waitFor({ + state: "visible", + timeout: 30000, + }); + + await page + .getByText("new folder test name") + .last() + .hover() + .then(async () => { + await page.getByTestId("more-options-button").last().click(); + }); + + await page.getByTestId("btn-delete-folder").click(); + await page.getByText("Delete").last().click(); + await expect(page.getByText("Folder deleted successfully")).toBeVisible({ timeout: 3000, }); - modalCount = await page.getByTestId("modal-title")?.count(); - } - await page.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Basic Prompting" }).click(); - - await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { - timeout: 100000, - }); - - await page.getByTestId("icon-ChevronLeft").first().click(); - await page.getByPlaceholder("Search flows").first().isVisible(); - await page.getByText("Flows").first().isVisible(); - await page.getByText("Components").first().isVisible(); - await page.getByText("All").first().isVisible(); - await page.getByText("Select All").first().isVisible(); - - await page.getByTestId("add-folder-button").click(); - await page - .locator("[data-testid='folder-sidebar']") - .getByText("New Folder") - .last() - .isVisible(); - - await page - .locator("[data-testid='folder-sidebar']") - .getByText("New Folder") - .last() - .dblclick(); - - const element = await page.getByTestId("input-folder"); - await element.fill("new folder test name"); - - await page.getByText("My Projects").last().click({ - force: true, - }); - - await page.getByText("new folder test name").last().waitFor({ - state: "visible", - timeout: 30000, - }); - - await page - .getByText("new folder test name") - .last() - .hover() - .then(async () => { - await page.getByTestId("more-options-button").last().click(); - }); - - await page.getByTestId("btn-delete-folder").click(); - await page.getByText("Delete").last().click(); - await expect(page.getByText("Folder deleted successfully")).toBeVisible({ - timeout: 3000, - }); -}); + }, +); test("add a flow into a folder by drag and drop", async ({ page }) => { await page.goto("/"); diff --git a/src/frontend/tests/core/features/freeze-path.spec.ts b/src/frontend/tests/core/features/freeze-path.spec.ts index 03fcffb5a..35144b7b5 100644 --- a/src/frontend/tests/core/features/freeze-path.spec.ts +++ b/src/frontend/tests/core/features/freeze-path.spec.ts @@ -2,187 +2,194 @@ import { expect, test } from "@playwright/test"; import * as dotenv from "dotenv"; import path from "path"; -test("user must be able to freeze a path", async ({ page }) => { - test.skip( - !process?.env?.OPENAI_API_KEY, - "OPENAI_API_KEY required to run this test", - ); +test( + "user must be able to freeze a path", + { tag: ["@release", "@workspace", "@components"] }, - 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.waitForSelector('[data-testid="modal-title"]', { - timeout: 3000, - }); - modalCount = await page.getByTestId("modal-title")?.count(); - } - - await page.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Basic Prompting" }).click(); - - 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 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(); - } - - //remove all saved api keys - let filledApiKey = await page.getByTestId("remove-icon-badge").count(); - while (filledApiKey > 0) { - await page.getByTestId("remove-icon-badge").first().click(); - 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("textarea_str_input_value") - .first() - .fill( - "say a random number between 1 and 100000 and a random animal that lives in the sea", + async ({ page }) => { + test.skip( + !process?.env?.OPENAI_API_KEY, + "OPENAI_API_KEY required to run this test", ); - await page.getByTestId("dropdown_str_model_name").click(); - await page.getByTestId("gpt-4o-1-option").click(); + if (!process.env.CI) { + dotenv.config({ path: path.resolve(__dirname, "../../.env") }); + } - await page.waitForSelector('[data-testid="float_float_temperature"]', { - timeout: 1000, - }); + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - await page.getByTestId("float_float_temperature").fill("1.0"); + await page.waitForSelector('[id="new-project-btn"]', { + timeout: 30000, + }); - await page.waitForSelector('[data-testid="button_run_chat output"]', { - timeout: 1000, - }); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; + } - await page.getByTestId("button_run_chat output").click(); + 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(); + } - await page.waitForSelector("text=built successfully", { timeout: 30000 }); + await page.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Basic Prompting" }).click(); - await page.getByText("built successfully").last().click({ - timeout: 15000, - }); + await page.waitForSelector('[data-testid="fit_view"]', { + timeout: 100000, + }); - await page.getByTestId("output-inspection-text").first().click(); + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); - const randomTextGeneratedByAI = await page - .getByPlaceholder("Empty") - .first() - .inputValue(); + let outdatedComponents = await page + .getByTestId("icon-AlertTriangle") + .count(); - await page.getByText("Close").first().click(); + while (outdatedComponents > 0) { + await page.getByTestId("icon-AlertTriangle").first().click(); + await page.waitForTimeout(1000); + outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); + } - await page.waitForSelector('[data-testid="float_float_temperature"]', { - timeout: 3000, - }); + //remove all saved api keys + let filledApiKey = await page.getByTestId("remove-icon-badge").count(); + while (filledApiKey > 0) { + await page.getByTestId("remove-icon-badge").first().click(); + filledApiKey = await page.getByTestId("remove-icon-badge").count(); + } - await page.getByTestId("float_float_temperature").fill(""); - await page.getByTestId("float_float_temperature").fill("1.2"); + const apiKeyInput = page.getByTestId("popover-anchor-input-api_key"); + const isApiKeyInputVisible = await apiKeyInput.isVisible(); - await page.waitForSelector('[data-testid="button_run_chat output"]', { - timeout: 1000, - }); + if (isApiKeyInputVisible) { + await apiKeyInput.fill(process.env.OPENAI_API_KEY ?? ""); + } - await page.getByTestId("button_run_chat output").click(); - await page.waitForSelector("text=built successfully", { timeout: 30000 }); + await page + .getByTestId("textarea_str_input_value") + .first() + .fill( + "say a random number between 1 and 100000 and a random animal that lives in the sea", + ); - await page.getByText("built successfully").last().click({ - timeout: 15000, - }); + await page.getByTestId("dropdown_str_model_name").click(); + await page.getByTestId("gpt-4o-1-option").click(); - await page.getByTestId("output-inspection-text").first().click(); + await page.waitForSelector('[data-testid="float_float_temperature"]', { + timeout: 1000, + }); - const secondRandomTextGeneratedByAI = await page - .getByPlaceholder("Empty") - .first() - .inputValue(); + await page.getByTestId("float_float_temperature").fill("1.0"); - await page.getByText("Close").first().click(); + await page.waitForSelector('[data-testid="button_run_chat output"]', { + timeout: 1000, + }); - await page.waitForSelector("text=OpenAI", { - timeout: 1000, - }); + await page.getByTestId("button_run_chat output").click(); - await page.getByText("OpenAI", { exact: true }).last().click(); + await page.waitForSelector("text=built successfully", { timeout: 30000 }); - await page.waitForSelector('[data-testid="more-options-modal"]', { - timeout: 1000, - }); + await page.getByText("built successfully").last().click({ + timeout: 15000, + }); - await page.getByTestId("more-options-modal").click(); + await page.getByTestId("output-inspection-text").first().click(); - await page.waitForSelector('[data-testid="freeze-path-button"]', { - timeout: 1000, - }); + const randomTextGeneratedByAI = await page + .getByPlaceholder("Empty") + .first() + .inputValue(); - await page.getByTestId("freeze-path-button").click(); + await page.getByText("Close").first().click(); - await page.waitForSelector('[data-testid="icon-Snowflake"]', { - timeout: 1000, - }); + await page.waitForSelector('[data-testid="float_float_temperature"]', { + timeout: 3000, + }); - expect(await page.getByTestId("icon-Snowflake").count()).toBeGreaterThan(0); + await page.getByTestId("float_float_temperature").fill(""); + await page.getByTestId("float_float_temperature").fill("1.2"); - await page.waitForSelector('[data-testid="button_run_chat output"]', { - timeout: 1000, - }); + await page.waitForSelector('[data-testid="button_run_chat output"]', { + timeout: 1000, + }); - await page.getByTestId("button_run_chat output").click(); + await page.getByTestId("button_run_chat output").click(); + await page.waitForSelector("text=built successfully", { timeout: 30000 }); - await page.waitForSelector("text=built successfully", { timeout: 30000 }); + await page.getByText("built successfully").last().click({ + timeout: 15000, + }); - await page.getByText("built successfully").last().click({ - timeout: 15000, - }); + await page.getByTestId("output-inspection-text").first().click(); - await page.getByTestId("output-inspection-text").first().click(); + const secondRandomTextGeneratedByAI = await page + .getByPlaceholder("Empty") + .first() + .inputValue(); - const thirdRandomTextGeneratedByAI = await page - .getByPlaceholder("Empty") - .first() - .inputValue(); + await page.getByText("Close").first().click(); - await page.getByText("Close").first().click(); + await page.waitForSelector("text=OpenAI", { + timeout: 1000, + }); - expect(randomTextGeneratedByAI).not.toEqual(secondRandomTextGeneratedByAI); - expect(randomTextGeneratedByAI).not.toEqual(thirdRandomTextGeneratedByAI); - expect(secondRandomTextGeneratedByAI).toEqual(thirdRandomTextGeneratedByAI); -}); + await page.getByText("OpenAI", { exact: true }).last().click(); + + await page.waitForSelector('[data-testid="more-options-modal"]', { + timeout: 1000, + }); + + await page.getByTestId("more-options-modal").click(); + + await page.waitForSelector('[data-testid="freeze-path-button"]', { + timeout: 1000, + }); + + await page.getByTestId("freeze-path-button").click(); + + await page.waitForSelector('[data-testid="icon-Snowflake"]', { + timeout: 1000, + }); + + expect(await page.getByTestId("icon-Snowflake").count()).toBeGreaterThan(0); + + await page.waitForSelector('[data-testid="button_run_chat output"]', { + timeout: 1000, + }); + + await page.getByTestId("button_run_chat output").click(); + + await page.waitForSelector("text=built successfully", { timeout: 30000 }); + + await page.getByText("built successfully").last().click({ + timeout: 15000, + }); + + await page.getByTestId("output-inspection-text").first().click(); + + const thirdRandomTextGeneratedByAI = await page + .getByPlaceholder("Empty") + .first() + .inputValue(); + + await page.getByText("Close").first().click(); + + expect(randomTextGeneratedByAI).not.toEqual(secondRandomTextGeneratedByAI); + expect(randomTextGeneratedByAI).not.toEqual(thirdRandomTextGeneratedByAI); + expect(secondRandomTextGeneratedByAI).toEqual(thirdRandomTextGeneratedByAI); + }, +); diff --git a/src/frontend/tests/core/features/freeze.spec.ts b/src/frontend/tests/core/features/freeze.spec.ts index 1fa9214a1..9b0542f09 100644 --- a/src/frontend/tests/core/features/freeze.spec.ts +++ b/src/frontend/tests/core/features/freeze.spec.ts @@ -1,367 +1,374 @@ import { expect, test } from "@playwright/test"; -test("user must be able to freeze a component", async ({ page }) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +test( + "user must be able to freeze a component", + { tag: ["@release", "@workspace", "@components"] }, - await page.waitForSelector('[id="new-project-btn"]', { - timeout: 30000, - }); + async ({ page }) => { + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); + 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; } - } 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(); - } + 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(); + } - await page.getByTestId("blank-flow").click(); + await page.getByTestId("blank-flow").click(); - //first component + //first component - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("text input"); - await page.waitForSelector('[data-testid="inputsText Input"]', { - timeout: 1000, - }); - - await page - .getByTestId("inputsText Input") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.getByTestId("zoom_out").click(); - await page - .locator('//*[@id="react-flow-id"]') - .hover() - .then(async () => { - await page.mouse.down(); - await page.mouse.move(-800, 300); - }); - - await page.mouse.up(); - - //second component - - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("url"); - await page.waitForSelector('[data-testid="dataURL"]', { - timeout: 1000, - }); - - await page - .getByTestId("dataURL") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.getByTestId("zoom_out").click(); - await page - .locator('//*[@id="react-flow-id"]') - .hover() - .then(async () => { - await page.mouse.down(); - await page.mouse.move(-800, 300); - }); - - await page.mouse.up(); - - //third component - - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("split text"); - await page.waitForSelector('[data-testid="processingSplit Text"]', { - timeout: 1000, - }); - - await page - .getByTestId("processingSplit Text") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.getByTestId("zoom_out").click(); - await page - .locator('//*[@id="react-flow-id"]') - .hover() - .then(async () => { - await page.mouse.down(); - await page.mouse.move(-800, 300); - }); - - await page.mouse.up(); - - //fourth component - - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("parse data"); - await page.waitForSelector('[data-testid="processingParse Data"]', { - timeout: 1000, - }); - - await page - .getByTestId("processingParse Data") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.getByTestId("zoom_out").click(); - await page - .locator('//*[@id="react-flow-id"]') - .hover() - .then(async () => { - await page.mouse.down(); - await page.mouse.move(-800, 300); - }); - - await page.mouse.up(); - - //fifth component - - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("chat output"); - await page.waitForSelector('[data-testid="outputsChat Output"]', { - timeout: 1000, - }); - - await page - .getByTestId("outputsChat Output") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.getByTestId("zoom_out").click(); - await page - .locator('//*[@id="react-flow-id"]') - .hover() - .then(async () => { - await page.mouse.down(); - await page.mouse.move(-800, 300); - }); - - await page.mouse.up(); - - let outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); - - while (outdatedComponents > 0) { - await page.getByTestId("icon-AlertTriangle").first().click(); - await page.waitForSelector('[data-testid="icon-AlertTriangle"]', { + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("text input"); + await page.waitForSelector('[data-testid="inputsText Input"]', { timeout: 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(); - filledApiKey = await page.getByTestId("remove-icon-badge").count(); - } + await page + .getByTestId("inputsText Input") + .dragTo(page.locator('//*[@id="react-flow-id"]')); - await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page + .locator('//*[@id="react-flow-id"]') + .hover() + .then(async () => { + await page.mouse.down(); + await page.mouse.move(-800, 300); + }); - //connection 1 - const urlOutput = await page - .getByTestId("handle-url-shownode-data-right") - .nth(0); - await urlOutput.hover(); - await page.mouse.down(); - const splitTextInputData = await page.getByTestId( - "handle-splittext-shownode-data inputs-left", - ); - await splitTextInputData.hover(); - await page.mouse.up(); + await page.mouse.up(); - //connection 2 - const textOutput = await page - .getByTestId("handle-textinput-shownode-text-right") - .nth(0); - await textOutput.hover(); - await page.mouse.down(); - const splitTextInput = await page.getByTestId( - "handle-splittext-shownode-separator-left", - ); - await splitTextInput.hover(); - await page.mouse.up(); + //second component - await page.getByTestId("fit_view").click(); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("url"); + await page.waitForSelector('[data-testid="dataURL"]', { + timeout: 1000, + }); - //connection 3 - const splitTextOutput = await page - .getByTestId("handle-splittext-shownode-chunks-right") - .nth(0); - await splitTextOutput.hover(); - await page.mouse.down(); - const parseDataInput = await page.getByTestId( - "handle-parsedata-shownode-data-left", - ); - await parseDataInput.hover(); - await page.mouse.up(); + await page + .getByTestId("dataURL") + .dragTo(page.locator('//*[@id="react-flow-id"]')); - //connection 4 - const parseDataOutput = await page - .getByTestId("handle-parsedata-shownode-text-right") - .nth(0); - await parseDataOutput.hover(); - await page.mouse.down(); - const chatOutputInput = await page.getByTestId( - "handle-chatoutput-shownode-text-left", - ); - await chatOutputInput.hover(); - await page.mouse.up(); + await page.getByTestId("zoom_out").click(); + await page + .locator('//*[@id="react-flow-id"]') + .hover() + .then(async () => { + await page.mouse.down(); + await page.mouse.move(-800, 300); + }); - await page.getByTestId("fit_view").click(); + await page.mouse.up(); - await page - .getByTestId("textarea_str_input_value") - .first() - .fill("lorem ipsum"); + //third component - await page - .getByTestId("inputlist_str_urls_0") - .fill("https://www.lipsum.com/"); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("split text"); + await page.waitForSelector('[data-testid="processingSplit Text"]', { + timeout: 1000, + }); - await page.getByTestId("button_run_chat output").click(); + await page + .getByTestId("processingSplit Text") + .dragTo(page.locator('//*[@id="react-flow-id"]')); - await page.waitForSelector("text=built successfully", { timeout: 30000 }); + await page.getByTestId("zoom_out").click(); + await page + .locator('//*[@id="react-flow-id"]') + .hover() + .then(async () => { + await page.mouse.down(); + await page.mouse.move(-800, 300); + }); - await page.getByText("built successfully").last().click({ - timeout: 15000, - }); + await page.mouse.up(); - await page.waitForSelector('[data-testid="output-inspection-message"]', { - timeout: 1000, - }); + //fourth component - await page.getByTestId("output-inspection-message").first().click(); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("parse data"); + await page.waitForSelector('[data-testid="processingParse Data"]', { + timeout: 1000, + }); - await page.getByRole("gridcell").nth(4).click(); + await page + .getByTestId("processingParse Data") + .dragTo(page.locator('//*[@id="react-flow-id"]')); - const firstRunWithoutFreezing = await page - .getByPlaceholder("Empty") - .textContent(); + await page.getByTestId("zoom_out").click(); + await page + .locator('//*[@id="react-flow-id"]') + .hover() + .then(async () => { + await page.mouse.down(); + await page.mouse.move(-800, 300); + }); - await page.getByText("Close").last().click(); - await page.getByText("Close").last().click(); + await page.mouse.up(); - await page.getByTestId("textarea_str_input_value").first().fill(","); + //fifth component - await page.getByTestId("button_run_chat output").click(); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("chat output"); + await page.waitForSelector('[data-testid="outputsChat Output"]', { + timeout: 1000, + }); - await page.waitForSelector("text=built successfully", { timeout: 30000 }); + await page + .getByTestId("outputsChat Output") + .dragTo(page.locator('//*[@id="react-flow-id"]')); - await page.getByText("built successfully").last().click({ - timeout: 15000, - }); + await page.getByTestId("zoom_out").click(); + await page + .locator('//*[@id="react-flow-id"]') + .hover() + .then(async () => { + await page.mouse.down(); + await page.mouse.move(-800, 300); + }); - await page.waitForSelector('[data-testid="output-inspection-message"]', { - timeout: 1000, - }); + await page.mouse.up(); - await page.getByTestId("output-inspection-message").first().click(); + let outdatedComponents = await page + .getByTestId("icon-AlertTriangle") + .count(); - await page.getByRole("gridcell").nth(4).click(); + while (outdatedComponents > 0) { + await page.getByTestId("icon-AlertTriangle").first().click(); + await page.waitForSelector('[data-testid="icon-AlertTriangle"]', { + timeout: 1000, + }); + outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); + } - const secondRunWithoutFreezing = await page - .getByPlaceholder("Empty") - .textContent(); + let filledApiKey = await page.getByTestId("remove-icon-badge").count(); + while (filledApiKey > 0) { + await page.getByTestId("remove-icon-badge").first().click(); + filledApiKey = await page.getByTestId("remove-icon-badge").count(); + } - await page.getByText("Close").last().click(); - await page.getByText("Close").last().click(); + await page.getByTestId("fit_view").click(); - await page.getByText("Split Text", { exact: true }).last().click(); + //connection 1 + const urlOutput = await page + .getByTestId("handle-url-shownode-data-right") + .nth(0); + await urlOutput.hover(); + await page.mouse.down(); + const splitTextInputData = await page.getByTestId( + "handle-splittext-shownode-data inputs-left", + ); + await splitTextInputData.hover(); + await page.mouse.up(); - await page.waitForSelector('[data-testid="more-options-modal"]', { - timeout: 1000, - }); + //connection 2 + const textOutput = await page + .getByTestId("handle-textinput-shownode-text-right") + .nth(0); + await textOutput.hover(); + await page.mouse.down(); + const splitTextInput = await page.getByTestId( + "handle-splittext-shownode-separator-left", + ); + await splitTextInput.hover(); + await page.mouse.up(); - await page.getByTestId("more-options-modal").click(); + await page.getByTestId("fit_view").click(); - await page.waitForSelector('[data-testid="icon-Snowflake"]', { - timeout: 1000, - }); + //connection 3 + const splitTextOutput = await page + .getByTestId("handle-splittext-shownode-chunks-right") + .nth(0); + await splitTextOutput.hover(); + await page.mouse.down(); + const parseDataInput = await page.getByTestId( + "handle-parsedata-shownode-data-left", + ); + await parseDataInput.hover(); + await page.mouse.up(); - await page.getByTestId("icon-Snowflake").click(); + //connection 4 + const parseDataOutput = await page + .getByTestId("handle-parsedata-shownode-text-right") + .nth(0); + await parseDataOutput.hover(); + await page.mouse.down(); + const chatOutputInput = await page.getByTestId( + "handle-chatoutput-shownode-text-left", + ); + await chatOutputInput.hover(); + await page.mouse.up(); - await page.keyboard.press("Escape"); + await page.getByTestId("fit_view").click(); - await page.locator('//*[@id="react-flow-id"]').click(); + await page + .getByTestId("textarea_str_input_value") + .first() + .fill("lorem ipsum"); - await page - .getByTestId("textarea_str_input_value") - .first() - .fill("lorem ipsum"); + await page + .getByTestId("inputlist_str_urls_0") + .fill("https://www.lipsum.com/"); - await page.waitForSelector('[data-testid="button_run_chat output"]', { - timeout: 1000, - }); + await page.getByTestId("button_run_chat output").click(); - await page.getByTestId("button_run_chat output").click(); + await page.waitForSelector("text=built successfully", { timeout: 30000 }); - await page.waitForSelector("text=built successfully", { timeout: 30000 }); + await page.getByText("built successfully").last().click({ + timeout: 15000, + }); - await page.getByText("built successfully").last().click({ - timeout: 15000, - }); + await page.waitForSelector('[data-testid="output-inspection-message"]', { + timeout: 1000, + }); - await page.waitForSelector('[data-testid="output-inspection-message"]', { - timeout: 1000, - }); + await page.getByTestId("output-inspection-message").first().click(); - await page.getByTestId("output-inspection-message").first().click(); + await page.getByRole("gridcell").nth(4).click(); - await page.getByRole("gridcell").nth(4).click(); + const firstRunWithoutFreezing = await page + .getByPlaceholder("Empty") + .textContent(); - const firstTextFreezed = await page.getByPlaceholder("Empty").textContent(); + await page.getByText("Close").last().click(); + await page.getByText("Close").last().click(); - await page.getByText("Close").last().click(); - await page.getByText("Close").last().click(); + await page.getByTestId("textarea_str_input_value").first().fill(","); - await page.getByText("Split Text", { exact: true }).click(); + await page.getByTestId("button_run_chat output").click(); - await page.waitForSelector('[data-testid="more-options-modal"]', { - timeout: 1000, - }); + await page.waitForSelector("text=built successfully", { timeout: 30000 }); - await page.getByTestId("more-options-modal").click(); + await page.getByText("built successfully").last().click({ + timeout: 15000, + }); - await page.waitForSelector('[data-testid="icon-Snowflake"]', { - timeout: 1000, - }); + await page.waitForSelector('[data-testid="output-inspection-message"]', { + timeout: 1000, + }); - await page.getByText("Freeze", { exact: true }).click(); + await page.getByTestId("output-inspection-message").first().click(); - await page.keyboard.press("Escape"); + await page.getByRole("gridcell").nth(4).click(); - await page.locator('//*[@id="react-flow-id"]').click(); + const secondRunWithoutFreezing = await page + .getByPlaceholder("Empty") + .textContent(); - await page.getByTestId("button_run_chat output").click(); + await page.getByText("Close").last().click(); + await page.getByText("Close").last().click(); - await page.waitForSelector("text=built successfully", { timeout: 30000 }); + await page.getByText("Split Text", { exact: true }).last().click(); - await page.getByText("built successfully").last().click({ - timeout: 15000, - }); + await page.waitForSelector('[data-testid="more-options-modal"]', { + timeout: 1000, + }); - await page.waitForSelector('[data-testid="output-inspection-message"]', { - timeout: 1000, - }); + await page.getByTestId("more-options-modal").click(); - await page.getByTestId("output-inspection-message").first().click(); + await page.waitForSelector('[data-testid="icon-Snowflake"]', { + timeout: 1000, + }); - await page.getByRole("gridcell").nth(4).click(); + await page.getByTestId("icon-Snowflake").click(); - const thirdTextWithoutFreezing = await page - .getByPlaceholder("Empty") - .textContent(); + await page.keyboard.press("Escape"); - expect(secondRunWithoutFreezing).toBe(firstTextFreezed); + await page.locator('//*[@id="react-flow-id"]').click(); - expect(firstRunWithoutFreezing).not.toBe(firstTextFreezed); - expect(firstRunWithoutFreezing).not.toBe(secondRunWithoutFreezing); - expect(firstRunWithoutFreezing).not.toBe(firstTextFreezed); - expect(thirdTextWithoutFreezing).not.toBe(firstTextFreezed); -}); + await page + .getByTestId("textarea_str_input_value") + .first() + .fill("lorem ipsum"); + + await page.waitForSelector('[data-testid="button_run_chat output"]', { + timeout: 1000, + }); + + await page.getByTestId("button_run_chat output").click(); + + await page.waitForSelector("text=built successfully", { timeout: 30000 }); + + await page.getByText("built successfully").last().click({ + timeout: 15000, + }); + + await page.waitForSelector('[data-testid="output-inspection-message"]', { + timeout: 1000, + }); + + await page.getByTestId("output-inspection-message").first().click(); + + await page.getByRole("gridcell").nth(4).click(); + + const firstTextFreezed = await page.getByPlaceholder("Empty").textContent(); + + await page.getByText("Close").last().click(); + await page.getByText("Close").last().click(); + + await page.getByText("Split Text", { exact: true }).click(); + + await page.waitForSelector('[data-testid="more-options-modal"]', { + timeout: 1000, + }); + + await page.getByTestId("more-options-modal").click(); + + await page.waitForSelector('[data-testid="icon-Snowflake"]', { + timeout: 1000, + }); + + await page.getByText("Freeze", { exact: true }).click(); + + await page.keyboard.press("Escape"); + + await page.locator('//*[@id="react-flow-id"]').click(); + + await page.getByTestId("button_run_chat output").click(); + + await page.waitForSelector("text=built successfully", { timeout: 30000 }); + + await page.getByText("built successfully").last().click({ + timeout: 15000, + }); + + await page.waitForSelector('[data-testid="output-inspection-message"]', { + timeout: 1000, + }); + + await page.getByTestId("output-inspection-message").first().click(); + + await page.getByRole("gridcell").nth(4).click(); + + const thirdTextWithoutFreezing = await page + .getByPlaceholder("Empty") + .textContent(); + + expect(secondRunWithoutFreezing).toBe(firstTextFreezed); + + expect(firstRunWithoutFreezing).not.toBe(firstTextFreezed); + expect(firstRunWithoutFreezing).not.toBe(secondRunWithoutFreezing); + expect(firstRunWithoutFreezing).not.toBe(firstTextFreezed); + expect(thirdTextWithoutFreezing).not.toBe(firstTextFreezed); + }, +); diff --git a/src/frontend/tests/core/features/globalVariables.spec.ts b/src/frontend/tests/core/features/globalVariables.spec.ts index 2ac2e318f..fa360c757 100644 --- a/src/frontend/tests/core/features/globalVariables.spec.ts +++ b/src/frontend/tests/core/features/globalVariables.spec.ts @@ -1,94 +1,96 @@ import { expect, test } from "@playwright/test"; -test("user must be able to save or delete a global variable", async ({ - page, -}) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +test( + "user must be able to save or delete a global variable", + { tag: ["@release", "@workspace", "@api"] }, + async ({ page }) => { + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - await page.waitForSelector('[id="new-project-btn"]', { - 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(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } catch (error) { - modalCount = 0; - } - while (modalCount === 0) { - await page.getByText("New Flow", { exact: true }).click(); - await page.waitForSelector('[data-testid="modal-title"]', { - timeout: 3000, + 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(); + } + await page.waitForSelector('[data-testid="blank-flow"]', { + timeout: 30000, }); - 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("openai"); + await page.getByTestId("blank-flow").click(); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("openai"); - await page.waitForSelector('[data-testid="modelsOpenAI"]', { - timeout: 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(); - - const genericName = Math.random().toString(); - const credentialName = Math.random().toString(); - - await page.getByTestId("icon-Globe").nth(0).click(); - await page.getByText("Add New Variable", { exact: true }).click(); - await page - .getByPlaceholder("Insert a name for the variable...") - .fill(genericName); - await page.getByText("Generic", { exact: true }).first().isVisible(); - await page - .getByPlaceholder("Insert a value for the variable...") - .fill("This is a test of generic variable value"); - await page.getByText("Save Variable", { exact: true }).click(); - expect(page.getByText(genericName, { exact: true })).not.toBeNull(); - await page.getByText(genericName, { exact: true }).isVisible(); - - await page.getByText("Add New Variable", { exact: true }).click(); - await page - .getByPlaceholder("Insert a name for the variable...") - .fill(credentialName); - await page.getByTestId("select-type-global-variables").first().click(); - await page.getByText("Credential", { exact: true }).last().click(); - await page - .getByPlaceholder("Insert a value for the variable...") - .fill("This is a test of credential variable value"); - await page.getByText("Save Variable", { exact: true }).click(); - expect(page.getByText(credentialName, { exact: true })).not.toBeNull(); - await page.getByText(credentialName, { exact: true }).isVisible(); - - await page - .getByText(credentialName, { exact: true }) - .hover() - .then(async () => { - await page.getByTestId("icon-Trash2").last().click(); - await page.getByText("Delete", { exact: true }).nth(1).click(); + await page.waitForSelector('[data-testid="modelsOpenAI"]', { + timeout: 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(); + + const genericName = Math.random().toString(); + const credentialName = Math.random().toString(); + + await page.getByTestId("icon-Globe").nth(0).click(); + await page.getByText("Add New Variable", { exact: true }).click(); + await page + .getByPlaceholder("Insert a name for the variable...") + .fill(genericName); + await page.getByText("Generic", { exact: true }).first().isVisible(); + await page + .getByPlaceholder("Insert a value for the variable...") + .fill("This is a test of generic variable value"); + await page.getByText("Save Variable", { exact: true }).click(); + expect(page.getByText(genericName, { exact: true })).not.toBeNull(); + await page.getByText(genericName, { exact: true }).isVisible(); + + await page.getByText("Add New Variable", { exact: true }).click(); + await page + .getByPlaceholder("Insert a name for the variable...") + .fill(credentialName); + await page.getByTestId("select-type-global-variables").first().click(); + await page.getByText("Credential", { exact: true }).last().click(); + await page + .getByPlaceholder("Insert a value for the variable...") + .fill("This is a test of credential variable value"); + await page.getByText("Save Variable", { exact: true }).click(); + expect(page.getByText(credentialName, { exact: true })).not.toBeNull(); + await page.getByText(credentialName, { exact: true }).isVisible(); + + await page + .getByText(credentialName, { exact: true }) + .hover() + .then(async () => { + await page.getByTestId("icon-Trash2").last().click(); + await page.getByText("Delete", { exact: true }).nth(1).click(); + }); + }, +); diff --git a/src/frontend/tests/core/features/group.spec.ts b/src/frontend/tests/core/features/group.spec.ts index 67f32ec29..2f4e6fa26 100644 --- a/src/frontend/tests/core/features/group.spec.ts +++ b/src/frontend/tests/core/features/group.spec.ts @@ -2,42 +2,46 @@ import { test } from "@playwright/test"; test.describe("group node test", () => { /// - test("group and ungroup updating values", async ({ page }) => { - await page.goto("/"); + test( + "group and ungroup updating values", + { tag: ["@release", "@workspace"] }, + async ({ page }) => { + await page.goto("/"); - let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } catch (error) { - modalCount = 0; - } - while (modalCount === 0) { - await page.getByText("New Flow", { exact: true }).click(); - modalCount = await page.getByTestId("modal-title")?.count(); - } + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + modalCount = await page.getByTestId("modal-title")?.count(); + } - await page.getByTestId("side_nav_options_all-templates").click(); - await page - .getByRole("heading", { name: "Basic Prompting" }) - .first() - .click(); - await page.getByTestId("fit_view").first().click(); + await page.getByTestId("side_nav_options_all-templates").click(); + await page + .getByRole("heading", { name: "Basic Prompting" }) + .first() + .click(); + await page.getByTestId("fit_view").first().click(); - await page.getByTestId("title-OpenAI").click(); - await page.getByTestId("title-OpenAI").click({ modifiers: ["Control"] }); - await page.getByTestId("title-Prompt").click({ modifiers: ["Control"] }); - await page.getByTestId("title-OpenAI").click({ modifiers: ["Control"] }); + await page.getByTestId("title-OpenAI").click(); + await page.getByTestId("title-OpenAI").click({ modifiers: ["Control"] }); + await page.getByTestId("title-Prompt").click({ modifiers: ["Control"] }); + await page.getByTestId("title-OpenAI").click({ modifiers: ["Control"] }); - await page.getByRole("button", { name: "Group" }).click(); - await page.getByTestId("title-Group").dblclick(); - await page.getByTestId("input-title-Group").first().fill("test"); - await page.getByTestId("icon-Ungroup").first().click(); - await page.keyboard.press("Control+g"); - await page.getByTestId("title-OpenAI").isVisible(); - await page.getByTestId("title-Prompt").isVisible(); - }); + await page.getByRole("button", { name: "Group" }).click(); + await page.getByTestId("title-Group").dblclick(); + await page.getByTestId("input-title-Group").first().fill("test"); + await page.getByTestId("icon-Ungroup").first().click(); + await page.keyboard.press("Control+g"); + await page.getByTestId("title-OpenAI").isVisible(); + await page.getByTestId("title-Prompt").isVisible(); + }, + ); }); diff --git a/src/frontend/tests/core/features/keyboardComponentSearch.spec.ts b/src/frontend/tests/core/features/keyboardComponentSearch.spec.ts index 0a0e2503e..2b0f9f68f 100644 --- a/src/frontend/tests/core/features/keyboardComponentSearch.spec.ts +++ b/src/frontend/tests/core/features/keyboardComponentSearch.spec.ts @@ -1,99 +1,101 @@ import { expect, test } from "@playwright/test"; -test("user can search and add components using keyboard shortcuts", async ({ - page, -}) => { - // Navigate to homepage and handle initial modal - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - 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, +test( + "user can search and add components using keyboard shortcuts", + { tag: ["@release", "@workspace"] }, + async ({ page }) => { + // Navigate to homepage and handle initial modal + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, }); - modalCount = await page.getByTestId("modal-title")?.count(); - } - // Start with blank flow - await page.getByTestId("blank-flow").click(); - await page.waitForSelector('[data-testid="sidebar-search-input"]', { - timeout: 1000, - }); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; + } - // Press "/" to activate search - await page.keyboard.press("/"); + 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(); + } - // Verify search is focused and disclosures are closed when search is empty - await expect(page.getByTestId("sidebar-search-input")).toBeFocused({ - timeout: 1000, - }); - await expect(page.getByTestId("inputsChat Input")).not.toBeVisible(); + // Start with blank flow + await page.getByTestId("blank-flow").click(); + await page.waitForSelector('[data-testid="sidebar-search-input"]', { + timeout: 1000, + }); - // Type "chat" to search for chat components - await page.keyboard.type("chat"); + // Press "/" to activate search + await page.keyboard.press("/"); - await expect(page.getByTestId("inputsChat Input")).toBeVisible({ - timeout: 1000, - }); + // Verify search is focused and disclosures are closed when search is empty + await expect(page.getByTestId("sidebar-search-input")).toBeFocused({ + timeout: 1000, + }); + await expect(page.getByTestId("inputsChat Input")).not.toBeVisible(); - // Verify disclosures open when search has content - await expect(page.getByTestId("inputsChat Input")).toBeVisible(); + // Type "chat" to search for chat components + await page.keyboard.type("chat"); - // Press Tab to focus first result - await page.keyboard.press("Tab"); - await page.keyboard.press("Tab"); + await expect(page.getByTestId("inputsChat Input")).toBeVisible({ + timeout: 1000, + }); - // Verify some expected chat-related components are visible - await expect(page.getByTestId("inputsChat Input")).toBeVisible(); - await expect(page.getByTestId("outputsChat Output")).toBeVisible(); + // Verify disclosures open when search has content + await expect(page.getByTestId("inputsChat Input")).toBeVisible(); - // Press Space to select the component - await page.keyboard.press("Space"); + // Press Tab to focus first result + await page.keyboard.press("Tab"); + await page.keyboard.press("Tab"); - // Verify component was added to flow - const addedComponent = await page.locator(".react-flow__node").first(); - await expect(addedComponent).toBeVisible(); + // Verify some expected chat-related components are visible + await expect(page.getByTestId("inputsChat Input")).toBeVisible(); + await expect(page.getByTestId("outputsChat Output")).toBeVisible(); - // Clear search input and verify disclosures are closed - await page.getByTestId("sidebar-search-input").clear(); - await expect(page.getByTestId("inputsChat Input")).not.toBeVisible(); + // Press Space to select the component + await page.keyboard.press("Space"); - // Test Enter key selection - await page.keyboard.press("/"); - await page.keyboard.type("prompt"); + // Verify component was added to flow + const addedComponent = await page.locator(".react-flow__node").first(); + await expect(addedComponent).toBeVisible(); - // Verify disclosures open with new search - await expect(page.getByTestId("promptsPrompt")).toBeVisible(); + // Clear search input and verify disclosures are closed + await page.getByTestId("sidebar-search-input").clear(); + await expect(page.getByTestId("inputsChat Input")).not.toBeVisible(); - await page.keyboard.press("Tab"); - await page.keyboard.press("Tab"); - await page.keyboard.press("Enter"); + // Test Enter key selection + await page.keyboard.press("/"); + await page.keyboard.type("prompt"); - // Verify second component was added - const nodeCount = await page.locator(".react-flow__node").count(); - expect(nodeCount).toBe(2); + // Verify disclosures open with new search + await expect(page.getByTestId("promptsPrompt")).toBeVisible(); - // Verify search is cleared and disclosures are closed after adding component - await page.keyboard.press("/"); - await page.getByTestId("sidebar-search-input").clear(); - await expect(page.getByTestId("sidebar-search-input")).toHaveValue(""); - await expect(page.getByTestId("inputsChat Input")).not.toBeVisible(); + await page.keyboard.press("Tab"); + await page.keyboard.press("Tab"); + await page.keyboard.press("Enter"); - await expect(page.getByTestId("sidebar-search-input")).toBeFocused(); - await page.keyboard.press("Escape"); - await expect(page.getByTestId("sidebar-search-input")).not.toBeFocused(); - await expect(page.getByTestId("inputsChat Input")).not.toBeVisible(); -}); + // Verify second component was added + const nodeCount = await page.locator(".react-flow__node").count(); + expect(nodeCount).toBe(2); + + // Verify search is cleared and disclosures are closed after adding component + await page.keyboard.press("/"); + await page.getByTestId("sidebar-search-input").clear(); + await expect(page.getByTestId("sidebar-search-input")).toHaveValue(""); + await expect(page.getByTestId("inputsChat Input")).not.toBeVisible(); + + await expect(page.getByTestId("sidebar-search-input")).toBeFocused(); + await page.keyboard.press("Escape"); + await expect(page.getByTestId("sidebar-search-input")).not.toBeFocused(); + await expect(page.getByTestId("inputsChat Input")).not.toBeVisible(); + }, +); diff --git a/src/frontend/tests/core/features/logs.spec.ts b/src/frontend/tests/core/features/logs.spec.ts index b8bdd60c7..befbd7871 100644 --- a/src/frontend/tests/core/features/logs.spec.ts +++ b/src/frontend/tests/core/features/logs.spec.ts @@ -2,116 +2,123 @@ import { expect, test } from "@playwright/test"; import * as dotenv from "dotenv"; import path from "path"; -test("should able to see and interact with logs", async ({ page }) => { - test.skip( - !process?.env?.OPENAI_API_KEY, - "OPENAI_API_KEY required to run this test", - ); +test( + "should able to see and interact with logs", + { tag: ["@release", "@workspace", "@api"] }, - if (!process.env.CI) { - dotenv.config({ path: path.resolve(__dirname, "../../.env") }); - } + async ({ page }) => { + test.skip( + !process?.env?.OPENAI_API_KEY, + "OPENAI_API_KEY required to run this test", + ); - 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(); + if (!process.env.CI) { + dotenv.config({ path: path.resolve(__dirname, "../../.env") }); } - } catch (error) { - modalCount = 0; - } - while (modalCount === 0) { - await page.getByText("New Flow", { exact: true }).click(); - await page.waitForSelector('[data-testid="modal-title"]', { - timeout: 3000, + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, }); - modalCount = await page.getByTestId("modal-title")?.count(); - } - await page.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Basic Prompting" }).click(); - await expect(page.getByTestId(/.*rf__node.*/).first()).toBeVisible({ - timeout: 1000, - }); - let outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); + await page.waitForSelector('[id="new-project-btn"]', { + timeout: 30000, + }); - while (outdatedComponents > 0) { - await page.getByTestId("icon-AlertTriangle").first().click(); - outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); - } + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; + } - let filledApiKey = await page.getByTestId("remove-icon-badge").count(); - while (filledApiKey > 0) { - await page.getByTestId("remove-icon-badge").first().click(); - filledApiKey = await page.getByTestId("remove-icon-badge").count(); - } + 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(); + } - await page.getByTestId("icon-ChevronDown").click(); - await page.getByText("Logs").click(); - await page.getByText("No Data Available", { exact: true }).isVisible(); - await page.keyboard.press("Escape"); + await page.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Basic Prompting" }).click(); + await expect(page.getByTestId(/.*rf__node.*/).first()).toBeVisible({ + timeout: 1000, + }); + let outdatedComponents = await page + .getByTestId("icon-AlertTriangle") + .count(); - const apiKeyInput = page.getByTestId("popover-anchor-input-api_key"); - const isApiKeyInputVisible = await apiKeyInput.isVisible(); + while (outdatedComponents > 0) { + await page.getByTestId("icon-AlertTriangle").first().click(); + outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); + } - if (isApiKeyInputVisible) { - await apiKeyInput.fill(process.env.OPENAI_API_KEY ?? ""); - } + let filledApiKey = await page.getByTestId("remove-icon-badge").count(); + while (filledApiKey > 0) { + await page.getByTestId("remove-icon-badge").first().click(); + filledApiKey = await page.getByTestId("remove-icon-badge").count(); + } - await page.getByTestId("dropdown_str_model_name").click(); - await page.getByTestId("gpt-4o-1-option").click(); + await page.getByTestId("icon-ChevronDown").click(); + await page.getByText("Logs").click(); + await page.getByText("No Data Available", { exact: true }).isVisible(); + await page.keyboard.press("Escape"); - await page.waitForSelector('[data-testid="button_run_chat output"]', { - timeout: 1000, - }); - await page.getByTestId("button_run_chat output").first().click(); + const apiKeyInput = page.getByTestId("popover-anchor-input-api_key"); + const isApiKeyInputVisible = await apiKeyInput.isVisible(); - await page.waitForSelector("text=built successfully", { timeout: 30000 }); + if (isApiKeyInputVisible) { + await apiKeyInput.fill(process.env.OPENAI_API_KEY ?? ""); + } - await page.getByText("built successfully").last().click({ - timeout: 15000, - }); + await page.getByTestId("dropdown_str_model_name").click(); + await page.getByTestId("gpt-4o-1-option").click(); - await page - .getByText("Chat Output built successfully", { exact: true }) - .isVisible(); - await page.getByTestId("icon-ChevronDown").click(); - await page.getByText("Logs").click(); + await page.waitForSelector('[data-testid="button_run_chat output"]', { + timeout: 1000, + }); + await page.getByTestId("button_run_chat output").first().click(); - await page.getByText("timestamp").first().isVisible(); - await page.getByText("flow_id").first().isVisible(); - await page.getByText("source").first().isVisible(); - await page.getByText("target", { exact: true }).first().isVisible(); - await page.getByText("target_args", { exact: true }).first().isVisible(); - await page.getByRole("gridcell").first().isVisible(); + await page.waitForSelector("text=built successfully", { timeout: 30000 }); - await page.keyboard.press("Escape"); + await page.getByText("built successfully").last().click({ + timeout: 15000, + }); - await page.getByTestId("user-profile-settings").first().click(); - await page.getByText("Settings", { exact: true }).click(); + await page + .getByText("Chat Output built successfully", { exact: true }) + .isVisible(); + await page.getByTestId("icon-ChevronDown").click(); + await page.getByText("Logs").click(); - await page.getByText("Messages", { exact: true }).click(); - await page.getByText("index", { exact: true }).last().isVisible(); - await page.getByText("timestamp", { exact: true }).isVisible(); - await page.getByText("flow_id", { exact: true }).isVisible(); - await page.getByText("source", { exact: true }).isVisible(); - await page.getByText("target", { exact: true }).isVisible(); - await page.getByText("vertex_id", { exact: true }).isVisible(); - await page.getByText("status", { exact: true }).isVisible(); - await page.getByText("error", { exact: true }).isVisible(); - await page.getByText("outputs", { exact: true }).isVisible(); - await page.getByText("inputs", { exact: true }).isVisible(); + await page.getByText("timestamp").first().isVisible(); + await page.getByText("flow_id").first().isVisible(); + await page.getByText("source").first().isVisible(); + await page.getByText("target", { exact: true }).first().isVisible(); + await page.getByText("target_args", { exact: true }).first().isVisible(); + await page.getByRole("gridcell").first().isVisible(); - await page.getByRole("gridcell").first().isVisible(); -}); + await page.keyboard.press("Escape"); + + await page.getByTestId("user-profile-settings").first().click(); + await page.getByText("Settings", { exact: true }).click(); + + await page.getByText("Messages", { exact: true }).click(); + await page.getByText("index", { exact: true }).last().isVisible(); + await page.getByText("timestamp", { exact: true }).isVisible(); + await page.getByText("flow_id", { exact: true }).isVisible(); + await page.getByText("source", { exact: true }).isVisible(); + await page.getByText("target", { exact: true }).isVisible(); + await page.getByText("vertex_id", { exact: true }).isVisible(); + await page.getByText("status", { exact: true }).isVisible(); + await page.getByText("error", { exact: true }).isVisible(); + await page.getByText("outputs", { exact: true }).isVisible(); + await page.getByText("inputs", { exact: true }).isVisible(); + + await page.getByRole("gridcell").first().isVisible(); + }, +); diff --git a/src/frontend/tests/core/features/playground.spec.ts b/src/frontend/tests/core/features/playground.spec.ts index 79c821b4d..ad37d0861 100644 --- a/src/frontend/tests/core/features/playground.spec.ts +++ b/src/frontend/tests/core/features/playground.spec.ts @@ -2,282 +2,288 @@ import { expect, test } from "@playwright/test"; import * as dotenv from "dotenv"; import path from "path"; -test("fresh start playground", async ({ page }) => { - if (!process.env.CI) { - dotenv.config({ path: path.resolve(__dirname, "../../.env") }); - } - - await page.goto("/"); - await page.locator("span").filter({ hasText: "My Collection" }).isVisible(); - 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(); +test( + "fresh start playground", + { tag: ["@release", "@workspace", "@api"] }, + async ({ page }) => { + if (!process.env.CI) { + dotenv.config({ path: path.resolve(__dirname, "../../.env") }); } - } 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.goto("/"); + await page.locator("span").filter({ hasText: "My Collection" }).isVisible(); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - await page.waitForSelector('[data-testid="blank-flow"]', { - timeout: 30000, - }); + await page.waitForSelector('[id="new-project-btn"]', { + timeout: 30000, + }); - await page.getByTestId("blank-flow").click(); - - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("chat output"); - await page.waitForTimeout(1000); - - await page - .getByTestId("outputsChat Output") - .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("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("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("chat input"); - await page.waitForTimeout(1000); - - await page - .getByTestId("inputsChat Input") - .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("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("text output"); - await page.waitForTimeout(1000); - - await page - .getByTestId("outputsText Output") - .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("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 elementsChatInput = await page - .locator('[data-testid="handle-chatinput-shownode-message-right"]') - .all(); - - let visibleElementHandle; - - for (const element of elementsChatInput) { - if (await element.isVisible()) { - visibleElementHandle = element; - break; + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } - // Click and hold on the first element - await visibleElementHandle.hover(); - await page.mouse.down(); - - // Move to the second element - - const elementsTextOutput = await page - .getByTestId("handle-textoutput-shownode-text-left") - .all(); - - for (const element of elementsTextOutput) { - if (await element.isVisible()) { - visibleElementHandle = element; - break; + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); } - } - await visibleElementHandle.hover(); + await page.waitForSelector('[data-testid="blank-flow"]', { + timeout: 30000, + }); - // Release the mouse - await page.mouse.up(); + await page.getByTestId("blank-flow").click(); - await page.getByTestId("fit_view").click(); - await page.getByTestId("fit_view").click(); - await page.getByTestId("fit_view").click(); - await page.getByTestId("fit_view").click(); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("chat output"); + await page.waitForTimeout(1000); - // + await page + .getByTestId("outputsChat Output") + .dragTo(page.locator('//*[@id="react-flow-id"]')); + await page.mouse.up(); + await page.mouse.down(); - const elementsTextOutputRight = await page - .locator('[data-testid="handle-textoutput-shownode-text-right"]') - .all(); + await page.getByTestId("fit_view").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(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); - for (const element of elementsTextOutputRight) { - if (await element.isVisible()) { - visibleElementHandle = element; - break; + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("chat input"); + await page.waitForTimeout(1000); + + await page + .getByTestId("inputsChat Input") + .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("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("text output"); + await page.waitForTimeout(1000); + + await page + .getByTestId("outputsText Output") + .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("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 elementsChatInput = await page + .locator('[data-testid="handle-chatinput-shownode-message-right"]') + .all(); + + let visibleElementHandle; + + for (const element of elementsChatInput) { + if (await element.isVisible()) { + visibleElementHandle = element; + break; + } } - } - // Click and hold on the first element - await visibleElementHandle.hover(); - await page.mouse.down(); + // Click and hold on the first element + await visibleElementHandle.hover(); + await page.mouse.down(); - // - const elementsChatOutput = await page - .getByTestId("handle-chatoutput-shownode-text-left") - .all(); + // Move to the second element - for (const element of elementsChatOutput) { - if (await element.isVisible()) { - visibleElementHandle = element; - break; + const elementsTextOutput = await page + .getByTestId("handle-textoutput-shownode-text-left") + .all(); + + for (const element of elementsTextOutput) { + if (await element.isVisible()) { + visibleElementHandle = element; + break; + } } - } - await visibleElementHandle.hover(); + await visibleElementHandle.hover(); - // Release the mouse - await page.mouse.up(); + // Release the mouse + await page.mouse.up(); - await page.getByTestId("fit_view").click(); - await page.getByText("Playground", { exact: true }).last().click(); - await page.waitForSelector('[data-testid="input-chat-playground"]', { - timeout: 100000, - }); + await page.getByTestId("fit_view").click(); + await page.getByTestId("fit_view").click(); + await page.getByTestId("fit_view").click(); + await page.getByTestId("fit_view").click(); - //send message - await page.getByTestId("input-chat-playground").click(); - await page.getByTestId("input-chat-playground").fill("message 1"); - await page.keyboard.press("Enter"); - //check message - await page.getByTestId("chat-message-User-message 1").click(); - await page - .getByTestId("chat-message-AI-message 1") - .getByText("message") - .click(); - //check session - await page.getByText("Default Session").first().click(); - await page.getByTestId("chat-message-User-message 1").click(); - //check edit message - await page.getByTestId("chat-message-User-message 1").hover(); - await page - .locator("div") - .filter({ hasText: /^Usermessage 1$/ }) - .getByTestId("icon-Pen") - .click(); - await page.waitForTimeout(500); + // - await page.getByTestId("textarea").fill("edit_1"); - await page.getByTestId("save-button").click(); - await page.getByTestId("chat-message-User-edit_1").click(); - await page.getByTestId("chat-message-User-edit_1").hover(); - // check cancel edit - await page.getByTestId("sender_name_user").hover(); - await page.getByTestId("icon-Pen").first().click(); - await page.waitForTimeout(500); + const elementsTextOutputRight = await page + .locator('[data-testid="handle-textoutput-shownode-text-right"]') + .all(); - await page.getByTestId("textarea").fill("cancel_edit"); - await page.getByTestId("cancel-button").click(); - await page.getByTestId("chat-message-User-edit_1").click(); - await page.getByTestId("chat-message-User-edit_1").hover(); - //check edit bot message - await page - .getByTestId("chat-message-AI-message 1") - .getByText("message") - .click(); - await page.getByTestId("chat-message-AI-message 1").hover(); - await page.getByTestId("icon-Pen").last().click(); - await page.waitForTimeout(500); + for (const element of elementsTextOutputRight) { + if (await element.isVisible()) { + visibleElementHandle = element; + break; + } + } - await page.getByTestId("textarea").fill("edit_bot_1"); - await page.getByTestId("save-button").click(); - await page.getByText("edit_bot_1").click(); - // check cancel edit bot - await page.getByTestId("chat-message-AI-edit_bot_1").hover(); - await page.getByTestId("icon-Pen").last().click(); - await page.waitForTimeout(500); + // Click and hold on the first element + await visibleElementHandle.hover(); + await page.mouse.down(); - await page.getByTestId("textarea").fill("edit_bot_cancel"); - await page.getByTestId("cancel-button").click(); - await page.getByText("edit_bot_1").click(); - await page.getByTestId("chat-message-AI-edit_bot_1").hover(); - // check table messages view - await page.getByRole("combobox").click(); - await page.getByLabel("Message logs").click(); - await page.getByText("Page 1 of 1", { exact: true }).click(); - // check rename session - await page.getByRole("combobox").click(); - await page.getByLabel("Rename").getByText("Rename").click(); - await page.getByRole("textbox").fill("new name"); - await page.getByTestId("icon-Check").click(); - await page.waitForTimeout(500); + // + const elementsChatOutput = await page + .getByTestId("handle-chatoutput-shownode-text-left") + .all(); - await page.getByTestId("session-selector").getByText("new name").click(); - // check cancel rename - await page.getByRole("combobox").click(); - await page.getByLabel("Rename").getByText("Rename").click(); - await page.getByRole("textbox").fill("cancel name"); - await page.getByTestId("session-selector").getByTestId("icon-X").click(); - await page.getByTestId("session-selector").getByText("new name").click(); - // check cancel rename blur - await page.getByRole("combobox").click(); - await page.getByLabel("Rename").getByText("Rename").click(); - await page.getByRole("textbox").fill("cancel_blur"); - await page.getByText("PlaygroundChat").click(); - await page.getByTestId("session-selector").getByText("new name").click(); - // check delete session - await page.getByRole("combobox").click(); - await page.getByLabel("Delete").click(); - await page.getByRole("heading", { name: "New chat" }).click(); - // check new session - await page.getByTestId("input-chat-playground").click(); - await page.getByTestId("input-chat-playground").fill("session_after_delete"); - await page.keyboard.press("Enter"); - await page.getByTestId("chat-message-User-session_after_delete").click(); - await expect(page.getByTestId("session-selector")).toBeVisible(); + for (const element of elementsChatOutput) { + if (await element.isVisible()) { + visibleElementHandle = element; + break; + } + } - // check new chat - await page.getByTestId("new-chat").click(); - await page.waitForTimeout(5000); - await page.getByText("New chat").click(); - await page.getByTestId("input-chat-playground").click(); - await page.getByTestId("input-chat-playground").fill("second session"); - await page.keyboard.press("Enter"); - await page.waitForTimeout(5000); + await visibleElementHandle.hover(); - await page.getByTestId("chat-message-User-second session").click(); - await page - .getByTestId("chat-message-AI-second session") - .getByText("second session") - .click(); - expect(await page.getByTestId("session-selector").count()).toBe(2); + // Release the mouse + await page.mouse.up(); - const sessionElements = await page.getByTestId("session-selector").all(); - expect(sessionElements.length).toBe(2); -}); + await page.getByTestId("fit_view").click(); + await page.getByText("Playground", { exact: true }).last().click(); + await page.waitForSelector('[data-testid="input-chat-playground"]', { + timeout: 100000, + }); + + //send message + await page.getByTestId("input-chat-playground").click(); + await page.getByTestId("input-chat-playground").fill("message 1"); + await page.keyboard.press("Enter"); + //check message + await page.getByTestId("chat-message-User-message 1").click(); + await page + .getByTestId("chat-message-AI-message 1") + .getByText("message") + .click(); + //check session + await page.getByText("Default Session").first().click(); + await page.getByTestId("chat-message-User-message 1").click(); + //check edit message + await page.getByTestId("chat-message-User-message 1").hover(); + await page + .locator("div") + .filter({ hasText: /^Usermessage 1$/ }) + .getByTestId("icon-Pen") + .click(); + await page.waitForTimeout(500); + + await page.getByTestId("textarea").fill("edit_1"); + await page.getByTestId("save-button").click(); + await page.getByTestId("chat-message-User-edit_1").click(); + await page.getByTestId("chat-message-User-edit_1").hover(); + // check cancel edit + await page.getByTestId("sender_name_user").hover(); + await page.getByTestId("icon-Pen").first().click(); + await page.waitForTimeout(500); + + await page.getByTestId("textarea").fill("cancel_edit"); + await page.getByTestId("cancel-button").click(); + await page.getByTestId("chat-message-User-edit_1").click(); + await page.getByTestId("chat-message-User-edit_1").hover(); + //check edit bot message + await page + .getByTestId("chat-message-AI-message 1") + .getByText("message") + .click(); + await page.getByTestId("chat-message-AI-message 1").hover(); + await page.getByTestId("icon-Pen").last().click(); + await page.waitForTimeout(500); + + await page.getByTestId("textarea").fill("edit_bot_1"); + await page.getByTestId("save-button").click(); + await page.getByText("edit_bot_1").click(); + // check cancel edit bot + await page.getByTestId("chat-message-AI-edit_bot_1").hover(); + await page.getByTestId("icon-Pen").last().click(); + await page.waitForTimeout(500); + + await page.getByTestId("textarea").fill("edit_bot_cancel"); + await page.getByTestId("cancel-button").click(); + await page.getByText("edit_bot_1").click(); + await page.getByTestId("chat-message-AI-edit_bot_1").hover(); + // check table messages view + await page.getByRole("combobox").click(); + await page.getByLabel("Message logs").click(); + await page.getByText("Page 1 of 1", { exact: true }).click(); + // check rename session + await page.getByRole("combobox").click(); + await page.getByLabel("Rename").getByText("Rename").click(); + await page.getByRole("textbox").fill("new name"); + await page.getByTestId("icon-Check").click(); + await page.waitForTimeout(500); + + await page.getByTestId("session-selector").getByText("new name").click(); + // check cancel rename + await page.getByRole("combobox").click(); + await page.getByLabel("Rename").getByText("Rename").click(); + await page.getByRole("textbox").fill("cancel name"); + await page.getByTestId("session-selector").getByTestId("icon-X").click(); + await page.getByTestId("session-selector").getByText("new name").click(); + // check cancel rename blur + await page.getByRole("combobox").click(); + await page.getByLabel("Rename").getByText("Rename").click(); + await page.getByRole("textbox").fill("cancel_blur"); + await page.getByText("PlaygroundChat").click(); + await page.getByTestId("session-selector").getByText("new name").click(); + // check delete session + await page.getByRole("combobox").click(); + await page.getByLabel("Delete").click(); + await page.getByRole("heading", { name: "New chat" }).click(); + // check new session + await page.getByTestId("input-chat-playground").click(); + await page + .getByTestId("input-chat-playground") + .fill("session_after_delete"); + await page.keyboard.press("Enter"); + await page.getByTestId("chat-message-User-session_after_delete").click(); + await expect(page.getByTestId("session-selector")).toBeVisible(); + + // check new chat + await page.getByTestId("new-chat").click(); + await page.waitForTimeout(5000); + await page.getByText("New chat").click(); + await page.getByTestId("input-chat-playground").click(); + await page.getByTestId("input-chat-playground").fill("second session"); + await page.keyboard.press("Enter"); + await page.waitForTimeout(5000); + + await page.getByTestId("chat-message-User-second session").click(); + await page + .getByTestId("chat-message-AI-second session") + .getByText("second session") + .click(); + expect(await page.getByTestId("session-selector").count()).toBe(2); + + const sessionElements = await page.getByTestId("session-selector").all(); + expect(sessionElements.length).toBe(2); + }, +); diff --git a/src/frontend/tests/core/features/saveComponents.spec.ts b/src/frontend/tests/core/features/saveComponents.spec.ts index 7e969d88c..3f32f7c6f 100644 --- a/src/frontend/tests/core/features/saveComponents.spec.ts +++ b/src/frontend/tests/core/features/saveComponents.spec.ts @@ -3,128 +3,135 @@ import { readFileSync } from "fs"; test.describe("save component tests", () => { /// - test("save group component tests", async ({ page }) => { - await page.goto("/"); - let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); + test( + "save group component tests", + { tag: ["@release", "@workspace", "@api"] }, + + async ({ page }) => { + await page.goto("/"); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } catch (error) { - modalCount = 0; - } - while (modalCount === 0) { - await page.getByText("New Flow", { exact: true }).click(); - await page.waitForSelector('[data-testid="modal-title"]', { - timeout: 3000, + 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(); + } + await page.waitForSelector('[data-testid="blank-flow"]', { + timeout: 30000, }); - 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("blank-flow").click(); - // Read your file into a buffer. - const jsonContent = readFileSync( - "tests/assets/flow_group_test.json", - "utf-8", - ); + // Read your file into a buffer. + const jsonContent = readFileSync( + "tests/assets/flow_group_test.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_group_test.json", { - type: "application/json", + // 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_group_test.json", { + type: "application/json", + }); + dt.items.add(file); + return dt; + }, jsonContent); + + // Now dispatch + await page.dispatchEvent( + "//*[@id='react-flow-id']/div[1]/div[1]/div", + "drop", + { + dataTransfer, + }, + ); + + const genericNoda = page.getByTestId("div-generic-node"); + const elementCount = await genericNoda?.count(); + if (elementCount > 0) { + expect(true).toBeTruthy(); + } + + await page + .locator('//*[@id="react-flow-id"]/div[1]/div[2]/button[3]') + .click(); + + await page.getByTestId("title-ChatOpenAI").click({ + modifiers: ["Control"], }); - dt.items.add(file); - return dt; - }, jsonContent); - // Now dispatch - await page.dispatchEvent( - "//*[@id='react-flow-id']/div[1]/div[1]/div", - "drop", - { - dataTransfer, - }, - ); + await page.getByTestId("title-Agent Initializer").click({ + modifiers: ["Control"], + }); - const genericNoda = page.getByTestId("div-generic-node"); - const elementCount = await genericNoda?.count(); - if (elementCount > 0) { - expect(true).toBeTruthy(); - } + await page.getByRole("button", { name: "Group" }).click(); - await page - .locator('//*[@id="react-flow-id"]/div[1]/div[2]/button[3]') - .click(); + await page + .locator('//*[@id="react-flow-id"]') + .first() + .click({ button: "left" }); - await page.getByTestId("title-ChatOpenAI").click({ - modifiers: ["Control"], - }); + let textArea = page.getByTestId("div-textarea-description"); + let elementCountText = await textArea?.count(); + if (elementCountText > 0) { + expect(true).toBeTruthy(); + } - await page.getByTestId("title-Agent Initializer").click({ - modifiers: ["Control"], - }); + let groupNode = page.getByTestId("title-Group"); + let elementGroup = await groupNode?.count(); + if (elementGroup > 0) { + expect(true).toBeTruthy(); + } - await page.getByRole("button", { name: "Group" }).click(); + await page.getByTestId("title-Group").click(); + await page.getByTestId("more-options-modal").click(); - await page - .locator('//*[@id="react-flow-id"]') - .first() - .click({ button: "left" }); + await page.getByTestId("icon-SaveAll").click(); + // timeout to handle case where there is already a saved component with the same name + await page.waitForTimeout(1000); - let textArea = page.getByTestId("div-textarea-description"); - let elementCountText = await textArea?.count(); - if (elementCountText > 0) { - expect(true).toBeTruthy(); - } + const replaceButton = await page + .getByTestId("replace-button") + .isVisible(); - let groupNode = page.getByTestId("title-Group"); - let elementGroup = await groupNode?.count(); - if (elementGroup > 0) { - expect(true).toBeTruthy(); - } + if (replaceButton) { + await page.getByTestId("replace-button").click(); + } + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("group"); - await page.getByTestId("title-Group").click(); - await page.getByTestId("more-options-modal").click(); + await page + .getByText("Group") + .first() + .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("zoom_out").click(); + textArea = page.getByTestId("div-textarea-description"); + elementCountText = await textArea?.count(); + if (elementCountText > 0) { + expect(true).toBeTruthy(); + } - await page.getByTestId("icon-SaveAll").click(); - // timeout to handle case where there is already a saved component with the same name - await page.waitForTimeout(1000); - - const replaceButton = await page.getByTestId("replace-button").isVisible(); - - if (replaceButton) { - await page.getByTestId("replace-button").click(); - } - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("group"); - - await page - .getByText("Group") - .first() - .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("zoom_out").click(); - textArea = page.getByTestId("div-textarea-description"); - elementCountText = await textArea?.count(); - if (elementCountText > 0) { - expect(true).toBeTruthy(); - } - - groupNode = page.getByTestId("title-Group"); - elementGroup = await groupNode?.count(); - if (elementGroup > 0) { - expect(true).toBeTruthy(); - } - }); + groupNode = page.getByTestId("title-Group"); + elementGroup = await groupNode?.count(); + if (elementGroup > 0) { + expect(true).toBeTruthy(); + } + }, + ); }); diff --git a/src/frontend/tests/core/features/stop-building.spec.ts b/src/frontend/tests/core/features/stop-building.spec.ts index 923b1185d..2340db761 100644 --- a/src/frontend/tests/core/features/stop-building.spec.ts +++ b/src/frontend/tests/core/features/stop-building.spec.ts @@ -2,216 +2,221 @@ import { test } from "@playwright/test"; import uaParser from "ua-parser-js"; // TODO: fix this test -test("user must be able to stop a building", async ({ page }) => { - test.skip(true, "Test is flaky"); - await page.goto("/"); - // await page.waitForTimeout(2000); +test( + "user must be able to stop a building", + { tag: ["@release", "@workspace", "@api"] }, + async ({ page }) => { + test.skip(true, "Test is flaky"); + await page.goto("/"); + // await page.waitForTimeout(2000); - let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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(); - } + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); + } - const getUA = await page.evaluate(() => navigator.userAgent); - const userAgentInfo = uaParser(getUA); + const getUA = await page.evaluate(() => navigator.userAgent); + const userAgentInfo = uaParser(getUA); - await page.getByTestId("blank-flow").click(); + await page.getByTestId("blank-flow").click(); - //first component + //first component - 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.getByTestId("zoom_out").click(); - await page - .locator('//*[@id="react-flow-id"]') - .hover() - .then(async () => { - await page.mouse.down(); - await page.mouse.move(-800, 300); - }); - - await page.mouse.up(); - - //second component - - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("url"); - // await page.waitForTimeout(1000); - - await page - .getByTestId("dataURL") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.getByTestId("zoom_out").click(); - await page - .locator('//*[@id="react-flow-id"]') - .hover() - .then(async () => { - await page.mouse.down(); - await page.mouse.move(-800, 300); - }); - - await page.mouse.up(); - - //third component - - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("split text"); - // await page.waitForTimeout(1000); - - await page - .getByTestId("processingSplit Text") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.getByTestId("zoom_out").click(); - await page - .locator('//*[@id="react-flow-id"]') - .hover() - .then(async () => { - await page.mouse.down(); - await page.mouse.move(-800, 300); - }); - - await page.mouse.up(); - - //fourth component - - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("parse data"); - // await page.waitForTimeout(1000); - - await page - .getByTestId("processingParse Data") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.getByTestId("zoom_out").click(); - await page - .locator('//*[@id="react-flow-id"]') - .hover() - .then(async () => { - await page.mouse.down(); - await page.mouse.move(-800, 300); - }); - - await page.mouse.up(); - - //fifth component - - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("chat output"); - // await page.waitForTimeout(1000); - - await page - .getByTestId("outputsChat Output") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.getByTestId("zoom_out").click(); - await page - .locator('//*[@id="react-flow-id"]') - .hover() - .then(async () => { - await page.mouse.down(); - await page.mouse.move(-800, 300); - }); - - await page.mouse.up(); - - let outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); - - while (outdatedComponents > 0) { - await page.getByTestId("icon-AlertTriangle").first().click(); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("text input"); // 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(); - } + await page + .getByTestId("inputsText Input") + .dragTo(page.locator('//*[@id="react-flow-id"]')); - await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page + .locator('//*[@id="react-flow-id"]') + .hover() + .then(async () => { + await page.mouse.down(); + await page.mouse.move(-800, 300); + }); - //connection 1 - const urlOutput = await page - .getByTestId("handle-url-shownode-data-right") - .nth(0); - await urlOutput.hover(); - await page.mouse.down(); - const splitTextInputData = await page.getByTestId( - "handle-splittext-shownode-data inputs-left", - ); - await splitTextInputData.hover(); - await page.mouse.up(); + await page.mouse.up(); - //connection 2 - const textOutput = await page - .getByTestId("handle-textinput-shownode-text-right") - .nth(0); - await textOutput.hover(); - await page.mouse.down(); - const splitTextInput = await page.getByTestId( - "handle-splittext-shownode-separator-left", - ); - await splitTextInput.hover(); - await page.mouse.up(); + //second component - await page.getByTestId("fit_view").click(); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("url"); + // await page.waitForTimeout(1000); - //connection 3 - const splitTextOutput = await page - .getByTestId("handle-splittext-shownode-chunks-right") - .nth(0); - await splitTextOutput.hover(); - await page.mouse.down(); - const parseDataInput = await page.getByTestId( - "handle-parsedata-shownode-data-left", - ); - await parseDataInput.hover(); - await page.mouse.up(); + await page + .getByTestId("dataURL") + .dragTo(page.locator('//*[@id="react-flow-id"]')); - //connection 4 - const parseDataOutput = await page - .getByTestId("handle-parsedata-shownode-text-right") - .nth(0); - await parseDataOutput.hover(); - await page.mouse.down(); - const chatOutputInput = await page.getByTestId( - "handle-chatoutput-shownode-text-left", - ); - await chatOutputInput.hover(); - await page.mouse.up(); + await page.getByTestId("zoom_out").click(); + await page + .locator('//*[@id="react-flow-id"]') + .hover() + .then(async () => { + await page.mouse.down(); + await page.mouse.move(-800, 300); + }); - await page.getByTestId("fit_view").click(); + await page.mouse.up(); - await page.getByTestId("textarea_str_input_value").first().fill(","); + //third component - await page - .getByTestId("inputlist_str_urls_0") - .fill("https://www.nature.com/articles/d41586-023-02870-5"); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("split text"); + // await page.waitForTimeout(1000); - await page.getByTestId("int_int_chunk_size").fill("2"); - await page.getByTestId("int_int_chunk_overlap").fill("1"); + await page + .getByTestId("processingSplit Text") + .dragTo(page.locator('//*[@id="react-flow-id"]')); - const timerCode = ` + await page.getByTestId("zoom_out").click(); + await page + .locator('//*[@id="react-flow-id"]') + .hover() + .then(async () => { + await page.mouse.down(); + await page.mouse.move(-800, 300); + }); + + await page.mouse.up(); + + //fourth component + + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("parse data"); + // await page.waitForTimeout(1000); + + await page + .getByTestId("processingParse Data") + .dragTo(page.locator('//*[@id="react-flow-id"]')); + + await page.getByTestId("zoom_out").click(); + await page + .locator('//*[@id="react-flow-id"]') + .hover() + .then(async () => { + await page.mouse.down(); + await page.mouse.move(-800, 300); + }); + + await page.mouse.up(); + + //fifth component + + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("chat output"); + // await page.waitForTimeout(1000); + + await page + .getByTestId("outputsChat Output") + .dragTo(page.locator('//*[@id="react-flow-id"]')); + + await page.getByTestId("zoom_out").click(); + await page + .locator('//*[@id="react-flow-id"]') + .hover() + .then(async () => { + await page.mouse.down(); + await page.mouse.move(-800, 300); + }); + + await page.mouse.up(); + + 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(); + } + + await page.getByTestId("fit_view").click(); + + //connection 1 + const urlOutput = await page + .getByTestId("handle-url-shownode-data-right") + .nth(0); + await urlOutput.hover(); + await page.mouse.down(); + const splitTextInputData = await page.getByTestId( + "handle-splittext-shownode-data inputs-left", + ); + await splitTextInputData.hover(); + await page.mouse.up(); + + //connection 2 + const textOutput = await page + .getByTestId("handle-textinput-shownode-text-right") + .nth(0); + await textOutput.hover(); + await page.mouse.down(); + const splitTextInput = await page.getByTestId( + "handle-splittext-shownode-separator-left", + ); + await splitTextInput.hover(); + await page.mouse.up(); + + await page.getByTestId("fit_view").click(); + + //connection 3 + const splitTextOutput = await page + .getByTestId("handle-splittext-shownode-chunks-right") + .nth(0); + await splitTextOutput.hover(); + await page.mouse.down(); + const parseDataInput = await page.getByTestId( + "handle-parsedata-shownode-data-left", + ); + await parseDataInput.hover(); + await page.mouse.up(); + + //connection 4 + const parseDataOutput = await page + .getByTestId("handle-parsedata-shownode-text-right") + .nth(0); + await parseDataOutput.hover(); + await page.mouse.down(); + const chatOutputInput = await page.getByTestId( + "handle-chatoutput-shownode-text-left", + ); + await chatOutputInput.hover(); + await page.mouse.up(); + + await page.getByTestId("fit_view").click(); + + await page.getByTestId("textarea_str_input_value").first().fill(","); + + await page + .getByTestId("inputlist_str_urls_0") + .fill("https://www.nature.com/articles/d41586-023-02870-5"); + + await page.getByTestId("int_int_chunk_size").fill("2"); + await page.getByTestId("int_int_chunk_overlap").fill("1"); + + const timerCode = ` # from langflow.field_typing import Data from langflow.custom import Component from langflow.io import MessageTextInput, Output @@ -240,71 +245,72 @@ class CustomComponent(Component): return data `; - await page.getByTestId("sidebar-custom-component-button").click(); - await page.getByTestId("fit_view").click(); - await page.getByTestId("zoom_out").click(); + await page.getByTestId("sidebar-custom-component-button").click(); + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); - await page.getByTestId("title-Custom Component").first().click(); + await page.getByTestId("title-Custom Component").first().click(); - await page.waitForTimeout(500); - await page.getByTestId("code-button-modal").click(); - await page.waitForTimeout(500); + await page.waitForTimeout(500); + await page.getByTestId("code-button-modal").click(); + await page.waitForTimeout(500); - await page.locator("textarea").last().press(`ControlOrMeta+a`); - await page.keyboard.press("Backspace"); - await page.locator("textarea").last().fill(timerCode); - await page.locator('//*[@id="checkAndSaveBtn"]').click(); - await page.waitForTimeout(500); + await page.locator("textarea").last().press(`ControlOrMeta+a`); + await page.keyboard.press("Backspace"); + await page.locator("textarea").last().fill(timerCode); + await page.locator('//*[@id="checkAndSaveBtn"]').click(); + await page.waitForTimeout(500); - await page.getByTestId("button_run_custom component").click(); + await page.getByTestId("button_run_custom component").click(); - await page.waitForSelector("text=Building", { - timeout: 100000, - }); + await page.waitForSelector("text=Building", { + timeout: 100000, + }); - await page.waitForSelector('div[class*="animate-border-beam"]', { - state: "visible", - timeout: 5000, - }); + await page.waitForSelector('div[class*="animate-border-beam"]', { + state: "visible", + timeout: 5000, + }); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page.waitForSelector('div[class*="animate-border-beam"]', { - state: "hidden", - timeout: 5000, - }); + await page.waitForSelector('div[class*="animate-border-beam"]', { + state: "hidden", + timeout: 5000, + }); - await page.waitForSelector("text=Saved", { - timeout: 100000, - }); + await page.waitForSelector("text=Saved", { + timeout: 100000, + }); - await page.getByTestId("button_run_custom component").click(); + await page.getByTestId("button_run_custom component").click(); - await page.waitForSelector("text=Building", { - timeout: 100000, - }); + await page.waitForSelector("text=Building", { + timeout: 100000, + }); - await page.waitForSelector('div[class*="animate-border-beam"]', { - state: "visible", - timeout: 5000, - }); + await page.waitForSelector('div[class*="animate-border-beam"]', { + state: "visible", + timeout: 5000, + }); - await page.waitForSelector("text=Building", { - timeout: 100000, - }); + await page.waitForSelector("text=Building", { + timeout: 100000, + }); - await page.waitForSelector("text=Saved", { - timeout: 100000, - }); + await page.waitForSelector("text=Saved", { + timeout: 100000, + }); - await page.getByTestId("button_run_custom component").click(); + await page.getByTestId("button_run_custom component").click(); - await page.waitForSelector('div[class*="animate-border-beam"]', { - state: "visible", - timeout: 5000, - }); + await page.waitForSelector('div[class*="animate-border-beam"]', { + state: "visible", + timeout: 5000, + }); - await page.waitForSelector("text=Saved", { - timeout: 100000, - }); -}); + await page.waitForSelector("text=Saved", { + timeout: 100000, + }); + }, +); diff --git a/src/frontend/tests/core/features/store-shard-2.spec.ts b/src/frontend/tests/core/features/store-shard-2.spec.ts index e2da1f0bc..f7398dd59 100644 --- a/src/frontend/tests/core/features/store-shard-2.spec.ts +++ b/src/frontend/tests/core/features/store-shard-2.spec.ts @@ -2,65 +2,69 @@ import { test } from "@playwright/test"; import * as dotenv from "dotenv"; import path from "path"; -test.skip("should filter by tag", async ({ page }) => { - test.skip( - !process?.env?.STORE_API_KEY, - "STORE_API_KEY required to run this test", - ); +test( + "should filter by tag", + { tag: ["@release", "@api"] }, + async ({ page }) => { + test.skip( + !process?.env?.STORE_API_KEY, + "STORE_API_KEY required to run this test", + ); - if (!process.env.CI) { - dotenv.config({ path: path.resolve(__dirname, "../../.env") }); - } + if (!process.env.CI) { + dotenv.config({ path: path.resolve(__dirname, "../../.env") }); + } - await page.goto("/"); - await page.waitForTimeout(1000); + await page.goto("/"); + await page.waitForTimeout(1000); - await page.getByTestId("button-store").click(); - await page.waitForTimeout(1000); + await page.getByTestId("button-store").click(); + await page.waitForTimeout(1000); - await page.getByTestId("api-key-button-store").click(); + await page.getByTestId("api-key-button-store").click(); - await page - .getByPlaceholder("Insert your API Key") - .fill(process.env.STORE_API_KEY ?? ""); + await page + .getByPlaceholder("Insert your API Key") + .fill(process.env.STORE_API_KEY ?? ""); - await page.getByTestId("api-key-save-button-store").click(); + await page.getByTestId("api-key-save-button-store").click(); - await page.waitForTimeout(1000); - await page.getByText("Success! Your API Key has been saved.").isVisible(); + await page.waitForTimeout(1000); + await page.getByText("Success! Your API Key has been saved.").isVisible(); - await page.getByTestId("button-store").click(); - await page.waitForTimeout(1000); + await page.getByTestId("button-store").click(); + await page.waitForTimeout(1000); - async function safeClick(selector: string) { - await page.getByTestId(selector).waitFor({ state: "visible" }); - await page.getByTestId(selector).click(); - await page.waitForTimeout(500); // Wait for UI updates - } + async function safeClick(selector: string) { + await page.getByTestId(selector).waitFor({ state: "visible" }); + await page.getByTestId(selector).click(); + await page.waitForTimeout(500); // Wait for UI updates + } - // Agent section - await safeClick("tag-selector-Agent"); - await page.getByText("File Loader").waitFor({ state: "visible" }); - await safeClick("tag-selector-Agent"); - await page.getByText("Website Content").waitFor({ state: "visible" }); + // Agent section + await safeClick("tag-selector-Agent"); + await page.getByText("File Loader").waitFor({ state: "visible" }); + await safeClick("tag-selector-Agent"); + await page.getByText("Website Content").waitFor({ state: "visible" }); - // Memory section - await safeClick("tag-selector-Memory"); - await page.getByText("MP3 QA12").waitFor({ state: "visible" }); + // Memory section + await safeClick("tag-selector-Memory"); + await page.getByText("MP3 QA12").waitFor({ state: "visible" }); - // Chain section - await safeClick("tag-selector-Chain"); - await page.getByText("ChatOllama").waitFor({ state: "visible" }); - await safeClick("tag-selector-Chain"); + // Chain section + await safeClick("tag-selector-Chain"); + await page.getByText("ChatOllama").waitFor({ state: "visible" }); + await safeClick("tag-selector-Chain"); - // Vector Store section - await safeClick("tag-selector-Vector Store"); - await page.getByText("MP3 QA12").waitFor({ state: "visible" }); - await safeClick("tag-selector-Vector Store"); - await safeClick("tag-selector-Memory"); + // Vector Store section + await safeClick("tag-selector-Vector Store"); + await page.getByText("MP3 QA12").waitFor({ state: "visible" }); + await safeClick("tag-selector-Vector Store"); + await safeClick("tag-selector-Memory"); - await page.getByText("Basic RAG").isVisible(); -}); + await page.getByText("Basic RAG").isVisible(); + }, +); test("should share component with share button", async ({ page }) => { test.skip( diff --git a/src/frontend/tests/core/features/tweaksTest.spec.ts b/src/frontend/tests/core/features/tweaksTest.spec.ts index 7d14dd33f..3278101b2 100644 --- a/src/frontend/tests/core/features/tweaksTest.spec.ts +++ b/src/frontend/tests/core/features/tweaksTest.spec.ts @@ -1,65 +1,70 @@ import { expect, test } from "@playwright/test"; -test("curl_api_generation", async ({ page, context }) => { - await page.goto("/"); - let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); +test( + "curl_api_generation", + { tag: ["@release", "@workspace", "@api"] }, + + async ({ page, context }) => { + await page.goto("/"); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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(); - } + 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(); + } - await page.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Basic Prompting" }).click(); - await page.getByText("API", { exact: true }).click(); - await page.getByRole("tab", { name: "cURL" }).click(); - await page.getByTestId("icon-Copy").click(); - const handle = await page.evaluateHandle(() => - navigator.clipboard.readText(), - ); - const clipboardContent = await handle.jsonValue(); - const oldValue = clipboardContent; - expect(clipboardContent.length).toBeGreaterThan(0); - await page.getByRole("tab", { name: "Tweaks" }).click(); - await page - .getByRole("heading", { name: "OpenAi" }) - .locator("div") - .first() - .click(); + await page.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Basic Prompting" }).click(); + await page.getByText("API", { exact: true }).click(); + await page.getByRole("tab", { name: "cURL" }).click(); + await page.getByTestId("icon-Copy").click(); + const handle = await page.evaluateHandle(() => + navigator.clipboard.readText(), + ); + const clipboardContent = await handle.jsonValue(); + const oldValue = clipboardContent; + expect(clipboardContent.length).toBeGreaterThan(0); + await page.getByRole("tab", { name: "Tweaks" }).click(); + await page + .getByRole("heading", { name: "OpenAi" }) + .locator("div") + .first() + .click(); - await page.waitForSelector( - '[data-testid="popover-anchor-input-openai_api_base-edit"]', - { - timeout: 1000, - }, - ); + await page.waitForSelector( + '[data-testid="popover-anchor-input-openai_api_base-edit"]', + { + timeout: 1000, + }, + ); - await page - .getByTestId("popover-anchor-input-openai_api_base-edit") - .first() - .fill("teste"); + await page + .getByTestId("popover-anchor-input-openai_api_base-edit") + .first() + .fill("teste"); - await page.getByRole("tab", { name: "cURL" }).click(); - await page.getByTestId("icon-Copy").click(); - const handle2 = await page.evaluateHandle(() => - navigator.clipboard.readText(), - ); - const clipboardContent2 = await handle2.jsonValue(); - const newValue = clipboardContent2; - expect(oldValue).not.toBe(newValue); - expect(clipboardContent2.length).toBeGreaterThan(clipboardContent.length); -}); + await page.getByRole("tab", { name: "cURL" }).click(); + await page.getByTestId("icon-Copy").click(); + const handle2 = await page.evaluateHandle(() => + navigator.clipboard.readText(), + ); + const clipboardContent2 = await handle2.jsonValue(); + const newValue = clipboardContent2; + expect(oldValue).not.toBe(newValue); + expect(clipboardContent2.length).toBeGreaterThan(clipboardContent.length); + }, +); test("check if tweaks are updating when someothing on the flow changes", async ({ page, diff --git a/src/frontend/tests/core/integrations/Basic Prompting.spec.ts b/src/frontend/tests/core/integrations/Basic Prompting.spec.ts index 877e852b9..758743677 100644 --- a/src/frontend/tests/core/integrations/Basic Prompting.spec.ts +++ b/src/frontend/tests/core/integrations/Basic Prompting.spec.ts @@ -2,126 +2,132 @@ import { test } from "@playwright/test"; import * as dotenv from "dotenv"; import path from "path"; -test("Basic Prompting (Hello, World)", async ({ page }) => { - test.skip( - !process?.env?.OPENAI_API_KEY, - "OPENAI_API_KEY required to run this test", - ); +test( + "Basic Prompting (Hello, World)", + { tag: ["@release", "@starter-project"] }, + 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(); + if (!process.env.CI) { + dotenv.config({ path: path.resolve(__dirname, "../../.env") }); } - } catch (error) { - modalCount = 0; - } - while (modalCount === 0) { - await page.getByText("New Flow", { exact: true }).click(); - await page.waitForSelector('[data-testid="modal-title"]', { - timeout: 3000, + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, }); - modalCount = await page.getByTestId("modal-title")?.count(); - } - await page.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Basic Prompting" }).click(); + await page.waitForSelector('[id="new-project-btn"]', { + timeout: 30000, + }); - await page.waitForSelector('[data-testid="fit_view"]', { - timeout: 100000, - }); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; + } - await page.getByTestId("fit_view").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); + 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(); + } - let outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); + await page.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Basic Prompting" }).click(); - while (outdatedComponents > 0) { - await page.getByTestId("icon-AlertTriangle").first().click(); - outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); - } + await page.waitForSelector('[data-testid="fit_view"]', { + timeout: 100000, + }); - let filledApiKey = await page.getByTestId("remove-icon-badge").count(); - while (filledApiKey > 0) { - await page.getByTestId("remove-icon-badge").first().click(); - filledApiKey = await page.getByTestId("remove-icon-badge").count(); - } + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); - const apiKeyInput = page.getByTestId("popover-anchor-input-api_key"); - const isApiKeyInputVisible = await apiKeyInput.isVisible(); + let outdatedComponents = await page + .getByTestId("icon-AlertTriangle") + .count(); - if (isApiKeyInputVisible) { - await apiKeyInput.fill(process.env.OPENAI_API_KEY ?? ""); - } + while (outdatedComponents > 0) { + await page.getByTestId("icon-AlertTriangle").first().click(); + outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); + } - await page.getByTestId("dropdown_str_model_name").click(); - await page.getByTestId("gpt-4o-1-option").click(); + let filledApiKey = await page.getByTestId("remove-icon-badge").count(); + while (filledApiKey > 0) { + await page.getByTestId("remove-icon-badge").first().click(); + filledApiKey = await page.getByTestId("remove-icon-badge").count(); + } - await page.getByTestId("button_run_chat output").click(); - await page.waitForSelector("text=built successfully", { timeout: 30000 }); + const apiKeyInput = page.getByTestId("popover-anchor-input-api_key"); + const isApiKeyInputVisible = await apiKeyInput.isVisible(); - await page.getByText("built successfully").last().click({ - timeout: 15000, - }); + if (isApiKeyInputVisible) { + await apiKeyInput.fill(process.env.OPENAI_API_KEY ?? ""); + } - await page.getByText("Playground", { exact: true }).last().click(); - await page - .getByText("No input message provided.", { exact: true }) - .last() - .isVisible(); + await page.getByTestId("dropdown_str_model_name").click(); + await page.getByTestId("gpt-4o-1-option").click(); - await page.waitForSelector('[data-testid="input-chat-playground"]', { - timeout: 100000, - }); + await page.getByTestId("button_run_chat output").click(); + await page.waitForSelector("text=built successfully", { timeout: 30000 }); - await page - .getByTestId("input-chat-playground") - .last() - .fill("Say hello as a pirate"); + await page.getByText("built successfully").last().click({ + timeout: 15000, + }); - await page.waitForSelector('[data-testid="button-send"]', { - timeout: 100000, - }); + await page.getByText("Playground", { exact: true }).last().click(); + await page + .getByText("No input message provided.", { exact: true }) + .last() + .isVisible(); - await page.getByTestId("button-send").last().click(); + await page.waitForSelector('[data-testid="input-chat-playground"]', { + timeout: 100000, + }); - await page.waitForSelector("text=matey", { - timeout: 100000, - }); + await page + .getByTestId("input-chat-playground") + .last() + .fill("Say hello as a pirate"); - await page.getByText("matey").last().isVisible(); - await page.getByText("Default Session").last().click(); + await page.waitForSelector('[data-testid="button-send"]', { + timeout: 100000, + }); - await page.getByText("timestamp", { exact: true }).last().isVisible(); - await page.getByText("text", { exact: true }).last().isVisible(); - await page.getByText("sender", { exact: true }).last().isVisible(); - await page.getByText("sender_name", { exact: true }).last().isVisible(); - await page.getByText("session_id", { exact: true }).last().isVisible(); - await page.getByText("files", { exact: true }).last().isVisible(); + await page.getByTestId("button-send").last().click(); - await page.getByRole("gridcell").last().isVisible(); - await page.getByRole("combobox").click(); - await page.getByLabel("Delete").click(); - await page.waitForSelector('[data-testid="input-chat-playground"]', { - timeout: 100000, - }); + await page.waitForSelector("text=matey", { + timeout: 100000, + }); - await page.getByTestId("input-chat-playground").last().isVisible(); -}); + await page.getByText("matey").last().isVisible(); + await page.getByText("Default Session").last().click(); + + await page.getByText("timestamp", { exact: true }).last().isVisible(); + await page.getByText("text", { exact: true }).last().isVisible(); + await page.getByText("sender", { exact: true }).last().isVisible(); + await page.getByText("sender_name", { exact: true }).last().isVisible(); + await page.getByText("session_id", { exact: true }).last().isVisible(); + await page.getByText("files", { exact: true }).last().isVisible(); + + await page.getByRole("gridcell").last().isVisible(); + await page.getByRole("combobox").click(); + await page.getByLabel("Delete").click(); + await page.waitForSelector('[data-testid="input-chat-playground"]', { + timeout: 100000, + }); + + await page.getByTestId("input-chat-playground").last().isVisible(); + }, +); diff --git a/src/frontend/tests/core/integrations/Blog Writer.spec.ts b/src/frontend/tests/core/integrations/Blog Writer.spec.ts index 81fc9fd0e..5298fdea2 100644 --- a/src/frontend/tests/core/integrations/Blog Writer.spec.ts +++ b/src/frontend/tests/core/integrations/Blog Writer.spec.ts @@ -1,113 +1,119 @@ -import { expect, test } from "@playwright/test"; +import { test } from "@playwright/test"; import * as dotenv from "dotenv"; import path from "path"; -test("Blog Writer", async ({ page }) => { - test.skip( - !process?.env?.OPENAI_API_KEY, - "OPENAI_API_KEY required to run this test", - ); +test( + "Blog Writer", + { tag: ["@release", "@starter-project"] }, + 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(); + if (!process.env.CI) { + dotenv.config({ path: path.resolve(__dirname, "../../.env") }); } - } catch (error) { - modalCount = 0; - } - while (modalCount === 0) { - await page.getByText("New Flow", { exact: true }).click(); - await page.waitForSelector('[data-testid="modal-title"]', { - timeout: 3000, + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, }); - modalCount = await page.getByTestId("modal-title")?.count(); - } - await page.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Blog Writer" }).click(); - await page.waitForSelector('[data-testid="fit_view"]', { - timeout: 5000, - }); + await page.waitForSelector('[id="new-project-btn"]', { + timeout: 30000, + }); - 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 modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; + } - let outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); + 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(); + } - while (outdatedComponents > 0) { - await page.getByTestId("icon-AlertTriangle").first().click(); - outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); - } + await page.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Blog Writer" }).click(); + await page.waitForSelector('[data-testid="fit_view"]', { + timeout: 5000, + }); - let filledApiKey = await page.getByTestId("remove-icon-badge").count(); - while (filledApiKey > 0) { - await page.getByTestId("remove-icon-badge").first().click(); - filledApiKey = await page.getByTestId("remove-icon-badge").count(); - } + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); - const apiKeyInput = page.getByTestId("popover-anchor-input-api_key"); - const isApiKeyInputVisible = await apiKeyInput.isVisible(); + let outdatedComponents = await page + .getByTestId("icon-AlertTriangle") + .count(); - if (isApiKeyInputVisible) { - await apiKeyInput.fill(process.env.OPENAI_API_KEY ?? ""); - } + while (outdatedComponents > 0) { + await page.getByTestId("icon-AlertTriangle").first().click(); + outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); + } - await page.getByTestId("dropdown_str_model_name").click(); - await page.getByTestId("gpt-4o-1-option").click(); + let filledApiKey = await page.getByTestId("remove-icon-badge").count(); + while (filledApiKey > 0) { + await page.getByTestId("remove-icon-badge").first().click(); + filledApiKey = await page.getByTestId("remove-icon-badge").count(); + } - await page - .getByTestId("inputlist_str_urls_0") - .nth(0) - .fill( - "https://www.natgeokids.com/uk/discover/animals/sea-life/turtle-facts/", - ); - await page - .getByTestId("inputlist_str_urls_1") - .nth(0) - .fill("https://www.originaldiving.com/blog/top-ten-turtle-facts"); + const apiKeyInput = page.getByTestId("popover-anchor-input-api_key"); + const isApiKeyInputVisible = await apiKeyInput.isVisible(); - await page - .getByTestId("textarea_str_input_value") - .fill( - "Use the references above for style to write a new blog/tutorial about turtles. Suggest non-covered topics.", - ); + if (isApiKeyInputVisible) { + await apiKeyInput.fill(process.env.OPENAI_API_KEY ?? ""); + } - await page.getByTestId("button_run_chat output").click(); + await page.getByTestId("dropdown_str_model_name").click(); + await page.getByTestId("gpt-4o-1-option").click(); - await page.waitForSelector("text=built successfully", { timeout: 30000 }); + await page + .getByTestId("inputlist_str_urls_0") + .nth(0) + .fill( + "https://www.natgeokids.com/uk/discover/animals/sea-life/turtle-facts/", + ); + await page + .getByTestId("inputlist_str_urls_1") + .nth(0) + .fill("https://www.originaldiving.com/blog/top-ten-turtle-facts"); - await page.getByText("built successfully").last().click({ - timeout: 30000, - }); + await page + .getByTestId("textarea_str_input_value") + .fill( + "Use the references above for style to write a new blog/tutorial about turtles. Suggest non-covered topics.", + ); - await page.getByText("Playground", { exact: true }).last().click(); - await page - .getByPlaceholder( - "No chat input variables found. Click to run your flow.", - { exact: true }, - ) - .last() - .isVisible(); + await page.getByTestId("button_run_chat output").click(); - await page.getByText("turtles").last().isVisible(); - await page.getByText("sea").last().isVisible(); - await page.getByText("survival").last().isVisible(); -}); + await page.waitForSelector("text=built successfully", { timeout: 30000 }); + + await page.getByText("built successfully").last().click({ + timeout: 30000, + }); + + await page.getByText("Playground", { exact: true }).last().click(); + await page + .getByPlaceholder( + "No chat input variables found. Click to run your flow.", + { exact: true }, + ) + .last() + .isVisible(); + + await page.getByText("turtles").last().isVisible(); + await page.getByText("sea").last().isVisible(); + await page.getByText("survival").last().isVisible(); + }, +); diff --git a/src/frontend/tests/core/integrations/Document QA.spec.ts b/src/frontend/tests/core/integrations/Document QA.spec.ts index fdadf5015..3b3082393 100644 --- a/src/frontend/tests/core/integrations/Document QA.spec.ts +++ b/src/frontend/tests/core/integrations/Document QA.spec.ts @@ -2,132 +2,138 @@ import { test } from "@playwright/test"; import * as dotenv from "dotenv"; import path from "path"; -test("Document Q&A", async ({ page }) => { - test.skip( - !process?.env?.OPENAI_API_KEY, - "OPENAI_API_KEY required to run this test", - ); +test( + "Document Q&A", + { tag: ["@release", "@starter-project"] }, + 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(); + if (!process.env.CI) { + dotenv.config({ path: path.resolve(__dirname, "../../.env") }); } - } catch (error) { - modalCount = 0; - } - while (modalCount === 0) { - await page.getByText("New Flow", { exact: true }).click(); - await page.waitForSelector('[data-testid="modal-title"]', { + 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(); + } + + await page.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Document Q&A" }).click(); + await page.waitForSelector('[data-testid="fit_view"]', { timeout: 3000, }); - modalCount = await page.getByTestId("modal-title")?.count(); - } - await page.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Document Q&A" }).click(); - await page.waitForSelector('[data-testid="fit_view"]', { - timeout: 3000, - }); + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); - 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 outdatedComponents = await page + .getByTestId("icon-AlertTriangle") + .count(); - let outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); + while (outdatedComponents > 0) { + await page.getByTestId("icon-AlertTriangle").first().click(); + outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); + } - while (outdatedComponents > 0) { - await page.getByTestId("icon-AlertTriangle").first().click(); - 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(); + filledApiKey = await page.getByTestId("remove-icon-badge").count(); + } - let filledApiKey = await page.getByTestId("remove-icon-badge").count(); - while (filledApiKey > 0) { - await page.getByTestId("remove-icon-badge").first().click(); - filledApiKey = await page.getByTestId("remove-icon-badge").count(); - } + const apiKeyInput = page.getByTestId("popover-anchor-input-api_key"); + const isApiKeyInputVisible = await apiKeyInput.isVisible(); - const apiKeyInput = page.getByTestId("popover-anchor-input-api_key"); - const isApiKeyInputVisible = await apiKeyInput.isVisible(); + if (isApiKeyInputVisible) { + await apiKeyInput.fill(process.env.OPENAI_API_KEY ?? ""); + } - 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.getByTestId("dropdown_str_model_name").click(); - await page.getByTestId("gpt-4o-1-option").click(); + const fileChooserPromise = page.waitForEvent("filechooser"); + await page.getByTestId("button_upload_file").click(); + const fileChooser = await fileChooserPromise; + await fileChooser.setFiles( + path.join(__dirname, "../../assets/test_file.txt"), + ); + await page.getByText("test_file.txt").isVisible(); - const fileChooserPromise = page.waitForEvent("filechooser"); - await page.getByTestId("button_upload_file").click(); - const fileChooser = await fileChooserPromise; - await fileChooser.setFiles( - path.join(__dirname, "../../assets/test_file.txt"), - ); - await page.getByText("test_file.txt").isVisible(); + await page.waitForSelector('[data-testid="button_run_chat output"]', { + timeout: 3000, + }); - await page.waitForSelector('[data-testid="button_run_chat output"]', { - timeout: 3000, - }); + await page.getByTestId("button_run_chat output").click(); + await page.waitForSelector("text=built successfully", { timeout: 30000 }); - await page.getByTestId("button_run_chat output").click(); - await page.waitForSelector("text=built successfully", { timeout: 30000 }); + await page.getByText("built successfully").last().click({ + timeout: 15000, + }); - await page.getByText("built successfully").last().click({ - timeout: 15000, - }); + await page.getByText("Playground", { exact: true }).last().click(); + await page + .getByText("No input message provided.", { exact: true }) + .last() + .isVisible(); - await page.getByText("Playground", { exact: true }).last().click(); - await page - .getByText("No input message provided.", { exact: true }) - .last() - .isVisible(); + await page.waitForSelector('[data-testid="input-chat-playground"]', { + timeout: 100000, + }); + await page + .getByTestId("input-chat-playground") + .last() + .fill("whats the text in the file?"); + await page.getByTestId("button-send").last().click(); - await page.waitForSelector('[data-testid="input-chat-playground"]', { - timeout: 100000, - }); - await page - .getByTestId("input-chat-playground") - .last() - .fill("whats the text in the file?"); - await page.getByTestId("button-send").last().click(); + await page.waitForSelector("text=this is a test file", { + timeout: 10000, + }); - await page.waitForSelector("text=this is a test file", { - timeout: 10000, - }); + await page.getByText("this is a test file").last().isVisible(); - await page.getByText("this is a test file").last().isVisible(); + await page.getByText("Default Session").last().click(); - await page.getByText("Default Session").last().click(); + await page.getByText("timestamp", { exact: true }).last().isVisible(); + await page.getByText("text", { exact: true }).last().isVisible(); + await page.getByText("sender", { exact: true }).last().isVisible(); + await page.getByText("sender_name", { exact: true }).last().isVisible(); + await page.getByText("session_id", { exact: true }).last().isVisible(); + await page.getByText("files", { exact: true }).last().isVisible(); - await page.getByText("timestamp", { exact: true }).last().isVisible(); - await page.getByText("text", { exact: true }).last().isVisible(); - await page.getByText("sender", { exact: true }).last().isVisible(); - await page.getByText("sender_name", { exact: true }).last().isVisible(); - await page.getByText("session_id", { exact: true }).last().isVisible(); - await page.getByText("files", { exact: true }).last().isVisible(); + await page.getByRole("gridcell").last().isVisible(); + await page.getByRole("combobox").click(); + await page.getByLabel("Delete").click(); + await page.waitForSelector('[data-testid="input-chat-playground"]', { + timeout: 100000, + }); - await page.getByRole("gridcell").last().isVisible(); - await page.getByRole("combobox").click(); - await page.getByLabel("Delete").click(); - await page.waitForSelector('[data-testid="input-chat-playground"]', { - timeout: 100000, - }); - - await page.getByTestId("input-chat-playground").last().isVisible(); -}); + await page.getByTestId("input-chat-playground").last().isVisible(); + }, +); diff --git a/src/frontend/tests/core/integrations/Dynamic Agent.spec.ts b/src/frontend/tests/core/integrations/Dynamic Agent.spec.ts index fbf6ba526..93a2bc527 100644 --- a/src/frontend/tests/core/integrations/Dynamic Agent.spec.ts +++ b/src/frontend/tests/core/integrations/Dynamic Agent.spec.ts @@ -2,99 +2,107 @@ import { expect, test } from "@playwright/test"; import * as dotenv from "dotenv"; import path from "path"; -test.skip("Dynamic Agent", async ({ page }) => { - test.skip( - !process?.env?.OPENAI_API_KEY, - "OPENAI_API_KEY required to run this test", - ); - test.skip( - !process?.env?.SEARCH_API_KEY, - "SEARCH_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(); +test.skip( + "Dynamic Agent", + { tag: ["@release", "@starter-project"] }, + async ({ page }) => { + test.skip( + !process?.env?.OPENAI_API_KEY, + "OPENAI_API_KEY required to run this test", + ); + test.skip( + !process?.env?.SEARCH_API_KEY, + "SEARCH_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.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Dynamic Agent" }).last().click(); + 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 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(); } - } 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.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Dynamic Agent" }).last().click(); - 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 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(); - } - await page - .getByTestId("popover-anchor-input-api_key") - .last() - .fill(process.env.SEARCH_API_KEY ?? ""); - await page.waitForTimeout(1000); - let openAiLlms = await page.getByText("OpenAI", { exact: true }).count(); - await page.waitForSelector('[data-testid="fit_view"]', { - timeout: 100000, - }); - for (let i = 0; i < openAiLlms; i++) { await page .getByTestId("popover-anchor-input-api_key") - .nth(i) - .fill(process.env.OPENAI_API_KEY ?? ""); - await page.getByTestId("zoom_in").click(); - await page.getByTestId("dropdown_str_model_name").nth(i).click(); - await page.getByTestId("gpt-4o-1-option").last().click(); + .last() + .fill(process.env.SEARCH_API_KEY ?? ""); await page.waitForTimeout(1000); - } - await page - .getByTestId("textarea_str_input_value") - .first() - .fill("how much is an apple stock today"); - await page.getByTestId("button_run_chat output").click(); + let openAiLlms = await page.getByText("OpenAI", { exact: true }).count(); + await page.waitForSelector('[data-testid="fit_view"]', { + timeout: 100000, + }); + for (let i = 0; i < openAiLlms; i++) { + await page + .getByTestId("popover-anchor-input-api_key") + .nth(i) + .fill(process.env.OPENAI_API_KEY ?? ""); + await page.getByTestId("zoom_in").click(); + await page.getByTestId("dropdown_str_model_name").nth(i).click(); + await page.getByTestId("gpt-4o-1-option").last().click(); + await page.waitForTimeout(1000); + } + await page + .getByTestId("textarea_str_input_value") + .first() + .fill("how much is an apple stock today"); + await page.getByTestId("button_run_chat output").click(); - await page.waitForSelector("text=built successfully", { timeout: 60000 * 3 }); - await page.getByText("built successfully").last().click({ - timeout: 15000, - }); - await page.getByText("Playground", { exact: true }).last().click(); - await page.waitForTimeout(1000); - expect(page.getByText("apple").last()).toBeVisible(); - const textContents = await page - .getByTestId("div-chat-message") - .allTextContents(); - const concatAllText = textContents.join(" "); - expect(concatAllText.toLocaleLowerCase()).toContain("apple"); - expect(concatAllText.toLocaleLowerCase()).not.toContain("error"); - expect(concatAllText.toLocaleLowerCase()).not.toContain("apologize"); - const allTextLength = concatAllText.length; - expect(allTextLength).toBeGreaterThan(100); -}); + await page.waitForSelector("text=built successfully", { + timeout: 60000 * 3, + }); + await page.getByText("built successfully").last().click({ + timeout: 15000, + }); + await page.getByText("Playground", { exact: true }).last().click(); + await page.waitForTimeout(1000); + expect(page.getByText("apple").last()).toBeVisible(); + const textContents = await page + .getByTestId("div-chat-message") + .allTextContents(); + const concatAllText = textContents.join(" "); + expect(concatAllText.toLocaleLowerCase()).toContain("apple"); + expect(concatAllText.toLocaleLowerCase()).not.toContain("error"); + expect(concatAllText.toLocaleLowerCase()).not.toContain("apologize"); + const allTextLength = concatAllText.length; + expect(allTextLength).toBeGreaterThan(100); + }, +); diff --git a/src/frontend/tests/core/integrations/Hierarchical Agent.spec.ts b/src/frontend/tests/core/integrations/Hierarchical Agent.spec.ts index 49caf5419..d14dc0bac 100644 --- a/src/frontend/tests/core/integrations/Hierarchical Agent.spec.ts +++ b/src/frontend/tests/core/integrations/Hierarchical Agent.spec.ts @@ -3,115 +3,121 @@ import * as dotenv from "dotenv"; import path from "path"; import uaParser from "ua-parser-js"; -test.skip("Hierarchical Tasks Agent", async ({ page }) => { - test.skip( - !process?.env?.OPENAI_API_KEY, - "OPENAI_API_KEY required to run this test", - ); +test.skip( + "Hierarchical Tasks Agent", + { tag: ["@release", "@starter-project"] }, + async ({ page }) => { + test.skip( + !process?.env?.OPENAI_API_KEY, + "OPENAI_API_KEY required to run this test", + ); - test.skip( - !process?.env?.SEARCH_API_KEY, - "SEARCH_API_KEY required to run this test", - ); + test.skip( + !process?.env?.SEARCH_API_KEY, + "SEARCH_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(); + if (!process.env.CI) { + dotenv.config({ path: path.resolve(__dirname, "../../.env") }); } - } 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.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - const getUA = await page.evaluate(() => navigator.userAgent); - const userAgentInfo = uaParser(getUA); + await page.waitForSelector('[id="new-project-btn"]', { + timeout: 30000, + }); - await page.getByTestId("side_nav_options_all-templates").click(); - await page - .getByRole("heading", { name: "Hierarchical Tasks Agent" }) - .first() - .click(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; + } - await page.waitForSelector('[data-testid="fit_view"]', { - timeout: 100000, - }); + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); + } - await page.getByTestId("fit_view").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); + const getUA = await page.evaluate(() => navigator.userAgent); + const userAgentInfo = uaParser(getUA); - let outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); + await page.getByTestId("side_nav_options_all-templates").click(); + await page + .getByRole("heading", { name: "Hierarchical Tasks Agent" }) + .first() + .click(); + + 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 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(); + } + + await page + .getByTestId("popover-anchor-input-api_key") + .nth(1) + .fill(process.env.OPENAI_API_KEY ?? ""); + + await page + .getByTestId("popover-anchor-input-api_key") + .nth(0) + .fill(process.env.OPENAI_API_KEY ?? ""); + + await page.getByTestId("dropdown_str_model_name").nth(1).click(); + await page.getByTestId("gpt-4o-1-option").last().click(); + + await page.getByTestId("dropdown_str_model_name").nth(0).click(); + await page.getByTestId("gpt-4o-1-option").first().click(); + + await page + .getByTestId("popover-anchor-input-api_key") + .last() + .fill(process.env.SEARCH_API_KEY ?? ""); - 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.getByTestId("button_run_chat output").click(); + await page.waitForTimeout(1000); - filledApiKey = await page.getByTestId("remove-icon-badge").count(); - } - await page - .getByTestId("popover-anchor-input-api_key") - .nth(1) - .fill(process.env.OPENAI_API_KEY ?? ""); + await page.waitForSelector("text=built successfully", { timeout: 30000 }); - await page - .getByTestId("popover-anchor-input-api_key") - .nth(0) - .fill(process.env.OPENAI_API_KEY ?? ""); + await page.getByText("built successfully").last().click({ + timeout: 15000, + }); - await page.getByTestId("dropdown_str_model_name").nth(1).click(); - await page.getByTestId("gpt-4o-1-option").last().click(); + await page.getByText("Playground", { exact: true }).last().click(); - await page.getByTestId("dropdown_str_model_name").nth(0).click(); - await page.getByTestId("gpt-4o-1-option").first().click(); + expect(await page.locator(".markdown").count()).toBeGreaterThan(0); - await page - .getByTestId("popover-anchor-input-api_key") - .last() - .fill(process.env.SEARCH_API_KEY ?? ""); - - await page.waitForTimeout(1000); - - await page.getByTestId("button_run_chat output").click(); - - await page.waitForTimeout(1000); - - await page.waitForSelector("text=built successfully", { timeout: 30000 }); - - await page.getByText("built successfully").last().click({ - timeout: 15000, - }); - - await page.getByText("Playground", { exact: true }).last().click(); - - expect(await page.locator(".markdown").count()).toBeGreaterThan(0); - - expect(await page.getByText("Langflow").count()).toBeGreaterThan(2); -}); + expect(await page.getByText("Langflow").count()).toBeGreaterThan(2); + }, +); diff --git a/src/frontend/tests/core/integrations/Memory Chatbot.spec.ts b/src/frontend/tests/core/integrations/Memory Chatbot.spec.ts index d1686ebef..070f64802 100644 --- a/src/frontend/tests/core/integrations/Memory Chatbot.spec.ts +++ b/src/frontend/tests/core/integrations/Memory Chatbot.spec.ts @@ -2,134 +2,140 @@ import { test } from "@playwright/test"; import * as dotenv from "dotenv"; import path from "path"; -test("Memory Chatbot", async ({ page }) => { - test.skip( - !process?.env?.OPENAI_API_KEY, - "OPENAI_API_KEY required to run this test", - ); +test( + "Memory Chatbot", + { tag: ["@release", "@starter-project"] }, + 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(); + if (!process.env.CI) { + dotenv.config({ path: path.resolve(__dirname, "../../.env") }); } - } 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.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - await page.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Memory Chatbot" }).click(); - await page.waitForTimeout(1000); + await page.waitForSelector('[id="new-project-btn"]', { + timeout: 30000, + }); - 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 modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; + } - await page.waitForTimeout(1000); + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); + } - let outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); - - while (outdatedComponents > 0) { - await page.getByTestId("icon-AlertTriangle").first().click(); + await page.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Memory Chatbot" }).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.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").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(); + let outdatedComponents = await page + .getByTestId("icon-AlertTriangle") + .count(); - if (isApiKeyInputVisible) { - await apiKeyInput.fill(process.env.OPENAI_API_KEY ?? ""); - } + while (outdatedComponents > 0) { + await page.getByTestId("icon-AlertTriangle").first().click(); + await page.waitForTimeout(1000); + outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); + } - await page.getByTestId("dropdown_str_model_name").click(); - await page.getByTestId("gpt-4o-1-option").click(); + 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(); + } - await page.waitForTimeout(1000); + const apiKeyInput = page.getByTestId("popover-anchor-input-api_key"); + const isApiKeyInputVisible = await apiKeyInput.isVisible(); - await page.getByTestId("button_run_chat output").click(); - await page.waitForSelector("text=built successfully", { timeout: 30000 }); + if (isApiKeyInputVisible) { + await apiKeyInput.fill(process.env.OPENAI_API_KEY ?? ""); + } - await page.getByText("built successfully").last().click({ - timeout: 15000, - }); + await page.getByTestId("dropdown_str_model_name").click(); + await page.getByTestId("gpt-4o-1-option").click(); - await page.getByText("Playground", { exact: true }).last().click(); + await page.waitForTimeout(1000); - await page - .getByText("No input message provided.", { exact: true }) - .last() - .isVisible(); + await page.getByTestId("button_run_chat output").click(); + await page.waitForSelector("text=built successfully", { timeout: 30000 }); - await page.waitForSelector('[data-testid="input-chat-playground"]', { - timeout: 100000, - }); + await page.getByText("built successfully").last().click({ + timeout: 15000, + }); - await page - .getByTestId("input-chat-playground") - .last() - .fill("Remember that I'm a lion"); - await page.getByTestId("button-send").last().click(); + await page.getByText("Playground", { exact: true }).last().click(); - await page.waitForSelector('[data-testid="input-chat-playground"]', { - timeout: 100000, - }); + await page + .getByText("No input message provided.", { exact: true }) + .last() + .isVisible(); - await page - .getByTestId("input-chat-playground") - .last() - .fill("try reproduce the sound I made in words"); + await page.waitForSelector('[data-testid="input-chat-playground"]', { + timeout: 100000, + }); - await page.waitForSelector('[data-testid="button-send"]', { - timeout: 100000, - }); + await page + .getByTestId("input-chat-playground") + .last() + .fill("Remember that I'm a lion"); + await page.getByTestId("button-send").last().click(); - await page.getByTestId("button-send").last().click(); + await page.waitForSelector('[data-testid="input-chat-playground"]', { + timeout: 100000, + }); - await page.waitForSelector("text=roar", { timeout: 30000 }); - await page.getByText("roar").last().isVisible(); - await page.getByText("Default Session").last().click(); + await page + .getByTestId("input-chat-playground") + .last() + .fill("try reproduce the sound I made in words"); - await page.getByText("timestamp", { exact: true }).last().isVisible(); - await page.getByText("text", { exact: true }).last().isVisible(); - await page.getByText("sender", { exact: true }).last().isVisible(); - await page.getByText("sender_name", { exact: true }).last().isVisible(); - await page.getByText("session_id", { exact: true }).last().isVisible(); - await page.getByText("files", { exact: true }).last().isVisible(); + await page.waitForSelector('[data-testid="button-send"]', { + timeout: 100000, + }); - await page.getByRole("gridcell").last().isVisible(); - await page.getByRole("combobox").click(); - await page.getByLabel("Delete").click(); - await page.waitForSelector('[data-testid="input-chat-playground"]', { - timeout: 100000, - }); - await page.getByTestId("input-chat-playground").last().isVisible(); -}); + await page.getByTestId("button-send").last().click(); + + await page.waitForSelector("text=roar", { timeout: 30000 }); + await page.getByText("roar").last().isVisible(); + await page.getByText("Default Session").last().click(); + + await page.getByText("timestamp", { exact: true }).last().isVisible(); + await page.getByText("text", { exact: true }).last().isVisible(); + await page.getByText("sender", { exact: true }).last().isVisible(); + await page.getByText("sender_name", { exact: true }).last().isVisible(); + await page.getByText("session_id", { exact: true }).last().isVisible(); + await page.getByText("files", { exact: true }).last().isVisible(); + + await page.getByRole("gridcell").last().isVisible(); + await page.getByRole("combobox").click(); + await page.getByLabel("Delete").click(); + await page.waitForSelector('[data-testid="input-chat-playground"]', { + timeout: 100000, + }); + await page.getByTestId("input-chat-playground").last().isVisible(); + }, +); diff --git a/src/frontend/tests/core/integrations/Sequential Task Agent.spec.ts b/src/frontend/tests/core/integrations/Sequential Task Agent.spec.ts index a786abbd4..ea7edba43 100644 --- a/src/frontend/tests/core/integrations/Sequential Task Agent.spec.ts +++ b/src/frontend/tests/core/integrations/Sequential Task Agent.spec.ts @@ -3,96 +3,102 @@ import * as dotenv from "dotenv"; import path from "path"; import uaParser from "ua-parser-js"; -test.skip("Sequential Task Agent", async ({ page }) => { - test.skip( - !process?.env?.OPENAI_API_KEY, - "OPENAI_API_KEY required to run this test", - ); +test.skip( + "Sequential Task Agent", + { tag: ["@release", "@starter-project"] }, + 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(); + if (!process.env.CI) { + dotenv.config({ path: path.resolve(__dirname, "../../.env") }); } - } 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.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - const getUA = await page.evaluate(() => navigator.userAgent); - const userAgentInfo = uaParser(getUA); + await page.waitForSelector('[id="new-project-btn"]', { + timeout: 30000, + }); - await page.getByTestId("side_nav_options_all-templates").click(); - await page - .getByRole("heading", { name: "Sequential Tasks Agent" }) - .first() - .click(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; + } - await page.waitForSelector('[data-testid="fit_view"]', { - timeout: 100000, - }); + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); + } - await page.getByTestId("fit_view").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); + const getUA = await page.evaluate(() => navigator.userAgent); + const userAgentInfo = uaParser(getUA); - let outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); + await page.getByTestId("side_nav_options_all-templates").click(); + await page + .getByRole("heading", { name: "Sequential Tasks Agent" }) + .first() + .click(); + + 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 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(); + } + + await page + .getByTestId("popover-anchor-input-api_key") + .fill(process.env.OPENAI_API_KEY ?? ""); + + await page.getByTestId("dropdown_str_model_name").click(); + await page.getByTestId("gpt-4o-1-option").click(); - 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.getByTestId("button_run_chat output").click(); + await page.waitForTimeout(1000); - filledApiKey = await page.getByTestId("remove-icon-badge").count(); - } - await page - .getByTestId("popover-anchor-input-api_key") - .fill(process.env.OPENAI_API_KEY ?? ""); + await page.waitForSelector("text=built successfully", { timeout: 30000 }); - await page.getByTestId("dropdown_str_model_name").click(); - await page.getByTestId("gpt-4o-1-option").click(); + await page.getByText("built successfully").last().click({ + timeout: 15000, + }); - await page.waitForTimeout(1000); + await page.getByText("Playground", { exact: true }).last().click(); - await page.getByTestId("button_run_chat output").click(); + expect(await page.locator(".markdown").count()).toBeGreaterThan(0); - await page.waitForTimeout(1000); - - await page.waitForSelector("text=built successfully", { timeout: 30000 }); - - await page.getByText("built successfully").last().click({ - timeout: 15000, - }); - - await page.getByText("Playground", { exact: true }).last().click(); - - expect(await page.locator(".markdown").count()).toBeGreaterThan(0); - - expect(await page.getByText("Agile").count()).toBeGreaterThan(0); -}); + expect(await page.getByText("Agile").count()).toBeGreaterThan(0); + }, +); diff --git a/src/frontend/tests/core/integrations/Simple Agent.spec.ts b/src/frontend/tests/core/integrations/Simple Agent.spec.ts index c8d689a8d..44e7b0803 100644 --- a/src/frontend/tests/core/integrations/Simple Agent.spec.ts +++ b/src/frontend/tests/core/integrations/Simple Agent.spec.ts @@ -3,96 +3,103 @@ import * as dotenv from "dotenv"; import path from "path"; import uaParser from "ua-parser-js"; -test("Simple Agent", async ({ page }) => { - test.skip( - !process?.env?.OPENAI_API_KEY, - "OPENAI_API_KEY required to run this test", - ); +test( + "Simple Agent", + { tag: ["@release", "@starter-project"] }, - if (!process.env.CI) { - dotenv.config({ path: path.resolve(__dirname, "../../.env") }); - } + async ({ page }) => { + test.skip( + !process?.env?.OPENAI_API_KEY, + "OPENAI_API_KEY required to run this test", + ); - 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(); + if (!process.env.CI) { + dotenv.config({ path: path.resolve(__dirname, "../../.env") }); } - } 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.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - const getUA = await page.evaluate(() => navigator.userAgent); - const userAgentInfo = uaParser(getUA); + await page.waitForSelector('[id="new-project-btn"]', { + timeout: 30000, + }); - await page.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Simple Agent" }).first().click(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; + } - await page.waitForSelector('[data-testid="fit_view"]', { - timeout: 100000, - }); + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); + } - await page.getByTestId("fit_view").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); + const getUA = await page.evaluate(() => navigator.userAgent); + const userAgentInfo = uaParser(getUA); - let outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); + await page.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Simple Agent" }).first().click(); - while (outdatedComponents > 0) { - await page.getByTestId("icon-AlertTriangle").first().click(); - await page.waitForTimeout(1000); - outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); - } + await page.waitForSelector('[data-testid="fit_view"]', { + timeout: 100000, + }); - 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(); - } + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); - await page - .getByTestId("popover-anchor-input-api_key") - .fill(process.env.OPENAI_API_KEY ?? ""); + let outdatedComponents = await page + .getByTestId("icon-AlertTriangle") + .count(); - await page.getByTestId("fit_view").click(); + while (outdatedComponents > 0) { + await page.getByTestId("icon-AlertTriangle").first().click(); + await page.waitForTimeout(1000); + outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); + } - await page.getByTestId("dropdown_str_model_name").click(); - await page.getByTestId("gpt-4o-1-option").click(); + 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(); + } - await page.waitForTimeout(500); + await page + .getByTestId("popover-anchor-input-api_key") + .fill(process.env.OPENAI_API_KEY ?? ""); - await page.getByTestId("button_run_chat output").last().click(); + await page.getByTestId("fit_view").click(); - await page.waitForSelector("text=built successfully", { - timeout: 10000 * 60 * 3, - }); + await page.getByTestId("dropdown_str_model_name").click(); + await page.getByTestId("gpt-4o-1-option").click(); - await page.getByTestId("playground-btn-flow-io").click(); + await page.waitForTimeout(500); - const textContents = await page - .getByTestId("div-chat-message") - .allTextContents(); + await page.getByTestId("button_run_chat output").last().click(); - const concatAllText = textContents.join(" ").toLowerCase(); + await page.waitForSelector("text=built successfully", { + timeout: 10000 * 60 * 3, + }); - expect(concatAllText).toContain("hello! how can i assist you today?"); - expect(concatAllText.length).toBeGreaterThan(20); -}); + await page.getByTestId("playground-btn-flow-io").click(); + + const textContents = await page + .getByTestId("div-chat-message") + .allTextContents(); + + const concatAllText = textContents.join(" ").toLowerCase(); + + expect(concatAllText).toContain("hello! how can i assist you today?"); + expect(concatAllText.length).toBeGreaterThan(20); + }, +); diff --git a/src/frontend/tests/core/integrations/Travel Planning Agent.spec.ts b/src/frontend/tests/core/integrations/Travel Planning Agent.spec.ts index 5fb3e78af..3d4158cb5 100644 --- a/src/frontend/tests/core/integrations/Travel Planning Agent.spec.ts +++ b/src/frontend/tests/core/integrations/Travel Planning Agent.spec.ts @@ -2,145 +2,151 @@ import { expect, Page, test } from "@playwright/test"; import * as dotenv from "dotenv"; import path from "path"; -test("Travel Planning Agent", async ({ page }) => { - test.skip( - !process?.env?.OPENAI_API_KEY, - "OPENAI_API_KEY required to run this test", - ); - - test.skip( - !process?.env?.SEARCH_API_KEY, - "SEARCH_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.getByTestId("side_nav_options_all-templates").click(); - await page - .getByRole("heading", { name: "Travel Planning Agents" }) - .last() - .click(); - - 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 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 randomCity = cities[Math.floor(Math.random() * cities.length)]; - const randomCity2 = cities[Math.floor(Math.random() * cities.length)]; - const randomFood = foods[Math.floor(Math.random() * foods.length)]; - - await page - .getByTestId("textarea_str_input_value") - .first() - .fill( - `Create a travel plan from ${randomCity} to ${randomCity2} with ${randomFood}`, +test( + "Travel Planning Agent", + { tag: ["@release", "@starter-project"] }, + async ({ page }) => { + test.skip( + !process?.env?.OPENAI_API_KEY, + "OPENAI_API_KEY required to run this test", ); - let openAiLlms = await page.getByText("OpenAI", { exact: true }).count(); - await page.waitForSelector('[data-testid="fit_view"]', { - timeout: 100000, - }); + test.skip( + !process?.env?.SEARCH_API_KEY, + "SEARCH_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.getByTestId("side_nav_options_all-templates").click(); + await page + .getByRole("heading", { name: "Travel Planning Agents" }) + .last() + .click(); + + 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 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 randomCity = cities[Math.floor(Math.random() * cities.length)]; + const randomCity2 = cities[Math.floor(Math.random() * cities.length)]; + const randomFood = foods[Math.floor(Math.random() * foods.length)]; + + await page + .getByTestId("textarea_str_input_value") + .first() + .fill( + `Create a travel plan from ${randomCity} to ${randomCity2} with ${randomFood}`, + ); + + let openAiLlms = await page.getByText("OpenAI", { exact: true }).count(); + await page.waitForSelector('[data-testid="fit_view"]', { + timeout: 100000, + }); + + for (let i = 0; i < openAiLlms; i++) { + await page + .getByTestId("popover-anchor-input-api_key") + .nth(i + 1) + .fill(process.env.OPENAI_API_KEY ?? ""); + await page.getByTestId("zoom_in").click(); + await page.getByTestId("dropdown_str_model_name").nth(i).click(); + await page.getByTestId("gpt-4o-1-option").last().click(); + await page.waitForTimeout(1000); + } - for (let i = 0; i < openAiLlms; i++) { await page .getByTestId("popover-anchor-input-api_key") - .nth(i + 1) - .fill(process.env.OPENAI_API_KEY ?? ""); - await page.getByTestId("zoom_in").click(); - await page.getByTestId("dropdown_str_model_name").nth(i).click(); - await page.getByTestId("gpt-4o-1-option").last().click(); + .first() + .fill(process.env.SEARCH_API_KEY ?? ""); + await page.waitForTimeout(1000); - } - await page - .getByTestId("popover-anchor-input-api_key") - .first() - .fill(process.env.SEARCH_API_KEY ?? ""); + await page.getByTestId("button_run_chat output").click(); - await page.waitForTimeout(1000); + await page.getByTestId("button_run_chat output").last().click(); - await page.getByTestId("button_run_chat output").click(); + if (await checkRateLimit(page)) { + console.log("Rate limit detected, skipping test"); + test.skip(); + } - await page.getByTestId("button_run_chat output").last().click(); + await page.waitForSelector("text=built successfully", { + timeout: 60000 * 3, + }); - if (await checkRateLimit(page)) { - console.log("Rate limit detected, skipping test"); - test.skip(); - } + await page.getByText("built successfully").last().click({ + timeout: 15000, + }); - await page.waitForSelector("text=built successfully", { - timeout: 60000 * 3, - }); + await page.getByText("Playground", { exact: true }).last().click(); - await page.getByText("built successfully").last().click({ - timeout: 15000, - }); + await page.waitForSelector("text=default session", { + timeout: 30000, + }); - await page.getByText("Playground", { exact: true }).last().click(); + await page.waitForTimeout(1000); - await page.waitForSelector("text=default session", { - timeout: 30000, - }); + const output = await page.getByTestId("div-chat-message").allTextContents(); + const outputText = output.join("\n"); - await page.waitForTimeout(1000); + expect(outputText.toLowerCase()).toContain("weather"); + expect(outputText.toLowerCase()).toContain("budget"); - const output = await page.getByTestId("div-chat-message").allTextContents(); - const outputText = output.join("\n"); - - expect(outputText.toLowerCase()).toContain("weather"); - expect(outputText.toLowerCase()).toContain("budget"); - - expect(outputText.toLowerCase()).toContain(randomCity.toLowerCase()); - expect(outputText.toLowerCase()).toContain(randomCity2.toLowerCase()); - expect(outputText.toLowerCase()).toContain(randomFood.toLowerCase()); -}); + expect(outputText.toLowerCase()).toContain(randomCity.toLowerCase()); + expect(outputText.toLowerCase()).toContain(randomCity2.toLowerCase()); + expect(outputText.toLowerCase()).toContain(randomFood.toLowerCase()); + }, +); async function checkRateLimit(page: Page): Promise { try { diff --git a/src/frontend/tests/core/integrations/Vector Store.spec.ts b/src/frontend/tests/core/integrations/Vector Store.spec.ts index 4c9819c8f..d425e2807 100644 --- a/src/frontend/tests/core/integrations/Vector Store.spec.ts +++ b/src/frontend/tests/core/integrations/Vector Store.spec.ts @@ -2,181 +2,196 @@ import { Page, test } from "@playwright/test"; import path from "path"; import uaParser from "ua-parser-js"; -test("Vector Store RAG", async ({ page }) => { - test.skip( - !process?.env?.OPENAI_API_KEY, - "OPENAI_API_KEY required to run this test", - ); - test.skip( - !process?.env?.ASTRA_DB_API_ENDPOINT, - "ASTRA_DB_API_ENDPOINT required to run this test", - ); - test.skip( - !process?.env?.ASTRA_DB_APPLICATION_TOKEN, - "ASTRA_DB_APPLICATION_TOKEN required to run this test", - ); - 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.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Vector Store RAG" }).first().click(); - await page.waitForSelector('[title="fit view"]', { - timeout: 100000, - }); - await page.getByTitle("fit view").click(); - await page.getByTitle("zoom out").click(); - await page.getByTitle("zoom out").click(); - await page.getByTitle("zoom out").click(); - 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(); - } - if (process?.env?.ASTRA_DB_API_ENDPOINT?.includes("astra-dev")) { - const getUA = await page.evaluate(() => navigator.userAgent); - const userAgentInfo = uaParser(getUA); - await page.getByTestId("title-Astra DB").first().click(); - await page.waitForTimeout(500); - await page.getByTestId("code-button-modal").click(); - await page.waitForTimeout(500); - let cleanCode = await extractAndCleanCode(page); - cleanCode = cleanCode!.replace( - '"pre_delete_collection": self.pre_delete_collection or False,', - '"pre_delete_collection": self.pre_delete_collection or False,\n "environment": "dev",', +test( + "Vector Store RAG", + { tag: ["@release", "@starter-project"] }, + async ({ page }) => { + test.skip( + !process?.env?.OPENAI_API_KEY, + "OPENAI_API_KEY required to run this test", ); - 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.waitForTimeout(500); - await page.getByTestId("title-Astra DB").last().click(); - await page.waitForTimeout(500); - await page.getByTestId("code-button-modal").click(); - await page.waitForTimeout(500); - 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.waitForTimeout(500); - } - 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("popover-anchor-input-api_key") // input ID without "anchor-" - .nth(0) - .fill(process.env.OPENAI_API_KEY ?? ""); - await page - .getByTestId("popover-anchor-input-openai_api_key") - .nth(1) - .fill(process.env.OPENAI_API_KEY ?? ""); - await page - .getByTestId("popover-anchor-input-openai_api_key") - .nth(0) - .fill(process.env.OPENAI_API_KEY ?? ""); - // Astra DB tokens - await page - .getByTestId("popover-anchor-input-token") - .nth(0) - .fill(process.env.ASTRA_DB_APPLICATION_TOKEN ?? ""); - await page - .getByTestId("popover-anchor-input-token") - .nth(1) - .fill(process.env.ASTRA_DB_APPLICATION_TOKEN ?? ""); - // Astra DB endpoints - await page - .getByTestId("popover-anchor-input-api_endpoint") - .nth(0) - .fill(process.env.ASTRA_DB_API_ENDPOINT ?? ""); - await page - .getByTestId("popover-anchor-input-api_endpoint") - .nth(1) - .fill(process.env.ASTRA_DB_API_ENDPOINT ?? ""); + test.skip( + !process?.env?.ASTRA_DB_API_ENDPOINT, + "ASTRA_DB_API_ENDPOINT required to run this test", + ); + test.skip( + !process?.env?.ASTRA_DB_APPLICATION_TOKEN, + "ASTRA_DB_APPLICATION_TOKEN required to run this test", + ); + 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.getByTestId("side_nav_options_all-templates").click(); + await page + .getByRole("heading", { name: "Vector Store RAG" }) + .first() + .click(); + await page.waitForSelector('[title="fit view"]', { + timeout: 100000, + }); + await page.getByTitle("fit view").click(); + await page.getByTitle("zoom out").click(); + await page.getByTitle("zoom out").click(); + await page.getByTitle("zoom out").click(); + 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(); + } + if (process?.env?.ASTRA_DB_API_ENDPOINT?.includes("astra-dev")) { + const getUA = await page.evaluate(() => navigator.userAgent); + const userAgentInfo = uaParser(getUA); + await page.getByTestId("title-Astra DB").first().click(); + await page.waitForTimeout(500); + await page.getByTestId("code-button-modal").click(); + await page.waitForTimeout(500); + let cleanCode = await extractAndCleanCode(page); + cleanCode = cleanCode!.replace( + '"pre_delete_collection": self.pre_delete_collection or False,', + '"pre_delete_collection": self.pre_delete_collection or False,\n "environment": "dev",', + ); + 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.waitForTimeout(500); + await page.getByTestId("title-Astra DB").last().click(); + await page.waitForTimeout(500); + await page.getByTestId("code-button-modal").click(); + await page.waitForTimeout(500); + 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.waitForTimeout(500); + } + 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("popover-anchor-input-api_key") // input ID without "anchor-" + .nth(0) + .fill(process.env.OPENAI_API_KEY ?? ""); + await page + .getByTestId("popover-anchor-input-openai_api_key") + .nth(1) + .fill(process.env.OPENAI_API_KEY ?? ""); + await page + .getByTestId("popover-anchor-input-openai_api_key") + .nth(0) + .fill(process.env.OPENAI_API_KEY ?? ""); + // Astra DB tokens + await page + .getByTestId("popover-anchor-input-token") + .nth(0) + .fill(process.env.ASTRA_DB_APPLICATION_TOKEN ?? ""); + await page + .getByTestId("popover-anchor-input-token") + .nth(1) + .fill(process.env.ASTRA_DB_APPLICATION_TOKEN ?? ""); + // Astra DB endpoints + await page + .getByTestId("popover-anchor-input-api_endpoint") + .nth(0) + .fill(process.env.ASTRA_DB_API_ENDPOINT ?? ""); + await page + .getByTestId("popover-anchor-input-api_endpoint") + .nth(1) + .fill(process.env.ASTRA_DB_API_ENDPOINT ?? ""); - await page - .getByTestId("popover-anchor-input-collection_name") - .nth(0) - .fill("test"); - const fileChooserPromise = page.waitForEvent("filechooser"); - await page.getByTestId("icon-Upload").last().click(); - const fileChooser = await fileChooserPromise; - await fileChooser.setFiles( - path.join(__dirname, "../../assets/test_file.txt"), - ); - await page.getByText("test_file.txt").isVisible(); - await page.waitForTimeout(1000); - await page.getByTestId("button_run_astra db").last().click(); - await page.waitForSelector("text=built successfully", { timeout: 60000 * 2 }); - await page.getByText("built successfully").last().click({ - timeout: 30000, - }); - await page.getByTestId("button_run_chat output").click(); - await page.waitForSelector("text=built successfully", { timeout: 60000 * 2 }); - await page.getByText("built successfully").last().click({ - timeout: 30000, - }); - await page.getByTestId("button_run_astra db").first().click(); - await page.waitForSelector("text=built successfully", { timeout: 60000 * 2 }); - await page.getByText("built successfully").last().click({ - timeout: 30000, - }); - await page.getByText("Playground", { exact: true }).last().click(); - await page.waitForSelector('[data-testid="input-chat-playground"]', { - timeout: 100000, - }); - await page.getByTestId("input-chat-playground").last().fill("hello"); - await page.getByTestId("input-chat-playground").last().click(); - await page.keyboard.press("Enter"); + await page + .getByTestId("popover-anchor-input-collection_name") + .nth(0) + .fill("test"); + const fileChooserPromise = page.waitForEvent("filechooser"); + await page.getByTestId("icon-Upload").last().click(); + const fileChooser = await fileChooserPromise; + await fileChooser.setFiles( + path.join(__dirname, "../../assets/test_file.txt"), + ); + await page.getByText("test_file.txt").isVisible(); + await page.waitForTimeout(1000); + await page.getByTestId("button_run_astra db").last().click(); + await page.waitForSelector("text=built successfully", { + timeout: 60000 * 2, + }); + await page.getByText("built successfully").last().click({ + timeout: 30000, + }); + await page.getByTestId("button_run_chat output").click(); + await page.waitForSelector("text=built successfully", { + timeout: 60000 * 2, + }); + await page.getByText("built successfully").last().click({ + timeout: 30000, + }); + await page.getByTestId("button_run_astra db").first().click(); + await page.waitForSelector("text=built successfully", { + timeout: 60000 * 2, + }); + await page.getByText("built successfully").last().click({ + timeout: 30000, + }); + await page.getByText("Playground", { exact: true }).last().click(); + await page.waitForSelector('[data-testid="input-chat-playground"]', { + timeout: 100000, + }); + await page.getByTestId("input-chat-playground").last().fill("hello"); + await page.getByTestId("input-chat-playground").last().click(); + await page.keyboard.press("Enter"); - await page - .getByText("This is a test file.", { exact: true }) - .last() - .isVisible(); - await page.getByText("Chat", { exact: true }).last().click(); - await page.getByText("Default Session").last().click(); - await page.getByRole("combobox").click(); - await page.getByLabel("Message logs").click(); - await page.getByText("timestamp", { exact: true }).last().isVisible(); - await page.getByText("text", { exact: true }).last().isVisible(); - await page.getByText("sender", { exact: true }).last().isVisible(); - await page.getByText("sender_name", { exact: true }).last().isVisible(); - await page.getByText("session_id", { exact: true }).last().isVisible(); - await page.getByText("files", { exact: true }).last().isVisible(); - await page.getByRole("gridcell").last().isVisible(); - await page.getByRole("combobox").click(); - await page.getByLabel("Delete").click(); - await page.waitForSelector('[data-testid="input-chat-playground"]', { - timeout: 100000, - }); - await page.getByTestId("input-chat-playground").last().isVisible(); -}); + await page + .getByText("This is a test file.", { exact: true }) + .last() + .isVisible(); + await page.getByText("Chat", { exact: true }).last().click(); + await page.getByText("Default Session").last().click(); + await page.getByRole("combobox").click(); + await page.getByLabel("Message logs").click(); + await page.getByText("timestamp", { exact: true }).last().isVisible(); + await page.getByText("text", { exact: true }).last().isVisible(); + await page.getByText("sender", { exact: true }).last().isVisible(); + await page.getByText("sender_name", { exact: true }).last().isVisible(); + await page.getByText("session_id", { exact: true }).last().isVisible(); + await page.getByText("files", { exact: true }).last().isVisible(); + await page.getByRole("gridcell").last().isVisible(); + await page.getByRole("combobox").click(); + await page.getByLabel("Delete").click(); + await page.waitForSelector('[data-testid="input-chat-playground"]', { + timeout: 100000, + }); + await page.getByTestId("input-chat-playground").last().isVisible(); + }, +); async function extractAndCleanCode(page: Page): Promise { const outerHTML = await page diff --git a/src/frontend/tests/core/integrations/decisionFlow.spec.ts b/src/frontend/tests/core/integrations/decisionFlow.spec.ts index 77e92c32c..8a3807d00 100644 --- a/src/frontend/tests/core/integrations/decisionFlow.spec.ts +++ b/src/frontend/tests/core/integrations/decisionFlow.spec.ts @@ -8,225 +8,237 @@ async function zoomOut(page: Page, times: number = 4) { } } -test("should create a flow with decision", 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(); +test( + "should create a flow with decision", + { 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") }); } - } catch (error) { - modalCount = 0; - } - while (modalCount === 0) { - await page.getByText("New Flow", { exact: true }).click(); - await page.waitForSelector('[data-testid="modal-title"]', { - timeout: 3000, + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, }); - modalCount = await page.getByTestId("modal-title")?.count(); - } - await page.waitForSelector('[data-testid="blank-flow"]', { - timeout: 30000, - }); - await page.getByTestId("blank-flow").click(); + 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(); + } + await page.waitForSelector('[data-testid="blank-flow"]', { + timeout: 30000, + }); + await page.getByTestId("blank-flow").click(); - await page.getByTestId("sidebar-options-trigger").click(); - await page.getByTestId("sidebar-legacy-switch").isVisible({ timeout: 5000 }); - await page.getByTestId("sidebar-legacy-switch").click(); + await page.getByTestId("sidebar-options-trigger").click(); + await page + .getByTestId("sidebar-legacy-switch") + .isVisible({ timeout: 5000 }); + await page.getByTestId("sidebar-legacy-switch").click(); - //---------------------------------- CHAT INPUT - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("chat input"); - await page.waitForSelector('[data-testid="inputsChat Input"]', { - timeout: 500, - }); - await page - .getByTestId("inputsChat Input") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - await zoomOut(page); + //---------------------------------- CHAT INPUT + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("chat input"); + await page.waitForSelector('[data-testid="inputsChat Input"]', { + timeout: 500, + }); + await page + .getByTestId("inputsChat Input") + .dragTo(page.locator('//*[@id="react-flow-id"]')); + await zoomOut(page); - //---------------------------------- CREATE LIST - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("list"); - await page.waitForSelector('[data-testid="helpersCreate List"]', { - timeout: 500, - }); - await page - .getByTestId("helpersCreate List") - .dragTo(page.locator('//*[@id="react-flow-id"]'), { - targetPosition: { x: 100, y: 100 }, + //---------------------------------- CREATE LIST + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("list"); + await page.waitForSelector('[data-testid="helpersCreate List"]', { + timeout: 500, }); + await page + .getByTestId("helpersCreate List") + .dragTo(page.locator('//*[@id="react-flow-id"]'), { + targetPosition: { x: 100, y: 100 }, + }); - await page.getByTestId("input-list-plus-btn_texts-0").first().click(); - await page.getByTestId("input-list-plus-btn_texts-0").first().click(); - await page.getByTestId("input-list-plus-btn_texts-0").first().click(); - await page - .getByTestId("inputlist_str_texts_0") - .first() - .fill("big news! langflow 1.0 is out"); - await page - .getByTestId("inputlist_str_texts_1") - .first() - .fill("uhul that movie was awesome"); - await page.getByTestId("inputlist_str_texts_2").first().fill("love you babe"); - await page - .getByTestId("helpersCreate List") - .dragTo(page.locator('//*[@id="react-flow-id"]'), { - targetPosition: { x: 300, y: 300 }, + await page.getByTestId("input-list-plus-btn_texts-0").first().click(); + await page.getByTestId("input-list-plus-btn_texts-0").first().click(); + await page.getByTestId("input-list-plus-btn_texts-0").first().click(); + await page + .getByTestId("inputlist_str_texts_0") + .first() + .fill("big news! langflow 1.0 is out"); + await page + .getByTestId("inputlist_str_texts_1") + .first() + .fill("uhul that movie was awesome"); + await page + .getByTestId("inputlist_str_texts_2") + .first() + .fill("love you babe"); + await page + .getByTestId("helpersCreate List") + .dragTo(page.locator('//*[@id="react-flow-id"]'), { + targetPosition: { x: 300, y: 300 }, + }); + await page.getByTestId("input-list-plus-btn_texts-0").last().click(); + await page.getByTestId("input-list-plus-btn_texts-0").last().click(); + await page.getByTestId("input-list-plus-btn_texts-0").last().click(); + await page + .getByTestId("inputlist_str_texts_0") + .last() + .fill("oh my cat died"); + await page + .getByTestId("inputlist_str_texts_1") + .last() + .fill("No one loves me"); + await page.getByTestId("inputlist_str_texts_2").last().fill("not cool.."); + //---------------------------------- PARSE DATA + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("parse data"); + await page.waitForSelector('[data-testid="processingParse Data"]', { + timeout: 500, }); - await page.getByTestId("input-list-plus-btn_texts-0").last().click(); - await page.getByTestId("input-list-plus-btn_texts-0").last().click(); - await page.getByTestId("input-list-plus-btn_texts-0").last().click(); - await page.getByTestId("inputlist_str_texts_0").last().fill("oh my cat died"); - await page - .getByTestId("inputlist_str_texts_1") - .last() - .fill("No one loves me"); - await page.getByTestId("inputlist_str_texts_2").last().fill("not cool.."); - //---------------------------------- PARSE DATA - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("parse data"); - await page.waitForSelector('[data-testid="processingParse Data"]', { - timeout: 500, - }); - await page - .getByTestId("processingParse Data") - .dragTo(page.locator('//*[@id="react-flow-id"]'), { - targetPosition: { x: 350, y: 100 }, - }); - await zoomOut(page, 1); - await page - .getByTestId("processingParse Data") - .dragTo(page.locator('//*[@id="react-flow-id"]'), { - targetPosition: { x: 50, y: 300 }, - }); - await zoomOut(page, 2); + await page + .getByTestId("processingParse Data") + .dragTo(page.locator('//*[@id="react-flow-id"]'), { + targetPosition: { x: 350, y: 100 }, + }); + await zoomOut(page, 1); + await page + .getByTestId("processingParse Data") + .dragTo(page.locator('//*[@id="react-flow-id"]'), { + targetPosition: { x: 50, y: 300 }, + }); + await zoomOut(page, 2); - //---------------------------------- PASS - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("pass"); - await page.waitForSelector('[data-testid="logicPass"]', { - timeout: 500, - }); - await page - .getByTestId("logicPass") - .dragTo(page.locator('//*[@id="react-flow-id"]'), { - targetPosition: { x: 400, y: 100 }, + //---------------------------------- PASS + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("pass"); + await page.waitForSelector('[data-testid="logicPass"]', { + timeout: 500, }); - await page.waitForSelector('[data-testid="logicPass"]', { - timeout: 500, - }); - //---------------------------------- PASS - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("pass"); - await page.waitForSelector('[data-testid="logicPass"]', { - timeout: 500, - }); - await page - .getByTestId("logicPass") - .dragTo(page.locator('//*[@id="react-flow-id"]'), { - targetPosition: { x: 600, y: 200 }, + await page + .getByTestId("logicPass") + .dragTo(page.locator('//*[@id="react-flow-id"]'), { + targetPosition: { x: 400, y: 100 }, + }); + await page.waitForSelector('[data-testid="logicPass"]', { + timeout: 500, }); - await page.waitForSelector('[data-testid="logicPass"]', { - timeout: 500, - }); - //---------------------------------- PASS - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("pass"); - await page.waitForSelector('[data-testid="logicPass"]', { - timeout: 500, - }); - await page - .getByTestId("logicPass") - .dragTo(page.locator('//*[@id="react-flow-id"]'), { - targetPosition: { x: 650, y: 350 }, + //---------------------------------- PASS + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("pass"); + await page.waitForSelector('[data-testid="logicPass"]', { + timeout: 500, }); - await page.waitForSelector('[data-testid="logicPass"]', { - timeout: 500, - }); - zoomOut(page, 2); - //---------------------------------- PROMPT - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("prompt"); - await page.waitForSelector('[data-testid="promptsPrompt"]', { - timeout: 500, - }); - await page - .getByTestId("promptsPrompt") - .dragTo(page.locator('//*[@id="react-flow-id"]'), { - targetPosition: { x: 50, y: 150 }, + await page + .getByTestId("logicPass") + .dragTo(page.locator('//*[@id="react-flow-id"]'), { + targetPosition: { x: 600, y: 200 }, + }); + await page.waitForSelector('[data-testid="logicPass"]', { + timeout: 500, }); + //---------------------------------- PASS + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("pass"); + await page.waitForSelector('[data-testid="logicPass"]', { + timeout: 500, + }); + await page + .getByTestId("logicPass") + .dragTo(page.locator('//*[@id="react-flow-id"]'), { + targetPosition: { x: 650, y: 350 }, + }); + await page.waitForSelector('[data-testid="logicPass"]', { + timeout: 500, + }); + zoomOut(page, 2); + //---------------------------------- PROMPT + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("prompt"); + await page.waitForSelector('[data-testid="promptsPrompt"]', { + timeout: 500, + }); + await page + .getByTestId("promptsPrompt") + .dragTo(page.locator('//*[@id="react-flow-id"]'), { + targetPosition: { x: 50, y: 150 }, + }); - //---------------------------------- OPENAI - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("openai"); - await page.waitForSelector('[data-testid="modelsOpenAI"]', { - timeout: 500, - }); - await page - .getByTestId("modelsOpenAI") - .dragTo(page.locator('//*[@id="react-flow-id"]'), { - targetPosition: { x: 50, y: 300 }, + //---------------------------------- OPENAI + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("openai"); + await page.waitForSelector('[data-testid="modelsOpenAI"]', { + timeout: 500, }); + await page + .getByTestId("modelsOpenAI") + .dragTo(page.locator('//*[@id="react-flow-id"]'), { + targetPosition: { x: 50, y: 300 }, + }); - //---------------------------------- CONDITIONAL ROUTER - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("if else"); - await page.waitForSelector('[data-testid="logicIf-Else"]', { - timeout: 500, - }); - await page - .getByTestId("logicIf-Else") - .dragTo(page.locator('//*[@id="react-flow-id"]'), { - targetPosition: { x: 750, y: 150 }, + //---------------------------------- CONDITIONAL ROUTER + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("if else"); + await page.waitForSelector('[data-testid="logicIf-Else"]', { + timeout: 500, }); - //---------------------------------- CHAT OUTPUT - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("chat output"); - await page.waitForSelector('[data-testid="outputsChat Output"]', { - timeout: 500, - }); - await page - .getByTestId("outputsChat Output") - .dragTo(page.locator('//*[@id="react-flow-id"]'), { - targetPosition: { x: 100, y: 75 }, + await page + .getByTestId("logicIf-Else") + .dragTo(page.locator('//*[@id="react-flow-id"]'), { + targetPosition: { x: 750, y: 150 }, + }); + //---------------------------------- CHAT OUTPUT + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("chat output"); + await page.waitForSelector('[data-testid="outputsChat Output"]', { + timeout: 500, }); - await page.waitForSelector('[data-testid="outputsChat Output"]', { - timeout: 500, - }); - //---------------------------------- CHAT OUTPUT - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("chat output"); - await page.waitForSelector('[data-testid="outputsChat Output"]', { - timeout: 500, - }); - await page - .getByTestId("outputsChat Output") - .dragTo(page.locator('//*[@id="react-flow-id"]'), { - targetPosition: { x: 250, y: 75 }, + await page + .getByTestId("outputsChat Output") + .dragTo(page.locator('//*[@id="react-flow-id"]'), { + targetPosition: { x: 100, y: 75 }, + }); + await page.waitForSelector('[data-testid="outputsChat Output"]', { + timeout: 500, }); - await page.waitForSelector('[data-testid="outputsChat Output"]', { - timeout: 500, - }); - //---------------------------------- - await page.getByTestId("fit_view").click(); - //---------------------------------- EDIT PROMPT - await page.getByTestId("promptarea_prompt_template").first().click(); - await page.getByTestId("modal-promptarea_prompt_template").first().fill(` + //---------------------------------- CHAT OUTPUT + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("chat output"); + await page.waitForSelector('[data-testid="outputsChat Output"]', { + timeout: 500, + }); + await page + .getByTestId("outputsChat Output") + .dragTo(page.locator('//*[@id="react-flow-id"]'), { + targetPosition: { x: 250, y: 75 }, + }); + await page.waitForSelector('[data-testid="outputsChat Output"]', { + timeout: 500, + }); + //---------------------------------- + await page.getByTestId("fit_view").click(); + //---------------------------------- EDIT PROMPT + await page.getByTestId("promptarea_prompt_template").first().click(); + await page.getByTestId("modal-promptarea_prompt_template").first().fill(` {Condition} Answer with either TRUE or FALSE (and nothing else). TRUE Examples: @@ -236,123 +248,142 @@ test("should create a flow with decision", async ({ page }) => { User: {user_message} AI: `); - await page.getByText("Check & Save").last().click(); - //---------------------------------- MAKE CONNECTIONS - await page - .getByTestId("handle-createlist-shownode-data list-right") - .nth(0) - .click(); - await page.getByTestId("handle-parsedata-shownode-data-left").nth(0).click(); - await page - .getByTestId("handle-createlist-shownode-data list-right") - .nth(2) - .click(); - await page.getByTestId("handle-parsedata-shownode-data-left").nth(1).click(); - await page - .getByTestId("handle-chatinput-shownode-message-right") - .nth(0) - .click(); - await page - .getByTestId("handle-pass-shownode-input message-left") - .nth(2) - .click(); - await page.getByTestId("handle-parsedata-shownode-text-right").nth(0).click(); - //quebrando aqui - await page - .getByTestId("handle-prompt-shownode-true_examples-left") - .nth(0) - .click(); - await page.getByTestId("handle-parsedata-shownode-text-right").nth(2).click(); - await page - .getByTestId("handle-prompt-shownode-false_examples-left") - .nth(0) - .click(); - await page - .getByTestId("handle-pass-shownode-output message-right") - .nth(4) - .click(); - await page - .getByTestId("handle-prompt-shownode-user_message-left") - .nth(0) - .click(); - await page - .getByTestId("handle-prompt-shownode-prompt message-right") - .first() - .click(); - await page - .getByTestId("handle-openaimodel-shownode-input-left") - .nth(0) - .click(); - await page - .getByTestId("handle-openaimodel-shownode-text-right") - .nth(0) - .click(); - await page - .getByTestId("handle-conditionalrouter-shownode-text input-left") - .nth(0) - .click(); - await page.getByTestId("popover-anchor-input-match_text").fill("TRUE"); - await page.getByTestId("title-Pass").nth(1).click(); - await page.getByTestId("edit-button-modal").click(); - await page - .getByTestId("popover-anchor-input-input_message-edit") - .nth(0) - .fill("You're Happy! 🤪"); - await page.getByTestId("showignored_message").last().click(); - await page.getByText("Close").last().click(); - await page.getByTestId("title-Pass").nth(0).click(); - await page.getByTestId("edit-button-modal").click(); - await page - .getByTestId("popover-anchor-input-input_message-edit") - .nth(0) - .fill("You're Sad! 🥲"); - await page.getByTestId("showignored_message").last().click(); - await page.getByText("Close").last().click(); - await page - .getByTestId("handle-conditionalrouter-shownode-true-right") - .nth(0) - .click(); - await page - .getByTestId("handle-pass-shownode-ignored message-left") - .nth(1) - .click(); - await page - .getByTestId("handle-conditionalrouter-shownode-false-right") - .nth(0) - .click(); - await page - .getByTestId("handle-pass-shownode-ignored message-left") - .nth(0) - .click(); - await page - .getByTestId("handle-pass-shownode-output message-right") - .nth(2) - .click(); - await page.getByTestId("handle-chatoutput-shownode-text-left").nth(0).click(); - await page - .getByTestId("handle-pass-shownode-output message-right") - .nth(0) - .click(); - await page.getByTestId("handle-chatoutput-shownode-text-left").nth(1).click(); - 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.getByTestId("fit_view").click(); - await page.getByText("Playground", { exact: true }).last().click(); - await page.waitForSelector('[data-testid="input-chat-playground"]', { - timeout: 100000, - }); - await page.getByTestId("input-chat-playground").click(); - await page - .getByTestId("input-chat-playground") - .fill("my dog is alive and happy!"); - await page.waitForSelector('[data-testid="button-send"]', { - timeout: 100000, - }); + await page.getByText("Check & Save").last().click(); + //---------------------------------- MAKE CONNECTIONS + await page + .getByTestId("handle-createlist-shownode-data list-right") + .nth(0) + .click(); + await page + .getByTestId("handle-parsedata-shownode-data-left") + .nth(0) + .click(); + await page + .getByTestId("handle-createlist-shownode-data list-right") + .nth(2) + .click(); + await page + .getByTestId("handle-parsedata-shownode-data-left") + .nth(1) + .click(); + await page + .getByTestId("handle-chatinput-shownode-message-right") + .nth(0) + .click(); + await page + .getByTestId("handle-pass-shownode-input message-left") + .nth(2) + .click(); + await page + .getByTestId("handle-parsedata-shownode-text-right") + .nth(0) + .click(); + //quebrando aqui + await page + .getByTestId("handle-prompt-shownode-true_examples-left") + .nth(0) + .click(); + await page + .getByTestId("handle-parsedata-shownode-text-right") + .nth(2) + .click(); + await page + .getByTestId("handle-prompt-shownode-false_examples-left") + .nth(0) + .click(); + await page + .getByTestId("handle-pass-shownode-output message-right") + .nth(4) + .click(); + await page + .getByTestId("handle-prompt-shownode-user_message-left") + .nth(0) + .click(); + await page + .getByTestId("handle-prompt-shownode-prompt message-right") + .first() + .click(); + await page + .getByTestId("handle-openaimodel-shownode-input-left") + .nth(0) + .click(); + await page + .getByTestId("handle-openaimodel-shownode-text-right") + .nth(0) + .click(); + await page + .getByTestId("handle-conditionalrouter-shownode-text input-left") + .nth(0) + .click(); + await page.getByTestId("popover-anchor-input-match_text").fill("TRUE"); + await page.getByTestId("title-Pass").nth(1).click(); + await page.getByTestId("edit-button-modal").click(); + await page + .getByTestId("popover-anchor-input-input_message-edit") + .nth(0) + .fill("You're Happy! 🤪"); + await page.getByTestId("showignored_message").last().click(); + await page.getByText("Close").last().click(); + await page.getByTestId("title-Pass").nth(0).click(); + await page.getByTestId("edit-button-modal").click(); + await page + .getByTestId("popover-anchor-input-input_message-edit") + .nth(0) + .fill("You're Sad! 🥲"); + await page.getByTestId("showignored_message").last().click(); + await page.getByText("Close").last().click(); + await page + .getByTestId("handle-conditionalrouter-shownode-true-right") + .nth(0) + .click(); + await page + .getByTestId("handle-pass-shownode-ignored message-left") + .nth(1) + .click(); + await page + .getByTestId("handle-conditionalrouter-shownode-false-right") + .nth(0) + .click(); + await page + .getByTestId("handle-pass-shownode-ignored message-left") + .nth(0) + .click(); + await page + .getByTestId("handle-pass-shownode-output message-right") + .nth(2) + .click(); + await page + .getByTestId("handle-chatoutput-shownode-text-left") + .nth(0) + .click(); + await page + .getByTestId("handle-pass-shownode-output message-right") + .nth(0) + .click(); + await page + .getByTestId("handle-chatoutput-shownode-text-left") + .nth(1) + .click(); + 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.getByTestId("fit_view").click(); + await page.getByText("Playground", { exact: true }).last().click(); + await page.waitForSelector('[data-testid="input-chat-playground"]', { + timeout: 100000, + }); + await page.getByTestId("input-chat-playground").click(); + await page + .getByTestId("input-chat-playground") + .fill("my dog is alive and happy!"); + await page.waitForSelector('[data-testid="button-send"]', { + timeout: 100000, + }); - await page.getByTestId("button-send").last().click(); -}); + await page.getByTestId("button-send").last().click(); + }, +); diff --git a/src/frontend/tests/core/integrations/similarity.spec.ts b/src/frontend/tests/core/integrations/similarity.spec.ts index d2aa40fca..a45ff8121 100644 --- a/src/frontend/tests/core/integrations/similarity.spec.ts +++ b/src/frontend/tests/core/integrations/similarity.spec.ts @@ -1,336 +1,341 @@ import { expect, test } from "@playwright/test"; -test("user must be able to check similarity between embedding texts", async ({ - page, -}) => { - test.skip( - !process?.env?.OPENAI_API_KEY, - "OPENAI_API_KEY required to run this test", - ); +test( + "user must be able to check similarity between embedding texts", + { tag: ["@release", "@components"] }, - await page.goto("/"); - await page.waitForTimeout(500); + async ({ page }) => { + test.skip( + !process?.env?.OPENAI_API_KEY, + "OPENAI_API_KEY required to run this test", + ); - let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); + await page.goto("/"); + await page.waitForTimeout(500); + + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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(); - } + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); + } - await page.getByTestId("blank-flow").click(); + await page.getByTestId("blank-flow").click(); - //first component - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("openai embedding"); - await page.waitForTimeout(500); + //first component + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("openai embedding"); + await page.waitForTimeout(500); - await page - .getByText("OpenAI Embeddings", { exact: true }) - .dragTo(page.locator('//*[@id="react-flow-id"]')); + await page + .getByText("OpenAI Embeddings", { exact: true }) + .dragTo(page.locator('//*[@id="react-flow-id"]')); - await page.getByTestId("zoom_out").click(); - await page - .locator('//*[@id="react-flow-id"]') - .hover() - .then(async () => { - await page.mouse.down(); - await page.mouse.move(-50, 50); - }); + await page.getByTestId("zoom_out").click(); + await page + .locator('//*[@id="react-flow-id"]') + .hover() + .then(async () => { + await page.mouse.down(); + await page.mouse.move(-50, 50); + }); - await page.mouse.up(); + await page.mouse.up(); - await page.waitForTimeout(1000); - - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("text embedder"); - await page.waitForTimeout(500); - - await page - .getByTestId("embeddingsText Embedder") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.getByTestId("zoom_out").click(); - await page - .locator('//*[@id="react-flow-id"]') - .hover() - .then(async () => { - await page.mouse.down(); - await page.mouse.move(-50, 50); - }); - - await page.mouse.up(); - - //fourth component - - await page - .getByTestId("embeddingsText Embedder") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.getByTestId("zoom_out").click(); - await page - .locator('//*[@id="react-flow-id"]') - .hover() - .then(async () => { - await page.mouse.down(); - await page.mouse.move(-50, 50); - }); - - await page.mouse.up(); - - //fifth component - - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("embedding similarity"); - await page.waitForTimeout(500); - - await page - .getByTestId("embeddingsEmbedding Similarity") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.getByTestId("zoom_out").click(); - await page - .locator('//*[@id="react-flow-id"]') - .hover() - .then(async () => { - await page.mouse.down(); - await page.mouse.move(-50, 50); - }); - - await page.mouse.up(); - - //sisxth component - - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("parse data"); - await page.waitForTimeout(500); - - await page - .getByTestId("processingParse Data") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.getByTestId("zoom_out").click(); - await page - .locator('//*[@id="react-flow-id"]') - .hover() - .then(async () => { - await page.mouse.down(); - await page.mouse.move(-50, 50); - }); - - await page.mouse.up(); - - //seventh component - - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("text output"); - await page.waitForTimeout(500); - - await page - .getByTestId("outputsText Output") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.getByTestId("zoom_out").click(); - await page - .locator('//*[@id="react-flow-id"]') - .hover() - .then(async () => { - await page.mouse.down(); - await page.mouse.move(-50, 50); - }); - - await page.mouse.up(); - - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("filter data"); - await page.waitForTimeout(500); - - await page - .getByTestId("processingFilter Data") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.getByTestId("zoom_out").click(); - await page - .locator('//*[@id="react-flow-id"]') - .hover() - .then(async () => { - await page.mouse.down(); - await page.mouse.move(-50, 50); - }); - - await page.mouse.up(); - - 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(); - } - await page.getByTestId("fit_view").click(); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("text embedder"); + await page.waitForTimeout(500); - await page - .getByTestId("textarea_str_template") - .last() - .fill("{similarity_score}"); + await page + .getByTestId("embeddingsText Embedder") + .dragTo(page.locator('//*[@id="react-flow-id"]')); - await page - .getByTestId("popover-anchor-input-message") - .last() - .fill("datastax"); - await page - .getByTestId("popover-anchor-input-message") - .first() - .fill("langflow"); + await page.getByTestId("zoom_out").click(); + await page + .locator('//*[@id="react-flow-id"]') + .hover() + .then(async () => { + await page.mouse.down(); + await page.mouse.move(-50, 50); + }); - const firstApiKeyInput = page - .getByTestId("popover-anchor-input-openai_api_key") - .nth(0); - const secondApiKeyInput = page - .getByTestId("popover-anchor-input-openai_api_key") - .nth(1); + await page.mouse.up(); - const isFirstInputVisible = await firstApiKeyInput.isVisible(); - const isSecondInputVisible = await secondApiKeyInput.isVisible(); + //fourth component - if (isFirstInputVisible) { - await firstApiKeyInput.fill(process.env.OPENAI_API_KEY ?? ""); - } + await page + .getByTestId("embeddingsText Embedder") + .dragTo(page.locator('//*[@id="react-flow-id"]')); - if (isSecondInputVisible) { - await secondApiKeyInput.fill(process.env.OPENAI_API_KEY ?? ""); - } + await page.getByTestId("zoom_out").click(); + await page + .locator('//*[@id="react-flow-id"]') + .hover() + .then(async () => { + await page.mouse.down(); + await page.mouse.move(-50, 50); + }); - await page - .getByTestId("inputlist_str_filter_criteria_0") - .nth(0) - .fill("similarity_score"); + await page.mouse.up(); - await page.getByTestId("fit_view").click(); - await page.mouse.wheel(0, 500); + //fifth component - await page.locator(".react-flow__pane").click(); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("embedding similarity"); + await page.waitForTimeout(500); - await page.getByTestId("fit_view").click(); + await page + .getByTestId("embeddingsEmbedding Similarity") + .dragTo(page.locator('//*[@id="react-flow-id"]')); - //connection 1 - const openAiEmbeddingOutput_0 = await page - .getByTestId("handle-openaiembeddings-shownode-embeddings-right") - .nth(0); - await openAiEmbeddingOutput_0.hover(); - await page.mouse.down(); + await page.getByTestId("zoom_out").click(); + await page + .locator('//*[@id="react-flow-id"]') + .hover() + .then(async () => { + await page.mouse.down(); + await page.mouse.move(-50, 50); + }); - const textEmbedderInput_0 = await page - .getByTestId("handle-textembeddercomponent-shownode-embedding model-left") - .nth(0); - await textEmbedderInput_0.hover(); - await page.mouse.up(); + await page.mouse.up(); - //connection 2 - const openAiEmbeddingOutput_1 = await page - .getByTestId("handle-openaiembeddings-shownode-embeddings-right") - .nth(0); - await openAiEmbeddingOutput_1.hover(); - await page.mouse.down(); - const textEmbedderInput_1 = await page - .getByTestId("handle-textembeddercomponent-shownode-embedding model-left") - .nth(1); - await textEmbedderInput_1.hover(); - await page.mouse.up(); + //sisxth component - //connection 3 - const textEmbedderOutput_0 = await page - .getByTestId("handle-textembeddercomponent-shownode-embedding data-right") - .nth(0); - await textEmbedderOutput_0.hover(); - await page.mouse.down(); - const embeddingSimilarityInput = await page - .getByTestId( - "handle-embeddingsimilaritycomponent-shownode-embedding vectors-left", - ) - .nth(0); - await embeddingSimilarityInput.hover(); - await page.mouse.up(); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("parse data"); + await page.waitForTimeout(500); - //connection 4 - const textEmbedderOutput_1 = await page - .getByTestId("handle-textembeddercomponent-shownode-embedding data-right") - .nth(2); - await textEmbedderOutput_1.hover(); - await page.mouse.down(); - await embeddingSimilarityInput.hover(); - await page.mouse.up(); + await page + .getByTestId("processingParse Data") + .dragTo(page.locator('//*[@id="react-flow-id"]')); - //connection 5 - const embeddingSimilarityOutput = await page - .getByTestId( - "handle-embeddingsimilaritycomponent-shownode-similarity data-right", - ) - .nth(0); - await embeddingSimilarityOutput.hover(); - await page.mouse.down(); - const filterDataInput = await page - .getByTestId("handle-filterdata-shownode-data-left") - .nth(0); - await filterDataInput.hover(); - await page.mouse.up(); + await page.getByTestId("zoom_out").click(); + await page + .locator('//*[@id="react-flow-id"]') + .hover() + .then(async () => { + await page.mouse.down(); + await page.mouse.move(-50, 50); + }); - //connection 6 - const filterDataOutput = await page - .getByTestId("handle-filterdata-shownode-filtered data-right") - .nth(0); - await filterDataOutput.hover(); - await page.mouse.down(); - const parseDataInput = await page - .getByTestId("handle-parsedata-shownode-data-left") - .nth(0); - await parseDataInput.hover(); - await page.mouse.up(); + await page.mouse.up(); - //connection 7 - const parseDataOutput = await page - .getByTestId("handle-parsedata-shownode-text-right") - .nth(0); - await parseDataOutput.hover(); - await page.mouse.down(); - const textOutputInput = await page - .getByTestId("handle-textoutput-shownode-text-left") - .nth(0); - await textOutputInput.hover(); - await page.mouse.up(); + //seventh component - await page.waitForTimeout(3000); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("text output"); + await page.waitForTimeout(500); - await page.getByTestId("button_run_text output").click(); + await page + .getByTestId("outputsText Output") + .dragTo(page.locator('//*[@id="react-flow-id"]')); - await page.waitForSelector("text=built successfully", { timeout: 30000 }); + await page.getByTestId("zoom_out").click(); + await page + .locator('//*[@id="react-flow-id"]') + .hover() + .then(async () => { + await page.mouse.down(); + await page.mouse.move(-50, 50); + }); - await page.waitForTimeout(1000); - await page - .getByTestId(/rf__node-TextOutput-[a-zA-Z0-9]{5}/) - .getByTestId("output-inspection-text") - .first() - .click(); - const valueSimilarity = await page.getByTestId("textarea").textContent(); + await page.mouse.up(); - expect(valueSimilarity).toContain("cosine_similarity"); - const valueLength = valueSimilarity!.length; - expect(valueLength).toBeGreaterThan(20); -}); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("filter data"); + await page.waitForTimeout(500); + + await page + .getByTestId("processingFilter Data") + .dragTo(page.locator('//*[@id="react-flow-id"]')); + + await page.getByTestId("zoom_out").click(); + await page + .locator('//*[@id="react-flow-id"]') + .hover() + .then(async () => { + await page.mouse.down(); + await page.mouse.move(-50, 50); + }); + + await page.mouse.up(); + + 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(); + } + + await page.getByTestId("fit_view").click(); + + await page + .getByTestId("textarea_str_template") + .last() + .fill("{similarity_score}"); + + await page + .getByTestId("popover-anchor-input-message") + .last() + .fill("datastax"); + await page + .getByTestId("popover-anchor-input-message") + .first() + .fill("langflow"); + + const firstApiKeyInput = page + .getByTestId("popover-anchor-input-openai_api_key") + .nth(0); + const secondApiKeyInput = page + .getByTestId("popover-anchor-input-openai_api_key") + .nth(1); + + const isFirstInputVisible = await firstApiKeyInput.isVisible(); + const isSecondInputVisible = await secondApiKeyInput.isVisible(); + + if (isFirstInputVisible) { + await firstApiKeyInput.fill(process.env.OPENAI_API_KEY ?? ""); + } + + if (isSecondInputVisible) { + await secondApiKeyInput.fill(process.env.OPENAI_API_KEY ?? ""); + } + + await page + .getByTestId("inputlist_str_filter_criteria_0") + .nth(0) + .fill("similarity_score"); + + await page.getByTestId("fit_view").click(); + await page.mouse.wheel(0, 500); + + await page.locator(".react-flow__pane").click(); + + await page.getByTestId("fit_view").click(); + + //connection 1 + const openAiEmbeddingOutput_0 = await page + .getByTestId("handle-openaiembeddings-shownode-embeddings-right") + .nth(0); + await openAiEmbeddingOutput_0.hover(); + await page.mouse.down(); + + const textEmbedderInput_0 = await page + .getByTestId("handle-textembeddercomponent-shownode-embedding model-left") + .nth(0); + await textEmbedderInput_0.hover(); + await page.mouse.up(); + + //connection 2 + const openAiEmbeddingOutput_1 = await page + .getByTestId("handle-openaiembeddings-shownode-embeddings-right") + .nth(0); + await openAiEmbeddingOutput_1.hover(); + await page.mouse.down(); + const textEmbedderInput_1 = await page + .getByTestId("handle-textembeddercomponent-shownode-embedding model-left") + .nth(1); + await textEmbedderInput_1.hover(); + await page.mouse.up(); + + //connection 3 + const textEmbedderOutput_0 = await page + .getByTestId("handle-textembeddercomponent-shownode-embedding data-right") + .nth(0); + await textEmbedderOutput_0.hover(); + await page.mouse.down(); + const embeddingSimilarityInput = await page + .getByTestId( + "handle-embeddingsimilaritycomponent-shownode-embedding vectors-left", + ) + .nth(0); + await embeddingSimilarityInput.hover(); + await page.mouse.up(); + + //connection 4 + const textEmbedderOutput_1 = await page + .getByTestId("handle-textembeddercomponent-shownode-embedding data-right") + .nth(2); + await textEmbedderOutput_1.hover(); + await page.mouse.down(); + await embeddingSimilarityInput.hover(); + await page.mouse.up(); + + //connection 5 + const embeddingSimilarityOutput = await page + .getByTestId( + "handle-embeddingsimilaritycomponent-shownode-similarity data-right", + ) + .nth(0); + await embeddingSimilarityOutput.hover(); + await page.mouse.down(); + const filterDataInput = await page + .getByTestId("handle-filterdata-shownode-data-left") + .nth(0); + await filterDataInput.hover(); + await page.mouse.up(); + + //connection 6 + const filterDataOutput = await page + .getByTestId("handle-filterdata-shownode-filtered data-right") + .nth(0); + await filterDataOutput.hover(); + await page.mouse.down(); + const parseDataInput = await page + .getByTestId("handle-parsedata-shownode-data-left") + .nth(0); + await parseDataInput.hover(); + await page.mouse.up(); + + //connection 7 + const parseDataOutput = await page + .getByTestId("handle-parsedata-shownode-text-right") + .nth(0); + await parseDataOutput.hover(); + await page.mouse.down(); + const textOutputInput = await page + .getByTestId("handle-textoutput-shownode-text-left") + .nth(0); + await textOutputInput.hover(); + await page.mouse.up(); + + await page.waitForTimeout(3000); + + await page.getByTestId("button_run_text output").click(); + + await page.waitForSelector("text=built successfully", { timeout: 30000 }); + + await page.waitForTimeout(1000); + await page + .getByTestId(/rf__node-TextOutput-[a-zA-Z0-9]{5}/) + .getByTestId("output-inspection-text") + .first() + .click(); + const valueSimilarity = await page.getByTestId("textarea").textContent(); + + expect(valueSimilarity).toContain("cosine_similarity"); + const valueLength = valueSimilarity!.length; + expect(valueLength).toBeGreaterThan(20); + }, +); diff --git a/src/frontend/tests/core/integrations/starter-projects.spec.ts b/src/frontend/tests/core/integrations/starter-projects.spec.ts index aeb537671..f0c2d5470 100644 --- a/src/frontend/tests/core/integrations/starter-projects.spec.ts +++ b/src/frontend/tests/core/integrations/starter-projects.spec.ts @@ -1,92 +1,96 @@ const { test, expect } = require("@playwright/test"); -test("vector store from starter projects should have its connections and nodes on the flow", async ({ - page, - request, -}) => { - const response = await request.get("/api/v1/starter-projects"); - expect(response.status()).toBe(200); - const responseBody = await response.json(); +test( + "vector store from starter projects should have its connections and nodes on the flow", + { tag: ["@release", "@starter-project"] }, + async ({ page, request }) => { + const response = await request.get("/api/v1/starter-projects"); + expect(response.status()).toBe(200); + const responseBody = await response.json(); - const astraStarterProject = responseBody.find((project) => { - if (project.data.nodes) { - return project.data.nodes.some((node) => node.id.includes("Astra")); - } - }); - - await page.route("**/api/v1/flows/", async (route) => { - if (route.request().method() === "GET") { - try { - const response = await route.fetch(); - const flowsData = await response.json(); - - const modifiedFlows = flowsData.map((flow) => { - if (flow.name === "Vector Store RAG" && flow.user_id === null) { - return { - ...flow, - data: astraStarterProject?.data, - }; - } - return flow; - }); - - const modifiedResponse = JSON.stringify(modifiedFlows); - - route.fulfill({ - status: response.status(), - headers: response.headers(), - body: modifiedResponse, - }); - } catch (error) { - console.error("Error in route handler:", error); + const astraStarterProject = responseBody.find((project) => { + if (project.data.nodes) { + return project.data.nodes.some((node) => node.id.includes("Astra")); } - } else { - // If not a GET request, continue without modifying - await route.continue(); + }); + + await page.route("**/api/v1/flows/", async (route) => { + if (route.request().method() === "GET") { + try { + const response = await route.fetch(); + const flowsData = await response.json(); + + const modifiedFlows = flowsData.map((flow) => { + if (flow.name === "Vector Store RAG" && flow.user_id === null) { + return { + ...flow, + data: astraStarterProject?.data, + }; + } + return flow; + }); + + const modifiedResponse = JSON.stringify(modifiedFlows); + + route.fulfill({ + status: response.status(), + headers: response.headers(), + body: modifiedResponse, + }); + } catch (error) { + console.error("Error in route handler:", error); + } + } else { + // If not a GET request, continue without modifying + await route.continue(); + } + }); + + 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; } - }); - 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(); + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.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.getByTestId("side_nav_options_all-templates").click(); + await page + .getByRole("heading", { name: "Vector Store RAG" }) + .first() + .click(); + await page.waitForSelector('[data-testid="fit_view"]', { + timeout: 100000, + }); - await page.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Vector Store RAG" }).first().click(); - await page.waitForSelector('[data-testid="fit_view"]', { - timeout: 100000, - }); + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); - await page.getByTestId("fit_view").click(); - await page.getByTestId("zoom_out").click(); + const edges = await page.locator(".react-flow__edge-interaction").count(); + const nodes = await page.getByTestId("div-generic-node").count(); - const edges = await page.locator(".react-flow__edge-interaction").count(); - const nodes = await page.getByTestId("div-generic-node").count(); + const edgesFromServer = astraStarterProject?.data.edges.length; + const nodesFromServer = astraStarterProject?.data.nodes.length; - const edgesFromServer = astraStarterProject?.data.edges.length; - const nodesFromServer = astraStarterProject?.data.nodes.length; - - expect(edges).toBe(edgesFromServer); - expect(nodes).toBe(nodesFromServer); -}); + expect(edges).toBe(edgesFromServer); + expect(nodes).toBe(nodesFromServer); + }, +); diff --git a/src/frontend/tests/core/integrations/textInputOutput.spec.ts b/src/frontend/tests/core/integrations/textInputOutput.spec.ts index bfa662409..a2f7616c8 100644 --- a/src/frontend/tests/core/integrations/textInputOutput.spec.ts +++ b/src/frontend/tests/core/integrations/textInputOutput.spec.ts @@ -2,194 +2,204 @@ import { expect, test } from "@playwright/test"; import * as dotenv from "dotenv"; import path from "path"; -test.skip("TextInputOutputComponent", async ({ page }) => { - // commented out because new playground does not support text io yet - 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(); +test.skip( + "TextInputOutputComponent", + { tag: ["@release", "@components"] }, + async ({ page }) => { + // commented out because new playground does not support text io yet + 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") }); } - } 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 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; } - } - 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; + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); } - } - await visibleElementHandle.waitFor({ - state: "visible", - timeout: 30000, - }); - // Move to the second element - await visibleElementHandle.hover(); - // Release the mouse - 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, - }); - // Click and hold on the first element - 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, - }); - // Move to the second element - await visibleElementHandle.hover(); - // Release the mouse - 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.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); - 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 + .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); - 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); -}); + 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, + }); + // Move to the second element + await visibleElementHandle.hover(); + // Release the mouse + 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, + }); + // Click and hold on the first element + 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, + }); + // Move to the second element + await visibleElementHandle.hover(); + // Release the mouse + 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); + }, +); diff --git a/src/frontend/tests/core/regression/generalBugs-shard-4.spec.ts b/src/frontend/tests/core/regression/generalBugs-shard-4.spec.ts index 937ef7f0a..47e69c978 100644 --- a/src/frontend/tests/core/regression/generalBugs-shard-4.spec.ts +++ b/src/frontend/tests/core/regression/generalBugs-shard-4.spec.ts @@ -1,132 +1,140 @@ import { expect, test } from "@playwright/test"; -test.skip("should be able to move flow from folder, rename it and be displayed on correct folder", async ({ - page, -}) => { - test.skip(true, "this functionality doesn't work yet w/ the uplift designs"); - const randomName = Math.random().toString(36).substring(2); - const secondRandomName = Math.random().toString(36).substring(2); +test( + "should be able to move flow from folder, rename it and be displayed on correct folder", + { tag: ["@release"] }, + async ({ page }) => { + test.skip( + true, + "this functionality doesn't work yet w/ the uplift designs", + ); + const randomName = Math.random().toString(36).substring(2); + const secondRandomName = Math.random().toString(36).substring(2); - await page.goto("/"); - await page.locator("span").filter({ hasText: "My Collection" }).isVisible(); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); + await page.goto("/"); + await page.locator("span").filter({ hasText: "My Collection" }).isVisible(); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - await page.waitForSelector('[id="new-project-btn"]', { - 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(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } catch (error) { - modalCount = 0; - } - while (modalCount === 0) { - await page.getByText("New Flow", { exact: true }).click(); + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); + } + + await page.getByTestId("side_nav_options_all-templates").click(); + await page + .getByRole("heading", { name: "Vector Store RAG" }) + .first() + .click(); + await page.waitForSelector('[data-testid="fit_view"]', { + timeout: 100000, + }); + + await page.getByTestId("fit_view").click(); + + await page.getByTestId("flow-configuration-button").click(); + await page.getByText("Flow Settings").click(); + await page.getByPlaceholder("Flow name").fill(randomName); + await page.getByText("Save").last().click(); + await page.getByTestId("icon-ChevronLeft").last().click(); + + await page.getByTestId("add-folder-button").click(); + + let countFolders = await page.getByText("New Folder").count(); + + while (countFolders > 1) { + await page.getByText("New Folder").first().hover(); + + await page.getByTestId("more-options-button").first().click(); + await page.getByTestId("btn-delete-folder").click(); + await page.getByText("Delete").last().click(); + countFolders--; + await page.waitForTimeout(1000); + } + + // Get the bounding boxes of the elements + const sourceElement = await page.getByTestId(`card-${randomName}`).first(); + const targetElement = await page.getByText("New Folder").last(); + + const sourceBox = await sourceElement.boundingBox(); + const targetBox = await targetElement.boundingBox(); + + // Perform the drag and drop + await page.mouse.move( + sourceBox!.x + sourceBox!.width / 2, + sourceBox!.y + sourceBox!.height / 2, + ); + await page.mouse.down(); + await page.mouse.move( + targetBox!.x + targetBox!.width / 2, + targetBox!.y + targetBox!.height / 2, + ); + await page.mouse.up(); + await page.waitForTimeout(3000); - modalCount = await page.getByTestId("modal-title")?.count(); - } - await page.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Vector Store RAG" }).first().click(); - await page.waitForSelector('[data-testid="fit_view"]', { - timeout: 100000, - }); + await page.getByText("New Folder").last().click(); - await page.getByTestId("fit_view").click(); + expect(await page.getByTestId(`card-${randomName}`).first().isVisible()); - await page.getByTestId("flow-configuration-button").click(); - await page.getByText("Flow Settings").click(); - await page.getByPlaceholder("Flow name").fill(randomName); - await page.getByText("Save").last().click(); - await page.getByTestId("icon-ChevronLeft").last().click(); + await page.getByTestId(`card-${randomName}`).first().click(); - await page.getByTestId("add-folder-button").click(); + await page.getByTestId("flow-configuration-button").click(); + await page.getByText("Flow Settings").click(); + await page.getByPlaceholder("Flow name").fill(secondRandomName); + await page.getByText("Save").last().click(); + await page.getByTestId("icon-ChevronLeft").last().click(); - let countFolders = await page.getByText("New Folder").count(); + await page.waitForTimeout(3000); - while (countFolders > 1) { - await page.getByText("New Folder").first().hover(); + await page.getByText("New Folder").last().click(); + expect( + await page.getByTestId(`card-${secondRandomName}`).first().isVisible(), + ); - await page.getByTestId("more-options-button").first().click(); - await page.getByTestId("btn-delete-folder").click(); - await page.getByText("Delete").last().click(); - countFolders--; - await page.waitForTimeout(1000); - } + // Get the bounding boxes of the elements + const secondSourceElement = await page + .getByTestId(`card-${secondRandomName}`) + .first(); + const secondTargetElement = await page.getByText("New Folder").last(); - // Get the bounding boxes of the elements - const sourceElement = await page.getByTestId(`card-${randomName}`).first(); - const targetElement = await page.getByText("New Folder").last(); + const secondSourceBox = await secondSourceElement.boundingBox(); + const secondTargetBox = await secondTargetElement.boundingBox(); - const sourceBox = await sourceElement.boundingBox(); - const targetBox = await targetElement.boundingBox(); + // Perform the drag and drop + await page.mouse.move( + secondSourceBox!.x + secondSourceBox!.width / 2, + secondSourceBox!.y + secondSourceBox!.height / 2, + ); + await page.mouse.down(); + await page.mouse.move( + secondTargetBox!.x + secondTargetBox!.width / 2, + secondTargetBox!.y + secondTargetBox!.height / 2, + ); + await page.mouse.up(); - // Perform the drag and drop - await page.mouse.move( - sourceBox!.x + sourceBox!.width / 2, - sourceBox!.y + sourceBox!.height / 2, - ); - await page.mouse.down(); - await page.mouse.move( - targetBox!.x + targetBox!.width / 2, - targetBox!.y + targetBox!.height / 2, - ); - await page.mouse.up(); + await page.waitForTimeout(3000); - await page.waitForTimeout(3000); + await page.getByText("My Projects").last().click(); - await page.getByText("New Folder").last().click(); - - expect(await page.getByTestId(`card-${randomName}`).first().isVisible()); - - await page.getByTestId(`card-${randomName}`).first().click(); - - await page.getByTestId("flow-configuration-button").click(); - await page.getByText("Flow Settings").click(); - await page.getByPlaceholder("Flow name").fill(secondRandomName); - await page.getByText("Save").last().click(); - await page.getByTestId("icon-ChevronLeft").last().click(); - - await page.waitForTimeout(3000); - - await page.getByText("New Folder").last().click(); - expect( - await page.getByTestId(`card-${secondRandomName}`).first().isVisible(), - ); - - // Get the bounding boxes of the elements - const secondSourceElement = await page - .getByTestId(`card-${secondRandomName}`) - .first(); - const secondTargetElement = await page.getByText("New Folder").last(); - - const secondSourceBox = await secondSourceElement.boundingBox(); - const secondTargetBox = await secondTargetElement.boundingBox(); - - // Perform the drag and drop - await page.mouse.move( - secondSourceBox!.x + secondSourceBox!.width / 2, - secondSourceBox!.y + secondSourceBox!.height / 2, - ); - await page.mouse.down(); - await page.mouse.move( - secondTargetBox!.x + secondTargetBox!.width / 2, - secondTargetBox!.y + secondTargetBox!.height / 2, - ); - await page.mouse.up(); - - await page.waitForTimeout(3000); - - await page.getByText("My Projects").last().click(); - - expect( - await page.getByTestId(`card-${secondRandomName}`).first().isVisible(), - ); -}); + expect( + await page.getByTestId(`card-${secondRandomName}`).first().isVisible(), + ); + }, +); diff --git a/src/frontend/tests/core/regression/generalBugs-shard-5.spec.ts b/src/frontend/tests/core/regression/generalBugs-shard-5.spec.ts index 54082e65a..3a13cff6f 100644 --- a/src/frontend/tests/core/regression/generalBugs-shard-5.spec.ts +++ b/src/frontend/tests/core/regression/generalBugs-shard-5.spec.ts @@ -1,342 +1,344 @@ import { expect, test } from "@playwright/test"; -test("should be able to see output preview from grouped components and connect components with a single click", async ({ - page, -}) => { - await page.goto("/"); +test( + "should be able to see output preview from grouped components and connect components with a single click", + { tag: ["@release", "@workspace", "@components"] }, + async ({ page }) => { + await page.goto("/"); - let modalCount = 0; - const randomName = Math.random().toString(36).substring(2); - const secondRandomName = Math.random().toString(36).substring(2); - const thirdRandomName = Math.random().toString(36).substring(2); + let modalCount = 0; + const randomName = Math.random().toString(36).substring(2); + const secondRandomName = Math.random().toString(36).substring(2); + const thirdRandomName = Math.random().toString(36).substring(2); - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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(); - } + 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.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); - await page - .locator('//*[@id="react-flow-id"]') - .hover() - .then(async () => { - await page.mouse.down(); - await page.mouse.move(-200, 100); - await page.waitForTimeout(400); + await page.waitForSelector('[data-testid="blank-flow"]', { + timeout: 30000, }); - await page.mouse.up(); + await page.getByTestId("blank-flow").click(); - await page - .getByTestId("inputsText Input") - .dragTo(page.locator('//*[@id="react-flow-id"]')); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("text input"); + await page.waitForTimeout(1000); - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("combine text"); - await page.waitForTimeout(1000); + await page + .getByTestId("inputsText Input") + .dragTo(page.locator('//*[@id="react-flow-id"]')); - await page - .locator('//*[@id="react-flow-id"]') - .hover() - .then(async () => { - await page.mouse.down(); - await page.mouse.move(-200, 100); - await page.waitForTimeout(400); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); + await page + .locator('//*[@id="react-flow-id"]') + .hover() + .then(async () => { + await page.mouse.down(); + await page.mouse.move(-200, 100); + await page.waitForTimeout(400); + }); + + await page.mouse.up(); + + await page + .getByTestId("inputsText Input") + .dragTo(page.locator('//*[@id="react-flow-id"]')); + + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("combine text"); + await page.waitForTimeout(1000); + + await page + .locator('//*[@id="react-flow-id"]') + .hover() + .then(async () => { + await page.mouse.down(); + await page.mouse.move(-200, 100); + await page.waitForTimeout(400); + }); + + await page.mouse.up(); + + await page + .getByTestId("processingCombine Text") + .dragTo(page.locator('//*[@id="react-flow-id"]')); + + await page + .locator('//*[@id="react-flow-id"]') + .hover() + .then(async () => { + await page.mouse.down(); + await page.mouse.move(-200, 100); + await page.waitForTimeout(400); + }); + + await page.mouse.up(); + + await page + .getByTestId("processingCombine Text") + .dragTo(page.locator('//*[@id="react-flow-id"]')); + + await page + .locator('//*[@id="react-flow-id"]') + .hover() + .then(async () => { + await page.mouse.down(); + await page.mouse.move(-200, 100); + await page.waitForTimeout(200); + }); + + await page.mouse.up(); + + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("text output"); + await page.waitForTimeout(1000); + + await page + .locator('//*[@id="react-flow-id"]') + .hover() + .then(async () => { + await page.mouse.down(); + await page.mouse.move(-200, 100); + }); + + await page.mouse.up(); + + await page + .getByTestId("outputsText Output") + .dragTo(page.locator('//*[@id="react-flow-id"]')); + + await page.getByTestId("fit_view").click({ + force: true, + }); + await page.waitForTimeout(500); + + //connection 1 + const elementCombineTextOutput0 = await page + .getByTestId("div-handle-combinetext-shownode-combined text-right") + .nth(0); + await elementCombineTextOutput0.click(); + + const blockedHandle = await page + .getByTestId("div-handle-textinput-shownode-text-right") + .nth(2); + const secondBlockedHandle = await page + .getByTestId("div-handle-combinetext-shownode-combined text-right") + .nth(2); + const thirdBlockedHandle = await page + .getByTestId("div-handle-textoutput-shownode-text-right") + .nth(0); + + const hasGradient = await blockedHandle?.evaluate((el) => { + const style = window.getComputedStyle(el); + return style.backgroundColor === "rgb(228, 228, 231)"; }); - await page.mouse.up(); + await page.waitForTimeout(500); - await page - .getByTestId("processingCombine Text") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page - .locator('//*[@id="react-flow-id"]') - .hover() - .then(async () => { - await page.mouse.down(); - await page.mouse.move(-200, 100); - await page.waitForTimeout(400); + const secondHasGradient = await secondBlockedHandle?.evaluate((el) => { + const style = window.getComputedStyle(el); + return style.backgroundColor === "rgb(228, 228, 231)"; }); - await page.mouse.up(); + await page.waitForTimeout(500); - await page - .getByTestId("processingCombine Text") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page - .locator('//*[@id="react-flow-id"]') - .hover() - .then(async () => { - await page.mouse.down(); - await page.mouse.move(-200, 100); - await page.waitForTimeout(200); + const thirdHasGradient = await thirdBlockedHandle?.evaluate((el) => { + const style = window.getComputedStyle(el); + return style.backgroundColor === "rgb(228, 228, 231)"; }); - await page.mouse.up(); + await page.waitForTimeout(500); - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("text output"); - await page.waitForTimeout(1000); + expect(hasGradient).toBe(true); + expect(secondHasGradient).toBe(true); + expect(thirdHasGradient).toBe(true); - await page - .locator('//*[@id="react-flow-id"]') - .hover() - .then(async () => { - await page.mouse.down(); - await page.mouse.move(-200, 100); + const unlockedHandle = await page + .getByTestId("div-handle-textinput-shownode-text-left") + .last(); + const secondUnlockedHandle = await page + .getByTestId("div-handle-combinetext-shownode-second text-left") + .last(); + const thirdUnlockedHandle = await page + .getByTestId("div-handle-combinetext-shownode-second text-left") + .first(); + const fourthUnlockedHandle = await page + .getByTestId("div-handle-textoutput-shownode-text-left") + .first(); + + const hasGradientUnlocked = await unlockedHandle?.evaluate((el) => { + const style = window.getComputedStyle(el); + return ( + style.backgroundImage.includes("conic-gradient") && + style.backgroundImage.includes("rgb(79, 70, 229)") + ); }); - await page.mouse.up(); + await page.waitForTimeout(500); - await page - .getByTestId("outputsText Output") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.getByTestId("fit_view").click({ - force: true, - }); - await page.waitForTimeout(500); - - //connection 1 - const elementCombineTextOutput0 = await page - .getByTestId("div-handle-combinetext-shownode-combined text-right") - .nth(0); - await elementCombineTextOutput0.click(); - - const blockedHandle = await page - .getByTestId("div-handle-textinput-shownode-text-right") - .nth(2); - const secondBlockedHandle = await page - .getByTestId("div-handle-combinetext-shownode-combined text-right") - .nth(2); - const thirdBlockedHandle = await page - .getByTestId("div-handle-textoutput-shownode-text-right") - .nth(0); - - const hasGradient = await blockedHandle?.evaluate((el) => { - const style = window.getComputedStyle(el); - return style.backgroundColor === "rgb(228, 228, 231)"; - }); - - await page.waitForTimeout(500); - - const secondHasGradient = await secondBlockedHandle?.evaluate((el) => { - const style = window.getComputedStyle(el); - return style.backgroundColor === "rgb(228, 228, 231)"; - }); - - await page.waitForTimeout(500); - - const thirdHasGradient = await thirdBlockedHandle?.evaluate((el) => { - const style = window.getComputedStyle(el); - return style.backgroundColor === "rgb(228, 228, 231)"; - }); - - await page.waitForTimeout(500); - - expect(hasGradient).toBe(true); - expect(secondHasGradient).toBe(true); - expect(thirdHasGradient).toBe(true); - - const unlockedHandle = await page - .getByTestId("div-handle-textinput-shownode-text-left") - .last(); - const secondUnlockedHandle = await page - .getByTestId("div-handle-combinetext-shownode-second text-left") - .last(); - const thirdUnlockedHandle = await page - .getByTestId("div-handle-combinetext-shownode-second text-left") - .first(); - const fourthUnlockedHandle = await page - .getByTestId("div-handle-textoutput-shownode-text-left") - .first(); - - const hasGradientUnlocked = await unlockedHandle?.evaluate((el) => { - const style = window.getComputedStyle(el); - return ( - style.backgroundImage.includes("conic-gradient") && - style.backgroundImage.includes("rgb(79, 70, 229)") + const secondHasGradientUnlocked = await secondUnlockedHandle?.evaluate( + (el) => { + const style = window.getComputedStyle(el); + return ( + style.backgroundImage.includes("conic-gradient") && + style.backgroundImage.includes("rgb(79, 70, 229)") + ); + }, ); - }); - await page.waitForTimeout(500); + await page.waitForTimeout(500); - const secondHasGradientUnlocked = await secondUnlockedHandle?.evaluate( - (el) => { + const thirdHasGradientLocked = await thirdUnlockedHandle?.evaluate((el) => { const style = window.getComputedStyle(el); - return ( - style.backgroundImage.includes("conic-gradient") && - style.backgroundImage.includes("rgb(79, 70, 229)") - ); - }, - ); + return style.backgroundColor === "rgb(228, 228, 231)"; + }); - await page.waitForTimeout(500); + await page.waitForTimeout(500); - const thirdHasGradientLocked = await thirdUnlockedHandle?.evaluate((el) => { - const style = window.getComputedStyle(el); - return style.backgroundColor === "rgb(228, 228, 231)"; - }); + const fourthHasGradientUnlocked = await fourthUnlockedHandle?.evaluate( + (el) => { + const style = window.getComputedStyle(el); + return ( + style.backgroundImage.includes("conic-gradient") && + style.backgroundImage.includes("rgb(79, 70, 229)") + ); + }, + ); - await page.waitForTimeout(500); + await page.waitForTimeout(500); - const fourthHasGradientUnlocked = await fourthUnlockedHandle?.evaluate( - (el) => { - const style = window.getComputedStyle(el); - return ( - style.backgroundImage.includes("conic-gradient") && - style.backgroundImage.includes("rgb(79, 70, 229)") - ); - }, - ); + expect(hasGradientUnlocked).toBe(true); + expect(secondHasGradientUnlocked).toBe(true); + expect(thirdHasGradientLocked).toBe(true); + expect(fourthHasGradientUnlocked).toBe(true); - await page.waitForTimeout(500); + const elementCombineTextInput1 = await page + .getByTestId("handle-combinetext-shownode-first text-left") + .nth(1); + await elementCombineTextInput1.click(); - expect(hasGradientUnlocked).toBe(true); - expect(secondHasGradientUnlocked).toBe(true); - expect(thirdHasGradientLocked).toBe(true); - expect(fourthHasGradientUnlocked).toBe(true); + await page + .getByTestId("title-Combine Text") + .first() + .click({ modifiers: ["Control"] }); + await page + .getByTestId("title-delimiter") + .last() + .click({ modifiers: ["Control"] }); - const elementCombineTextInput1 = await page - .getByTestId("handle-combinetext-shownode-first text-left") - .nth(1); - await elementCombineTextInput1.click(); + await page.getByRole("button", { name: "Group" }).click(); - await page - .getByTestId("title-Combine Text") - .first() - .click({ modifiers: ["Control"] }); - await page - .getByTestId("title-delimiter") - .last() - .click({ modifiers: ["Control"] }); + await page.waitForTimeout(500); - await page.getByRole("button", { name: "Group" }).click(); + await page.getByTitle("fit view").click(); - await page.waitForTimeout(500); + await page.waitForTimeout(500); - await page.getByTitle("fit view").click(); + //connection 2 + const elementTextOutput0 = await page + .getByTestId("handle-textinput-shownode-text-right") + .nth(0); + await elementTextOutput0.click(); + const elementGroupInput0 = await page.getByTestId( + "handle-groupnode-shownode-first text-left", + ); + await elementGroupInput0.click(); - await page.waitForTimeout(500); + //connection 3 + const elementTextOutput1 = await page + .getByTestId("handle-textinput-shownode-text-right") + .nth(2); + await elementTextOutput1.click(); + const elementGroupInput1 = await page + .getByTestId("handle-groupnode-shownode-second text-left") + .nth(1); + await elementGroupInput1.click(); - //connection 2 - const elementTextOutput0 = await page - .getByTestId("handle-textinput-shownode-text-right") - .nth(0); - await elementTextOutput0.click(); - const elementGroupInput0 = await page.getByTestId( - "handle-groupnode-shownode-first text-left", - ); - await elementGroupInput0.click(); + //connection 4 + const elementGroupOutput = await page + .getByTestId("handle-groupnode-shownode-combined text-right") + .nth(0); + await elementGroupOutput.click(); + const elementTextOutputInput = await page + .getByTestId("handle-textoutput-shownode-text-left") + .nth(0); - //connection 3 - const elementTextOutput1 = await page - .getByTestId("handle-textinput-shownode-text-right") - .nth(2); - await elementTextOutput1.click(); - const elementGroupInput1 = await page - .getByTestId("handle-groupnode-shownode-second text-left") - .nth(1); - await elementGroupInput1.click(); + await elementTextOutputInput.click(); - //connection 4 - const elementGroupOutput = await page - .getByTestId("handle-groupnode-shownode-combined text-right") - .nth(0); - await elementGroupOutput.click(); - const elementTextOutputInput = await page - .getByTestId("handle-textoutput-shownode-text-left") - .nth(0); + await page.getByTestId("textarea_str_input_value").nth(0).fill(randomName); - await elementTextOutputInput.click(); + await page.waitForTimeout(500); + await page + .getByTestId("textarea_str_input_value") + .nth(1) + .fill(secondRandomName); + await page.waitForTimeout(500); - await page.getByTestId("textarea_str_input_value").nth(0).fill(randomName); + await page + .getByPlaceholder("Type something...", { exact: true }) + .nth(4) + .fill(thirdRandomName); + await page.waitForTimeout(500); - await page.waitForTimeout(500); - await page - .getByTestId("textarea_str_input_value") - .nth(1) - .fill(secondRandomName); - await page.waitForTimeout(500); + await page + .getByPlaceholder("Type something...", { exact: true }) + .nth(3) + .fill("-"); + await page.waitForTimeout(500); - await page - .getByPlaceholder("Type something...", { exact: true }) - .nth(4) - .fill(thirdRandomName); - await page.waitForTimeout(500); + await page + .getByPlaceholder("Type something...", { exact: true }) + .nth(2) + .fill("-"); - await page - .getByPlaceholder("Type something...", { exact: true }) - .nth(3) - .fill("-"); - await page.waitForTimeout(500); + await page.waitForTimeout(500); - await page - .getByPlaceholder("Type something...", { exact: true }) - .nth(2) - .fill("-"); + await page.getByTestId("button_run_text output").last().click(); - await page.waitForTimeout(500); + await page.waitForSelector("text=built successfully", { timeout: 30000 }); - await page.getByTestId("button_run_text output").last().click(); + await page.getByText("built successfully").last().click({ + timeout: 15000, + }); + await page.waitForTimeout(500); - await page.waitForSelector("text=built successfully", { timeout: 30000 }); + expect( + await page.getByTestId("output-inspection-combined text").first(), + ).not.toBeDisabled(); + await page.getByTestId("output-inspection-combined text").first().click(); + await page.waitForTimeout(500); - await page.getByText("built successfully").last().click({ - timeout: 15000, - }); - await page.waitForTimeout(500); + await page.getByText("Component Output").isVisible(); - expect( - await page.getByTestId("output-inspection-combined text").first(), - ).not.toBeDisabled(); - await page.getByTestId("output-inspection-combined text").first().click(); - await page.waitForTimeout(500); + const text = await page.getByPlaceholder("Empty").textContent(); - await page.getByText("Component Output").isVisible(); + const permutations = [ + `${randomName}-${secondRandomName}-${thirdRandomName}`, + `${randomName}-${thirdRandomName}-${secondRandomName}`, + `${thirdRandomName}-${randomName}-${secondRandomName}`, + `${thirdRandomName}-${secondRandomName}-${randomName}`, + `${secondRandomName}-${randomName}-${thirdRandomName}`, + `${secondRandomName}-${thirdRandomName}-${randomName}`, + ]; - const text = await page.getByPlaceholder("Empty").textContent(); + const isPermutationIncluded = permutations.some((permutation) => + text!.includes(permutation), + ); - const permutations = [ - `${randomName}-${secondRandomName}-${thirdRandomName}`, - `${randomName}-${thirdRandomName}-${secondRandomName}`, - `${thirdRandomName}-${randomName}-${secondRandomName}`, - `${thirdRandomName}-${secondRandomName}-${randomName}`, - `${secondRandomName}-${randomName}-${thirdRandomName}`, - `${secondRandomName}-${thirdRandomName}-${randomName}`, - ]; - - const isPermutationIncluded = permutations.some((permutation) => - text!.includes(permutation), - ); - - expect(isPermutationIncluded).toBe(true); -}); + expect(isPermutationIncluded).toBe(true); + }, +); diff --git a/src/frontend/tests/core/regression/generalBugs-shard-9.spec.ts b/src/frontend/tests/core/regression/generalBugs-shard-9.spec.ts index bc7717415..34e85f7f0 100644 --- a/src/frontend/tests/core/regression/generalBugs-shard-9.spec.ts +++ b/src/frontend/tests/core/regression/generalBugs-shard-9.spec.ts @@ -2,117 +2,124 @@ import { expect, test } from "@playwright/test"; import * as dotenv from "dotenv"; import path from "path"; -test("memory should work as expect", async ({ page }) => { - test.skip( - !process?.env?.OPENAI_API_KEY, - "OPENAI_API_KEY required to run this test", - ); +test( + "memory should work as expect", + { tag: ["@release"] }, + 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.waitForTimeout(1000); - - let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); + if (!process.env.CI) { + dotenv.config({ path: path.resolve(__dirname, "../../.env") }); } - } 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.goto("/"); - await page.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Basic Prompting" }).click(); - await page.waitForTimeout(1000); - - await page.getByTestId("fit_view").click(); - - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("message history"); - - await page.getByTestId("sidebar-options-trigger").click(); - await page.getByTestId("sidebar-legacy-switch").isVisible({ timeout: 5000 }); - await page.getByTestId("sidebar-legacy-switch").click(); - - // Locate the canvas element - const canvas = page.locator("#react-flow-id"); // Update the selector if needed - - // Get the bounding box of the canvas to determine its position - const canvasBox = await canvas.boundingBox(); - if (!canvasBox) { - throw new Error("Canvas element bounding box not found"); - } - - // Starting point (center of the canvas) - const startX = canvasBox.x + canvasBox.width / 2; - const startY = canvasBox.y + canvasBox.height / 2; - - // End point (move 600 pixels to the right) - const endX = startX + 600; - const endY = startY; - - // Hover over the canvas to focus it - await canvas.hover(); - - // Start the drag operation - await page.mouse.move(startX, startY); - await page.mouse.down(); - - // Move to the new position - await page.mouse.move(endX, endY); - - // Release the mouse button to finish the drag - await page.mouse.up(); - - await page - .getByTestId("helpersMessage History") - .first() - .dragTo(page.locator('//*[@id="react-flow-id"]')); - - await page.mouse.up(); - await page.mouse.down(); - - await page.waitForTimeout; - - await page.getByTestId("fit_view").click(); - - 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(); + 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.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Basic Prompting" }).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(); + await page.getByTestId("fit_view").click(); - if (isApiKeyInputVisible) { - await apiKeyInput.fill(process.env.OPENAI_API_KEY ?? ""); - } + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("message history"); - await page.getByTestId("dropdown_str_model_name").click(); - await page.getByTestId("gpt-4o-1-option").click(); + await page.getByTestId("sidebar-options-trigger").click(); + await page + .getByTestId("sidebar-legacy-switch") + .isVisible({ timeout: 5000 }); + await page.getByTestId("sidebar-legacy-switch").click(); - const prompt = ` + // Locate the canvas element + const canvas = page.locator("#react-flow-id"); // Update the selector if needed + + // Get the bounding box of the canvas to determine its position + const canvasBox = await canvas.boundingBox(); + if (!canvasBox) { + throw new Error("Canvas element bounding box not found"); + } + + // Starting point (center of the canvas) + const startX = canvasBox.x + canvasBox.width / 2; + const startY = canvasBox.y + canvasBox.height / 2; + + // End point (move 600 pixels to the right) + const endX = startX + 600; + const endY = startY; + + // Hover over the canvas to focus it + await canvas.hover(); + + // Start the drag operation + await page.mouse.move(startX, startY); + await page.mouse.down(); + + // Move to the new position + await page.mouse.move(endX, endY); + + // Release the mouse button to finish the drag + await page.mouse.up(); + + await page + .getByTestId("helpersMessage History") + .first() + .dragTo(page.locator('//*[@id="react-flow-id"]')); + + await page.mouse.up(); + await page.mouse.down(); + + await page.waitForTimeout; + + await page.getByTestId("fit_view").click(); + + 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(); + + const prompt = ` {context} User: {user_input} @@ -120,67 +127,68 @@ User: {user_input} AI: `; - await page.getByTestId("title-Prompt").last().click(); - await page.getByTestId("button_open_prompt_modal").nth(0).click(); + await page.getByTestId("title-Prompt").last().click(); + await page.getByTestId("button_open_prompt_modal").nth(0).click(); - await page.getByTestId("modal-promptarea_prompt_template").fill(prompt); - await page.getByText("Edit Prompt", { exact: true }).click(); - await page.getByText("Check & Save").last().click(); + await page.getByTestId("modal-promptarea_prompt_template").fill(prompt); + await page.getByText("Edit Prompt", { exact: true }).click(); + await page.getByText("Check & Save").last().click(); - await page.getByTestId("fit_view").click(); - await page.getByTestId("fit_view").click(); + await page.getByTestId("fit_view").click(); + await page.getByTestId("fit_view").click(); - //connection 1 - const elementChatMemoryOutput = await page - .getByTestId("handle-memory-shownode-text-right") - .first(); - await elementChatMemoryOutput.hover(); - await page.mouse.down(); + //connection 1 + const elementChatMemoryOutput = await page + .getByTestId("handle-memory-shownode-text-right") + .first(); + await elementChatMemoryOutput.hover(); + await page.mouse.down(); - const promptInput = await page.getByTestId( - "handle-prompt-shownode-context-left", - ); + const promptInput = await page.getByTestId( + "handle-prompt-shownode-context-left", + ); - await promptInput.hover(); - await page.mouse.up(); + await promptInput.hover(); + await page.mouse.up(); - await page.locator('//*[@id="react-flow-id"]').hover(); + await page.locator('//*[@id="react-flow-id"]').hover(); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page.getByText("Playground", { exact: true }).last().click(); + await page.getByText("Playground", { exact: true }).last().click(); - await page.waitForSelector('[data-testid="button-send"]', { - timeout: 100000, - }); + await page.waitForSelector('[data-testid="button-send"]', { + timeout: 100000, + }); - await page - .getByPlaceholder("Send a message...") - .fill("hi, my car is blue and I like to eat pizza"); + await page + .getByPlaceholder("Send a message...") + .fill("hi, my car is blue and I like to eat pizza"); - await page.getByTestId("button-send").click(); + await page.getByTestId("button-send").click(); - await page.waitForSelector("text=AI", { timeout: 30000 }); + await page.waitForSelector("text=AI", { timeout: 30000 }); - await page - .getByPlaceholder("Send a message...") - .fill("what color is my car and what do I like to eat?"); + await page + .getByPlaceholder("Send a message...") + .fill("what color is my car and what do I like to eat?"); - await page.getByTestId("button-send").click(); + await page.getByTestId("button-send").click(); - await page.waitForTimeout(400); + await page.waitForTimeout(400); - const textLocator = page.locator("text=AI"); - await textLocator.nth(6).waitFor({ timeout: 30000 }); - await expect(textLocator.nth(1)).toBeVisible(); + const textLocator = page.locator("text=AI"); + await textLocator.nth(6).waitFor({ timeout: 30000 }); + await expect(textLocator.nth(1)).toBeVisible(); - await page.waitForTimeout(3000); + await page.waitForTimeout(3000); - const memoryResponseText = await page - .locator(".form-modal-chat-text") - .nth(1) - .allTextContents(); + const memoryResponseText = await page + .locator(".form-modal-chat-text") + .nth(1) + .allTextContents(); - expect(memoryResponseText[0].includes("pizza")).toBeTruthy(); - expect(memoryResponseText[0].includes("blue")).toBeTruthy(); -}); + expect(memoryResponseText[0].includes("pizza")).toBeTruthy(); + expect(memoryResponseText[0].includes("blue")).toBeTruthy(); + }, +); diff --git a/src/frontend/tests/core/unit/chatInputOutput.spec.ts b/src/frontend/tests/core/unit/chatInputOutput.spec.ts index 846f6b419..5748c384f 100644 --- a/src/frontend/tests/core/unit/chatInputOutput.spec.ts +++ b/src/frontend/tests/core/unit/chatInputOutput.spec.ts @@ -1,6 +1,6 @@ import { expect, test } from "@playwright/test"; -test("chat_io_teste", async ({ page }) => { +test("chat_io_teste", { tag: ["@release", "@workspace"] }, async ({ page }) => { await page.goto("/"); await page.locator("span").filter({ hasText: "My Collection" }).isVisible(); await page.waitForSelector('[data-testid="mainpage_title"]', { diff --git a/src/frontend/tests/core/unit/codeAreaModalComponent.spec.ts b/src/frontend/tests/core/unit/codeAreaModalComponent.spec.ts index 4948c02b3..b0bdab06d 100644 --- a/src/frontend/tests/core/unit/codeAreaModalComponent.spec.ts +++ b/src/frontend/tests/core/unit/codeAreaModalComponent.spec.ts @@ -1,64 +1,69 @@ import { test } from "@playwright/test"; -test("CodeAreaModalComponent", async ({ page }) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +test( + "CodeAreaModalComponent", + { 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, - }); + 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(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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(); - } + 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.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("python function"); + await page.getByTestId("blank-flow").click(); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("python function"); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page.getByTestId("sidebar-options-trigger").click(); - await page.getByTestId("sidebar-legacy-switch").isVisible({ timeout: 5000 }); - await page.getByTestId("sidebar-legacy-switch").click(); + await page.getByTestId("sidebar-options-trigger").click(); + await page + .getByTestId("sidebar-legacy-switch") + .isVisible({ timeout: 5000 }); + await page.getByTestId("sidebar-legacy-switch").click(); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page - .getByTestId("prototypesPython Function") - .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("zoom_out").click(); - await page.getByTestId("div-generic-node").click(); + await page + .getByTestId("prototypesPython Function") + .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("zoom_out").click(); + await page.getByTestId("div-generic-node").click(); - await page.getByTestId("code-button-modal").click(); + await page.getByTestId("code-button-modal").click(); - const wCode = - 'def python_function(text: str) -> st: """This is a default python function that returns the input text""" return text'; + const wCode = + 'def python_function(text: str) -> st: """This is a default python function that returns the input text""" return text'; - const customComponentCode = `from typing import Callable + const customComponentCode = `from typing import Callable from langflow.field_typing import Code from langflow.interface.custom.custom_component import CustomComponent from langflow.interface.custom.utils import get_function @@ -68,18 +73,19 @@ class PythonFunctionComponent(CustomComponent): """This is a default python function that returns the input text""" return text`; - await page - .locator("#CodeEditor div") - .filter({ hasText: "PythonFunctionComponent" }) - .nth(1) - .click(); - await page.locator("textarea").press("Control+a"); - await page.locator("textarea").fill(wCode); - await page.locator('//*[@id="checkAndSaveBtn"]').click(); - await page.waitForTimeout(1000); - await page.locator("textarea").press("Control+a"); - await page.locator("textarea").fill(wCode); - await page.locator("textarea").fill(customComponentCode); - await page.locator('//*[@id="checkAndSaveBtn"]').click(); - await page.waitForTimeout(1000); -}); + await page + .locator("#CodeEditor div") + .filter({ hasText: "PythonFunctionComponent" }) + .nth(1) + .click(); + await page.locator("textarea").press("Control+a"); + await page.locator("textarea").fill(wCode); + await page.locator('//*[@id="checkAndSaveBtn"]').click(); + await page.waitForTimeout(1000); + await page.locator("textarea").press("Control+a"); + await page.locator("textarea").fill(wCode); + await page.locator("textarea").fill(customComponentCode); + await page.locator('//*[@id="checkAndSaveBtn"]').click(); + await page.waitForTimeout(1000); + }, +); diff --git a/src/frontend/tests/core/unit/dropdownComponent.spec.ts b/src/frontend/tests/core/unit/dropdownComponent.spec.ts index 46496bd9d..474a94501 100644 --- a/src/frontend/tests/core/unit/dropdownComponent.spec.ts +++ b/src/frontend/tests/core/unit/dropdownComponent.spec.ts @@ -1,150 +1,157 @@ import { expect, test } from "@playwright/test"; -test("dropDownComponent", async ({ page }) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +test( + "dropDownComponent", + { 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, - }); + 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(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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, - }); + 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("blank-flow").click(); - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("amazon"); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("amazon"); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page - .getByTestId("modelsAmazon Bedrock") - .first() - .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("zoom_out").click(); - await page.getByTestId("title-Amazon Bedrock").click(); + await page + .getByTestId("modelsAmazon Bedrock") + .first() + .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("zoom_out").click(); + await page.getByTestId("title-Amazon Bedrock").click(); - await page.getByTestId("dropdown_str_model_id").click(); + await page.getByTestId("dropdown_str_model_id").click(); - await page - .getByTestId(/anthropic\.claude-3-haiku-20240307-v1:0.*option/) - .click(); + await page + .getByTestId(/anthropic\.claude-3-haiku-20240307-v1:0.*option/) + .click(); - let value = await page - .getByTestId(/anthropic\.claude-3-haiku-20240307-v1:0.*option/) - .first() - .innerText(); - if (value !== "anthropic.claude-3-haiku-20240307-v1:0") { - expect(false).toBeTruthy(); - } + let value = await page + .getByTestId(/anthropic\.claude-3-haiku-20240307-v1:0.*option/) + .first() + .innerText(); + if (value !== "anthropic.claude-3-haiku-20240307-v1:0") { + expect(false).toBeTruthy(); + } - await page.getByTestId("dropdown_str_model_id").click(); - await page.getByText("anthropic.claude-v2").last().click(); + await page.getByTestId("dropdown_str_model_id").click(); + await page.getByText("anthropic.claude-v2").last().click(); - value = await page.getByTestId("dropdown_str_model_id").innerText(); - if (value !== "anthropic.claude-v2:1") { - expect(false).toBeTruthy(); - } + value = await page.getByTestId("dropdown_str_model_id").innerText(); + if (value !== "anthropic.claude-v2:1") { + expect(false).toBeTruthy(); + } - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page.getByTestId("more-options-modal").click(); - await page.getByTestId("advanced-button-modal").click(); + await page.getByTestId("more-options-modal").click(); + await page.getByTestId("advanced-button-modal").click(); - value = await page - .getByTestId("value-dropdown-dropdown_str_edit_model_id") - .innerText(); - if (value !== "anthropic.claude-v2:1") { - expect(false).toBeTruthy(); - } + value = await page + .getByTestId("value-dropdown-dropdown_str_edit_model_id") + .innerText(); + if (value !== "anthropic.claude-v2:1") { + expect(false).toBeTruthy(); + } - await page.locator('//*[@id="showregion_name"]').click(); - expect( - await page.locator('//*[@id="showregion_name"]').isChecked(), - ).toBeFalsy(); + await page.locator('//*[@id="showregion_name"]').click(); + expect( + await page.locator('//*[@id="showregion_name"]').isChecked(), + ).toBeFalsy(); - await page.locator('//*[@id="showregion_name"]').click(); - expect( - await page.locator('//*[@id="showregion_name"]').isChecked(), - ).toBeTruthy(); + await page.locator('//*[@id="showregion_name"]').click(); + expect( + await page.locator('//*[@id="showregion_name"]').isChecked(), + ).toBeTruthy(); - // showmodel_id - await page.locator('//*[@id="showmodel_id"]').click(); - expect(await page.locator('//*[@id="showmodel_id"]').isChecked()).toBeFalsy(); + // showmodel_id + await page.locator('//*[@id="showmodel_id"]').click(); + expect( + await page.locator('//*[@id="showmodel_id"]').isChecked(), + ).toBeFalsy(); - // showmodel_id - await page.locator('//*[@id="showmodel_id"]').click(); - expect( - await page.locator('//*[@id="showmodel_id"]').isChecked(), - ).toBeTruthy(); + // showmodel_id + await page.locator('//*[@id="showmodel_id"]').click(); + expect( + await page.locator('//*[@id="showmodel_id"]').isChecked(), + ).toBeTruthy(); - await page.locator('//*[@id="showregion_name"]').click(); - expect( - await page.locator('//*[@id="showregion_name"]').isChecked(), - ).toBeFalsy(); + await page.locator('//*[@id="showregion_name"]').click(); + expect( + await page.locator('//*[@id="showregion_name"]').isChecked(), + ).toBeFalsy(); - await page.locator('//*[@id="showregion_name"]').click(); - expect( - await page.locator('//*[@id="showregion_name"]').isChecked(), - ).toBeTruthy(); + await page.locator('//*[@id="showregion_name"]').click(); + expect( + await page.locator('//*[@id="showregion_name"]').isChecked(), + ).toBeTruthy(); - // showmodel_id - await page.locator('//*[@id="showmodel_id"]').click(); - expect(await page.locator('//*[@id="showmodel_id"]').isChecked()).toBeFalsy(); + // showmodel_id + await page.locator('//*[@id="showmodel_id"]').click(); + expect( + await page.locator('//*[@id="showmodel_id"]').isChecked(), + ).toBeFalsy(); - // showmodel_id - await page.locator('//*[@id="showmodel_id"]').click(); - expect( - await page.locator('//*[@id="showmodel_id"]').isChecked(), - ).toBeTruthy(); + // showmodel_id + await page.locator('//*[@id="showmodel_id"]').click(); + expect( + await page.locator('//*[@id="showmodel_id"]').isChecked(), + ).toBeTruthy(); - await page.getByTestId("value-dropdown-dropdown_str_edit_model_id").click(); - await page.getByText("cohere").last().click(); + await page.getByTestId("value-dropdown-dropdown_str_edit_model_id").click(); + await page.getByText("cohere").last().click(); - value = await page - .getByTestId("value-dropdown-dropdown_str_edit_model_id") - .innerText(); - if (value !== "cohere.command-r-plus-v1:0") { - expect(false).toBeTruthy(); - } + value = await page + .getByTestId("value-dropdown-dropdown_str_edit_model_id") + .innerText(); + if (value !== "cohere.command-r-plus-v1:0") { + expect(false).toBeTruthy(); + } - await page.getByText("Close").last().click(); + await page.getByText("Close").last().click(); - value = await page - .getByTestId("value-dropdown-dropdown_str_model_id") - .innerText(); - if (value !== "cohere.command-r-plus-v1:0") { - expect(false).toBeTruthy(); - } - await page.getByTestId("code-button-modal").click(); - await page.waitForTimeout(1000); + value = await page + .getByTestId("value-dropdown-dropdown_str_model_id") + .innerText(); + if (value !== "cohere.command-r-plus-v1:0") { + expect(false).toBeTruthy(); + } + await page.getByTestId("code-button-modal").click(); + await page.waitForTimeout(1000); - await page.locator("textarea").press("Control+a"); - const emptyOptionsCode = `from langchain_community.chat_models.bedrock import BedrockChat + await page.locator("textarea").press("Control+a"); + const emptyOptionsCode = `from langchain_community.chat_models.bedrock import BedrockChat from langflow.base.constants import STREAM_INFO_TEXT from langflow.base.models.model import LCModelComponent @@ -248,7 +255,10 @@ class AmazonBedrockComponent(LCModelComponent): raise ValueError("Could not connect to AmazonBedrock API.") from e return output `; - await page.locator("textarea").fill(emptyOptionsCode); - await page.getByRole("button", { name: "Check & Save" }).click(); - await page.getByText("No parameters are available for display.").isVisible(); -}); + await page.locator("textarea").fill(emptyOptionsCode); + await page.getByRole("button", { name: "Check & Save" }).click(); + await page + .getByText("No parameters are available for display.") + .isVisible(); + }, +); diff --git a/src/frontend/tests/core/unit/fileUploadComponent.spec.ts b/src/frontend/tests/core/unit/fileUploadComponent.spec.ts index 00c61d729..61692926c 100644 --- a/src/frontend/tests/core/unit/fileUploadComponent.spec.ts +++ b/src/frontend/tests/core/unit/fileUploadComponent.spec.ts @@ -1,165 +1,171 @@ import { expect, test } from "@playwright/test"; import path from "path"; -test("should be able to upload a file", async ({ page }) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +test( + "should be able to upload a file", + { + 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, - }); + 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(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } catch (error) { - modalCount = 0; - } - while (modalCount === 0) { - await page.getByText("New Flow", { exact: true }).click(); + 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("file"); + + await page.waitForTimeout(1000); + + await page + .getByTestId("dataFile") + .first() + .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("zoom_out").click(); + const fileChooserPromise = page.waitForEvent("filechooser"); + await page.getByTestId("button_upload_file").click(); + const fileChooser = await fileChooserPromise; + await fileChooser.setFiles( + path.join(__dirname, "../../assets/test_file.txt"), + ); + await page.getByText("test_file.txt").isVisible(); + + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("chat output"); + + await page + .getByTestId("outputsChat Output") + .first() + .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("zoom_out").click(); + + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("parse data"); + await page + .getByTestId("processingParse Data") + .first() + .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("zoom_out").click(); + + let visibleElementHandle; + + const elementsFile = await page + .getByTestId("handle-file-shownode-data-right") + .all(); + + for (const element of elementsFile) { + if (await element.isVisible()) { + visibleElementHandle = element; + break; + } + } + + // Click and hold on the first element + await visibleElementHandle.hover(); + await page.mouse.down(); + + // Move to the second element + + const parseDataElement = await page + .getByTestId("handle-parsedata-shownode-data-left") + .all(); + + for (const element of parseDataElement) { + if (await element.isVisible()) { + visibleElementHandle = element; + break; + } + } + + await visibleElementHandle.hover(); + + // Release the mouse + await page.mouse.up(); + + // Click and hold on the first element + + const parseDataOutputElement = await page + .getByTestId("handle-parsedata-shownode-text-right") + .all(); + + for (const element of parseDataOutputElement) { + if (await element.isVisible()) { + visibleElementHandle = element; + break; + } + } + + await page.getByTitle("fit view").click(); + + await visibleElementHandle.hover(); + await page.mouse.down(); + + // Move to the second element + const chatOutputElement = await page + .getByTestId("handle-chatoutput-shownode-text-left") + .all(); + + for (const element of chatOutputElement) { + if (await element.isVisible()) { + visibleElementHandle = element; + break; + } + } + + await visibleElementHandle.hover(); + + // Release the mouse + await page.mouse.up(); + + await page.getByText("Playground", { exact: true }).last().click(); + + await page.waitForSelector("text=Run Flow", { + timeout: 30000, + }); + + await page.getByText("Run 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("file"); - - await page.waitForTimeout(1000); - - await page - .getByTestId("dataFile") - .first() - .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("zoom_out").click(); - const fileChooserPromise = page.waitForEvent("filechooser"); - await page.getByTestId("button_upload_file").click(); - const fileChooser = await fileChooserPromise; - await fileChooser.setFiles( - path.join(__dirname, "../../assets/test_file.txt"), - ); - await page.getByText("test_file.txt").isVisible(); - - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("chat output"); - - await page - .getByTestId("outputsChat Output") - .first() - .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("zoom_out").click(); - - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("parse data"); - await page - .getByTestId("processingParse Data") - .first() - .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("zoom_out").click(); - - let visibleElementHandle; - - const elementsFile = await page - .getByTestId("handle-file-shownode-data-right") - .all(); - - for (const element of elementsFile) { - if (await element.isVisible()) { - visibleElementHandle = element; - break; - } - } - - // Click and hold on the first element - await visibleElementHandle.hover(); - await page.mouse.down(); - - // Move to the second element - - const parseDataElement = await page - .getByTestId("handle-parsedata-shownode-data-left") - .all(); - - for (const element of parseDataElement) { - if (await element.isVisible()) { - visibleElementHandle = element; - break; - } - } - - await visibleElementHandle.hover(); - - // Release the mouse - await page.mouse.up(); - - // Click and hold on the first element - - const parseDataOutputElement = await page - .getByTestId("handle-parsedata-shownode-text-right") - .all(); - - for (const element of parseDataOutputElement) { - if (await element.isVisible()) { - visibleElementHandle = element; - break; - } - } - - await page.getByTitle("fit view").click(); - - await visibleElementHandle.hover(); - await page.mouse.down(); - - // Move to the second element - const chatOutputElement = await page - .getByTestId("handle-chatoutput-shownode-text-left") - .all(); - - for (const element of chatOutputElement) { - if (await element.isVisible()) { - visibleElementHandle = element; - break; - } - } - - await visibleElementHandle.hover(); - - // Release the mouse - await page.mouse.up(); - - await page.getByText("Playground", { exact: true }).last().click(); - - await page.waitForSelector("text=Run Flow", { - timeout: 30000, - }); - - await page.getByText("Run Flow", { exact: true }).click(); - - await page.waitForTimeout(3000); - expect(await page.getByText("this is a test file").isVisible()).toBe(true); -}); + expect(await page.getByText("this is a test file").isVisible()).toBe(true); + }, +); diff --git a/src/frontend/tests/core/unit/floatComponent.spec.ts b/src/frontend/tests/core/unit/floatComponent.spec.ts index abbaeb746..4c74bc11f 100644 --- a/src/frontend/tests/core/unit/floatComponent.spec.ts +++ b/src/frontend/tests/core/unit/floatComponent.spec.ts @@ -1,149 +1,157 @@ import { expect, test } from "@playwright/test"; -test("FloatComponent", async ({ page }) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +test( + "FloatComponent", + { 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, - }); + 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(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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("ollama"); + 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("ollama"); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - 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("zoom_out").click(); + 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("zoom_out").click(); - await page.waitForTimeout(1000); - await page.locator('//*[@id="float_float_temperature"]').click(); - await page.locator('//*[@id="float_float_temperature"]').fill(""); - await page.waitForTimeout(1000); - await page.locator('//*[@id="float_float_temperature"]').fill("3"); - - let value = await page - .locator('//*[@id="float_float_temperature"]') - .inputValue(); - - if (value != "2") { - expect(false).toBeTruthy(); - } - - await page.waitForTimeout(1000); - await page.locator('//*[@id="float_float_temperature"]').click(); - await page.locator('//*[@id="float_float_temperature"]').fill(""); - await page.waitForTimeout(1000); - await page.locator('//*[@id="float_float_temperature"]').fill("-3"); - - value = await page.locator('//*[@id="float_float_temperature"]').inputValue(); - - if (value != "-2") { - expect(false).toBeTruthy(); - } - - await page.getByTestId("more-options-modal").click(); - await page.getByTestId("advanced-button-modal").click(); - - await page.getByTestId("showmirostat_eta").click(); - expect( - await page.locator('//*[@id="showmirostat_eta"]').isChecked(), - ).toBeTruthy(); - - await page.getByTestId("showmirostat_eta").click(); - expect( - await page.locator('//*[@id="showmirostat_eta"]').isChecked(), - ).toBeFalsy(); - - await page.getByTestId("showmirostat_eta").click(); - expect( - await page.locator('//*[@id="showmirostat_eta"]').isChecked(), - ).toBeTruthy(); - - await page.getByTestId("showmirostat_eta").click(); - expect( - await page.locator('//*[@id="showmirostat_eta"]').isChecked(), - ).toBeFalsy(); - - await page.getByTestId("showmirostat_tau").click(); - expect( - await page.locator('//*[@id="showmirostat_tau"]').isChecked(), - ).toBeTruthy(); - - await page.getByTestId("showmirostat_tau").click(); - expect( - await page.locator('//*[@id="showmirostat_tau"]').isChecked(), - ).toBeFalsy(); - - await page.getByText("Close").last().click(); - - const plusButtonLocator = page.locator('//*[@id="float_float_temperature"]'); - const elementCount = await plusButtonLocator?.count(); - if (elementCount === 0) { - expect(true).toBeTruthy(); - - await page.getByTestId("more-options-modal").click(); - await page.getByTestId("advanced-button-modal").click(); - - // showtemperature - await page.locator('//*[@id="showtemperature"]').click(); - expect( - await page.locator('//*[@id="showtemperature"]').isChecked(), - ).toBeTruthy(); - - await page.getByText("Close").last().click(); + await page.waitForTimeout(1000); await page.locator('//*[@id="float_float_temperature"]').click(); - await page.getByTestId("float_float_temperature").fill(""); - + await page.locator('//*[@id="float_float_temperature"]').fill(""); + await page.waitForTimeout(1000); await page.locator('//*[@id="float_float_temperature"]').fill("3"); let value = await page .locator('//*[@id="float_float_temperature"]') .inputValue(); - if (value != "1") { + if (value != "2") { expect(false).toBeTruthy(); } + await page.waitForTimeout(1000); await page.locator('//*[@id="float_float_temperature"]').click(); - await page.getByTestId("float_float_temperature").fill(""); - + await page.locator('//*[@id="float_float_temperature"]').fill(""); + await page.waitForTimeout(1000); await page.locator('//*[@id="float_float_temperature"]').fill("-3"); value = await page .locator('//*[@id="float_float_temperature"]') .inputValue(); - if (value != "-1") { + if (value != "-2") { expect(false).toBeTruthy(); } - } -}); + + await page.getByTestId("more-options-modal").click(); + await page.getByTestId("advanced-button-modal").click(); + + await page.getByTestId("showmirostat_eta").click(); + expect( + await page.locator('//*[@id="showmirostat_eta"]').isChecked(), + ).toBeTruthy(); + + await page.getByTestId("showmirostat_eta").click(); + expect( + await page.locator('//*[@id="showmirostat_eta"]').isChecked(), + ).toBeFalsy(); + + await page.getByTestId("showmirostat_eta").click(); + expect( + await page.locator('//*[@id="showmirostat_eta"]').isChecked(), + ).toBeTruthy(); + + await page.getByTestId("showmirostat_eta").click(); + expect( + await page.locator('//*[@id="showmirostat_eta"]').isChecked(), + ).toBeFalsy(); + + await page.getByTestId("showmirostat_tau").click(); + expect( + await page.locator('//*[@id="showmirostat_tau"]').isChecked(), + ).toBeTruthy(); + + await page.getByTestId("showmirostat_tau").click(); + expect( + await page.locator('//*[@id="showmirostat_tau"]').isChecked(), + ).toBeFalsy(); + + await page.getByText("Close").last().click(); + + const plusButtonLocator = page.locator( + '//*[@id="float_float_temperature"]', + ); + const elementCount = await plusButtonLocator?.count(); + if (elementCount === 0) { + expect(true).toBeTruthy(); + + await page.getByTestId("more-options-modal").click(); + await page.getByTestId("advanced-button-modal").click(); + + // showtemperature + await page.locator('//*[@id="showtemperature"]').click(); + expect( + await page.locator('//*[@id="showtemperature"]').isChecked(), + ).toBeTruthy(); + + await page.getByText("Close").last().click(); + await page.locator('//*[@id="float_float_temperature"]').click(); + await page.getByTestId("float_float_temperature").fill(""); + + await page.locator('//*[@id="float_float_temperature"]').fill("3"); + + let value = await page + .locator('//*[@id="float_float_temperature"]') + .inputValue(); + + if (value != "1") { + expect(false).toBeTruthy(); + } + + await page.locator('//*[@id="float_float_temperature"]').click(); + await page.getByTestId("float_float_temperature").fill(""); + + await page.locator('//*[@id="float_float_temperature"]').fill("-3"); + + value = await page + .locator('//*[@id="float_float_temperature"]') + .inputValue(); + + if (value != "-1") { + expect(false).toBeTruthy(); + } + } + }, +); diff --git a/src/frontend/tests/core/unit/inputComponent.spec.ts b/src/frontend/tests/core/unit/inputComponent.spec.ts index afed660b2..877a0280a 100644 --- a/src/frontend/tests/core/unit/inputComponent.spec.ts +++ b/src/frontend/tests/core/unit/inputComponent.spec.ts @@ -1,157 +1,169 @@ import { expect, test } from "@playwright/test"; -test("InputComponent", async ({ page }) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +test( + "InputComponent", + { 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, - }); + 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(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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("Chroma"); + 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("Chroma"); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page - .getByTestId("vectorstoresChroma DB") - .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(); - await page.getByTestId("popover-anchor-input-collection_name").click(); - await page - .getByTestId("popover-anchor-input-collection_name") - .fill("collection_name_test_123123123!@#$&*(&%$@"); - - let value = await page - .getByTestId("popover-anchor-input-collection_name") - .inputValue(); - - if (value != "collection_name_test_123123123!@#$&*(&%$@") { - expect(false).toBeTruthy(); - } - - await page.getByTestId("div-generic-node").click(); - - await page.getByTestId("more-options-modal").click(); - await page.getByTestId("advanced-button-modal").click(); - - await page.locator('//*[@id="showchroma_server_cors_allow_origins"]').click(); - expect( await page - .locator('//*[@id="showchroma_server_cors_allow_origins"]') - .isChecked(), - ).toBeTruthy(); + .getByTestId("vectorstoresChroma DB") + .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.locator('//*[@id="showchroma_server_grpc_port"]').click(); - expect( - await page.locator('//*[@id="showchroma_server_grpc_port"]').isChecked(), - ).toBeTruthy(); - - await page.locator('//*[@id="showchroma_server_host"]').click(); - expect( - await page.locator('//*[@id="showchroma_server_host"]').isChecked(), - ).toBeTruthy(); - - await page.locator('//*[@id="showchroma_server_http_port"]').click(); - expect( - await page.locator('//*[@id="showchroma_server_http_port"]').isChecked(), - ).toBeTruthy(); - - await page.locator('//*[@id="showchroma_server_ssl_enabled"]').click(); - expect( - await page.locator('//*[@id="showchroma_server_ssl_enabled"]').isChecked(), - ).toBeTruthy(); - - await page.locator('//*[@id="showchroma_server_cors_allow_origins"]').click(); - expect( + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("popover-anchor-input-collection_name").click(); await page - .locator('//*[@id="showchroma_server_cors_allow_origins"]') - .isChecked(), - ).toBeFalsy(); + .getByTestId("popover-anchor-input-collection_name") + .fill("collection_name_test_123123123!@#$&*(&%$@"); - await page.locator('//*[@id="showchroma_server_grpc_port"]').click(); - expect( - await page.locator('//*[@id="showchroma_server_grpc_port"]').isChecked(), - ).toBeFalsy(); + let value = await page + .getByTestId("popover-anchor-input-collection_name") + .inputValue(); - await page.locator('//*[@id="showchroma_server_host"]').click(); - expect( - await page.locator('//*[@id="showchroma_server_host"]').isChecked(), - ).toBeFalsy(); - - await page.locator('//*[@id="showchroma_server_http_port"]').click(); - expect( - await page.locator('//*[@id="showchroma_server_http_port"]').isChecked(), - ).toBeFalsy(); - - await page.locator('//*[@id="showchroma_server_ssl_enabled"]').click(); - expect( - await page.locator('//*[@id="showchroma_server_ssl_enabled"]').isChecked(), - ).toBeFalsy(); - - let valueEditNode = await page - .getByTestId("popover-anchor-input-collection_name-edit") - .inputValue(); - - if (valueEditNode != "collection_name_test_123123123!@#$&*(&%$@") { - expect(false).toBeTruthy(); - } - - await page - .getByTestId("popover-anchor-input-collection_name-edit") - .fill("NEW_collection_name_test_123123123!@#$&*(&%$@ÇÇÇÀõe"); - - await page.waitForTimeout(1000); - await page.getByText("Close").last().click(); - - const plusButtonLocator = page.getByTestId("input-collection_name"); - const elementCount = await plusButtonLocator?.count(); - if (elementCount === 0) { - expect(true).toBeTruthy(); + if (value != "collection_name_test_123123123!@#$&*(&%$@") { + expect(false).toBeTruthy(); + } await page.getByTestId("div-generic-node").click(); await page.getByTestId("more-options-modal").click(); await page.getByTestId("advanced-button-modal").click(); - await page.getByText("Close").last().click(); + await page + .locator('//*[@id="showchroma_server_cors_allow_origins"]') + .click(); + expect( + await page + .locator('//*[@id="showchroma_server_cors_allow_origins"]') + .isChecked(), + ).toBeTruthy(); - let value = await page - .getByTestId("popover-anchor-input-collection_name") + await page.locator('//*[@id="showchroma_server_grpc_port"]').click(); + expect( + await page.locator('//*[@id="showchroma_server_grpc_port"]').isChecked(), + ).toBeTruthy(); + + await page.locator('//*[@id="showchroma_server_host"]').click(); + expect( + await page.locator('//*[@id="showchroma_server_host"]').isChecked(), + ).toBeTruthy(); + + await page.locator('//*[@id="showchroma_server_http_port"]').click(); + expect( + await page.locator('//*[@id="showchroma_server_http_port"]').isChecked(), + ).toBeTruthy(); + + await page.locator('//*[@id="showchroma_server_ssl_enabled"]').click(); + expect( + await page + .locator('//*[@id="showchroma_server_ssl_enabled"]') + .isChecked(), + ).toBeTruthy(); + + await page + .locator('//*[@id="showchroma_server_cors_allow_origins"]') + .click(); + expect( + await page + .locator('//*[@id="showchroma_server_cors_allow_origins"]') + .isChecked(), + ).toBeFalsy(); + + await page.locator('//*[@id="showchroma_server_grpc_port"]').click(); + expect( + await page.locator('//*[@id="showchroma_server_grpc_port"]').isChecked(), + ).toBeFalsy(); + + await page.locator('//*[@id="showchroma_server_host"]').click(); + expect( + await page.locator('//*[@id="showchroma_server_host"]').isChecked(), + ).toBeFalsy(); + + await page.locator('//*[@id="showchroma_server_http_port"]').click(); + expect( + await page.locator('//*[@id="showchroma_server_http_port"]').isChecked(), + ).toBeFalsy(); + + await page.locator('//*[@id="showchroma_server_ssl_enabled"]').click(); + expect( + await page + .locator('//*[@id="showchroma_server_ssl_enabled"]') + .isChecked(), + ).toBeFalsy(); + + let valueEditNode = await page + .getByTestId("popover-anchor-input-collection_name-edit") .inputValue(); - if (value != "NEW_collection_name_test_123123123!@#$&*(&%$@ÇÇÇÀõe") { + if (valueEditNode != "collection_name_test_123123123!@#$&*(&%$@") { expect(false).toBeTruthy(); } - } -}); + + await page + .getByTestId("popover-anchor-input-collection_name-edit") + .fill("NEW_collection_name_test_123123123!@#$&*(&%$@ÇÇÇÀõe"); + + await page.waitForTimeout(1000); + await page.getByText("Close").last().click(); + + const plusButtonLocator = page.getByTestId("input-collection_name"); + const elementCount = await plusButtonLocator?.count(); + if (elementCount === 0) { + expect(true).toBeTruthy(); + + await page.getByTestId("div-generic-node").click(); + + await page.getByTestId("more-options-modal").click(); + await page.getByTestId("advanced-button-modal").click(); + + await page.getByText("Close").last().click(); + + let value = await page + .getByTestId("popover-anchor-input-collection_name") + .inputValue(); + + if (value != "NEW_collection_name_test_123123123!@#$&*(&%$@ÇÇÇÀõe") { + expect(false).toBeTruthy(); + } + } + }, +); diff --git a/src/frontend/tests/core/unit/inputListComponent.spec.ts b/src/frontend/tests/core/unit/inputListComponent.spec.ts index cda4bc43a..2267c91c5 100644 --- a/src/frontend/tests/core/unit/inputListComponent.spec.ts +++ b/src/frontend/tests/core/unit/inputListComponent.spec.ts @@ -1,157 +1,161 @@ import { expect, test } from "@playwright/test"; -test("InputListComponent", async ({ page }) => { - await page.goto("/"); - await page.waitForTimeout(1000); +test( + "InputListComponent", + { tag: ["@release", "@workspace"] }, + async ({ page }) => { + await page.goto("/"); + await page.waitForTimeout(1000); - let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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(); - } + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); + } - await page.getByTestId("blank-flow").click(); - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("url"); + await page.getByTestId("blank-flow").click(); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("url"); - await page.waitForTimeout(1000); - await page - .getByTestId("dataURL") - .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("zoom_out").click(); + await page.waitForTimeout(1000); + await page + .getByTestId("dataURL") + .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("zoom_out").click(); - await page.getByTestId("inputlist_str_urls_0").fill("test test test test"); + await page.getByTestId("inputlist_str_urls_0").fill("test test test test"); - await page.getByTestId("input-list-plus-btn_urls-0").click(); + await page.getByTestId("input-list-plus-btn_urls-0").click(); - await page.getByTestId("input-list-plus-btn_urls-0").click(); + await page.getByTestId("input-list-plus-btn_urls-0").click(); - await page - .getByTestId("inputlist_str_urls_1") - .fill("test1 test1 test1 test1"); + await page + .getByTestId("inputlist_str_urls_1") + .fill("test1 test1 test1 test1"); - await page - .getByTestId("inputlist_str_urls_2") - .fill("test2 test2 test2 test2"); + await page + .getByTestId("inputlist_str_urls_2") + .fill("test2 test2 test2 test2"); - await page.getByTestId("div-generic-node").click(); - await page.getByTestId("more-options-modal").click(); - await page.getByTestId("advanced-button-modal").click(); + await page.getByTestId("div-generic-node").click(); + await page.getByTestId("more-options-modal").click(); + await page.getByTestId("advanced-button-modal").click(); - const value0 = await page.getByTestId("inputlist_str_urls_0").inputValue(); - const value1 = await page.getByTestId("inputlist_str_urls_1").inputValue(); + const value0 = await page.getByTestId("inputlist_str_urls_0").inputValue(); + const value1 = await page.getByTestId("inputlist_str_urls_1").inputValue(); - const value2 = await page.getByTestId("inputlist_str_urls_2").inputValue(); + const value2 = await page.getByTestId("inputlist_str_urls_2").inputValue(); - if ( - value0 !== "test test test test" || - value1 !== "test1 test1 test1 test1" || - value2 !== "test2 test2 test2 test2" - ) { - expect(false).toBeTruthy(); - } + if ( + value0 !== "test test test test" || + value1 !== "test1 test1 test1 test1" || + value2 !== "test2 test2 test2 test2" + ) { + expect(false).toBeTruthy(); + } - await page.getByTestId("input-list-minus-btn-edit_urls-1").click(); + await page.getByTestId("input-list-minus-btn-edit_urls-1").click(); - const plusButtonLocator = page.getByTestId( - "input-list-minus-btn-edit_urls-1", - ); - const elementCount = await plusButtonLocator?.count(); + const plusButtonLocator = page.getByTestId( + "input-list-minus-btn-edit_urls-1", + ); + const elementCount = await plusButtonLocator?.count(); - if (elementCount > 1) { - expect(false).toBeTruthy(); - } + if (elementCount > 1) { + expect(false).toBeTruthy(); + } - await page.getByText("Close").last().click(); + await page.getByText("Close").last().click(); - await page.getByTestId("input-list-minus-btn_urls-2").isHidden(); + await page.getByTestId("input-list-minus-btn_urls-2").isHidden(); - await page.getByTestId("input-list-plus-btn_urls-0").click(); - await page.getByTestId("input-list-plus-btn_urls-0").click(); + await page.getByTestId("input-list-plus-btn_urls-0").click(); + await page.getByTestId("input-list-plus-btn_urls-0").click(); - await page.getByTestId("inputlist_str_urls_0").fill("test test test test"); - await page - .getByTestId("inputlist_str_urls_1") - .fill("test1 test1 test1 test1"); - await page - .getByTestId("inputlist_str_urls_2") - .fill("test2 test2 test2 test2"); - await page - .getByTestId("inputlist_str_urls_3") - .fill("test3 test3 test3 test3"); + await page.getByTestId("inputlist_str_urls_0").fill("test test test test"); + await page + .getByTestId("inputlist_str_urls_1") + .fill("test1 test1 test1 test1"); + await page + .getByTestId("inputlist_str_urls_2") + .fill("test2 test2 test2 test2"); + await page + .getByTestId("inputlist_str_urls_3") + .fill("test3 test3 test3 test3"); - await page.getByTestId("div-generic-node").click(); - await page.getByTestId("more-options-modal").click(); - await page.getByTestId("advanced-button-modal").click(); + await page.getByTestId("div-generic-node").click(); + await page.getByTestId("more-options-modal").click(); + await page.getByTestId("advanced-button-modal").click(); - const value0Edit = await page - .getByTestId("inputlist_str_edit_urls_0") - .inputValue(); - const value1Edit = await page - .getByTestId("inputlist_str_edit_urls_1") - .inputValue(); - const value2Edit = await page - .getByTestId("inputlist_str_edit_urls_2") - .inputValue(); - const value3Edit = await page - .getByTestId("inputlist_str_edit_urls_3") - .inputValue(); + const value0Edit = await page + .getByTestId("inputlist_str_edit_urls_0") + .inputValue(); + const value1Edit = await page + .getByTestId("inputlist_str_edit_urls_1") + .inputValue(); + const value2Edit = await page + .getByTestId("inputlist_str_edit_urls_2") + .inputValue(); + const value3Edit = await page + .getByTestId("inputlist_str_edit_urls_3") + .inputValue(); - if ( - value0Edit !== "test test test test" || - value1Edit !== "test1 test1 test1 test1" || - value2Edit !== "test2 test2 test2 test2" || - value3Edit !== "test3 test3 test3 test3" - ) { - expect(false).toBeTruthy(); - } + if ( + value0Edit !== "test test test test" || + value1Edit !== "test1 test1 test1 test1" || + value2Edit !== "test2 test2 test2 test2" || + value3Edit !== "test3 test3 test3 test3" + ) { + expect(false).toBeTruthy(); + } - await page.getByTestId("input-list-minus-btn-edit_urls-1").click(); - await page.getByTestId("input-list-minus-btn-edit_urls-1").click(); - await page.getByTestId("input-list-minus-btn-edit_urls-1").click(); + await page.getByTestId("input-list-minus-btn-edit_urls-1").click(); + await page.getByTestId("input-list-minus-btn-edit_urls-1").click(); + await page.getByTestId("input-list-minus-btn-edit_urls-1").click(); - const plusButtonLocatorEdit0 = await page.getByTestId( - "input-list-plus-btn-edit_urls-0", - ); - const elementCountEdit0 = await plusButtonLocatorEdit0?.count(); + const plusButtonLocatorEdit0 = await page.getByTestId( + "input-list-plus-btn-edit_urls-0", + ); + const elementCountEdit0 = await plusButtonLocatorEdit0?.count(); - const plusButtonLocatorEdit2 = await page.getByTestId( - "input-list-plus-btn-edit_urls-1", - ); - const elementCountEdit2 = await plusButtonLocatorEdit2?.count(); + const plusButtonLocatorEdit2 = await page.getByTestId( + "input-list-plus-btn-edit_urls-1", + ); + const elementCountEdit2 = await plusButtonLocatorEdit2?.count(); - if (elementCountEdit0 > 1 || elementCountEdit2 > 0) { - expect(false).toBeTruthy(); - } + if (elementCountEdit0 > 1 || elementCountEdit2 > 0) { + expect(false).toBeTruthy(); + } - const minusButtonLocatorEdit1 = await page.getByTestId( - "input-list-minus-btn-edit_urls-1", - ); + const minusButtonLocatorEdit1 = await page.getByTestId( + "input-list-minus-btn-edit_urls-1", + ); - const elementCountMinusEdit1 = await minusButtonLocatorEdit1?.count(); + const elementCountMinusEdit1 = await minusButtonLocatorEdit1?.count(); - const minusButtonLocatorEdit2 = await page.getByTestId( - "input-list-minus-btn-edit_urls-2", - ); + const minusButtonLocatorEdit2 = await page.getByTestId( + "input-list-minus-btn-edit_urls-2", + ); - const elementCountMinusEdit2 = await minusButtonLocatorEdit2?.count(); + const elementCountMinusEdit2 = await minusButtonLocatorEdit2?.count(); - if (elementCountMinusEdit1 > 1 || elementCountMinusEdit2 > 0) { - expect(false).toBeTruthy(); - } -}); + if (elementCountMinusEdit1 > 1 || elementCountMinusEdit2 > 0) { + expect(false).toBeTruthy(); + } + }, +); diff --git a/src/frontend/tests/core/unit/intComponent.spec.ts b/src/frontend/tests/core/unit/intComponent.spec.ts index 3e8d1aeb0..e2b1a6049 100644 --- a/src/frontend/tests/core/unit/intComponent.spec.ts +++ b/src/frontend/tests/core/unit/intComponent.spec.ts @@ -1,6 +1,6 @@ import { expect, test } from "@playwright/test"; -test("IntComponent", async ({ page }) => { +test("IntComponent", { tag: ["@release", "@workspace"] }, async ({ page }) => { await page.goto("/"); await page.waitForSelector('[data-testid="mainpage_title"]', { timeout: 30000, diff --git a/src/frontend/tests/core/unit/keyPairListComponent.spec.ts b/src/frontend/tests/core/unit/keyPairListComponent.spec.ts index 9ef26db9f..30b80e813 100644 --- a/src/frontend/tests/core/unit/keyPairListComponent.spec.ts +++ b/src/frontend/tests/core/unit/keyPairListComponent.spec.ts @@ -1,133 +1,139 @@ import { expect, test } from "@playwright/test"; -test("KeypairListComponent", async ({ page }) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +test( + "KeypairListComponent", + { 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, - }); + 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(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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("amazon bedrock"); + 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("amazon bedrock"); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page - .getByTestId("modelsAmazon Bedrock") - .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("zoom_out").click(); - - await page.getByTestId("more-options-modal").click(); - await page.getByTestId("advanced-button-modal").click(); - - await page.getByTestId("showmodel_kwargs").click(); - expect(await page.getByTestId("showmodel_kwargs").isChecked()).toBeTruthy(); - await page.getByText("Close").last().click(); - - await page.locator('//*[@id="keypair0"]').click(); - await page.locator('//*[@id="keypair0"]').fill("testtesttesttest"); - await page.locator('//*[@id="keypair100"]').click(); - await page - .locator('//*[@id="keypair100"]') - .fill("test test test test test test"); - - await page.getByTestId("div-generic-node").click(); - - const valueWithSpace = await page.getByTestId("keypair100").inputValue(); - await page.getByTestId("div-generic-node").click(); - - if (valueWithSpace !== "test test test test test test") { - expect(false).toBeTruthy(); - } - - const plusButtonLocatorNode = page.locator('//*[@id="plusbtn0"]'); - const elementCountNode = await plusButtonLocatorNode?.count(); - if (elementCountNode > 0) { - await plusButtonLocatorNode.click(); - } - await page.getByTestId("div-generic-node").click(); - - await page.locator('//*[@id="keypair0"]').click(); - await page.locator('//*[@id="keypair0"]').fill("testtesttesttest1"); - await page.getByTestId("div-generic-node").click(); - - const keyPairVerification = page.locator('//*[@id="keypair100"]'); - const elementKeyCount = await keyPairVerification?.count(); - - if (elementKeyCount === 1) { - expect(true).toBeTruthy(); - } else { - expect(false).toBeTruthy(); - } - - await page.getByTestId("more-options-modal").click(); - await page.getByTestId("advanced-button-modal").click(); - - await page.getByText("Close").last().click(); - - const plusButtonLocator = page.locator('//*[@id="plusbtn0"]'); - const elementCount = await plusButtonLocator?.count(); - if (elementCount === 1) { - expect(true).toBeTruthy(); - await page.getByTestId("div-generic-node").click(); + await page + .getByTestId("modelsAmazon Bedrock") + .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("zoom_out").click(); await page.getByTestId("more-options-modal").click(); await page.getByTestId("advanced-button-modal").click(); - await page.locator('//*[@id="editNodekeypair0"]').click(); - await page.locator('//*[@id="editNodekeypair0"]').fill("testtesttesttest"); + await page.getByTestId("showmodel_kwargs").click(); + expect(await page.getByTestId("showmodel_kwargs").isChecked()).toBeTruthy(); + await page.getByText("Close").last().click(); - const keyPairVerification = page.locator('//*[@id="editNodekeypair0"]'); + await page.locator('//*[@id="keypair0"]').click(); + await page.locator('//*[@id="keypair0"]').fill("testtesttesttest"); + await page.locator('//*[@id="keypair100"]').click(); + await page + .locator('//*[@id="keypair100"]') + .fill("test test test test test test"); + + await page.getByTestId("div-generic-node").click(); + + const valueWithSpace = await page.getByTestId("keypair100").inputValue(); + await page.getByTestId("div-generic-node").click(); + + if (valueWithSpace !== "test test test test test test") { + expect(false).toBeTruthy(); + } + + const plusButtonLocatorNode = page.locator('//*[@id="plusbtn0"]'); + const elementCountNode = await plusButtonLocatorNode?.count(); + if (elementCountNode > 0) { + await plusButtonLocatorNode.click(); + } + await page.getByTestId("div-generic-node").click(); + + await page.locator('//*[@id="keypair0"]').click(); + await page.locator('//*[@id="keypair0"]').fill("testtesttesttest1"); + await page.getByTestId("div-generic-node").click(); + + const keyPairVerification = page.locator('//*[@id="keypair100"]'); const elementKeyCount = await keyPairVerification?.count(); if (elementKeyCount === 1) { - await page.getByText("Close").last().click(); + expect(true).toBeTruthy(); + } else { + expect(false).toBeTruthy(); + } + await page.getByTestId("more-options-modal").click(); + await page.getByTestId("advanced-button-modal").click(); + + await page.getByText("Close").last().click(); + + const plusButtonLocator = page.locator('//*[@id="plusbtn0"]'); + const elementCount = await plusButtonLocator?.count(); + if (elementCount === 1) { + expect(true).toBeTruthy(); await page.getByTestId("div-generic-node").click(); - const key1 = await page.locator('//*[@id="keypair0"]').inputValue(); - const value1 = await page.locator('//*[@id="keypair100"]').inputValue(); - await page.getByTestId("div-generic-node").click(); + await page.getByTestId("more-options-modal").click(); + await page.getByTestId("advanced-button-modal").click(); - if ( - key1 === "testtesttesttest" && - value1 === "test test test test test test" - ) { - expect(true).toBeTruthy(); + await page.locator('//*[@id="editNodekeypair0"]').click(); + await page + .locator('//*[@id="editNodekeypair0"]') + .fill("testtesttesttest"); + + const keyPairVerification = page.locator('//*[@id="editNodekeypair0"]'); + const elementKeyCount = await keyPairVerification?.count(); + + if (elementKeyCount === 1) { + await page.getByText("Close").last().click(); + + await page.getByTestId("div-generic-node").click(); + + const key1 = await page.locator('//*[@id="keypair0"]').inputValue(); + const value1 = await page.locator('//*[@id="keypair100"]').inputValue(); + await page.getByTestId("div-generic-node").click(); + + if ( + key1 === "testtesttesttest" && + value1 === "test test test test test test" + ) { + expect(true).toBeTruthy(); + } else { + expect(false).toBeTruthy(); + } } else { expect(false).toBeTruthy(); } } else { expect(false).toBeTruthy(); } - } else { - expect(false).toBeTruthy(); - } -}); + }, +); diff --git a/src/frontend/tests/core/unit/linkComponent.spec.ts b/src/frontend/tests/core/unit/linkComponent.spec.ts index b06c18a31..2f358ab5b 100644 --- a/src/frontend/tests/core/unit/linkComponent.spec.ts +++ b/src/frontend/tests/core/unit/linkComponent.spec.ts @@ -2,94 +2,98 @@ import { expect, Page, test } from "@playwright/test"; import uaParser from "ua-parser-js"; // TODO: This test might not be needed anymore -test("user should interact with link component", async ({ context, page }) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +test( + "user should interact with link component", + { tag: ["@release", "@workspace"] }, + async ({ context, page }) => { + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - await page.waitForSelector('[id="new-project-btn"]', { - 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(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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(); - } + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); + } - const getUA = await page.evaluate(() => navigator.userAgent); - const userAgentInfo = uaParser(getUA); + 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.waitForSelector('[data-testid="blank-flow"]', { + timeout: 30000, + }); + await page.getByTestId("blank-flow").click(); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page.getByTestId("sidebar-custom-component-button").click(); - await page.getByTitle("fit view").click(); - await page.getByTitle("zoom out").click(); + await page.getByTestId("sidebar-custom-component-button").click(); + await page.getByTitle("fit view").click(); + await page.getByTitle("zoom out").click(); - await page.getByTestId("title-Custom Component").first().click(); + await page.getByTestId("title-Custom Component").first().click(); - await page.waitForTimeout(500); - await page.getByTestId("code-button-modal").click(); - await page.waitForTimeout(500); + await page.waitForTimeout(500); + await page.getByTestId("code-button-modal").click(); + await page.waitForTimeout(500); - let cleanCode = await extractAndCleanCode(page); + let cleanCode = await extractAndCleanCode(page); - // Use regex pattern to match the imports section more flexibly - cleanCode = updateComponentCode(cleanCode, { - imports: ["MessageTextInput", "Output", "LinkInput"], - inputs: [ - { - name: "MessageTextInput", - config: { - name: "input_value", - display_name: "Input Value", - info: "This is a custom component Input", - value: "Hello, World!", - tool_mode: true, + // Use regex pattern to match the imports section more flexibly + cleanCode = updateComponentCode(cleanCode, { + imports: ["MessageTextInput", "Output", "LinkInput"], + inputs: [ + { + name: "MessageTextInput", + config: { + name: "input_value", + display_name: "Input Value", + info: "This is a custom component Input", + value: "Hello, World!", + tool_mode: true, + }, }, - }, - { - name: "LinkInput", - config: { - name: "link", - display_name: "BUTTON", - value: "https://www.datastax.com", - text: "Click me", + { + name: "LinkInput", + config: { + name: "link", + display_name: "BUTTON", + value: "https://www.datastax.com", + text: "Click me", + }, }, - }, - ], - }); + ], + }); - 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.waitForTimeout(500); + 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.waitForTimeout(500); - await page.getByTestId("fit_view").click(); - await page.getByTestId("zoom_out").click(); + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); - expect(await page.getByText("BUTTON").isVisible()).toBeTruthy(); - expect(await page.getByText("Click me").isVisible()).toBeTruthy(); - expect(await page.getByTestId("link_link_link")).toBeEnabled(); - await page.getByTestId("link_link_link").click(); -}); + expect(await page.getByText("BUTTON").isVisible()).toBeTruthy(); + expect(await page.getByText("Click me").isVisible()).toBeTruthy(); + expect(await page.getByTestId("link_link_link")).toBeEnabled(); + await page.getByTestId("link_link_link").click(); + }, +); async function extractAndCleanCode(page: Page): Promise { const outerHTML = await page diff --git a/src/frontend/tests/core/unit/nestedComponent.spec.ts b/src/frontend/tests/core/unit/nestedComponent.spec.ts index 19df84a78..c0c2166b0 100644 --- a/src/frontend/tests/core/unit/nestedComponent.spec.ts +++ b/src/frontend/tests/core/unit/nestedComponent.spec.ts @@ -1,102 +1,106 @@ import { expect, test } from "@playwright/test"; -test("NestedComponent", async ({ page }) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +test( + "NestedComponent", + { 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, - }); + 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(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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("api request"); - - await page.waitForTimeout(1000); - - await page - .getByTestId("dataAPI Request") - .first() - .dragTo(page.locator('//*[@id="react-flow-id"]')); - await page.click('//*[@id="react-flow-id"]'); - - await page.getByTestId("fit_view").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); - - await page.getByTestId("dict_nesteddict_headers").first().click(); - await page - .getByText("{") - .last() - .hover() - .then(async () => { - await page.locator(".json-view--edit").first().click(); - await page.locator(".json-view--input").first().fill("keytest"); - await page.locator(".json-view--edit").first().click(); - - await page.locator(".json-view--edit").first().click(); - await page.locator(".json-view--input").first().fill("keytest1"); - await page.locator(".json-view--edit").first().click(); - - await page.locator(".json-view--edit").first().click(); - await page.locator(".json-view--input").first().fill("keytest2"); - await page.locator(".json-view--edit").first().click(); + 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("api request"); - await page - .locator(".json-view--pair") - .first() - .hover() - .then(async () => { - await page.locator(".json-view--edit").nth(2).click(); - await page.locator(".json-view--null").first().fill("proptest1"); - await page.locator(".json-view--edit").nth(2).click(); - }); + await page.waitForTimeout(1000); - await page.getByText("Save").last().click(); + await page + .getByTestId("dataAPI Request") + .first() + .dragTo(page.locator('//*[@id="react-flow-id"]')); + await page.click('//*[@id="react-flow-id"]'); - await page.getByTestId("div-generic-node").click(); + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); - await page.getByTestId("more-options-modal").click(); - await page.getByTestId("advanced-button-modal").click(); + await page.getByTestId("dict_nesteddict_headers").first().click(); + await page + .getByText("{") + .last() + .hover() + .then(async () => { + await page.locator(".json-view--edit").first().click(); + await page.locator(".json-view--input").first().fill("keytest"); + await page.locator(".json-view--edit").first().click(); - await page.getByTestId("dict_nesteddict_edit_headers").first().click(); + await page.locator(".json-view--edit").first().click(); + await page.locator(".json-view--input").first().fill("keytest1"); + await page.locator(".json-view--edit").first().click(); - expect(await page.getByText("keytest", { exact: true }).count()).toBe(1); - expect(await page.getByText("keytest1", { exact: true }).count()).toBe(1); - expect(await page.getByText("keytest2", { exact: true }).count()).toBe(1); - expect(await page.getByText("proptest1").count()).toBe(1); + await page.locator(".json-view--edit").first().click(); + await page.locator(".json-view--input").first().fill("keytest2"); + await page.locator(".json-view--edit").first().click(); + }); - await page - .locator(".json-view--pair") - .first() - .hover() - .then(async () => { - await page.locator(".json-view--edit").nth(3).click(); - await page.locator(".json-view--edit").nth(2).click(); - }); + await page + .locator(".json-view--pair") + .first() + .hover() + .then(async () => { + await page.locator(".json-view--edit").nth(2).click(); + await page.locator(".json-view--null").first().fill("proptest1"); + await page.locator(".json-view--edit").nth(2).click(); + }); - expect(await page.getByText("keytest", { exact: true }).count()).toBe(0); - expect(await page.getByText("proptest1").count()).toBe(0); -}); + await page.getByText("Save").last().click(); + + await page.getByTestId("div-generic-node").click(); + + await page.getByTestId("more-options-modal").click(); + await page.getByTestId("advanced-button-modal").click(); + + await page.getByTestId("dict_nesteddict_edit_headers").first().click(); + + expect(await page.getByText("keytest", { exact: true }).count()).toBe(1); + expect(await page.getByText("keytest1", { exact: true }).count()).toBe(1); + expect(await page.getByText("keytest2", { exact: true }).count()).toBe(1); + expect(await page.getByText("proptest1").count()).toBe(1); + + await page + .locator(".json-view--pair") + .first() + .hover() + .then(async () => { + await page.locator(".json-view--edit").nth(3).click(); + await page.locator(".json-view--edit").nth(2).click(); + }); + + expect(await page.getByText("keytest", { exact: true }).count()).toBe(0); + expect(await page.getByText("proptest1").count()).toBe(0); + }, +); diff --git a/src/frontend/tests/core/unit/promptModalComponent.spec.ts b/src/frontend/tests/core/unit/promptModalComponent.spec.ts index 7288578e5..68bd0d499 100644 --- a/src/frontend/tests/core/unit/promptModalComponent.spec.ts +++ b/src/frontend/tests/core/unit/promptModalComponent.spec.ts @@ -1,221 +1,245 @@ import { expect, test } from "@playwright/test"; -test("PromptTemplateComponent", async ({ page }) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +test( + "PromptTemplateComponent", + { 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, - }); + 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(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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("prompt"); + 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("prompt"); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page - .locator('//*[@id="promptsPrompt"]') - .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("zoom_out").click(); - await page.getByTestId("promptarea_prompt_template").click(); + await page + .locator('//*[@id="promptsPrompt"]') + .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("zoom_out").click(); + await page.getByTestId("promptarea_prompt_template").click(); - await page - .getByTestId("modal-promptarea_prompt_template") - .fill("{prompt} example {prompt1}"); + await page + .getByTestId("modal-promptarea_prompt_template") + .fill("{prompt} example {prompt1}"); - let value = await page - .getByTestId("modal-promptarea_prompt_template") - .inputValue(); + let value = await page + .getByTestId("modal-promptarea_prompt_template") + .inputValue(); - if (value != "{prompt} example {prompt1}") { - expect(false).toBeTruthy(); - } + if (value != "{prompt} example {prompt1}") { + expect(false).toBeTruthy(); + } - let valueBadgeOne = await page.locator('//*[@id="badge0"]').innerText(); - if (valueBadgeOne != "prompt") { - expect(false).toBeTruthy(); - } + let valueBadgeOne = await page.locator('//*[@id="badge0"]').innerText(); + if (valueBadgeOne != "prompt") { + expect(false).toBeTruthy(); + } - let valueBadgeTwo = await page.locator('//*[@id="badge1"]').innerText(); - if (valueBadgeTwo != "prompt1") { - expect(false).toBeTruthy(); - } + let valueBadgeTwo = await page.locator('//*[@id="badge1"]').innerText(); + if (valueBadgeTwo != "prompt1") { + expect(false).toBeTruthy(); + } - await page.getByTestId("genericModalBtnSave").click(); + await page.getByTestId("genericModalBtnSave").click(); - await page.getByTestId("textarea_str_prompt").click(); - await page.getByTestId("textarea_str_prompt").fill("prompt_value_!@#!@#"); + await page.getByTestId("textarea_str_prompt").click(); + await page.getByTestId("textarea_str_prompt").fill("prompt_value_!@#!@#"); - value = await page.getByTestId("textarea_str_prompt").inputValue(); + value = await page.getByTestId("textarea_str_prompt").inputValue(); - if (value != "prompt_value_!@#!@#") { - expect(false).toBeTruthy(); - } + if (value != "prompt_value_!@#!@#") { + expect(false).toBeTruthy(); + } - await page.getByTestId("div-generic-node").click(); + await page.getByTestId("div-generic-node").click(); - await page.getByTestId("more-options-modal").click(); - await page.getByTestId("save-button-modal").click(); + await page.getByTestId("more-options-modal").click(); + await page.getByTestId("save-button-modal").click(); - const replace = await page.getByTestId("replace-button").isVisible(); + const replace = await page.getByTestId("replace-button").isVisible(); - if (replace) { - await page.getByTestId("replace-button").click(); - } + if (replace) { + await page.getByTestId("replace-button").click(); + } - await page.getByTestId("textarea_str_prompt1").click(); - await page - .getByTestId("textarea_str_prompt1") - .fill("prompt_name_test_123123!@#!@#"); + await page.getByTestId("textarea_str_prompt1").click(); + await page + .getByTestId("textarea_str_prompt1") + .fill("prompt_name_test_123123!@#!@#"); - value = await page.getByTestId("textarea_str_prompt1").inputValue(); + value = await page.getByTestId("textarea_str_prompt1").inputValue(); - if (value != "prompt_name_test_123123!@#!@#") { - expect(false).toBeTruthy(); - } + if (value != "prompt_name_test_123123!@#!@#") { + expect(false).toBeTruthy(); + } - await page.getByTestId("more-options-modal").click(); - await page.getByTestId("advanced-button-modal").click(); + await page.getByTestId("more-options-modal").click(); + await page.getByTestId("advanced-button-modal").click(); - value = - (await page.locator('//*[@id="textarea_str_edit_prompt"]').inputValue()) ?? - ""; + value = + (await page + .locator('//*[@id="textarea_str_edit_prompt"]') + .inputValue()) ?? ""; - if (value != "prompt_value_!@#!@#") { - expect(false).toBeTruthy(); - } + if (value != "prompt_value_!@#!@#") { + expect(false).toBeTruthy(); + } - value = - (await page.locator('//*[@id="textarea_str_edit_prompt1"]').inputValue()) ?? - ""; + value = + (await page + .locator('//*[@id="textarea_str_edit_prompt1"]') + .inputValue()) ?? ""; - if (value != "prompt_name_test_123123!@#!@#") { - expect(false).toBeTruthy(); - } + if (value != "prompt_name_test_123123!@#!@#") { + expect(false).toBeTruthy(); + } - value = await page - .locator('//*[@id="promptarea_prompt_edit_template"]') - .innerText(); + value = await page + .locator('//*[@id="promptarea_prompt_edit_template"]') + .innerText(); - if (value != "{prompt} example {prompt1}") { - expect(false).toBeTruthy(); - } + if (value != "{prompt} example {prompt1}") { + expect(false).toBeTruthy(); + } - await page - .getByTestId( - "button_open_text_area_modal_textarea_str_edit_prompt1_advanced", - ) - .click(); - await page - .getByTestId("text-area-modal") - .fill("prompt_edit_test_12312312321!@#$"); + await page + .getByTestId( + "button_open_text_area_modal_textarea_str_edit_prompt1_advanced", + ) + .click(); + await page + .getByTestId("text-area-modal") + .fill("prompt_edit_test_12312312321!@#$"); - await page.getByText("Finish Editing", { exact: true }).click(); + await page.getByText("Finish Editing", { exact: true }).click(); - await page - .getByTestId( - "button_open_text_area_modal_textarea_str_edit_prompt_advanced", - ) - .nth(0) - .click(); - await page - .getByTestId("text-area-modal") - .fill("prompt_edit_test_44444444444!@#$"); + await page + .getByTestId( + "button_open_text_area_modal_textarea_str_edit_prompt_advanced", + ) + .nth(0) + .click(); + await page + .getByTestId("text-area-modal") + .fill("prompt_edit_test_44444444444!@#$"); - await page.getByText("Finish Editing", { exact: true }).click(); + await page.getByText("Finish Editing", { exact: true }).click(); - await page.locator('//*[@id="showtemplate"]').click(); - expect(await page.locator('//*[@id="showtemplate"]').isChecked()).toBeFalsy(); + await page.locator('//*[@id="showtemplate"]').click(); + expect( + await page.locator('//*[@id="showtemplate"]').isChecked(), + ).toBeFalsy(); - await page.locator('//*[@id="showprompt"]').click(); - expect(await page.locator('//*[@id="showprompt"]').isChecked()).toBeFalsy(); + await page.locator('//*[@id="showprompt"]').click(); + expect(await page.locator('//*[@id="showprompt"]').isChecked()).toBeFalsy(); - await page.locator('//*[@id="showprompt1"]').click(); - expect(await page.locator('//*[@id="showprompt1"]').isChecked()).toBeFalsy(); + await page.locator('//*[@id="showprompt1"]').click(); + expect( + await page.locator('//*[@id="showprompt1"]').isChecked(), + ).toBeFalsy(); - await page.locator('//*[@id="showtemplate"]').click(); - expect( - await page.locator('//*[@id="showtemplate"]').isChecked(), - ).toBeTruthy(); + await page.locator('//*[@id="showtemplate"]').click(); + expect( + await page.locator('//*[@id="showtemplate"]').isChecked(), + ).toBeTruthy(); - await page.locator('//*[@id="showprompt"]').click(); - expect(await page.locator('//*[@id="showprompt"]').isChecked()).toBeTruthy(); + await page.locator('//*[@id="showprompt"]').click(); + expect( + await page.locator('//*[@id="showprompt"]').isChecked(), + ).toBeTruthy(); - await page.locator('//*[@id="showprompt1"]').click(); - expect(await page.locator('//*[@id="showprompt1"]').isChecked()).toBeTruthy(); + await page.locator('//*[@id="showprompt1"]').click(); + expect( + await page.locator('//*[@id="showprompt1"]').isChecked(), + ).toBeTruthy(); - await page.locator('//*[@id="showtemplate"]').click(); - expect(await page.locator('//*[@id="showtemplate"]').isChecked()).toBeFalsy(); + await page.locator('//*[@id="showtemplate"]').click(); + expect( + await page.locator('//*[@id="showtemplate"]').isChecked(), + ).toBeFalsy(); - await page.locator('//*[@id="showprompt"]').click(); - expect(await page.locator('//*[@id="showprompt"]').isChecked()).toBeFalsy(); + await page.locator('//*[@id="showprompt"]').click(); + expect(await page.locator('//*[@id="showprompt"]').isChecked()).toBeFalsy(); - await page.locator('//*[@id="showprompt1"]').click(); - expect(await page.locator('//*[@id="showprompt1"]').isChecked()).toBeFalsy(); + await page.locator('//*[@id="showprompt1"]').click(); + expect( + await page.locator('//*[@id="showprompt1"]').isChecked(), + ).toBeFalsy(); - await page.locator('//*[@id="showtemplate"]').click(); - expect( - await page.locator('//*[@id="showtemplate"]').isChecked(), - ).toBeTruthy(); + await page.locator('//*[@id="showtemplate"]').click(); + expect( + await page.locator('//*[@id="showtemplate"]').isChecked(), + ).toBeTruthy(); - await page.locator('//*[@id="showprompt"]').click(); - expect(await page.locator('//*[@id="showprompt"]').isChecked()).toBeTruthy(); + await page.locator('//*[@id="showprompt"]').click(); + expect( + await page.locator('//*[@id="showprompt"]').isChecked(), + ).toBeTruthy(); - await page.getByText("Close").last().click(); + await page.getByText("Close").last().click(); - await page.getByTestId("more-options-modal").click(); - await page.getByTestId("advanced-button-modal").click(); + await page.getByTestId("more-options-modal").click(); + await page.getByTestId("advanced-button-modal").click(); - await page.locator('//*[@id="showprompt1"]').click(); - expect(await page.locator('//*[@id="showprompt1"]').isChecked()).toBeTruthy(); + await page.locator('//*[@id="showprompt1"]').click(); + expect( + await page.locator('//*[@id="showprompt1"]').isChecked(), + ).toBeTruthy(); - value = - (await page.locator('//*[@id="textarea_str_edit_prompt"]').inputValue()) ?? - ""; + value = + (await page + .locator('//*[@id="textarea_str_edit_prompt"]') + .inputValue()) ?? ""; - if (value != "prompt_edit_test_44444444444!@#$") { - expect(false).toBeTruthy(); - } + if (value != "prompt_edit_test_44444444444!@#$") { + expect(false).toBeTruthy(); + } - value = - (await page.locator('//*[@id="textarea_str_edit_prompt1"]').inputValue()) ?? - ""; + value = + (await page + .locator('//*[@id="textarea_str_edit_prompt1"]') + .inputValue()) ?? ""; - if (value != "prompt_edit_test_12312312321!@#$") { - expect(false).toBeTruthy(); - } + if (value != "prompt_edit_test_12312312321!@#$") { + expect(false).toBeTruthy(); + } - value = await page - .locator('//*[@id="promptarea_prompt_edit_template"]') - .innerText(); + value = await page + .locator('//*[@id="promptarea_prompt_edit_template"]') + .innerText(); - if (value != "{prompt} example {prompt1}") { - expect(false).toBeTruthy(); - } -}); + if (value != "{prompt} example {prompt1}") { + expect(false).toBeTruthy(); + } + }, +); diff --git a/src/frontend/tests/core/unit/sliderComponent.spec.ts b/src/frontend/tests/core/unit/sliderComponent.spec.ts index d0f4c8b43..0ac3e4982 100644 --- a/src/frontend/tests/core/unit/sliderComponent.spec.ts +++ b/src/frontend/tests/core/unit/sliderComponent.spec.ts @@ -2,106 +2,112 @@ 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", async ({ page }) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +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, - }); + 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(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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(); - } + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); + } - const getUA = await page.evaluate(() => navigator.userAgent); - const userAgentInfo = uaParser(getUA); + 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="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.waitForTimeout(1000); + await page.waitForTimeout(1000); - 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("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(); + await page.getByTestId("title-Ollama").click(); + await page.getByTestId("code-button-modal").click(); - let cleanCode = await extractAndCleanCode(page); + 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", - ); + // 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,", - ); + 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.waitForTimeout(500); + 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.waitForTimeout(500); - await page.getByTestId("fit_view").click(); + await page.getByTestId("fit_view").click(); - await mutualValidation(page); + await mutualValidation(page); - await moveSlider(page, "right", false); + await moveSlider(page, "right", false); - await page.waitForTimeout(500); + await page.waitForTimeout(500); - await page.getByTestId("zoom_out").click(); + 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 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 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 expect( + page.getByTestId("default_slider_display_value_advanced"), + ).toHaveText("14.00"); - await page.getByText("Close").last().click(); + await page.getByText("Close").last().click(); - await expect(page.getByTestId("default_slider_display_value")).toHaveText( - "14.00", - ); -}); + await expect(page.getByTestId("default_slider_display_value")).toHaveText( + "14.00", + ); + }, +); async function extractAndCleanCode(page: Page): Promise { const outerHTML = await page diff --git a/src/frontend/tests/core/unit/tableInputComponent.spec.ts b/src/frontend/tests/core/unit/tableInputComponent.spec.ts index 89d472960..098ccdd9c 100644 --- a/src/frontend/tests/core/unit/tableInputComponent.spec.ts +++ b/src/frontend/tests/core/unit/tableInputComponent.spec.ts @@ -2,56 +2,59 @@ import { expect, test } from "@playwright/test"; import uaParser from "ua-parser-js"; // TODO: This component doesn't have table input needs updating -test("user must be able to interact with table input component", async ({ - page, -}) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +test( + "user must be able to interact with table input component", + { + 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, - }); + 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(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } catch (error) { - modalCount = 0; - } - const randomText = Math.random().toString(36).substring(7); - const secondRandomText = Math.random().toString(36).substring(7); - const thirdRandomText = Math.random().toString(36).substring(7); + const randomText = Math.random().toString(36).substring(7); + const secondRandomText = Math.random().toString(36).substring(7); + const thirdRandomText = Math.random().toString(36).substring(7); - const getUA = await page.evaluate(() => navigator.userAgent); - const userAgentInfo = uaParser(getUA); + const getUA = await page.evaluate(() => navigator.userAgent); + const userAgentInfo = uaParser(getUA); - 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(); + 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.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page.getByTestId("sidebar-custom-component-button").click(); + await page.getByTestId("sidebar-custom-component-button").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("div-generic-node").click(); - await page.getByTestId("code-button-modal").click(); + await page.getByTestId("div-generic-node").click(); + await page.getByTestId("code-button-modal").click(); - const customCodeWithError = ` + const customCodeWithError = ` # from langflow.field_typing import Data from langflow.custom import Component from langflow.io import TableInput, Output @@ -96,94 +99,95 @@ class CustomComponent(Component): return data `; - await page.locator("textarea").press(`ControlOrMeta+a`); - await page.locator("textarea").fill(customCodeWithError); + await page.locator("textarea").press(`ControlOrMeta+a`); + await page.locator("textarea").fill(customCodeWithError); - await page.getByText("Check & Save").last().click(); + await page.getByText("Check & Save").last().click(); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page.getByText("Open Table").click(); + await page.getByText("Open Table").click(); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - const visibleTextsGroup1 = ["Alpha", "Bravo", "Charlie", "Delta", "Echo"]; - const visibleTextsGroup2 = ["X1", "Y2", "Z3", "W4", "V5"]; - const visibleTextsGroup3 = ["P1", "Q2", "R3", "S4", "T5"]; - const visibleTextsGroup4 = ["F1", "G2", "H3", "I4", "J5"]; + const visibleTextsGroup1 = ["Alpha", "Bravo", "Charlie", "Delta", "Echo"]; + const visibleTextsGroup2 = ["X1", "Y2", "Z3", "W4", "V5"]; + const visibleTextsGroup3 = ["P1", "Q2", "R3", "S4", "T5"]; + const visibleTextsGroup4 = ["F1", "G2", "H3", "I4", "J5"]; - const allVisibleTexts = [ - ...visibleTextsGroup1, - ...visibleTextsGroup2, - ...visibleTextsGroup3, - ...visibleTextsGroup4, - ]; + const allVisibleTexts = [ + ...visibleTextsGroup1, + ...visibleTextsGroup2, + ...visibleTextsGroup3, + ...visibleTextsGroup4, + ]; - for (const text of allVisibleTexts) { - await expect(page.getByText(text).last()).toBeVisible(); - } + for (const text of allVisibleTexts) { + await expect(page.getByText(text).last()).toBeVisible(); + } - await page.locator(".ag-cell-value").first().click(); + await page.locator(".ag-cell-value").first().click(); - await page.getByPlaceholder("Empty").fill(randomText); - await page.getByText("Save").last().click(); - await page.waitForTimeout(500); + await page.getByPlaceholder("Empty").fill(randomText); + await page.getByText("Save").last().click(); + await page.waitForTimeout(500); - await page.locator(".ag-cell-value").nth(12).click(); + await page.locator(".ag-cell-value").nth(12).click(); - await page.getByPlaceholder("Empty").fill(secondRandomText); - await page.getByText("Save").last().click(); - await page.waitForTimeout(500); + await page.getByPlaceholder("Empty").fill(secondRandomText); + await page.getByText("Save").last().click(); + await page.waitForTimeout(500); - await page.locator(".ag-cell-value").nth(24).click(); - await page.waitForTimeout(500); + await page.locator(".ag-cell-value").nth(24).click(); + await page.waitForTimeout(500); - await page.getByPlaceholder("Empty").fill(thirdRandomText); - await page.getByText("Save").last().click(); + await page.getByPlaceholder("Empty").fill(thirdRandomText); + await page.getByText("Save").last().click(); - await page.waitForTimeout(500); + await page.waitForTimeout(500); - expect(page.getByText(randomText)).toBeVisible(); - expect(page.getByText(secondRandomText)).toBeVisible(); - expect(page.getByText(thirdRandomText)).toBeVisible(); + expect(page.getByText(randomText)).toBeVisible(); + expect(page.getByText(secondRandomText)).toBeVisible(); + expect(page.getByText(thirdRandomText)).toBeVisible(); - await page.locator('input[type="checkbox"]').last().click(); + await page.locator('input[type="checkbox"]').last().click(); - await page.getByTestId("icon-Copy").last().click(); + await page.getByTestId("icon-Copy").last().click(); - await page.waitForTimeout(500); + await page.waitForTimeout(500); - let numberOfCopiedRows = await page.getByText(thirdRandomText).count(); - expect(numberOfCopiedRows).toBe(2); + let numberOfCopiedRows = await page.getByText(thirdRandomText).count(); + expect(numberOfCopiedRows).toBe(2); - await page.locator('input[type="checkbox"]').last().click(); - await page.getByTestId("icon-Trash2").last().click(); + await page.locator('input[type="checkbox"]').last().click(); + await page.getByTestId("icon-Trash2").last().click(); - await page.waitForTimeout(500); + await page.waitForTimeout(500); - await page.locator('input[type="checkbox"]').last().click(); - await page.getByTestId("icon-Trash2").click(); + await page.locator('input[type="checkbox"]').last().click(); + await page.getByTestId("icon-Trash2").click(); - numberOfCopiedRows = await page.getByText(thirdRandomText).count(); - expect(numberOfCopiedRows).toBe(0); + numberOfCopiedRows = await page.getByText(thirdRandomText).count(); + expect(numberOfCopiedRows).toBe(0); - await page.getByText("Close").last().click(); + await page.getByText("Close").last().click(); - await page.waitForTimeout(500); + await page.waitForTimeout(500); - await page.getByText("Open Table").click(); + await page.getByText("Open Table").click(); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - const visibleTexts = ["Alpha", "Bravo", "Charlie", "Delta", "Echo"]; - const notVisibleTexts = ["X1", "thirdRandomText"]; + const visibleTexts = ["Alpha", "Bravo", "Charlie", "Delta", "Echo"]; + const notVisibleTexts = ["X1", "thirdRandomText"]; - await Promise.all( - visibleTexts.map((text) => expect(page.getByText(text)).toBeVisible()), - ); - await Promise.all( - notVisibleTexts.map((text) => - expect(page.getByText(text)).not.toBeVisible(), - ), - ); -}); + await Promise.all( + visibleTexts.map((text) => expect(page.getByText(text)).toBeVisible()), + ); + await Promise.all( + notVisibleTexts.map((text) => + expect(page.getByText(text)).not.toBeVisible(), + ), + ); + }, +); diff --git a/src/frontend/tests/core/unit/textAreaModalComponent.spec.ts b/src/frontend/tests/core/unit/textAreaModalComponent.spec.ts index c2ae137c8..13982b238 100644 --- a/src/frontend/tests/core/unit/textAreaModalComponent.spec.ts +++ b/src/frontend/tests/core/unit/textAreaModalComponent.spec.ts @@ -1,88 +1,92 @@ import { expect, test } from "@playwright/test"; -test("TextAreaModalComponent", async ({ page }) => { - await page.goto("/"); - await page.waitForTimeout(1000); +test( + "TextAreaModalComponent", + { tag: ["@release", "@workspace"] }, + async ({ page }) => { + await page.goto("/"); + await page.waitForTimeout(1000); - let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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(); + 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("prompt"); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("prompt"); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page - .locator('//*[@id="promptsPrompt"]') - .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 + .locator('//*[@id="promptsPrompt"]') + .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(); - await page.getByTestId("promptarea_prompt_template").click(); + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("promptarea_prompt_template").click(); - await page.getByTestId("modal-promptarea_prompt_template").fill("{text}"); + await page.getByTestId("modal-promptarea_prompt_template").fill("{text}"); - let valueBadgeOne = await page.locator('//*[@id="badge0"]').innerText(); - if (valueBadgeOne != "text") { - expect(false).toBeTruthy(); - } + let valueBadgeOne = await page.locator('//*[@id="badge0"]').innerText(); + if (valueBadgeOne != "text") { + expect(false).toBeTruthy(); + } - await page.getByTestId("genericModalBtnSave").click(); + await page.getByTestId("genericModalBtnSave").click(); - await page - .getByTestId("textarea_str_text") - .fill( - "test test test test test test test test test test test !@#%*)( 123456789101010101010101111111111 !!!!!!!!!!", - ); + await page + .getByTestId("textarea_str_text") + .fill( + "test test test test test test test test test test test !@#%*)( 123456789101010101010101111111111 !!!!!!!!!!", + ); - await page - .getByTestId("button_open_text_area_modal_textarea_str_text") - .click(); + await page + .getByTestId("button_open_text_area_modal_textarea_str_text") + .click(); - await page.waitForTimeout(500); + await page.waitForTimeout(500); - const value = await page.getByTestId("text-area-modal").inputValue(); + const value = await page.getByTestId("text-area-modal").inputValue(); - if ( - value != - "test test test test test test test test test test test !@#%*)( 123456789101010101010101111111111 !!!!!!!!!!" - ) { - expect(false).toBeTruthy(); - } + if ( + value != + "test test test test test test test test test test test !@#%*)( 123456789101010101010101111111111 !!!!!!!!!!" + ) { + expect(false).toBeTruthy(); + } - await page.getByTestId("text-area-modal").fill("test123123"); + await page.getByTestId("text-area-modal").fill("test123123"); - await page.getByTestId("genericModalBtnSave").click(); + await page.getByTestId("genericModalBtnSave").click(); - const valueTextArea = await page - .getByTestId("textarea_str_text") - .inputValue(); + const valueTextArea = await page + .getByTestId("textarea_str_text") + .inputValue(); - if (valueTextArea != "test123123") { - expect(false).toBeTruthy(); - } -}); + if (valueTextArea != "test123123") { + expect(false).toBeTruthy(); + } + }, +); diff --git a/src/frontend/tests/core/unit/toggleComponent.spec.ts b/src/frontend/tests/core/unit/toggleComponent.spec.ts index b6fb949fa..8fd41f65e 100644 --- a/src/frontend/tests/core/unit/toggleComponent.spec.ts +++ b/src/frontend/tests/core/unit/toggleComponent.spec.ts @@ -1,172 +1,56 @@ import { expect, test } from "@playwright/test"; -test("ToggleComponent", async ({ page }) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +test( + "ToggleComponent", + { 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, - }); + 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(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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(); + 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("directory"); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("directory"); - await page.waitForTimeout(1000); - await page - .getByTestId("dataDirectory") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - await page.mouse.up(); - await page.mouse.down(); + await page.waitForTimeout(1000); + await page + .getByTestId("dataDirectory") + .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.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(); - - await page.getByTestId("div-generic-node").click(); - - await page.getByTestId("more-options-modal").click(); - await page.getByTestId("advanced-button-modal").click(); - - await page.locator('//*[@id="showload_hidden"]').click(); - expect( - await page.locator('//*[@id="showload_hidden"]').isChecked(), - ).toBeTruthy(); - - await page.getByText("Close").last().click(); - - await page.waitForSelector('[data-testid="fit_view"]', { - timeout: 100000, - }); - - await page.getByTestId("fit_view").click(); - - await page.getByTestId("toggle_bool_load_hidden").click(); - expect( - await page.getByTestId("toggle_bool_load_hidden").isChecked(), - ).toBeTruthy(); - - await page.getByTestId("toggle_bool_load_hidden").click(); - expect( - await page.getByTestId("toggle_bool_load_hidden").isChecked(), - ).toBeFalsy(); - - await page.getByTestId("toggle_bool_load_hidden").click(); - expect( - await page.getByTestId("toggle_bool_load_hidden").isChecked(), - ).toBeTruthy(); - - await page.getByTestId("toggle_bool_load_hidden").click(); - expect( - await page.getByTestId("toggle_bool_load_hidden").isChecked(), - ).toBeFalsy(); - - await page.getByTestId("toggle_bool_load_hidden").click(); - expect( - await page.getByTestId("toggle_bool_load_hidden").isChecked(), - ).toBeTruthy(); - - await page.getByTestId("div-generic-node").click(); - - 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(); - - await page.getByTestId("more-options-modal").click(); - await page.getByTestId("advanced-button-modal").click(); - - expect( - await page.getByTestId("toggle_bool_load_hidden").isChecked(), - ).toBeTruthy(); - - await page.locator('//*[@id="showload_hidden"]').click(); - expect( - await page.locator('//*[@id="showload_hidden"]').isChecked(), - ).toBeFalsy(); - - await page.locator('//*[@id="showmax_concurrency"]').click(); - expect( - await page.locator('//*[@id="showmax_concurrency"]').isChecked(), - ).toBeTruthy(); - - await page.locator('//*[@id="showpath"]').click(); - expect(await page.locator('//*[@id="showpath"]').isChecked()).toBeFalsy(); - - await page.locator('//*[@id="showrecursive"]').click(); - expect( - await page.locator('//*[@id="showrecursive"]').isChecked(), - ).toBeTruthy(); - - await page.locator('//*[@id="showsilent_errors"]').click(); - expect( - await page.locator('//*[@id="showsilent_errors"]').isChecked(), - ).toBeTruthy(); - - await page.locator('//*[@id="showuse_multithreading"]').click(); - expect( - await page.locator('//*[@id="showuse_multithreading"]').isChecked(), - ).toBeTruthy(); - - await page.locator('//*[@id="showmax_concurrency"]').click(); - expect( - await page.locator('//*[@id="showmax_concurrency"]').isChecked(), - ).toBeFalsy(); - - await page.locator('//*[@id="showpath"]').click(); - expect(await page.locator('//*[@id="showpath"]').isChecked()).toBeTruthy(); - - await page.locator('//*[@id="showrecursive"]').click(); - expect( - await page.locator('//*[@id="showrecursive"]').isChecked(), - ).toBeFalsy(); - - await page.locator('//*[@id="showsilent_errors"]').click(); - expect( - await page.locator('//*[@id="showsilent_errors"]').isChecked(), - ).toBeFalsy(); - - await page.locator('//*[@id="showuse_multithreading"]').click(); - expect( - await page.locator('//*[@id="showuse_multithreading"]').isChecked(), - ).toBeFalsy(); - - await page.getByText("Close").last().click(); - - const plusButtonLocator = page.getByTestId("toggle_bool_load_hidden"); - const elementCount = await plusButtonLocator?.count(); - if (elementCount === 0) { - expect(true).toBeTruthy(); + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); await page.getByTestId("div-generic-node").click(); @@ -178,35 +62,155 @@ test("ToggleComponent", async ({ page }) => { await page.locator('//*[@id="showload_hidden"]').isChecked(), ).toBeTruthy(); + await page.getByText("Close").last().click(); + + await page.waitForSelector('[data-testid="fit_view"]', { + timeout: 100000, + }); + + await page.getByTestId("fit_view").click(); + + await page.getByTestId("toggle_bool_load_hidden").click(); expect( await page.getByTestId("toggle_bool_load_hidden").isChecked(), ).toBeTruthy(); + await page.getByTestId("toggle_bool_load_hidden").click(); + expect( + await page.getByTestId("toggle_bool_load_hidden").isChecked(), + ).toBeFalsy(); + + await page.getByTestId("toggle_bool_load_hidden").click(); + expect( + await page.getByTestId("toggle_bool_load_hidden").isChecked(), + ).toBeTruthy(); + + await page.getByTestId("toggle_bool_load_hidden").click(); + expect( + await page.getByTestId("toggle_bool_load_hidden").isChecked(), + ).toBeFalsy(); + + await page.getByTestId("toggle_bool_load_hidden").click(); + expect( + await page.getByTestId("toggle_bool_load_hidden").isChecked(), + ).toBeTruthy(); + + await page.getByTestId("div-generic-node").click(); + + 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(); + + await page.getByTestId("more-options-modal").click(); + await page.getByTestId("advanced-button-modal").click(); + + expect( + await page.getByTestId("toggle_bool_load_hidden").isChecked(), + ).toBeTruthy(); + + await page.locator('//*[@id="showload_hidden"]').click(); + expect( + await page.locator('//*[@id="showload_hidden"]').isChecked(), + ).toBeFalsy(); + + await page.locator('//*[@id="showmax_concurrency"]').click(); + expect( + await page.locator('//*[@id="showmax_concurrency"]').isChecked(), + ).toBeTruthy(); + + await page.locator('//*[@id="showpath"]').click(); + expect(await page.locator('//*[@id="showpath"]').isChecked()).toBeFalsy(); + + await page.locator('//*[@id="showrecursive"]').click(); + expect( + await page.locator('//*[@id="showrecursive"]').isChecked(), + ).toBeTruthy(); + + await page.locator('//*[@id="showsilent_errors"]').click(); + expect( + await page.locator('//*[@id="showsilent_errors"]').isChecked(), + ).toBeTruthy(); + + await page.locator('//*[@id="showuse_multithreading"]').click(); + expect( + await page.locator('//*[@id="showuse_multithreading"]').isChecked(), + ).toBeTruthy(); + + await page.locator('//*[@id="showmax_concurrency"]').click(); + expect( + await page.locator('//*[@id="showmax_concurrency"]').isChecked(), + ).toBeFalsy(); + + await page.locator('//*[@id="showpath"]').click(); + expect(await page.locator('//*[@id="showpath"]').isChecked()).toBeTruthy(); + + await page.locator('//*[@id="showrecursive"]').click(); + expect( + await page.locator('//*[@id="showrecursive"]').isChecked(), + ).toBeFalsy(); + + await page.locator('//*[@id="showsilent_errors"]').click(); + expect( + await page.locator('//*[@id="showsilent_errors"]').isChecked(), + ).toBeFalsy(); + + await page.locator('//*[@id="showuse_multithreading"]').click(); + expect( + await page.locator('//*[@id="showuse_multithreading"]').isChecked(), + ).toBeFalsy(); + await page.getByText("Close").last().click(); - await page.getByTestId("toggle_bool_load_hidden").click(); - expect( - await page.getByTestId("toggle_bool_load_hidden").isChecked(), - ).toBeFalsy(); + const plusButtonLocator = page.getByTestId("toggle_bool_load_hidden"); + const elementCount = await plusButtonLocator?.count(); + if (elementCount === 0) { + expect(true).toBeTruthy(); - await page.getByTestId("toggle_bool_load_hidden").click(); - expect( - await page.getByTestId("toggle_bool_load_hidden").isChecked(), - ).toBeTruthy(); + await page.getByTestId("div-generic-node").click(); - await page.getByTestId("toggle_bool_load_hidden").click(); - expect( - await page.getByTestId("toggle_bool_load_hidden").isChecked(), - ).toBeFalsy(); + await page.getByTestId("more-options-modal").click(); + await page.getByTestId("advanced-button-modal").click(); - await page.getByTestId("toggle_bool_load_hidden").click(); - expect( - await page.getByTestId("toggle_bool_load_hidden").isChecked(), - ).toBeTruthy(); + await page.locator('//*[@id="showload_hidden"]').click(); + expect( + await page.locator('//*[@id="showload_hidden"]').isChecked(), + ).toBeTruthy(); - await page.getByTestId("toggle_bool_load_hidden").click(); - expect( - await page.getByTestId("toggle_bool_load_hidden").isChecked(), - ).toBeFalsy(); - } -}); + expect( + await page.getByTestId("toggle_bool_load_hidden").isChecked(), + ).toBeTruthy(); + + await page.getByText("Close").last().click(); + + await page.getByTestId("toggle_bool_load_hidden").click(); + expect( + await page.getByTestId("toggle_bool_load_hidden").isChecked(), + ).toBeFalsy(); + + await page.getByTestId("toggle_bool_load_hidden").click(); + expect( + await page.getByTestId("toggle_bool_load_hidden").isChecked(), + ).toBeTruthy(); + + await page.getByTestId("toggle_bool_load_hidden").click(); + expect( + await page.getByTestId("toggle_bool_load_hidden").isChecked(), + ).toBeFalsy(); + + await page.getByTestId("toggle_bool_load_hidden").click(); + expect( + await page.getByTestId("toggle_bool_load_hidden").isChecked(), + ).toBeTruthy(); + + await page.getByTestId("toggle_bool_load_hidden").click(); + expect( + await page.getByTestId("toggle_bool_load_hidden").isChecked(), + ).toBeFalsy(); + } + }, +); diff --git a/src/frontend/tests/extended/features/actionsMainPage-shard-0.spec.ts b/src/frontend/tests/extended/features/actionsMainPage-shard-0.spec.ts index b2d178bba..4d782e331 100644 --- a/src/frontend/tests/extended/features/actionsMainPage-shard-0.spec.ts +++ b/src/frontend/tests/extended/features/actionsMainPage-shard-0.spec.ts @@ -1,185 +1,191 @@ import { test } from "@playwright/test"; -test("user should be able to download a flow or a component", async ({ - page, -}) => { - await page.goto("/"); +test( + "user should be able to download a flow or a component", + { tag: ["@release", "@workspace"] }, + async ({ page }) => { + await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - await page.waitForSelector('[id="new-project-btn"]', { - 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(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Basic Prompting" }).click(); - - 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(); - - await page.getByText("Chat Input", { exact: true }).click(); - await page.getByTestId("more-options-modal").click(); - - await page.getByTestId("icon-SaveAll").first().click(); - await page.waitForTimeout(1000); - - if (await page.getByTestId("replace-button").isVisible()) { - await page.getByTestId("replace-button").click(); - } - - await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { - timeout: 100000, - }); - - const exitButton = await page.getByText("Exit", { exact: true }).count(); - - if (exitButton > 0) { - await page.getByText("Exit", { exact: true }).click(); - } - - await page.getByTestId("icon-ChevronLeft").last().click(); - await page.getByTestId("home-dropdown-menu").nth(0).click(); - await page.getByTestId("btn-download-json").last().click(); - await page.waitForTimeout(1000); - await page.getByText(/.*exported successfully/).isVisible(); - - await page.getByText("Flows", { exact: true }).click(); - await page.getByTestId("home-dropdown-menu").nth(0).click(); - await page.getByTestId("btn-download-json").last().click(); - await page.waitForTimeout(1000); - await page - .getByText(/.*exported successfully/) - .last() - .isVisible(); - - await page.getByText("Components", { exact: true }).click(); - await page.getByTestId("home-dropdown-menu").nth(0).click(); - await page.getByTestId("btn-download-json").last().click(); - await page.waitForTimeout(1000); - await page - .getByText(/.*exported successfully/) - .last() - .isVisible(); -}); - -test("user should be able to upload a flow or a component", 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(); + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); } - } catch (error) { - modalCount = 0; - } - await page.getByTestId("upload-folder-button").last().click(); -}); + await page.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Basic Prompting" }).click(); -test("user should be able to duplicate a flow or a component", async ({ - page, -}) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); + await page.waitForSelector('[data-testid="fit_view"]', { + timeout: 100000, + }); - await page.waitForSelector('[id="new-project-btn"]', { - timeout: 30000, - }); + 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 modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); + await page.getByText("Chat Input", { exact: true }).click(); + await page.getByTestId("more-options-modal").click(); + + await page.getByTestId("icon-SaveAll").first().click(); + await page.waitForTimeout(1000); + + if (await page.getByTestId("replace-button").isVisible()) { + await page.getByTestId("replace-button").click(); } - } 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="icon-ChevronLeft"]', { + timeout: 100000, + }); - await page.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Basic Prompting" }).click(); - await page.waitForSelector('[data-testid="fit_view"]', { - timeout: 100000, - }); + const exitButton = await page.getByText("Exit", { exact: true }).count(); - await page.getByTestId("fit_view").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); + if (exitButton > 0) { + await page.getByText("Exit", { exact: true }).click(); + } - await page.getByText("Chat Input", { exact: true }).click(); - await page.getByTestId("more-options-modal").click(); + await page.getByTestId("icon-ChevronLeft").last().click(); + await page.getByTestId("home-dropdown-menu").nth(0).click(); + await page.getByTestId("btn-download-json").last().click(); + await page.waitForTimeout(1000); + await page.getByText(/.*exported successfully/).isVisible(); - await page.getByTestId("icon-SaveAll").first().click(); - await page.waitForTimeout(1000); + await page.getByText("Flows", { exact: true }).click(); + await page.getByTestId("home-dropdown-menu").nth(0).click(); + await page.getByTestId("btn-download-json").last().click(); + await page.waitForTimeout(1000); + await page + .getByText(/.*exported successfully/) + .last() + .isVisible(); - if (await page.getByTestId("replace-button").isVisible()) { - await page.getByTestId("replace-button").click(); - } + await page.getByText("Components", { exact: true }).click(); + await page.getByTestId("home-dropdown-menu").nth(0).click(); + await page.getByTestId("btn-download-json").last().click(); + await page.waitForTimeout(1000); + await page + .getByText(/.*exported successfully/) + .last() + .isVisible(); + }, +); - await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { - timeout: 100000, - }); +test( + "user should be able to upload a flow or a component", + { tag: ["@release", "@api", "@workspace"] }, + async ({ page }) => { + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - const exitButton = await page.getByText("Exit", { exact: true }).count(); + await page.waitForSelector('[id="new-project-btn"]', { + timeout: 30000, + }); - if (exitButton > 0) { - await page.getByText("Exit", { exact: true }).click(); - } + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; + } - const replaceButton = await page.getByTestId("replace-button").isVisible(); + await page.getByTestId("upload-folder-button").last().click(); + }, +); - if (replaceButton) { - await page.getByTestId("replace-button").click(); - } +test( + "user should be able to duplicate a flow or a component", + { tag: ["@release", "@workspace"] }, + async ({ page }) => { + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - await page.getByTestId("icon-ChevronLeft").last().click(); - await page.getByTestId("home-dropdown-menu").nth(1).click(); - await page.getByTestId("btn-duplicate-flow").last().click(); + await page.waitForSelector('[id="new-project-btn"]', { + timeout: 30000, + }); - await page.waitForTimeout(1000); - await page.getByText("Items duplicated successfully").isVisible(); -}); + 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.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Basic Prompting" }).click(); + 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(); + + await page.getByText("Chat Input", { exact: true }).click(); + await page.getByTestId("more-options-modal").click(); + + await page.getByTestId("icon-SaveAll").first().click(); + await page.waitForTimeout(1000); + + if (await page.getByTestId("replace-button").isVisible()) { + await page.getByTestId("replace-button").click(); + } + + await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { + timeout: 100000, + }); + + const exitButton = await page.getByText("Exit", { exact: true }).count(); + + if (exitButton > 0) { + await page.getByText("Exit", { exact: true }).click(); + } + + const replaceButton = await page.getByTestId("replace-button").isVisible(); + + if (replaceButton) { + await page.getByTestId("replace-button").click(); + } + + await page.getByTestId("icon-ChevronLeft").last().click(); + await page.getByTestId("home-dropdown-menu").nth(1).click(); + await page.getByTestId("btn-duplicate-flow").last().click(); + + await page.waitForTimeout(1000); + await page.getByText("Items duplicated successfully").isVisible(); + }, +); diff --git a/src/frontend/tests/extended/features/auto-save-off.spec.ts b/src/frontend/tests/extended/features/auto-save-off.spec.ts index f1286af56..6c428a19f 100644 --- a/src/frontend/tests/extended/features/auto-save-off.spec.ts +++ b/src/frontend/tests/extended/features/auto-save-off.spec.ts @@ -1,188 +1,190 @@ import { expect, test } from "@playwright/test"; -test("user should be able to manually save a flow when the auto_save is off", async ({ - page, -}) => { - await page.route("**/api/v1/config", (route) => { - route.fulfill({ - status: 200, - contentType: "application/json", - body: JSON.stringify({ - auto_saving: false, - frontend_timeout: 0, - }), - headers: { - "content-type": "application/json", - ...route.request().headers(), - }, +test( + "user should be able to manually save a flow when the auto_save is off", + { tag: ["@release", "@api", "@database"] }, + async ({ page }) => { + await page.route("**/api/v1/config", (route) => { + route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify({ + auto_saving: false, + frontend_timeout: 0, + }), + headers: { + "content-type": "application/json", + ...route.request().headers(), + }, + }); }); - }); - await page.goto("/"); - await page.locator("span").filter({ hasText: "My Collection" }).isVisible(); + await page.goto("/"); + await page.locator("span").filter({ hasText: "My Collection" }).isVisible(); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 5000, - }); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 5000, + }); - await page.waitForSelector('[id="new-project-btn"]', { - timeout: 5000, - }); + await page.waitForSelector('[id="new-project-btn"]', { + timeout: 5000, + }); - let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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(); - } + 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: 5000, - }); - - await page.getByTestId("blank-flow").click(); - - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("NVIDIA"); - - await page.waitForTimeout(1000); - - await page - .getByTestId("modelsNVIDIA") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - await page.mouse.up(); - await page.mouse.down(); - - await page.waitForSelector('[data-testid="fit_view"]', { - timeout: 5000, - }); - - await page.getByTestId("fit_view").click(); - - expect(await page.getByText("Saved").isVisible()).toBeTruthy(); - - await page - .getByText("Saved") - .first() - .hover() - .then(async () => { - await page.waitForTimeout(1000); - await page.getByText("Auto-saving is disabled").nth(0).isVisible(); - await page - .getByText("Enable auto-saving to avoid losing progress.") - .nth(0) - .isVisible(); + await page.waitForSelector('[data-testid="blank-flow"]', { + timeout: 5000, }); - expect(await page.getByTestId("save-flow-button").isEnabled()).toBeTruthy(); + await page.getByTestId("blank-flow").click(); - await page.waitForSelector("text=loading", { - state: "hidden", - timeout: 5000, - }); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("NVIDIA"); - await page.getByTestId("icon-ChevronLeft").last().click(); + await page.waitForTimeout(1000); - expect( await page - .getByText("Unsaved changes will be permanently lost.") - .isVisible(), - ).toBeTruthy(); + .getByTestId("modelsNVIDIA") + .dragTo(page.locator('//*[@id="react-flow-id"]')); + await page.mouse.up(); + await page.mouse.down(); - await page.getByText("Exit Anyway", { exact: true }).click(); + await page.waitForSelector('[data-testid="fit_view"]', { + timeout: 5000, + }); - await page.getByText("Untitled document").first().click(); + await page.getByTestId("fit_view").click(); - await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { - timeout: 5000, - }); + expect(await page.getByText("Saved").isVisible()).toBeTruthy(); - expect(await page.getByText("NVIDIA").isVisible()).toBeFalsy(); + await page + .getByText("Saved") + .first() + .hover() + .then(async () => { + await page.waitForTimeout(1000); + await page.getByText("Auto-saving is disabled").nth(0).isVisible(); + await page + .getByText("Enable auto-saving to avoid losing progress.") + .nth(0) + .isVisible(); + }); - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("NVIDIA"); + expect(await page.getByTestId("save-flow-button").isEnabled()).toBeTruthy(); - await page.waitForTimeout(1000); + await page.waitForSelector("text=loading", { + state: "hidden", + timeout: 5000, + }); - await page - .getByTestId("modelsNVIDIA") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - await page.mouse.up(); - await page.mouse.down(); + await page.getByTestId("icon-ChevronLeft").last().click(); - await page.waitForSelector('[data-testid="fit_view"]', { - timeout: 5000, - }); + expect( + await page + .getByText("Unsaved changes will be permanently lost.") + .isVisible(), + ).toBeTruthy(); - await page.getByTestId("fit_view").click(); + await page.getByText("Exit Anyway", { exact: true }).click(); - await page.getByTestId("icon-ChevronLeft").last().click(); + await page.getByText("Untitled document").first().click(); - await page.getByText("Save And Exit", { exact: true }).click(); + await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { + timeout: 5000, + }); - await page.getByText("Untitled document").first().click(); + expect(await page.getByText("NVIDIA").isVisible()).toBeFalsy(); - await page.waitForSelector("text=loading", { - state: "hidden", - timeout: 5000, - }); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("NVIDIA"); - await page.waitForTimeout(5000); + await page.waitForTimeout(1000); - expect(await page.getByTestId("title-NVIDIA").isVisible()).toBeTruthy(); + await page + .getByTestId("modelsNVIDIA") + .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("NVIDIA"); + await page.waitForSelector('[data-testid="fit_view"]', { + timeout: 5000, + }); - await page.waitForTimeout(1000); + await page.getByTestId("fit_view").click(); - await page - .getByTestId("modelsNVIDIA") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - await page.mouse.up(); - await page.mouse.down(); + await page.getByTestId("icon-ChevronLeft").last().click(); - await page.waitForSelector('[data-testid="fit_view"]', { - timeout: 5000, - }); + await page.getByText("Save And Exit", { exact: true }).click(); - await page.getByTestId("fit_view").click(); + await page.getByText("Untitled document").first().click(); - await page.getByTestId("save-flow-button").click(); - await page.getByTestId("icon-ChevronLeft").last().click(); + await page.waitForSelector("text=loading", { + state: "hidden", + timeout: 5000, + }); - const replaceButton = await page.getByTestId("replace-button").isVisible(); + await page.waitForTimeout(5000); - if (replaceButton) { - await page.getByTestId("replace-button").click(); - } + expect(await page.getByTestId("title-NVIDIA").isVisible()).toBeTruthy(); - const saveExitButton = await page - .getByText("Save And Exit", { exact: true }) - .last() - .isVisible(); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("NVIDIA"); - if (saveExitButton) { - await page.getByText("Save And Exit", { exact: true }).last().click(); - } + await page.waitForTimeout(1000); - await page.getByText("Untitled document").first().click(); + await page + .getByTestId("modelsNVIDIA") + .dragTo(page.locator('//*[@id="react-flow-id"]')); + await page.mouse.up(); + await page.mouse.down(); - await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { - timeout: 5000, - }); + await page.waitForSelector('[data-testid="fit_view"]', { + timeout: 5000, + }); - await page.waitForTimeout(5000); + await page.getByTestId("fit_view").click(); - const nvidiaNumber = await page.getByTestId("title-NVIDIA").count(); - expect(nvidiaNumber).toBe(2); -}); + await page.getByTestId("save-flow-button").click(); + await page.getByTestId("icon-ChevronLeft").last().click(); + + const replaceButton = await page.getByTestId("replace-button").isVisible(); + + if (replaceButton) { + await page.getByTestId("replace-button").click(); + } + + const saveExitButton = await page + .getByText("Save And Exit", { exact: true }) + .last() + .isVisible(); + + if (saveExitButton) { + await page.getByText("Save And Exit", { exact: true }).last().click(); + } + + await page.getByText("Untitled document").first().click(); + + await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { + timeout: 5000, + }); + + await page.waitForTimeout(5000); + + const nvidiaNumber = await page.getByTestId("title-NVIDIA").count(); + expect(nvidiaNumber).toBe(2); + }, +); diff --git a/src/frontend/tests/extended/features/autoLogin.spec.ts b/src/frontend/tests/extended/features/autoLogin.spec.ts index a69280981..2280aa336 100644 --- a/src/frontend/tests/extended/features/autoLogin.spec.ts +++ b/src/frontend/tests/extended/features/autoLogin.spec.ts @@ -1,26 +1,39 @@ import { test } from "@playwright/test"; -test.describe("Auto_login tests", () => { - test("auto_login sign in", async ({ page }) => { - await page.goto("/"); - await page.getByText("New Flow", { exact: true }).click(); - }); +test.describe( + "Auto_login tests", + { tag: ["@release", "@api", "@database"] }, - test("auto_login block_admin", async ({ page }) => { - await page.goto("/"); - await page.getByText("New Flow", { exact: true }).click(); - await page.waitForTimeout(5000); + () => { + test( + "auto_login sign in", + { tag: ["@release", "@api", "@database"] }, + async ({ page }) => { + await page.goto("/"); + await page.getByText("New Flow", { exact: true }).click(); + }, + ); - await page.goto("/login"); - await page.getByText("New Flow", { exact: true }).click(); - await page.waitForTimeout(5000); + test( + "auto_login block_admin", + { tag: ["@release", "@api", "@database"] }, + async ({ page }) => { + await page.goto("/"); + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(5000); - await page.goto("/admin"); - await page.getByText("New Flow", { exact: true }).click(); - await page.waitForTimeout(5000); + await page.goto("/login"); + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(5000); - await page.goto("/admin/login"); - await page.getByText("New Flow", { exact: true }).click(); - await page.waitForTimeout(5000); - }); -}); + await page.goto("/admin"); + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(5000); + + await page.goto("/admin/login"); + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(5000); + }, + ); + }, +); diff --git a/src/frontend/tests/extended/features/curlApiGeneration.spec.ts b/src/frontend/tests/extended/features/curlApiGeneration.spec.ts index bc6e4a9d5..399dd2ace 100644 --- a/src/frontend/tests/extended/features/curlApiGeneration.spec.ts +++ b/src/frontend/tests/extended/features/curlApiGeneration.spec.ts @@ -1,31 +1,35 @@ import { expect, test } from "@playwright/test"; -test("curl_api_generation", async ({ page, context }) => { - await page.goto("/"); - let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); +test( + "curl_api_generation", + { tag: ["@release", "@api", "@workspace"] }, + async ({ page, context }) => { + await page.goto("/"); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Basic Prompting" }).click(); - await page.waitForTimeout(1000); - await page.getByText("API", { exact: true }).click(); - await page.getByRole("tab", { name: "cURL" }).click(); - await page.getByTestId("icon-Copy").last().click(); - const handle = await page.evaluateHandle(() => - navigator.clipboard.readText(), - ); - const clipboardContent = await handle.jsonValue(); - expect(clipboardContent.length).toBeGreaterThan(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.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Basic Prompting" }).click(); + await page.waitForTimeout(1000); + await page.getByText("API", { exact: true }).click(); + await page.getByRole("tab", { name: "cURL" }).click(); + await page.getByTestId("icon-Copy").last().click(); + const handle = await page.evaluateHandle(() => + navigator.clipboard.readText(), + ); + const clipboardContent = await handle.jsonValue(); + expect(clipboardContent.length).toBeGreaterThan(0); + }, +); diff --git a/src/frontend/tests/extended/features/deleteComponents.spec.ts b/src/frontend/tests/extended/features/deleteComponents.spec.ts index c43531822..6bcaccde8 100644 --- a/src/frontend/tests/extended/features/deleteComponents.spec.ts +++ b/src/frontend/tests/extended/features/deleteComponents.spec.ts @@ -2,45 +2,49 @@ import { test } from "@playwright/test"; import * as dotenv from "dotenv"; import path from "path"; -test("should delete a component", async ({ page }) => { - test.skip( - !process?.env?.STORE_API_KEY, - "STORE_API_KEY required to run this test", - ); - if (!process.env.CI) { - dotenv.config({ path: path.resolve(__dirname, "../../.env") }); - } - await page.goto("/"); - await page.waitForTimeout(1000); - await page.getByTestId("button-store").click(); - await page.waitForTimeout(1000); - await page.getByTestId("api-key-button-store").click(); - await page - .getByPlaceholder("Insert your API Key") - .fill(process.env.STORE_API_KEY ?? ""); - await page.getByTestId("api-key-save-button-store").click(); - await page.waitForTimeout(1000); - await page.getByText("Success! Your API Key has been saved.").isVisible(); - await page.waitForTimeout(1000); - await page.getByTestId("button-store").click(); +test( + "should delete a component", + { tag: ["@release", "@api"] }, + async ({ page }) => { + test.skip( + !process?.env?.STORE_API_KEY, + "STORE_API_KEY required to run this test", + ); + if (!process.env.CI) { + dotenv.config({ path: path.resolve(__dirname, "../../.env") }); + } + await page.goto("/"); + await page.waitForTimeout(1000); + await page.getByTestId("button-store").click(); + await page.waitForTimeout(1000); + await page.getByTestId("api-key-button-store").click(); + await page + .getByPlaceholder("Insert your API Key") + .fill(process.env.STORE_API_KEY ?? ""); + await page.getByTestId("api-key-save-button-store").click(); + await page.waitForTimeout(1000); + await page.getByText("Success! Your API Key has been saved.").isVisible(); + await page.waitForTimeout(1000); + await page.getByTestId("button-store").click(); - await page.getByTestId("install-Basic RAG").click(); - await page.waitForTimeout(5000); - await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { - timeout: 100000, - }); - await page.getByTestId("icon-ChevronLeft").first().click(); - await page.getByText("Components").first().click(); - await page.getByText("Basic RAG").first().isVisible(); - await page.waitForSelector('[data-testid="home-dropdown-menu"]', { - timeout: 100000, - }); - await page.getByTestId("home-dropdown-menu").first().click(); - await page.getByTestId("icon-Trash2").click(); - await page - .getByText("Are you sure you want to delete the selected component?") - .isVisible(); - await page.getByText("Delete").nth(1).click(); - await page.waitForTimeout(1000); - await page.getByText("Successfully").first().isVisible(); -}); + await page.getByTestId("install-Basic RAG").click(); + await page.waitForTimeout(5000); + await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { + timeout: 100000, + }); + await page.getByTestId("icon-ChevronLeft").first().click(); + await page.getByText("Components").first().click(); + await page.getByText("Basic RAG").first().isVisible(); + await page.waitForSelector('[data-testid="home-dropdown-menu"]', { + timeout: 100000, + }); + await page.getByTestId("home-dropdown-menu").first().click(); + await page.getByTestId("icon-Trash2").click(); + await page + .getByText("Are you sure you want to delete the selected component?") + .isVisible(); + await page.getByText("Delete").nth(1).click(); + await page.waitForTimeout(1000); + await page.getByText("Successfully").first().isVisible(); + }, +); diff --git a/src/frontend/tests/extended/features/deleteFlows.spec.ts b/src/frontend/tests/extended/features/deleteFlows.spec.ts index 17c9f0e5c..e85ae7556 100644 --- a/src/frontend/tests/extended/features/deleteFlows.spec.ts +++ b/src/frontend/tests/extended/features/deleteFlows.spec.ts @@ -2,70 +2,74 @@ import { test } from "@playwright/test"; import * as dotenv from "dotenv"; import path from "path"; -test("should delete a flow", async ({ page }) => { - test.skip( - !process?.env?.STORE_API_KEY, - "STORE_API_KEY required to run this test", - ); +test( + "should delete a flow", + { tag: ["@release", "@api"] }, + async ({ page }) => { + test.skip( + !process?.env?.STORE_API_KEY, + "STORE_API_KEY required to run this test", + ); - if (!process.env.CI) { - dotenv.config({ path: path.resolve(__dirname, "../../.env") }); - } - await page.goto("/"); - await page.waitForTimeout(1000); + if (!process.env.CI) { + dotenv.config({ path: path.resolve(__dirname, "../../.env") }); + } + await page.goto("/"); + await page.waitForTimeout(1000); - await page.getByTestId("button-store").click(); - await page.waitForTimeout(1000); + await page.getByTestId("button-store").click(); + await page.waitForTimeout(1000); - await page.getByTestId("api-key-button-store").click(); + await page.getByTestId("api-key-button-store").click(); - await page - .getByPlaceholder("Insert your API Key") - .fill(process.env.STORE_API_KEY ?? ""); + await page + .getByPlaceholder("Insert your API Key") + .fill(process.env.STORE_API_KEY ?? ""); - await page.getByTestId("api-key-save-button-store").click(); + await page.getByTestId("api-key-save-button-store").click(); - await page.waitForTimeout(1000); - await page.getByText("Success! Your API Key has been saved.").isVisible(); + await page.waitForTimeout(1000); + await page.getByText("Success! Your API Key has been saved.").isVisible(); - await page.waitForSelector('[data-testid="button-store"]', { - timeout: 30000, - }); + await page.waitForSelector('[data-testid="button-store"]', { + timeout: 30000, + }); - await page.getByTestId("button-store").click(); - await page.waitForLoadState("networkidle"); + await page.getByTestId("button-store").click(); + await page.waitForLoadState("networkidle"); - // Get and click install button - const installButton = await waitForInstallButton(page); - await installButton.click(); + // Get and click install button + const installButton = await waitForInstallButton(page); + await installButton.click(); - // Handle success message - await waitForSuccessMessage(page); + // Handle success message + await waitForSuccessMessage(page); - // Wait for navigation button - await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { - state: "visible", - timeout: 30000, - }); + // Wait for navigation button + await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { + state: "visible", + timeout: 30000, + }); - await page.getByTestId("icon-ChevronLeft").first().click(); + await page.getByTestId("icon-ChevronLeft").first().click(); - await page.waitForSelector("text=Website Content QA", { timeout: 30000 }); + await page.waitForSelector("text=Website Content QA", { timeout: 30000 }); - await page.getByText("Website Content QA").first().isVisible(); + await page.getByText("Website Content QA").first().isVisible(); - await page.getByTestId("home-dropdown-menu").first().click(); - await page.waitForTimeout(500); + await page.getByTestId("home-dropdown-menu").first().click(); + await page.waitForTimeout(500); - await page.getByText("Delete").last().click(); - await page.waitForTimeout(500); - await page - .getByText("Are you sure you want to delete the selected component?") - .isVisible(); - await page.getByText("Delete").nth(1).click(); - await page.waitForTimeout(1000); - await page.getByText("Successfully").first().isVisible(); -}); + await page.getByText("Delete").last().click(); + await page.waitForTimeout(500); + await page + .getByText("Are you sure you want to delete the selected component?") + .isVisible(); + await page.getByText("Delete").nth(1).click(); + await page.waitForTimeout(1000); + await page.getByText("Successfully").first().isVisible(); + }, +); async function waitForInstallButton(page) { try { diff --git a/src/frontend/tests/extended/features/dragAndDrop.spec.ts b/src/frontend/tests/extended/features/dragAndDrop.spec.ts index 36851caf7..63a149491 100644 --- a/src/frontend/tests/extended/features/dragAndDrop.spec.ts +++ b/src/frontend/tests/extended/features/dragAndDrop.spec.ts @@ -3,7 +3,7 @@ import { readFileSync } from "fs"; test.describe("drag and drop test", () => { /// - test("drop collection", async ({ page }) => { + test("drop collection", { tag: ["@release"] }, async ({ page }) => { await page.goto("/"); let modalCount = 0; diff --git a/src/frontend/tests/extended/features/filterEdge-shard-1.spec.ts b/src/frontend/tests/extended/features/filterEdge-shard-1.spec.ts index 987d8c154..095a6d0a9 100644 --- a/src/frontend/tests/extended/features/filterEdge-shard-1.spec.ts +++ b/src/frontend/tests/extended/features/filterEdge-shard-1.spec.ts @@ -1,185 +1,189 @@ import { expect, test } from "@playwright/test"; -test("user must see on handle click the possibility connections - RetrievalQA", async ({ - page, -}) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +test( + "user must see on handle click the possibility connections - RetrievalQA", + { tag: ["@release", "@api", "@components"] }, + async ({ page }) => { + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - await page.waitForSelector('[id="new-project-btn"]', { - 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(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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.waitForTimeout(1000); - - await page.getByTestId( - "input-list-plus-btn-edit_metadata_indexing_include-2", - ); - - await page.getByTestId("blank-flow").click(); - - await page.waitForTimeout(1000); - - await page.getByTestId("sidebar-options-trigger").click(); - await page.getByTestId("sidebar-legacy-switch").isVisible({ timeout: 5000 }); - await page.getByTestId("sidebar-legacy-switch").click(); - await expect(page.getByTestId("sidebar-legacy-switch")).toBeChecked(); - await page.getByTestId("sidebar-options-trigger").click(); - - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("retrievalqa"); - - await page.waitForTimeout(1000); - await page - .getByTestId("langchain_utilitiesRetrieval QA") - .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("zoom_out").click(); - await page.waitForTimeout(500); - - let visibleElementHandle; - - const outputElements = await page - .getByTestId("handle-retrievalqa-shownode-text-right") - .all(); - - for (const element of outputElements) { - if (await element.isVisible()) { - visibleElementHandle = element; - break; + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); } - } + await page.waitForTimeout(1000); - await visibleElementHandle.click({ - force: true, - }); + await page.getByTestId( + "input-list-plus-btn-edit_metadata_indexing_include-2", + ); - const disclosureTestIds = [ - "disclosure-inputs", - "disclosure-outputs", - "disclosure-data", - "disclosure-models", - "disclosure-helpers", - "disclosure-vector stores", - "disclosure-embeddings", - "disclosure-agents", - "disclosure-memories", - "disclosure-logic", - "disclosure-tools", - "disclosure-bundles-langchain", - "disclosure-bundles-assemblyai", - "disclosure-bundles-datastax", - ]; + await page.getByTestId("blank-flow").click(); - const elementTestIds = [ - "inputsChat Input", - "outputsChat Output", - "dataAPI Request", - "modelsAmazon Bedrock", - "helpersMessage History", - "vectorstoresAstra DB", - "embeddingsAmazon Bedrock Embeddings", - "langchain_utilitiesTool Calling Agent", - "langchain_utilitiesConversationChain", - "memoriesAstra DB Chat Memory", - "logicCondition", - "langchain_utilitiesSelf Query Retriever", - "langchain_utilitiesCharacterTextSplitter", - ]; + await page.waitForTimeout(1000); - await Promise.all( - disclosureTestIds.map((id) => expect(page.getByTestId(id)).toBeVisible()), - ); + await page.getByTestId("sidebar-options-trigger").click(); + await page + .getByTestId("sidebar-legacy-switch") + .isVisible({ timeout: 5000 }); + await page.getByTestId("sidebar-legacy-switch").click(); + await expect(page.getByTestId("sidebar-legacy-switch")).toBeChecked(); + await page.getByTestId("sidebar-options-trigger").click(); - await Promise.all( - elementTestIds.map((id) => - expect(page.getByTestId(id).first()).toBeVisible(), - ), - ); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("retrievalqa"); - await page.getByTestId("sidebar-search-input").click(); + await page.waitForTimeout(1000); + await page + .getByTestId("langchain_utilitiesRetrieval QA") + .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("zoom_out").click(); + await page.waitForTimeout(500); - const visibleModelSpecsTestIds = [ - "modelsAIML", - "modelsAmazon Bedrock", - "modelsAnthropic", - "modelsAzure OpenAI", - "modelsCohere", - "modelsGoogle Generative AI", - "modelsGroq", - "modelsHuggingFace", - "modelsLM Studio", - "modelsMaritalk", - "modelsMistralAI", - "modelsNVIDIA", - "modelsOllama", - "modelsOpenAI", - "modelsPerplexity", - "modelsQianfan", - "modelsVertex AI", - ]; + let visibleElementHandle; - await Promise.all( - visibleModelSpecsTestIds.map((id) => - expect(page.getByTestId(id)).toBeVisible(), - ), - ); + const outputElements = await page + .getByTestId("handle-retrievalqa-shownode-text-right") + .all(); - const chainInputElements1 = await page - .getByTestId("handle-retrievalqa-shownode-llm-left") - .all(); - - for (const element of chainInputElements1) { - if (await element.isVisible()) { - visibleElementHandle = element; - break; + for (const element of outputElements) { + if (await element.isVisible()) { + visibleElementHandle = element; + break; + } } - } - await visibleElementHandle.blur(); + await visibleElementHandle.click({ + force: true, + }); - await visibleElementHandle.click({ - force: true, - }); + const disclosureTestIds = [ + "disclosure-inputs", + "disclosure-outputs", + "disclosure-data", + "disclosure-models", + "disclosure-helpers", + "disclosure-vector stores", + "disclosure-embeddings", + "disclosure-agents", + "disclosure-memories", + "disclosure-logic", + "disclosure-tools", + "disclosure-bundles-langchain", + "disclosure-bundles-assemblyai", + "disclosure-bundles-datastax", + ]; - await expect(page.getByTestId("disclosure-models")).toBeVisible(); + const elementTestIds = [ + "inputsChat Input", + "outputsChat Output", + "dataAPI Request", + "modelsAmazon Bedrock", + "helpersMessage History", + "vectorstoresAstra DB", + "embeddingsAmazon Bedrock Embeddings", + "langchain_utilitiesTool Calling Agent", + "langchain_utilitiesConversationChain", + "memoriesAstra DB Chat Memory", + "logicCondition", + "langchain_utilitiesSelf Query Retriever", + "langchain_utilitiesCharacterTextSplitter", + ]; - const rqaChainInputElements0 = await page - .getByTestId("handle-retrievalqa-shownode-template-left") - .all(); + await Promise.all( + disclosureTestIds.map((id) => expect(page.getByTestId(id)).toBeVisible()), + ); - for (const element of rqaChainInputElements0) { - if (await element.isVisible()) { - visibleElementHandle = element; - break; + await Promise.all( + elementTestIds.map((id) => + expect(page.getByTestId(id).first()).toBeVisible(), + ), + ); + + await page.getByTestId("sidebar-search-input").click(); + + const visibleModelSpecsTestIds = [ + "modelsAIML", + "modelsAmazon Bedrock", + "modelsAnthropic", + "modelsAzure OpenAI", + "modelsCohere", + "modelsGoogle Generative AI", + "modelsGroq", + "modelsHuggingFace", + "modelsLM Studio", + "modelsMaritalk", + "modelsMistralAI", + "modelsNVIDIA", + "modelsOllama", + "modelsOpenAI", + "modelsPerplexity", + "modelsQianfan", + "modelsVertex AI", + ]; + + await Promise.all( + visibleModelSpecsTestIds.map((id) => + expect(page.getByTestId(id)).toBeVisible(), + ), + ); + + const chainInputElements1 = await page + .getByTestId("handle-retrievalqa-shownode-llm-left") + .all(); + + for (const element of chainInputElements1) { + if (await element.isVisible()) { + visibleElementHandle = element; + break; + } } - } - await visibleElementHandle.click(); + await visibleElementHandle.blur(); - await expect(page.getByTestId("disclosure-helpers")).toBeVisible(); - await expect(page.getByTestId("disclosure-agents")).toBeVisible(); - await expect(page.getByTestId("disclosure-memories")).toBeVisible(); - await expect(page.getByTestId("disclosure-logic")).toBeVisible(); -}); + await visibleElementHandle.click({ + force: true, + }); + + await expect(page.getByTestId("disclosure-models")).toBeVisible(); + + const rqaChainInputElements0 = await page + .getByTestId("handle-retrievalqa-shownode-template-left") + .all(); + + for (const element of rqaChainInputElements0) { + if (await element.isVisible()) { + visibleElementHandle = element; + break; + } + } + + await visibleElementHandle.click(); + + await expect(page.getByTestId("disclosure-helpers")).toBeVisible(); + await expect(page.getByTestId("disclosure-agents")).toBeVisible(); + await expect(page.getByTestId("disclosure-memories")).toBeVisible(); + await expect(page.getByTestId("disclosure-logic")).toBeVisible(); + }, +); diff --git a/src/frontend/tests/extended/features/flowPage.spec.ts b/src/frontend/tests/extended/features/flowPage.spec.ts index e92469bf9..bd6ab016b 100644 --- a/src/frontend/tests/extended/features/flowPage.spec.ts +++ b/src/frontend/tests/extended/features/flowPage.spec.ts @@ -1,7 +1,7 @@ import { test } from "@playwright/test"; test.describe("Flow Page tests", () => { - test("save", async ({ page }) => { + test("save", { tag: ["@release"] }, async ({ page }) => { await page.goto("/"); await page.waitForSelector('[data-testid="mainpage_title"]', { timeout: 30000, diff --git a/src/frontend/tests/extended/features/flowSettings.spec.ts b/src/frontend/tests/extended/features/flowSettings.spec.ts index da97a03ef..60bc669be 100644 --- a/src/frontend/tests/extended/features/flowSettings.spec.ts +++ b/src/frontend/tests/extended/features/flowSettings.spec.ts @@ -1,78 +1,82 @@ import { expect, test } from "@playwright/test"; -test("flowSettings", async ({ page }) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +test( + "flowSettings", + { tag: ["@release", "@api", "@workspace"] }, + async ({ page }) => { + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - await page.waitForSelector('[id="new-project-btn"]', { - 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(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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.waitForTimeout(1000); + 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.waitForTimeout(1000); - await page.getByTestId("flow_name").click(); - await page.getByText("Flow Settings").first().click(); - await page - .getByPlaceholder("Flow name") - .fill( - "Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test", - ); + await page.getByTestId("flow_name").click(); + await page.getByText("Flow Settings").first().click(); + await page + .getByPlaceholder("Flow name") + .fill( + "Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test", + ); - await page.getByText("Character limit reached").isVisible(); + await page.getByText("Character limit reached").isVisible(); - await page.getByPlaceholder("Flow name").click(); - const randomName = Math.random().toString(36).substring(2); - await page.getByPlaceholder("Flow name").fill(randomName); - await page.getByPlaceholder("Flow name").click(); - await page - .getByPlaceholder("Flow description") - .fill( - "Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test", - ); + await page.getByPlaceholder("Flow name").click(); + const randomName = Math.random().toString(36).substring(2); + await page.getByPlaceholder("Flow name").fill(randomName); + await page.getByPlaceholder("Flow name").click(); + await page + .getByPlaceholder("Flow description") + .fill( + "Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test", + ); - await page.getByTestId("save-flow-settings").click(); + await page.getByTestId("save-flow-settings").click(); - await page.getByText("Changes saved successfully").isVisible(); + await page.getByText("Changes saved successfully").isVisible(); - await page.getByTestId("flow_name").click(); - await page.getByText("Flow Settings").first().click(); + await page.getByTestId("flow_name").click(); + await page.getByText("Flow Settings").first().click(); - const flowName = await page.getByPlaceholder("Flow name").inputValue(); - const flowDescription = await page - .getByPlaceholder("Flow description") - .inputValue(); + const flowName = await page.getByPlaceholder("Flow name").inputValue(); + const flowDescription = await page + .getByPlaceholder("Flow description") + .inputValue(); - if (flowName != randomName) { - expect(false).toBeTruthy(); - } + if (flowName != randomName) { + expect(false).toBeTruthy(); + } - if ( - flowDescription != - "Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test" - ) { - expect(false).toBeTruthy(); - } - await page.getByText("Saved").first().isVisible(); - await page.getByTestId("icon-CheckCircle2").first().isVisible(); -}); + if ( + flowDescription != + "Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test Flow Name Test" + ) { + expect(false).toBeTruthy(); + } + await page.getByText("Saved").first().isVisible(); + await page.getByTestId("icon-CheckCircle2").first().isVisible(); + }, +); diff --git a/src/frontend/tests/extended/features/integration-side-bar.spec.ts b/src/frontend/tests/extended/features/integration-side-bar.spec.ts index e627a9b78..c269d3de1 100644 --- a/src/frontend/tests/extended/features/integration-side-bar.spec.ts +++ b/src/frontend/tests/extended/features/integration-side-bar.spec.ts @@ -1,87 +1,91 @@ import { expect, test } from "@playwright/test"; -test("user should be able to see integrations in the sidebar if mvp_components is true", async ({ - page, -}) => { - // await page.route("**/api/v1/config", (route) => { - // route.fulfill({ - // status: 200, - // contentType: "application/json", - // body: JSON.stringify({ - // feature_flags: { - // mvp_components: true, - // }, - // }), - // headers: { - // "content-type": "application/json", - // ...route.request().headers(), - // }, - // }); - // }); - await page.goto("/"); - await page.waitForTimeout(1000); - let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); +test( + "user should be able to see integrations in the sidebar if mvp_components is true", + { tag: ["@release", "@api", "@workspace"] }, + async ({ page }) => { + // await page.route("**/api/v1/config", (route) => { + // route.fulfill({ + // status: 200, + // contentType: "application/json", + // body: JSON.stringify({ + // feature_flags: { + // mvp_components: true, + // }, + // }), + // headers: { + // "content-type": "application/json", + // ...route.request().headers(), + // }, + // }); + // }); + await page.goto("/"); + await page.waitForTimeout(1000); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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.getByTestId("blank-flow").click(); - await page.waitForSelector('[data-testid="shad-sidebar"]', { - timeout: 30000, - }); - await expect(page.getByText("Bundles")).toBeVisible(); - await expect(page.getByText("Notion")).toBeVisible(); - await expect(page.getByText("AssemblyAI")).toBeVisible(); -}); + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); + } + await page.getByTestId("blank-flow").click(); + await page.waitForSelector('[data-testid="shad-sidebar"]', { + timeout: 30000, + }); + await expect(page.getByText("Bundles")).toBeVisible(); + await expect(page.getByText("Notion")).toBeVisible(); + await expect(page.getByText("AssemblyAI")).toBeVisible(); + }, +); -test("user should NOT be able to see integrations in the sidebar if mvp_components is false", async ({ - page, -}) => { - // await page.waitForTimeout(4000); - // await page.route("**/api/v1/config", (route) => { - // route.fulfill({ - // status: 200, - // contentType: "application/json", - // body: JSON.stringify({ - // feature_flags: { - // mvp_components: false, - // }, - // }), - // headers: { - // "content-type": "application/json", - // ...route.request().headers(), - // }, - // }); - // }); - // await page.goto("/"); - // await page.waitForTimeout(1000); - // 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 Project", { exact: true }).click(); - // await page.waitForTimeout(3000); - // modalCount = await page.getByTestId("modal-title")?.count(); - // } - // await page.getByTestId("blank-flow").click(); - // await page.waitForSelector('[data-testid="shad-sidebar"]', { - // timeout: 30000, - // }); - // await expect(page.getByText("Integrations")).not.toBeVisible(); - // await expect(page.getByText("Notion")).not.toBeVisible(); -}); +test( + "user should NOT be able to see integrations in the sidebar if mvp_components is false", + { tag: ["@release", "@api", "@workspace"] }, + async ({ page }) => { + // await page.waitForTimeout(4000); + // await page.route("**/api/v1/config", (route) => { + // route.fulfill({ + // status: 200, + // contentType: "application/json", + // body: JSON.stringify({ + // feature_flags: { + // mvp_components: false, + // }, + // }), + // headers: { + // "content-type": "application/json", + // ...route.request().headers(), + // }, + // }); + // }); + // await page.goto("/"); + // await page.waitForTimeout(1000); + // 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 Project", { exact: true }).click(); + // await page.waitForTimeout(3000); + // modalCount = await page.getByTestId("modal-title")?.count(); + // } + // await page.getByTestId("blank-flow").click(); + // await page.waitForSelector('[data-testid="shad-sidebar"]', { + // timeout: 30000, + // }); + // await expect(page.getByText("Integrations")).not.toBeVisible(); + // await expect(page.getByText("Notion")).not.toBeVisible(); + }, +); diff --git a/src/frontend/tests/extended/features/langflowShortcuts.spec.ts b/src/frontend/tests/extended/features/langflowShortcuts.spec.ts index 8cf802e0e..cc108efa2 100644 --- a/src/frontend/tests/extended/features/langflowShortcuts.spec.ts +++ b/src/frontend/tests/extended/features/langflowShortcuts.spec.ts @@ -1,114 +1,119 @@ import { expect, test } from "@playwright/test"; import uaParser from "ua-parser-js"; -test("LangflowShortcuts", async ({ page }) => { - await page.goto("/"); - let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); +test( + "LangflowShortcuts", + { tag: ["@release", "@workspace"] }, + async ({ page }) => { + await page.goto("/"); + + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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(); - } + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); + } - const getUA = await page.evaluate(() => navigator.userAgent); - const userAgentInfo = uaParser(getUA); + 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.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.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("ollama"); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page - .getByTestId("modelsOllama") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - await page.mouse.up(); - await page.mouse.down(); + await page + .getByTestId("modelsOllama") + .dragTo(page.locator('//*[@id="react-flow-id"]')); + await page.mouse.up(); + await page.mouse.down(); - await page.locator('//*[@id="react-flow-id"]/div/div[2]/button[3]').click(); + await page.locator('//*[@id="react-flow-id"]/div/div[2]/button[3]').click(); - await page.waitForSelector('[data-testid="fit_view"]', { - timeout: 100000, - }); + 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(); - await page.getByTestId("generic-node-title-arrangement").click(); - await page.keyboard.press(`ControlOrMeta+Shift+A`); - await page.getByText("Close").last().click(); + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("generic-node-title-arrangement").click(); + await page.keyboard.press(`ControlOrMeta+Shift+A`); + await page.getByText("Close").last().click(); - await page.getByTestId("generic-node-title-arrangement").click(); - await page.keyboard.press(`ControlOrMeta+d`); + await page.getByTestId("generic-node-title-arrangement").click(); + await page.keyboard.press(`ControlOrMeta+d`); - let numberOfNodes = await page.getByTestId("title-Ollama")?.count(); - if (numberOfNodes != 2) { - expect(false).toBeTruthy(); - } + let numberOfNodes = await page.getByTestId("title-Ollama")?.count(); + if (numberOfNodes != 2) { + expect(false).toBeTruthy(); + } - const ollamaTitleElement = await page.getByTestId("title-Ollama").last(); + const ollamaTitleElement = await page.getByTestId("title-Ollama").last(); - await ollamaTitleElement.click(); - await page.keyboard.press("Backspace"); + await ollamaTitleElement.click(); + await page.keyboard.press("Backspace"); - numberOfNodes = await page.getByTestId("title-Ollama")?.count(); - if (numberOfNodes != 1) { - expect(false).toBeTruthy(); - } + numberOfNodes = await page.getByTestId("title-Ollama")?.count(); + if (numberOfNodes != 1) { + expect(false).toBeTruthy(); + } - await page.getByTestId("generic-node-title-arrangement").click(); - await page.keyboard.press(`ControlOrMeta+c`); + await page.getByTestId("generic-node-title-arrangement").click(); + await page.keyboard.press(`ControlOrMeta+c`); - await page.getByTestId("title-Ollama").click(); - await page.keyboard.press(`ControlOrMeta+v`); + await page.getByTestId("title-Ollama").click(); + await page.keyboard.press(`ControlOrMeta+v`); - numberOfNodes = await page.getByTestId("title-Ollama")?.count(); - if (numberOfNodes != 2) { - expect(false).toBeTruthy(); - } + numberOfNodes = await page.getByTestId("title-Ollama")?.count(); + if (numberOfNodes != 2) { + expect(false).toBeTruthy(); + } - await ollamaTitleElement.click(); - await page.keyboard.press("Backspace"); + await ollamaTitleElement.click(); + await page.keyboard.press("Backspace"); - await page.getByTestId("title-Ollama").click(); - await page.keyboard.press(`ControlOrMeta+x`); + await page.getByTestId("title-Ollama").click(); + await page.keyboard.press(`ControlOrMeta+x`); - numberOfNodes = await page.getByTestId("title-Ollama")?.count(); - if (numberOfNodes != 0) { - expect(false).toBeTruthy(); - } - await page.keyboard.press(`ControlOrMeta+v`); - numberOfNodes = await page.getByTestId("title-Ollama")?.count(); - if (numberOfNodes != 1) { - expect(false).toBeTruthy(); - } + numberOfNodes = await page.getByTestId("title-Ollama")?.count(); + if (numberOfNodes != 0) { + expect(false).toBeTruthy(); + } + await page.keyboard.press(`ControlOrMeta+v`); + numberOfNodes = await page.getByTestId("title-Ollama")?.count(); + if (numberOfNodes != 1) { + expect(false).toBeTruthy(); + } - // Test undo (Command+Z or Control+Z) - await page.getByTestId("title-Ollama").click(); - await page.keyboard.press("Backspace"); - numberOfNodes = await page.getByTestId("title-Ollama")?.count(); - expect(numberOfNodes).toBe(0); + // Test undo (Command+Z or Control+Z) + await page.getByTestId("title-Ollama").click(); + await page.keyboard.press("Backspace"); + numberOfNodes = await page.getByTestId("title-Ollama")?.count(); + expect(numberOfNodes).toBe(0); - await page.keyboard.press(`ControlOrMeta+z`); - numberOfNodes = await page.getByTestId("title-Ollama")?.count(); - expect(numberOfNodes).toBe(1); + await page.keyboard.press(`ControlOrMeta+z`); + numberOfNodes = await page.getByTestId("title-Ollama")?.count(); + expect(numberOfNodes).toBe(1); - // Test redo (Command+Y or Control+Y) - await page.keyboard.press(`ControlOrMeta+y`); - numberOfNodes = await page.getByTestId("title-Ollama")?.count(); - expect(numberOfNodes).toBe(0); -}); + // Test redo (Command+Y or Control+Y) + await page.keyboard.press(`ControlOrMeta+y`); + numberOfNodes = await page.getByTestId("title-Ollama")?.count(); + expect(numberOfNodes).toBe(0); + }, +); diff --git a/src/frontend/tests/extended/features/limit-file-size-upload.spec.ts b/src/frontend/tests/extended/features/limit-file-size-upload.spec.ts index 27db5fac4..35d03c244 100644 --- a/src/frontend/tests/extended/features/limit-file-size-upload.spec.ts +++ b/src/frontend/tests/extended/features/limit-file-size-upload.spec.ts @@ -3,137 +3,141 @@ import * as dotenv from "dotenv"; import { readFileSync } from "fs"; import path from "path"; -test("user should not be able to upload a file larger than the limit", async ({ - page, -}) => { - const maxFileSizeUpload = 0.001; - await page.route("**/api/v1/config", (route) => { - route.fulfill({ - status: 200, - contentType: "application/json", - body: JSON.stringify({ - max_file_size_upload: maxFileSizeUpload, - }), - headers: { - "content-type": "application/json", - ...route.request().headers(), - }, +test( + "user should not be able to upload a file larger than the limit", + { tag: ["@release", "@api", "@database"] }, + async ({ page }) => { + const maxFileSizeUpload = 0.001; + await page.route("**/api/v1/config", (route) => { + route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify({ + max_file_size_upload: maxFileSizeUpload, + }), + headers: { + "content-type": "application/json", + ...route.request().headers(), + }, + }); }); - }); - test.skip( - !process?.env?.OPENAI_API_KEY, - "OPENAI_API_KEY required to run this test", - ); + 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.waitForTimeout(1000); - - let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); + if (!process.env.CI) { + dotenv.config({ path: path.resolve(__dirname, "../../.env") }); } - } 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.goto("/"); - await page.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Basic Prompting" }).click(); - 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 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.waitForSelector("text=Chat Input", { timeout: 30000 }); - - await page.getByText("Chat Input", { exact: true }).click(); - await page.getByTestId("more-options-modal").click(); - await page.getByTestId("advanced-button-modal").click(); - await page.getByText("Close").last().click(); - - await page.getByText("Playground", { exact: true }).last().click(); - - // Read the image file as a binary string - const filePath = "tests/assets/chain.png"; - const fileContent = readFileSync(filePath, "base64"); - - // Create the DataTransfer and File objects within the browser context - const dataTransfer = await page.evaluateHandle( - ({ fileContent }) => { - const dt = new DataTransfer(); - const byteCharacters = atob(fileContent); - const byteNumbers = new Array(byteCharacters.length); - for (let i = 0; i < byteCharacters.length; i++) { - byteNumbers[i] = byteCharacters.charCodeAt(i); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); } - const byteArray = new Uint8Array(byteNumbers); - const file = new File([byteArray], "chain.png", { type: "image/png" }); - dt.items.add(file); - return dt; - }, - { fileContent }, - ); + } catch (error) { + modalCount = 0; + } - await page.waitForSelector('[data-testid="input-chat-playground"]', { - timeout: 100000, - }); + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); + } - // Locate the target element - const element = await page.getByTestId("input-chat-playground"); + await page.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Basic Prompting" }).click(); + await page.waitForSelector('[data-testid="fit_view"]', { + timeout: 100000, + }); - // Dispatch the drop event on the target element - await element.dispatchEvent("drop", { dataTransfer }); + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); - await page.waitForTimeout(1000); + let outdatedComponents = await page + .getByTestId("icon-AlertTriangle") + .count(); - await page.waitForSelector("text=The file size is too large", { - timeout: 10000, - }); + while (outdatedComponents > 0) { + await page.getByTestId("icon-AlertTriangle").first().click(); + await page.waitForTimeout(1000); + outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); + } - await expect( - page.getByText( - `The file size is too large. Please select a file smaller than ${maxFileSizeUpload}MB`, - ), - ).toBeVisible(); -}); + 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.waitForSelector("text=Chat Input", { timeout: 30000 }); + + await page.getByText("Chat Input", { exact: true }).click(); + await page.getByTestId("more-options-modal").click(); + await page.getByTestId("advanced-button-modal").click(); + await page.getByText("Close").last().click(); + + await page.getByText("Playground", { exact: true }).last().click(); + + // Read the image file as a binary string + const filePath = "tests/assets/chain.png"; + const fileContent = readFileSync(filePath, "base64"); + + // Create the DataTransfer and File objects within the browser context + const dataTransfer = await page.evaluateHandle( + ({ fileContent }) => { + const dt = new DataTransfer(); + const byteCharacters = atob(fileContent); + const byteNumbers = new Array(byteCharacters.length); + for (let i = 0; i < byteCharacters.length; i++) { + byteNumbers[i] = byteCharacters.charCodeAt(i); + } + const byteArray = new Uint8Array(byteNumbers); + const file = new File([byteArray], "chain.png", { type: "image/png" }); + dt.items.add(file); + return dt; + }, + { fileContent }, + ); + + await page.waitForSelector('[data-testid="input-chat-playground"]', { + timeout: 100000, + }); + + // Locate the target element + const element = await page.getByTestId("input-chat-playground"); + + // Dispatch the drop event on the target element + await element.dispatchEvent("drop", { dataTransfer }); + + await page.waitForTimeout(1000); + + await page.waitForSelector("text=The file size is too large", { + timeout: 10000, + }); + + await expect( + page.getByText( + `The file size is too large. Please select a file smaller than ${maxFileSizeUpload}MB`, + ), + ).toBeVisible(); + }, +); diff --git a/src/frontend/tests/extended/features/minimize.spec.ts b/src/frontend/tests/extended/features/minimize.spec.ts index 8d430c881..fd95b3e18 100644 --- a/src/frontend/tests/extended/features/minimize.spec.ts +++ b/src/frontend/tests/extended/features/minimize.spec.ts @@ -1,82 +1,88 @@ import { expect, test } from "@playwright/test"; -test("user must be able to minimize and expand a component", 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.waitForTimeout(3000); - modalCount = await page.getByTestId("modal-title")?.count(); - } - - 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.getByTestId("zoom_out").click(); - await page - .locator('//*[@id="react-flow-id"]') - .hover() - .then(async () => { - await page.mouse.down(); - await page.mouse.move(-800, 300); +test( + "user must be able to minimize and expand a component", + { tag: ["@release", "@workspace"] }, + async ({ page }) => { + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, }); - await page.mouse.up(); + await page.waitForSelector('[id="new-project-btn"]', { + timeout: 30000, + }); - 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 modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; + } - await page.getByTestId("more-options-modal").click(); - await page.waitForTimeout(1000); + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); + } - await page.getByTestId("minimize-button-modal").first().click(); + await page.getByTestId("blank-flow").click(); - await page.waitForTimeout(1000); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("text input"); + await page.waitForTimeout(1000); - await expect( - page.locator(".react-flow__handle-left.no-show").first(), - ).toBeVisible(); + await page + .getByTestId("inputsText Input") + .dragTo(page.locator('//*[@id="react-flow-id"]')); - await expect( - page.locator(".react-flow__handle-right.no-show").first(), - ).toBeVisible(); + await page.getByTestId("zoom_out").click(); + await page + .locator('//*[@id="react-flow-id"]') + .hover() + .then(async () => { + await page.mouse.down(); + await page.mouse.move(-800, 300); + }); - await page.getByTestId("more-options-modal").click(); + await page.mouse.up(); - await page.waitForTimeout(1000); - await page.getByTestId("expand-button-modal").first().click(); + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); - await page.waitForTimeout(1000); + await page.getByTestId("more-options-modal").click(); + await page.waitForTimeout(1000); - await expect(page.locator(".react-flow__handle-left").first()).toBeVisible(); + await page.getByTestId("minimize-button-modal").first().click(); - await expect(page.locator(".react-flow__handle-right").first()).toBeVisible(); -}); + await page.waitForTimeout(1000); + + await expect( + page.locator(".react-flow__handle-left.no-show").first(), + ).toBeVisible(); + + await expect( + page.locator(".react-flow__handle-right.no-show").first(), + ).toBeVisible(); + + await page.getByTestId("more-options-modal").click(); + + await page.waitForTimeout(1000); + await page.getByTestId("expand-button-modal").first().click(); + + await page.waitForTimeout(1000); + + await expect( + page.locator(".react-flow__handle-left").first(), + ).toBeVisible(); + + await expect( + page.locator(".react-flow__handle-right").first(), + ).toBeVisible(); + }, +); diff --git a/src/frontend/tests/extended/features/pythonApiGeneration.spec.ts b/src/frontend/tests/extended/features/pythonApiGeneration.spec.ts index 088d79383..492793b51 100644 --- a/src/frontend/tests/extended/features/pythonApiGeneration.spec.ts +++ b/src/frontend/tests/extended/features/pythonApiGeneration.spec.ts @@ -1,38 +1,42 @@ import { expect, test } from "@playwright/test"; -test("python_api_generation", async ({ page, context }) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +test( + "python_api_generation", + { tag: ["@release", "@api", "@workspace"] }, + async ({ page, context }) => { + 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(); + 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; } - } 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.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Basic Prompting" }).click(); - await page.waitForTimeout(1000); - await page.getByText("API", { exact: true }).click(); - await page.getByRole("tab", { name: "Python API" }).click(); - await page.getByTestId("icon-Copy").click(); - const handle = await page.evaluateHandle(() => - navigator.clipboard.readText(), - ); - const clipboardContent = await handle.jsonValue(); - expect(clipboardContent.length).toBeGreaterThan(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.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Basic Prompting" }).click(); + await page.waitForTimeout(1000); + await page.getByText("API", { exact: true }).click(); + await page.getByRole("tab", { name: "Python API" }).click(); + await page.getByTestId("icon-Copy").click(); + const handle = await page.evaluateHandle(() => + navigator.clipboard.readText(), + ); + const clipboardContent = await handle.jsonValue(); + expect(clipboardContent.length).toBeGreaterThan(0); + }, +); diff --git a/src/frontend/tests/extended/features/starter-projects.spec.ts b/src/frontend/tests/extended/features/starter-projects.spec.ts index d59259cef..3b193154e 100644 --- a/src/frontend/tests/extended/features/starter-projects.spec.ts +++ b/src/frontend/tests/extended/features/starter-projects.spec.ts @@ -1,85 +1,86 @@ import { expect, Page, test } from "@playwright/test"; -test("user must be able to interact with starter projects", async ({ - page, - context, -}) => { - await page.goto("/"); - let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); +test( + "user must be able to interact with starter projects", + { tag: ["@release", "@starter-projects"] }, + async ({ page, context }) => { + await page.goto("/"); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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(); - } + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); + } - expect(page.getByText("Start from scratch", { exact: true })).toBeVisible(); - expect(page.getByRole("button", { name: "Blank Flow" })).toBeVisible(); + expect(page.getByText("Start from scratch", { exact: true })).toBeVisible(); + expect(page.getByRole("button", { name: "Blank Flow" })).toBeVisible(); - await page.getByTestId("side_nav_options_all-templates").click(); - await page.waitForTimeout(500); + await page.getByTestId("side_nav_options_all-templates").click(); + await page.waitForTimeout(500); - await page.getByPlaceholder("Search...").fill("Document"); - await page.waitForTimeout(500); + await page.getByPlaceholder("Search...").fill("Document"); + await page.waitForTimeout(500); - expect( - page.getByTestId("template_basic-prompting-(hello,-world)"), - ).not.toBeVisible(); + expect( + page.getByTestId("template_basic-prompting-(hello,-world)"), + ).not.toBeVisible(); - expect(page.getByTestId("template_document-q&a").first()).toBeVisible(); - expect( - page.getByTestId(`template_sequential-tasks-agents`).first(), - ).toBeVisible(); + expect(page.getByTestId("template_document-q&a").first()).toBeVisible(); + expect( + page.getByTestId(`template_sequential-tasks-agents`).first(), + ).toBeVisible(); - expect(page.getByTestId("template_vector-store")).not.toBeVisible(); - expect(page.getByTestId(`template_simple-agent`)).not.toBeVisible(); - expect(page.getByTestId(`template_dynamic-agent`)).not.toBeVisible(); - expect( - page.getByTestId(`template_hierarchical-tasks-agent`), - ).not.toBeVisible(); + expect(page.getByTestId("template_vector-store")).not.toBeVisible(); + expect(page.getByTestId(`template_simple-agent`)).not.toBeVisible(); + expect(page.getByTestId(`template_dynamic-agent`)).not.toBeVisible(); + expect( + page.getByTestId(`template_hierarchical-tasks-agent`), + ).not.toBeVisible(); - await page.waitForTimeout(500); + await page.waitForTimeout(500); - await page.getByTestId(`side_nav_options_prompting`).click(); - await page.waitForTimeout(500); - expect(page.getByTestId(`category_title_prompting`)).toBeVisible(); + await page.getByTestId(`side_nav_options_prompting`).click(); + await page.waitForTimeout(500); + expect(page.getByTestId(`category_title_prompting`)).toBeVisible(); - await page.getByTestId(`side_nav_options_rag`).click(); - await page.waitForTimeout(500); + await page.getByTestId(`side_nav_options_rag`).click(); + await page.waitForTimeout(500); - expect(page.getByTestId(`category_title_rag`)).toBeVisible(); - expect(page.getByTestId(`template_vector-store-rag`)).toBeVisible(); + expect(page.getByTestId(`category_title_rag`)).toBeVisible(); + expect(page.getByTestId(`template_vector-store-rag`)).toBeVisible(); - expect( - page.getByTestId(`template_basic-prompting-(hello,-world)`), - ).not.toBeVisible(); - expect(page.getByTestId(`template_document-qa`)).not.toBeVisible(); + expect( + page.getByTestId(`template_basic-prompting-(hello,-world)`), + ).not.toBeVisible(); + expect(page.getByTestId(`template_document-qa`)).not.toBeVisible(); - await page.getByTestId(`side_nav_options_agents`).click(); - await page.waitForTimeout(500); + await page.getByTestId(`side_nav_options_agents`).click(); + await page.waitForTimeout(500); - expect(page.getByTestId(`category_title_agents`)).toBeVisible(); + expect(page.getByTestId(`category_title_agents`)).toBeVisible(); - await page.waitForTimeout(500); + await page.waitForTimeout(500); - expect( - page.getByTestId(`template_basic-prompting-(hello,-world)`), - ).not.toBeVisible(); - expect(page.getByTestId(`template_document-qa`)).not.toBeVisible(); - expect(page.getByTestId(`template_vector-store-rag`)).not.toBeVisible(); + expect( + page.getByTestId(`template_basic-prompting-(hello,-world)`), + ).not.toBeVisible(); + expect(page.getByTestId(`template_document-qa`)).not.toBeVisible(); + expect(page.getByTestId(`template_vector-store-rag`)).not.toBeVisible(); - await page.waitForTimeout(500); + await page.waitForTimeout(500); - await waitForTemplateVisibility(page, templateIds); -}); + await waitForTemplateVisibility(page, templateIds); + }, +); async function waitForTemplateVisibility(page: Page, templateIds: string[]) { const timeout = 10000; // Increased timeout for better reliability diff --git a/src/frontend/tests/extended/features/sticky-notes.spec.ts b/src/frontend/tests/extended/features/sticky-notes.spec.ts index 34ebbe8bb..ee1bbd6d0 100644 --- a/src/frontend/tests/extended/features/sticky-notes.spec.ts +++ b/src/frontend/tests/extended/features/sticky-notes.spec.ts @@ -1,36 +1,40 @@ import { expect, test } from "@playwright/test"; import uaParser from "ua-parser-js"; -test("user should be able to interact with sticky notes", async ({ page }) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +test( + "user should be able to interact with sticky notes", + { tag: ["@release", "@workspace"] }, - await page.waitForSelector('[id="new-project-btn"]', { - timeout: 30000, - }); + async ({ page }) => { + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); + 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; } - } catch (error) { - modalCount = 0; - } - const getUA = await page.evaluate(() => navigator.userAgent); - const userAgentInfo = uaParser(getUA); + const getUA = await page.evaluate(() => navigator.userAgent); + const userAgentInfo = uaParser(getUA); - const randomTitle = Math.random() - .toString(36) - .substring(7) - .padEnd(8, "x") - .substring(0, 8); + const randomTitle = Math.random() + .toString(36) + .substring(7) + .padEnd(8, "x") + .substring(0, 8); - const noteText = `# ${randomTitle} + const noteText = `# ${randomTitle} Artificial Intelligence (AI) has rapidly evolved from a speculative concept in science fiction to a transformative force reshaping industries and everyday life. The term AI encompasses a broad range of technologies, from simple algorithms designed to perform specific tasks to complex systems capable of learning and adapting independently. As AI continues to advance, its applications are becoming increasingly diverse, impacting everything from healthcare to finance, entertainment, and beyond. @@ -51,122 +55,123 @@ Despite its many benefits, AI also raises important ethical and societal questio The future of AI is both exciting and uncertain. As the technology continues to advance, it will undoubtedly bring about profound changes in society. The challenge will be to harness AI's potential for good while addressing the ethical and societal issues that arise. Whether it's through smarter healthcare, more efficient transportation, or enhanced creativity, AI has the potential to reshape the world in ways we are only beginning to imagine. The journey of AI is far from over, and its impact will be felt for generations to come. `; - while (modalCount === 0) { - await page.getByText("New Flow", { exact: true }).click(); - await page.waitForTimeout(3000); - modalCount = await page.getByTestId("modal-title")?.count(); - } + 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("add_note").click(); + await page.waitForSelector('[data-testid="blank-flow"]', { + timeout: 30000, + }); + await page.getByTestId("blank-flow").click(); + await page.getByTestId("add_note").click(); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - const targetElement = await page.locator('//*[@id="react-flow-id"]'); - await targetElement.click(); + const targetElement = await page.locator('//*[@id="react-flow-id"]'); + await targetElement.click(); - await page.mouse.up(); - await page.mouse.down(); + await page.mouse.up(); + await page.mouse.down(); - await page.waitForSelector('[data-testid="fit_view"]', { - timeout: 100000, - }); + 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("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); - await page.getByTestId("note_node").click(); + await page.getByTestId("note_node").click(); - await page.locator(".generic-node-desc-text").last().dblclick(); - await page.getByTestId("textarea").fill(noteText); + await page.locator(".generic-node-desc-text").last().dblclick(); + await page.getByTestId("textarea").fill(noteText); - expect(await page.getByText("2500/2500")).toBeVisible(); + expect(await page.getByText("2500/2500")).toBeVisible(); - await targetElement.click(); - const textMarkdown = await page.locator(".markdown").innerText(); + await targetElement.click(); + const textMarkdown = await page.locator(".markdown").innerText(); - const textLength = textMarkdown.length; - const noteTextLength = noteText.length; + const textLength = textMarkdown.length; + const noteTextLength = noteText.length; - expect(textLength).toBeLessThan(noteTextLength); + expect(textLength).toBeLessThan(noteTextLength); - await page.getByTestId("note_node").click(); + await page.getByTestId("note_node").click(); - let element = await page.getByTestId("note_node"); + let element = await page.getByTestId("note_node"); - let hasStyles = await element?.evaluate((el) => { - const style = window.getComputedStyle(el); - return ( - style.backgroundColor === "rgb(252, 211, 77)" || - style.backgroundColor === "rgb(253, 230, 138)" - ); - }); - expect(hasStyles).toBe(true); + let hasStyles = await element?.evaluate((el) => { + const style = window.getComputedStyle(el); + return ( + style.backgroundColor === "rgb(252, 211, 77)" || + style.backgroundColor === "rgb(253, 230, 138)" + ); + }); + expect(hasStyles).toBe(true); - await page.getByTestId("note_node").click(); + await page.getByTestId("note_node").click(); - await page.getByTestId("color_picker").click(); + await page.getByTestId("color_picker").click(); - await page.getByTestId("color_picker_button_rose").click(); - await page.waitForTimeout(1000); + await page.getByTestId("color_picker_button_rose").click(); + await page.waitForTimeout(1000); - await page.getByTestId("note_node").click(); + await page.getByTestId("note_node").click(); - element = await page.getByTestId("note_node"); + element = await page.getByTestId("note_node"); - hasStyles = await element?.evaluate((el) => { - const style = window.getComputedStyle(el); + hasStyles = await element?.evaluate((el) => { + const style = window.getComputedStyle(el); - return ( - style.backgroundColor === "rgb(253, 164, 175)" || - style.backgroundColor === "rgb(254, 205, 211)" - ); - }); - expect(hasStyles).toBe(true); + return ( + style.backgroundColor === "rgb(253, 164, 175)" || + style.backgroundColor === "rgb(254, 205, 211)" + ); + }); + expect(hasStyles).toBe(true); - await page.getByTestId("note_node").click(); - await page.getByTestId("more-options-modal").click(); + await page.getByTestId("note_node").click(); + await page.getByTestId("more-options-modal").click(); - await page.getByText("Duplicate").click(); + await page.getByText("Duplicate").click(); - let titleNumber = await page.getByText(randomTitle).count(); - expect(titleNumber).toBe(2); + let titleNumber = await page.getByText(randomTitle).count(); + expect(titleNumber).toBe(2); - await page.getByTestId("note_node").last().click(); - await page.getByTestId("more-options-modal").click(); + await page.getByTestId("note_node").last().click(); + await page.getByTestId("more-options-modal").click(); - await page.getByText("Copy").click(); + await page.getByText("Copy").click(); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page.getByTestId("fit_view").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); - targetElement.focus(); - targetElement.click(); - await page.waitForTimeout(1000); - targetElement.click(); - await page.waitForTimeout(1000); - targetElement.click(); - await page.keyboard.press(`ControlOrMeta+v`); + targetElement.focus(); + targetElement.click(); + await page.waitForTimeout(1000); + targetElement.click(); + await page.waitForTimeout(1000); + targetElement.click(); + await page.keyboard.press(`ControlOrMeta+v`); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - titleNumber = await page.getByText(randomTitle).count(); - expect(titleNumber).toBe(3); + titleNumber = await page.getByText(randomTitle).count(); + expect(titleNumber).toBe(3); - await page.getByTestId("note_node").nth(0).focus(); - await page.getByTestId("more-options-modal").click(); - await page.getByText("Delete").first().click(); + await page.getByTestId("note_node").nth(0).focus(); + await page.getByTestId("more-options-modal").click(); + await page.getByText("Delete").first().click(); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - titleNumber = await page.getByText(randomTitle).count(); + titleNumber = await page.getByText(randomTitle).count(); - expect(titleNumber).toBe(2); -}); + expect(titleNumber).toBe(2); + }, +); diff --git a/src/frontend/tests/extended/features/stop-button-playground.spec.ts b/src/frontend/tests/extended/features/stop-button-playground.spec.ts index 6e68cdad8..1e0a3455d 100644 --- a/src/frontend/tests/extended/features/stop-button-playground.spec.ts +++ b/src/frontend/tests/extended/features/stop-button-playground.spec.ts @@ -1,63 +1,64 @@ import { expect, test } from "@playwright/test"; import uaParser from "ua-parser-js"; -test("User must be able to stop building from inside Playground", async ({ - page, -}) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +test( + "User must be able to stop building from inside Playground", + { tag: ["@release", "@api"] }, + async ({ page }) => { + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - await page.waitForSelector('[id="new-project-btn"]', { - 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(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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(); - } + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); + } - await page.getByTestId("blank-flow").click(); + await page.getByTestId("blank-flow").click(); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page.getByTestId("sidebar-custom-component-button").click(); - await page.getByTitle("fit view").click(); - await page.getByTitle("zoom out").click(); - await page.getByTitle("zoom out").click(); - await page.getByTitle("zoom out").click(); + await page.getByTestId("sidebar-custom-component-button").click(); + await page.getByTitle("fit view").click(); + await page.getByTitle("zoom out").click(); + await page.getByTitle("zoom out").click(); + await page.getByTitle("zoom out").click(); - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("chat output"); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("chat output"); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page - .getByTestId("outputsChat Output") - .dragTo(page.locator('//*[@id="react-flow-id"]')); + await page + .getByTestId("outputsChat Output") + .dragTo(page.locator('//*[@id="react-flow-id"]')); - await page.getByTestId("fit_view").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); - await page.getByTestId("div-generic-node").nth(0).click(); + await page.getByTestId("div-generic-node").nth(0).click(); - await page.getByTestId("code-button-modal").nth(0).click(); + await page.getByTestId("code-button-modal").nth(0).click(); - const waitTimeoutCode = ` + const waitTimeoutCode = ` # from langflow.field_typing import Data from langflow.custom import Component from langflow.io import MessageTextInput, Output @@ -86,59 +87,60 @@ class CustomComponent(Component): sleep(60) return data`; - const getUA = await page.evaluate(() => navigator.userAgent); - const userAgentInfo = uaParser(getUA); + const getUA = await page.evaluate(() => navigator.userAgent); + const userAgentInfo = uaParser(getUA); - await page.locator(".ace_content").click(); - await page.keyboard.press(`ControlOrMeta+A`); - await page.locator("textarea").fill(waitTimeoutCode); + await page.locator(".ace_content").click(); + await page.keyboard.press(`ControlOrMeta+A`); + await page.locator("textarea").fill(waitTimeoutCode); - await page.getByText("Check & Save").last().click(); + await page.getByText("Check & Save").last().click(); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page.getByTestId("fit_view").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); - //connection 1 - const elementCustomComponentOutput = await page - .getByTestId("handle-customcomponent-shownode-output-right") - .first(); + //connection 1 + const elementCustomComponentOutput = await page + .getByTestId("handle-customcomponent-shownode-output-right") + .first(); - await elementCustomComponentOutput.hover(); - await page.mouse.down(); - const elementChatOutput = await page - .getByTestId("handle-chatoutput-shownode-text-left") - .first(); - await elementChatOutput.hover(); - await page.mouse.up(); + await elementCustomComponentOutput.hover(); + await page.mouse.down(); + const elementChatOutput = await page + .getByTestId("handle-chatoutput-shownode-text-left") + .first(); + await elementChatOutput.hover(); + await page.mouse.up(); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page.getByTestId("button_run_chat output").click(); + await page.getByTestId("button_run_chat output").click(); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page.getByText("Playground", { exact: true }).last().click(); + await page.getByText("Playground", { exact: true }).last().click(); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page.waitForSelector('[data-testid="button-stop"]', { - timeout: 30000, - }); + await page.waitForSelector('[data-testid="button-stop"]', { + timeout: 30000, + }); - const elements = await page.$$('[data-testid="button-stop"]'); + const elements = await page.$$('[data-testid="button-stop"]'); - if (elements.length > 0) { - const lastElement = elements[elements.length - 1]; - await lastElement.waitForElementState("visible"); - } + if (elements.length > 0) { + const lastElement = elements[elements.length - 1]; + await lastElement.waitForElementState("visible"); + } - expect(await page.getByTestId("button-stop").last()).toBeVisible(); + expect(await page.getByTestId("button-stop").last()).toBeVisible(); - await page.getByTestId("button-stop").last().click(); + await page.getByTestId("button-stop").last().click(); - await page.waitForSelector("text=build stopped", { timeout: 30000 }); - expect(await page.getByText("build stopped").isVisible()).toBeTruthy(); -}); + await page.waitForSelector("text=build stopped", { timeout: 30000 }); + expect(await page.getByText("build stopped").isVisible()).toBeTruthy(); + }, +); diff --git a/src/frontend/tests/extended/features/store-shard-0.spec.ts b/src/frontend/tests/extended/features/store-shard-0.spec.ts index 758934764..8b6e9f1c0 100644 --- a/src/frontend/tests/extended/features/store-shard-0.spec.ts +++ b/src/frontend/tests/extended/features/store-shard-0.spec.ts @@ -1,6 +1,6 @@ import { test } from "@playwright/test"; -test("should exists Store", async ({ page }) => { +test("should exists Store", { tag: ["@release"] }, async ({ page }) => { await page.goto("/"); await page.waitForTimeout(1000); @@ -8,7 +8,7 @@ test("should exists Store", async ({ page }) => { await page.getByTestId("button-store").isEnabled(); }); -test("should not have an API key", async ({ page }) => { +test("should not have an API key", { tag: ["@release"] }, async ({ page }) => { await page.goto("/"); await page.waitForTimeout(1000); diff --git a/src/frontend/tests/extended/features/store-shard-1.spec.ts b/src/frontend/tests/extended/features/store-shard-1.spec.ts index 633b55658..6bbf06e17 100644 --- a/src/frontend/tests/extended/features/store-shard-1.spec.ts +++ b/src/frontend/tests/extended/features/store-shard-1.spec.ts @@ -2,138 +2,146 @@ import { expect, test } from "@playwright/test"; import * as dotenv from "dotenv"; import path from "path"; -test.skip("should like and add components and flows", async ({ page }) => { - test.skip( - !process?.env?.STORE_API_KEY, - "STORE_API_KEY required to run this test", - ); - if (!process.env.CI) { - dotenv.config({ path: path.resolve(__dirname, "../../.env") }); - } - await page.goto("/"); - await page.waitForTimeout(1000); - let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); +test.skip( + "should like and add components and flows", + { tag: ["@release"] }, + async ({ page }) => { + test.skip( + !process?.env?.STORE_API_KEY, + "STORE_API_KEY required to run this test", + ); + if (!process.env.CI) { + dotenv.config({ path: path.resolve(__dirname, "../../.env") }); } - } catch (error) { - modalCount = 0; - } - while (modalCount === 0) { - await page.getByText("New Flow", { exact: true }).click(); - await page.waitForTimeout(5000); - modalCount = await page.getByTestId("modal-title")?.count(); - } - await page.getByText("Close", { exact: true }).click(); - await page.waitForTimeout(1000); - await page.getByTestId("button-store").click(); - await page.waitForTimeout(1000); - await page.getByTestId("api-key-button-store").click(); - await page - .getByPlaceholder("Insert your API Key") - .fill(process.env.STORE_API_KEY ?? ""); - await page.getByTestId("api-key-save-button-store").click(); - await page.waitForTimeout(1000); - await page.getByText("Success! Your API Key has been saved.").isVisible(); - await page.waitForTimeout(1000); - await page.getByTestId("button-store").click(); - await page.waitForSelector('[data-testid="likes-Website Content QA"]', { - timeout: 100000, - }); - await page.getByTestId("likes-Website Content QA").isVisible(); - await page.waitForTimeout(1000); - const likedValue = await page - .getByTestId("likes-Website Content QA") - .innerText(); - await page.getByTestId("like-Website Content QA").click(); - await page.waitForSelector('[data-testid="likes-Website Content QA"]', { - timeout: 100000, - }); - await page.waitForTimeout(1000); - const likedValueAfter = await page - .getByTestId("likes-Website Content QA") - .innerText(); - if (Number(likedValue) === Number(likedValueAfter)) { - expect(false).toBe(true); - } - await page.waitForSelector('[data-testid="downloads-Website Content QA"]', { - timeout: 100000, - }); - const downloadValue = await page - .getByTestId("downloads-Website Content QA") - .innerText(); - await page.waitForTimeout(1000); - await page.getByTestId("install-Website Content QA").click(); - await page.waitForTimeout(1000); - await page.getByText("Flow Installed Successfully").isVisible(); - await page.waitForTimeout(1000); - const downloadValueAfter = await page - .getByTestId("downloads-Website Content QA") - .innerText(); - if (Number(downloadValue) === Number(downloadValueAfter)) { - expect(false).toBe(true); - } - await page.getByTestId("install-Basic RAG").click(); - await page.waitForTimeout(1000); - await page.getByText("Component Installed Successfully").isVisible(); - await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { - timeout: 100000, - }); - await page.getByTestId("icon-ChevronLeft").first().click(); - await page.waitForSelector("text=Website Content QA", { timeout: 30000 }); - await page.getByText("Website Content QA").first().isVisible(); - await page.getByText("Components").first().click(); - await page.waitForTimeout(1000); - await page.waitForSelector("text=Basic RAG", { timeout: 30000 }); - await page.getByText("Basic RAG").first().isVisible(); -}); + await page.goto("/"); + await page.waitForTimeout(1000); + 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(5000); + modalCount = await page.getByTestId("modal-title")?.count(); + } + await page.getByText("Close", { exact: true }).click(); + await page.waitForTimeout(1000); + await page.getByTestId("button-store").click(); + await page.waitForTimeout(1000); + await page.getByTestId("api-key-button-store").click(); + await page + .getByPlaceholder("Insert your API Key") + .fill(process.env.STORE_API_KEY ?? ""); + await page.getByTestId("api-key-save-button-store").click(); + await page.waitForTimeout(1000); + await page.getByText("Success! Your API Key has been saved.").isVisible(); + await page.waitForTimeout(1000); + await page.getByTestId("button-store").click(); + await page.waitForSelector('[data-testid="likes-Website Content QA"]', { + timeout: 100000, + }); + await page.getByTestId("likes-Website Content QA").isVisible(); + await page.waitForTimeout(1000); + const likedValue = await page + .getByTestId("likes-Website Content QA") + .innerText(); + await page.getByTestId("like-Website Content QA").click(); + await page.waitForSelector('[data-testid="likes-Website Content QA"]', { + timeout: 100000, + }); + await page.waitForTimeout(1000); + const likedValueAfter = await page + .getByTestId("likes-Website Content QA") + .innerText(); + if (Number(likedValue) === Number(likedValueAfter)) { + expect(false).toBe(true); + } + await page.waitForSelector('[data-testid="downloads-Website Content QA"]', { + timeout: 100000, + }); + const downloadValue = await page + .getByTestId("downloads-Website Content QA") + .innerText(); + await page.waitForTimeout(1000); + await page.getByTestId("install-Website Content QA").click(); + await page.waitForTimeout(1000); + await page.getByText("Flow Installed Successfully").isVisible(); + await page.waitForTimeout(1000); + const downloadValueAfter = await page + .getByTestId("downloads-Website Content QA") + .innerText(); + if (Number(downloadValue) === Number(downloadValueAfter)) { + expect(false).toBe(true); + } + await page.getByTestId("install-Basic RAG").click(); + await page.waitForTimeout(1000); + await page.getByText("Component Installed Successfully").isVisible(); + await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { + timeout: 100000, + }); + await page.getByTestId("icon-ChevronLeft").first().click(); + await page.waitForSelector("text=Website Content QA", { timeout: 30000 }); + await page.getByText("Website Content QA").first().isVisible(); + await page.getByText("Components").first().click(); + await page.waitForTimeout(1000); + await page.waitForSelector("text=Basic RAG", { timeout: 30000 }); + await page.getByText("Basic RAG").first().isVisible(); + }, +); -test.skip("should find a searched Component on Store", async ({ page }) => { - test.skip( - !process?.env?.STORE_API_KEY, - "STORE_API_KEY required to run this test", - ); +test.skip( + "should find a searched Component on Store", + { tag: ["@release"] }, + async ({ page }) => { + test.skip( + !process?.env?.STORE_API_KEY, + "STORE_API_KEY required to run this test", + ); - if (!process.env.CI) { - dotenv.config({ path: path.resolve(__dirname, "../../.env") }); - } + if (!process.env.CI) { + dotenv.config({ path: path.resolve(__dirname, "../../.env") }); + } - await page.goto("/"); - await page.waitForTimeout(1000); + await page.goto("/"); + await page.waitForTimeout(1000); - await page.getByTestId("button-store").click(); - await page.waitForTimeout(1000); + await page.getByTestId("button-store").click(); + await page.waitForTimeout(1000); - await page.getByTestId("api-key-button-store").click(); + await page.getByTestId("api-key-button-store").click(); - await page - .getByPlaceholder("Insert your API Key") - .fill(process.env.STORE_API_KEY ?? ""); + await page + .getByPlaceholder("Insert your API Key") + .fill(process.env.STORE_API_KEY ?? ""); - await page.getByTestId("api-key-save-button-store").click(); + await page.getByTestId("api-key-save-button-store").click(); - await page.waitForTimeout(1000); - await page.getByText("Success! Your API Key has been saved.").isVisible(); + await page.waitForTimeout(1000); + await page.getByText("Success! Your API Key has been saved.").isVisible(); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page.getByTestId("button-store").click(); + await page.getByTestId("button-store").click(); - await page.waitForSelector('[data-testid="search-store-input"]', { - timeout: 100000, - }); + await page.waitForSelector('[data-testid="search-store-input"]', { + timeout: 100000, + }); - await page.getByTestId("search-store-input").fill("File Loader"); - await page.getByTestId("search-store-button").click(); - await page.getByText("File Loader").isVisible(); + await page.getByTestId("search-store-input").fill("File Loader"); + await page.getByTestId("search-store-button").click(); + await page.getByText("File Loader").isVisible(); - await page.getByTestId("search-store-input").fill("Basic RAG"); - await page.getByTestId("search-store-button").click(); - await page.getByText("Basic RAG").isVisible(); + await page.getByTestId("search-store-input").fill("Basic RAG"); + await page.getByTestId("search-store-button").click(); + await page.getByText("Basic RAG").isVisible(); - await page.getByTestId("search-store-input").fill("YouTube QA"); - await page.getByTestId("search-store-button").click(); - await page.getByText("YouTube QA").isVisible(); -}); + await page.getByTestId("search-store-input").fill("YouTube QA"); + await page.getByTestId("search-store-button").click(); + await page.getByText("YouTube QA").isVisible(); + }, +); diff --git a/src/frontend/tests/extended/features/store-shard-3.spec.ts b/src/frontend/tests/extended/features/store-shard-3.spec.ts index f7500dac7..a1e916bda 100644 --- a/src/frontend/tests/extended/features/store-shard-3.spec.ts +++ b/src/frontend/tests/extended/features/store-shard-3.spec.ts @@ -2,53 +2,57 @@ import { expect, test } from "@playwright/test"; import * as dotenv from "dotenv"; import path from "path"; -test("should order the visualization", async ({ page }) => { - test.skip( - !process?.env?.STORE_API_KEY, - "STORE_API_KEY required to run this test", - ); +test( + "should order the visualization", + { tag: ["@release"] }, + async ({ page }) => { + test.skip( + !process?.env?.STORE_API_KEY, + "STORE_API_KEY required to run this test", + ); - if (!process.env.CI) { - dotenv.config({ path: path.resolve(__dirname, "../../.env") }); - } + if (!process.env.CI) { + dotenv.config({ path: path.resolve(__dirname, "../../.env") }); + } - await page.goto("/"); - await page.waitForTimeout(1000); + await page.goto("/"); + await page.waitForTimeout(1000); - await page.getByTestId("button-store").click(); - await page.waitForTimeout(1000); + await page.getByTestId("button-store").click(); + await page.waitForTimeout(1000); - await page.getByTestId("api-key-button-store").click(); + await page.getByTestId("api-key-button-store").click(); - await page - .getByPlaceholder("Insert your API Key") - .fill(process.env.STORE_API_KEY ?? ""); + await page + .getByPlaceholder("Insert your API Key") + .fill(process.env.STORE_API_KEY ?? ""); - await page.getByTestId("api-key-save-button-store").click(); + await page.getByTestId("api-key-save-button-store").click(); - await page.waitForTimeout(1000); - await page.getByText("Success! Your API Key has been saved.").isVisible(); + await page.waitForTimeout(1000); + await page.getByText("Success! Your API Key has been saved.").isVisible(); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page.getByTestId("button-store").click(); - await page.waitForTimeout(1000); + await page.getByTestId("button-store").click(); + await page.waitForTimeout(1000); - await page.getByText("Basic RAG").isVisible(); + await page.getByText("Basic RAG").isVisible(); - await page.getByTestId("select-order-store").click(); - await page.waitForTimeout(1000); - await page.getByText("Alphabetical").click(); + await page.getByTestId("select-order-store").click(); + await page.waitForTimeout(1000); + await page.getByText("Alphabetical").click(); - await page.getByText("Album Cover Builder").isVisible(); + await page.getByText("Album Cover Builder").isVisible(); - await page.getByTestId("select-order-store").click(); - await page.getByText("Popular").click(); + await page.getByTestId("select-order-store").click(); + await page.getByText("Popular").click(); - await page.getByText("Basic RAG").isVisible(); -}); + await page.getByText("Basic RAG").isVisible(); + }, +); -test("should filter by type", async ({ page }) => { +test("should filter by type", { tag: ["@release"] }, async ({ page }) => { test.skip( !process?.env?.STORE_API_KEY, "STORE_API_KEY required to run this test", diff --git a/src/frontend/tests/extended/features/twoEdges.spec.ts b/src/frontend/tests/extended/features/twoEdges.spec.ts index 70ae34f12..495bbf866 100644 --- a/src/frontend/tests/extended/features/twoEdges.spec.ts +++ b/src/frontend/tests/extended/features/twoEdges.spec.ts @@ -1,57 +1,61 @@ import { test } from "@playwright/test"; -test("user should be able to see multiple edges and interact with them", async ({ - page, -}) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +test( + "user should be able to see multiple edges and interact with them", + { tag: ["@release", "@api", "@workspace"] }, + async ({ page }) => { + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - await page.waitForSelector('[id="new-project-btn"]', { - 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(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } catch (error) { - modalCount = 0; - } - while (modalCount === 0) { - await page.getByText("New Flow", { exact: true }).click(); + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); + } + await page.waitForTimeout(1000); + + await page.getByText("Vector Store RAG", { exact: true }).last().click(); await page.waitForTimeout(3000); - modalCount = await page.getByTestId("modal-title")?.count(); - } - await page.waitForTimeout(1000); + await page.getByText("Retriever", { exact: true }).first().isVisible(); + await page.getByText("Search Results", { exact: true }).first().isVisible(); - await page.getByText("Vector Store RAG", { exact: true }).last().click(); - await page.waitForTimeout(3000); - await page.getByText("Retriever", { exact: true }).first().isVisible(); - await page.getByText("Search Results", { exact: true }).first().isVisible(); + const focusElementsOnBoard = async ({ page }) => { + await page.waitForSelector('[data-testid="fit_view"]', { + timeout: 30000, + }); + const focusElements = await page.getByTestId("fit_view"); + await focusElements.click(); + }; - const focusElementsOnBoard = async ({ page }) => { - await page.waitForSelector('[data-testid="fit_view"]', { timeout: 30000 }); - const focusElements = await page.getByTestId("fit_view"); - await focusElements.click(); - }; + await focusElementsOnBoard({ page }); - await focusElementsOnBoard({ page }); + 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(); + await page.getByTestId("input-inspection-retriever").first().click(); + await page.getByText("Retriever", { exact: true }).first().isHidden(); + await page.getByTestId("icon-ChevronDown").last().isVisible(); + await page.getByTestId("icon-ChevronDown").last().click(); + await page.getByText("Retriever", { exact: true }).first().isVisible(); + await page.getByText("Search Results", { exact: true }).first().isVisible(); - await page.getByTestId("input-inspection-retriever").first().click(); - await page.getByText("Retriever", { exact: true }).first().isHidden(); - await page.getByTestId("icon-ChevronDown").last().isVisible(); - await page.getByTestId("icon-ChevronDown").last().click(); - await page.getByText("Retriever", { exact: true }).first().isVisible(); - await page.getByText("Search Results", { exact: true }).first().isVisible(); - - await page.getByTestId("icon-EyeOff").nth(0).isVisible(); -}); + await page.getByTestId("icon-EyeOff").nth(0).isVisible(); + }, +); diff --git a/src/frontend/tests/extended/features/userSettings.spec.ts b/src/frontend/tests/extended/features/userSettings.spec.ts index 5d5226db1..3f518d091 100644 --- a/src/frontend/tests/extended/features/userSettings.spec.ts +++ b/src/frontend/tests/extended/features/userSettings.spec.ts @@ -1,111 +1,124 @@ import { test } from "@playwright/test"; -test("should see general profile gradient", async ({ page }) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +test( + "should see general profile gradient", + { tag: ["@release"] }, - await page.waitForSelector('[id="new-project-btn"]', { - timeout: 30000, - }); - await page.getByTestId("user-profile-settings").click(); - await page.waitForTimeout(1000); + async ({ page }) => { + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - await page.getByText("Settings").click(); - await page.waitForTimeout(2000); + await page.waitForSelector('[id="new-project-btn"]', { + timeout: 30000, + }); + await page.getByTestId("user-profile-settings").click(); + await page.waitForTimeout(1000); - await page.getByText("General").nth(2).isVisible(); - await page.getByText("Profile Gradient").isVisible(); -}); + await page.getByText("Settings").click(); + await page.waitForTimeout(2000); -test("should interact with global variables", async ({ page }) => { - const randomName = Math.random().toString(36).substring(2); - const randomName2 = Math.random().toString(36).substring(2); - const randomName3 = Math.random().toString(36).substring(2); + await page.getByText("General").nth(2).isVisible(); + await page.getByText("Profile Gradient").isVisible(); + }, +); - await page.goto("/"); - await page.waitForTimeout(1000); - await page.getByTestId("user-profile-settings").click(); - await page.getByText("Settings").click(); - await page.getByText("Global Variables").click(); - await page.getByText("Global Variables").nth(2); - await page.getByText("Global Variables", { exact: true }).nth(1).isVisible(); - await page.getByText("Add New").click(); - await page - .getByPlaceholder("Insert a name for the variable...") - .fill(randomName); - await page.getByTestId("select-type-global-variables").first().click(); - await page.getByText("Generic", { exact: true }).last().isVisible(); - await page.getByText("Generic", { exact: true }).last().click(); +test( + "should interact with global variables", + { tag: ["@release", "@workspace", "@api"] }, - await page - .getByPlaceholder("Insert a value for the variable...") - .fill("testtesttesttesttesttesttesttest"); - await page.getByTestId("popover-anchor-apply-to-fields").click(); + async ({ page }) => { + const randomName = Math.random().toString(36).substring(2); + const randomName2 = Math.random().toString(36).substring(2); + const randomName3 = Math.random().toString(36).substring(2); - await page.waitForTimeout(1000); + await page.goto("/"); + await page.waitForTimeout(1000); + await page.getByTestId("user-profile-settings").click(); + await page.getByText("Settings").click(); + await page.getByText("Global Variables").click(); + await page.getByText("Global Variables").nth(2); + await page + .getByText("Global Variables", { exact: true }) + .nth(1) + .isVisible(); + await page.getByText("Add New").click(); + await page + .getByPlaceholder("Insert a name for the variable...") + .fill(randomName); + await page.getByTestId("select-type-global-variables").first().click(); + await page.getByText("Generic", { exact: true }).last().isVisible(); + await page.getByText("Generic", { exact: true }).last().click(); - await page.getByPlaceholder("Search options...").fill("System"); + await page + .getByPlaceholder("Insert a value for the variable...") + .fill("testtesttesttesttesttesttesttest"); + await page.getByTestId("popover-anchor-apply-to-fields").click(); - await page.waitForTimeout(500); + await page.waitForTimeout(1000); - await page.waitForSelector("text=System", { timeout: 30000 }); + await page.getByPlaceholder("Search options...").fill("System"); - await page.waitForTimeout(500); + await page.waitForTimeout(500); - await page.getByText("System").last().click(); + await page.waitForSelector("text=System", { timeout: 30000 }); - await page.getByPlaceholder("Search options...").fill("openAI"); + await page.waitForTimeout(500); - await page.waitForSelector("text=openai", { timeout: 30000 }); + await page.getByText("System").last().click(); - await page.waitForTimeout(500); + await page.getByPlaceholder("Search options...").fill("openAI"); - await page.getByText("openai").last().click(); + await page.waitForSelector("text=openai", { timeout: 30000 }); - await page.waitForTimeout(500); + await page.waitForTimeout(500); - await page.getByPlaceholder("Search options...").fill("ollama"); + await page.getByText("openai").last().click(); - await page.keyboard.press("Escape"); - await page.getByText("Save Variable", { exact: true }).click(); + await page.waitForTimeout(500); - await page.getByText(randomName).last().isVisible(); + await page.getByPlaceholder("Search options...").fill("ollama"); - await page.getByText(randomName).last().click(); - await page.getByText(randomName).last().click(); + await page.keyboard.press("Escape"); + await page.getByText("Save Variable", { exact: true }).click(); - await page.waitForTimeout(500); + await page.getByText(randomName).last().isVisible(); - await page - .getByPlaceholder("Insert a name for the variable...") - .fill(randomName2); + await page.getByText(randomName).last().click(); + await page.getByText(randomName).last().click(); - await page.getByText("Update Variable", { exact: true }).last().click(); + await page.waitForTimeout(500); - await page.getByText(randomName2).last().isVisible(); + await page + .getByPlaceholder("Insert a name for the variable...") + .fill(randomName2); - await page.getByText(randomName2).last().click(); + await page.getByText("Update Variable", { exact: true }).last().click(); - await page.waitForTimeout(500); + await page.getByText(randomName2).last().isVisible(); - await page - .getByPlaceholder("Insert a name for the variable...") - .fill(randomName3); + await page.getByText(randomName2).last().click(); - await page.getByText("Update Variable", { exact: true }).last().click(); + await page.waitForTimeout(500); - await page.getByText(randomName3).last().isVisible(); + await page + .getByPlaceholder("Insert a name for the variable...") + .fill(randomName3); - await page.waitForTimeout(2000); + await page.getByText("Update Variable", { exact: true }).last().click(); - await page.locator(".ag-checkbox-input").first().click(); - await page.getByTestId("icon-Trash2").click(); - await page.getByText("No data available").isVisible(); -}); + await page.getByText(randomName3).last().isVisible(); -test("should see shortcuts", async ({ page }) => { + await page.waitForTimeout(2000); + + await page.locator(".ag-checkbox-input").first().click(); + await page.getByTestId("icon-Trash2").click(); + await page.getByText("No data available").isVisible(); + }, +); + +test("should see shortcuts", { tag: ["@release"] }, async ({ page }) => { await page.goto("/"); await page.waitForSelector('[data-testid="mainpage_title"]', { timeout: 30000, @@ -144,25 +157,30 @@ test("should see shortcuts", async ({ page }) => { await page.getByText("Reset Columns").last().isVisible(); }); -test("should interact with API Keys", async ({ page }) => { - await page.goto("/"); - await page.waitForTimeout(1000); - await page.getByTestId("user-profile-settings").click(); - await page.getByText("Settings").click(); - await page.getByText("Langflow API").first().click(); - await page.getByText("Langflow API", { exact: true }).nth(1).isVisible(); - await page.getByText("Add New").click(); - await page.getByPlaceholder("Insert a name for your API Key").isVisible(); +test( + "should interact with API Keys", + { tag: ["@release", "@api"] }, - const randomName = Math.random().toString(36).substring(2); + async ({ page }) => { + await page.goto("/"); + await page.waitForTimeout(1000); + await page.getByTestId("user-profile-settings").click(); + await page.getByText("Settings").click(); + await page.getByText("Langflow API").first().click(); + await page.getByText("Langflow API", { exact: true }).nth(1).isVisible(); + await page.getByText("Add New").click(); + await page.getByPlaceholder("Insert a name for your API Key").isVisible(); - await page - .getByPlaceholder("Insert a name for your API Key") - .fill(randomName); - await page.getByText("Create Secret Key", { exact: true }).click(); - await page.getByText("Please save").isVisible(); - await page.getByTestId("icon-Copy").click(); - await page.waitForTimeout(1000); - await page.getByText("Api Key Copied!").isVisible(); - await page.getByText(randomName).isVisible(); -}); + const randomName = Math.random().toString(36).substring(2); + + await page + .getByPlaceholder("Insert a name for your API Key") + .fill(randomName); + await page.getByText("Create Secret Key", { exact: true }).click(); + await page.getByText("Please save").isVisible(); + await page.getByTestId("icon-Copy").click(); + await page.waitForTimeout(1000); + await page.getByText("Api Key Copied!").isVisible(); + await page.getByText(randomName).isVisible(); + }, +); diff --git a/src/frontend/tests/extended/integrations/chatInputOutputUser-shard-1.spec.ts b/src/frontend/tests/extended/integrations/chatInputOutputUser-shard-1.spec.ts index b2452a2ca..5e325a0f2 100644 --- a/src/frontend/tests/extended/integrations/chatInputOutputUser-shard-1.spec.ts +++ b/src/frontend/tests/extended/integrations/chatInputOutputUser-shard-1.spec.ts @@ -2,88 +2,94 @@ import { test } from "@playwright/test"; import * as dotenv from "dotenv"; import path from "path"; -test("user must be able to see output inspection", async ({ page }) => { - test.skip( - !process?.env?.OPENAI_API_KEY, - "OPENAI_API_KEY required to run this test", - ); +test( + "user must be able to see output inspection", + { 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.waitForTimeout(1000); - - let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); + if (!process.env.CI) { + dotenv.config({ path: path.resolve(__dirname, "../../.env") }); } - } 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.goto("/"); - await page.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Basic Prompting" }).click(); - 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 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(); + 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.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Basic Prompting" }).click(); + 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 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); - filledApiKey = await page.getByTestId("remove-icon-badge").count(); - } + await page.getByTestId("button_run_chat output").last().click(); - const apiKeyInput = page.getByTestId("popover-anchor-input-api_key"); - const isApiKeyInputVisible = await apiKeyInput.isVisible(); + await page.waitForSelector("text=built successfully", { timeout: 30000 }); - if (isApiKeyInputVisible) { - await apiKeyInput.fill(process.env.OPENAI_API_KEY ?? ""); - } + await page.getByText("built successfully").last().click({ + timeout: 15000, + }); - await page.getByTestId("dropdown_str_model_name").click(); - await page.getByTestId("gpt-4o-1-option").click(); + await page.waitForSelector('[data-testid="icon-ScanEye"]', { + timeout: 30000, + }); - await page.waitForTimeout(1000); - await page.getByTestId("button_run_chat output").last().click(); + await page.getByTestId("icon-ScanEye").nth(4).click(); - await page.waitForSelector("text=built successfully", { timeout: 30000 }); - - await page.getByText("built successfully").last().click({ - timeout: 15000, - }); - - await page.waitForSelector('[data-testid="icon-ScanEye"]', { - timeout: 30000, - }); - - await page.getByTestId("icon-ScanEye").nth(4).click(); - - await page.getByText("Sender", { exact: true }).isVisible(); - await page.getByText("Type", { exact: true }).isVisible(); - await page.getByText("User", { exact: true }).last().isVisible(); -}); + await page.getByText("Sender", { exact: true }).isVisible(); + await page.getByText("Type", { exact: true }).isVisible(); + await page.getByText("User", { exact: true }).last().isVisible(); + }, +); diff --git a/src/frontend/tests/extended/integrations/chatInputOutputUser-shard-2.spec.ts b/src/frontend/tests/extended/integrations/chatInputOutputUser-shard-2.spec.ts index 73d7ecbe0..868716e4d 100644 --- a/src/frontend/tests/extended/integrations/chatInputOutputUser-shard-2.spec.ts +++ b/src/frontend/tests/extended/integrations/chatInputOutputUser-shard-2.spec.ts @@ -2,156 +2,162 @@ import { expect, test } from "@playwright/test"; import * as dotenv from "dotenv"; import path from "path"; -test("user must interact with chat with Input/Output", 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.waitForTimeout(1000); - - 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.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Basic Prompting" }).click(); - 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 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.waitForSelector('[data-testid="input-chat-playground"]', { - timeout: 100000, - }); - - await page.getByTestId("input-chat-playground").fill("Hello, how are you?"); - - await page.waitForSelector('[data-testid="button-send"]', { - timeout: 100000, - }); - - await page.getByTestId("button-send").click(); - let valueUser = await page.getByTestId("sender_name_user").textContent(); - - await page.waitForSelector('[data-testid="sender_name_ai"]', { - timeout: 100000, - }); - - let valueAI = await page.getByTestId("sender_name_ai").textContent(); - - expect(valueUser).toBe("User"); - expect(valueAI).toContain("AI"); - - await page.keyboard.press("Escape"); - - await page - .getByTestId("textarea_str_input_value") - .nth(0) - .fill( - "testtesttesttesttesttestte;.;.,;,.;,.;.,;,..,;;;;;;;;;;;;;;;;;;;;;,;.;,.;,.,;.,;.;.,~~çççççççççççççççççççççççççççççççççççççççisdajfdasiopjfaodisjhvoicxjiovjcxizopjviopasjioasfhjaiohf23432432432423423sttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttestççççççççççççççççççççççççççççççççç,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,!", +test( + "user must interact with chat with Input/Output", + { tag: ["@release", "@components"] }, + async ({ page }) => { + test.skip( + !process?.env?.OPENAI_API_KEY, + "OPENAI_API_KEY required to run this test", ); - await page.getByText("Playground", { exact: true }).last().click(); - await page.waitForSelector('[data-testid="button-send"]', { - timeout: 100000, - }); + if (!process.env.CI) { + dotenv.config({ path: path.resolve(__dirname, "../../.env") }); + } - await page.getByTestId("button-send").click(); - await page.getByText("Close", { exact: true }).click(); - await page.getByText("Chat Input", { exact: true }).click(); - await page.getByTestId("edit-button-modal").click(); - await page.getByTestId("showsender_name").click(); - await page.getByText("Close").last().click(); + await page.goto("/"); - await page.getByText("Chat Output", { exact: true }).click(); - await page.getByTestId("edit-button-modal").click(); - await page.getByTestId("showsender_name").click(); - await page.getByText("Close").last().click(); + await page.waitForTimeout(1000); - await page - .getByTestId("popover-anchor-input-sender_name") - .nth(1) - .fill("TestSenderNameUser"); - await page - .getByTestId("popover-anchor-input-sender_name") - .nth(0) - .fill("TestSenderNameAI"); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; + } - await page.getByText("Playground", { exact: true }).last().click(); + 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="button-send"]', { - timeout: 100000, - }); + await page.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Basic Prompting" }).click(); + await page.waitForSelector('[data-testid="fit_view"]', { + timeout: 100000, + }); - await page.getByTestId("button-send").click(); + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); - valueUser = await page - .getByTestId("sender_name_testsendernameuser") - .textContent(); - valueAI = await page - .getByTestId("sender_name_testsendernameai") - .textContent(); + let outdatedComponents = await page + .getByTestId("icon-AlertTriangle") + .count(); - expect(valueUser).toContain("TestSenderNameUser"); - expect(valueAI).toContain("TestSenderNameAI"); + 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.waitForSelector('[data-testid="input-chat-playground"]', { + timeout: 100000, + }); + + await page.getByTestId("input-chat-playground").fill("Hello, how are you?"); + + await page.waitForSelector('[data-testid="button-send"]', { + timeout: 100000, + }); + + await page.getByTestId("button-send").click(); + let valueUser = await page.getByTestId("sender_name_user").textContent(); + + await page.waitForSelector('[data-testid="sender_name_ai"]', { + timeout: 100000, + }); + + let valueAI = await page.getByTestId("sender_name_ai").textContent(); + + expect(valueUser).toBe("User"); + expect(valueAI).toContain("AI"); + + await page.keyboard.press("Escape"); - expect( await page - .getByText( + .getByTestId("textarea_str_input_value") + .nth(0) + .fill( "testtesttesttesttesttestte;.;.,;,.;,.;.,;,..,;;;;;;;;;;;;;;;;;;;;;,;.;,.;,.,;.,;.;.,~~çççççççççççççççççççççççççççççççççççççççisdajfdasiopjfaodisjhvoicxjiovjcxizopjviopasjioasfhjaiohf23432432432423423sttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttestççççççççççççççççççççççççççççççççç,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,!", - { exact: true }, - ) - .isVisible(), - ); -}); + ); + await page.getByText("Playground", { exact: true }).last().click(); + + await page.waitForSelector('[data-testid="button-send"]', { + timeout: 100000, + }); + + await page.getByTestId("button-send").click(); + await page.getByText("Close", { exact: true }).click(); + await page.getByText("Chat Input", { exact: true }).click(); + await page.getByTestId("edit-button-modal").click(); + await page.getByTestId("showsender_name").click(); + await page.getByText("Close").last().click(); + + await page.getByText("Chat Output", { exact: true }).click(); + await page.getByTestId("edit-button-modal").click(); + await page.getByTestId("showsender_name").click(); + await page.getByText("Close").last().click(); + + await page + .getByTestId("popover-anchor-input-sender_name") + .nth(1) + .fill("TestSenderNameUser"); + await page + .getByTestId("popover-anchor-input-sender_name") + .nth(0) + .fill("TestSenderNameAI"); + + await page.getByText("Playground", { exact: true }).last().click(); + + await page.waitForSelector('[data-testid="button-send"]', { + timeout: 100000, + }); + + await page.getByTestId("button-send").click(); + + valueUser = await page + .getByTestId("sender_name_testsendernameuser") + .textContent(); + valueAI = await page + .getByTestId("sender_name_testsendernameai") + .textContent(); + + expect(valueUser).toContain("TestSenderNameUser"); + expect(valueAI).toContain("TestSenderNameAI"); + + expect( + await page + .getByText( + "testtesttesttesttesttestte;.;.,;,.;,.;.,;,..,;;;;;;;;;;;;;;;;;;;;;,;.;,.;,.,;.,;.;.,~~çççççççççççççççççççççççççççççççççççççççisdajfdasiopjfaodisjhvoicxjiovjcxizopjviopasjioasfhjaiohf23432432432423423sttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttesttestççççççççççççççççççççççççççççççççç,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,!", + { exact: true }, + ) + .isVisible(), + ); + }, +); diff --git a/src/frontend/tests/extended/integrations/duckduckgo.spec.ts b/src/frontend/tests/extended/integrations/duckduckgo.spec.ts index e5aed115d..cdb0a0e15 100644 --- a/src/frontend/tests/extended/integrations/duckduckgo.spec.ts +++ b/src/frontend/tests/extended/integrations/duckduckgo.spec.ts @@ -1,78 +1,80 @@ import { expect, test } from "@playwright/test"; -test("user should be able to use duckduckgo search component", async ({ - page, -}) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +test( + "user should be able to use duckduckgo search component", + { tag: ["@release", "@components"] }, + async ({ page }) => { + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - await page.waitForSelector('[id="new-project-btn"]', { - 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(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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(); - } + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); + } - await page.getByTestId("blank-flow").click(); - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("duck"); + await page.getByTestId("blank-flow").click(); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("duck"); - await page.waitForTimeout(1000); - - await page - .locator('//*[@id="toolsDuckDuckGo Search"]') - .dragTo(page.locator('//*[@id="react-flow-id"]')); - await page.mouse.up(); - await page.mouse.down(); - await page.getByTestId("fit_view").click(); - - await page - .getByTestId("popover-anchor-input-input_value") - .fill("what is langflow?"); - - await page.getByTestId("button_run_duckduckgo search").click(); - - await page.getByTestId("fit_view").click(); - - const result = await Promise.race([ - page.waitForSelector("text=built successfully", { timeout: 30000 }), - page.waitForSelector("text=ratelimit", { timeout: 30000 }), - ]); - - if (result) { - const isBuiltSuccessfully = - (await page.evaluate((el) => el.textContent, result))?.includes( - "built successfully", - ) ?? false; - - await page.waitForTimeout(500); - await page.getByTestId("output-inspection-data").first().click(); await page.waitForTimeout(1000); - if (isBuiltSuccessfully) { - await page.getByRole("gridcell").first().click(); - const searchResults = await page.getByPlaceholder("Empty").inputValue(); - expect(searchResults.length).toBeGreaterThan(10); - expect(searchResults.toLowerCase()).toContain("langflow"); - } else { - const value = await page.getByPlaceholder("Empty").inputValue(); - expect(value.length).toBeGreaterThan(10); - expect(value.toLowerCase()).toContain("ratelimit"); + await page + .locator('//*[@id="toolsDuckDuckGo Search"]') + .dragTo(page.locator('//*[@id="react-flow-id"]')); + await page.mouse.up(); + await page.mouse.down(); + await page.getByTestId("fit_view").click(); + + await page + .getByTestId("popover-anchor-input-input_value") + .fill("what is langflow?"); + + await page.getByTestId("button_run_duckduckgo search").click(); + + await page.getByTestId("fit_view").click(); + + const result = await Promise.race([ + page.waitForSelector("text=built successfully", { timeout: 30000 }), + page.waitForSelector("text=ratelimit", { timeout: 30000 }), + ]); + + if (result) { + const isBuiltSuccessfully = + (await page.evaluate((el) => el.textContent, result))?.includes( + "built successfully", + ) ?? false; + + await page.waitForTimeout(500); + await page.getByTestId("output-inspection-data").first().click(); + await page.waitForTimeout(1000); + + if (isBuiltSuccessfully) { + await page.getByRole("gridcell").first().click(); + const searchResults = await page.getByPlaceholder("Empty").inputValue(); + expect(searchResults.length).toBeGreaterThan(10); + expect(searchResults.toLowerCase()).toContain("langflow"); + } else { + const value = await page.getByPlaceholder("Empty").inputValue(); + expect(value.length).toBeGreaterThan(10); + expect(value.toLowerCase()).toContain("ratelimit"); + } } - } -}); + }, +); diff --git a/src/frontend/tests/extended/integrations/youtube-transcripts.spec.ts b/src/frontend/tests/extended/integrations/youtube-transcripts.spec.ts index 9678d26c6..5d7dc8e57 100644 --- a/src/frontend/tests/extended/integrations/youtube-transcripts.spec.ts +++ b/src/frontend/tests/extended/integrations/youtube-transcripts.spec.ts @@ -1,72 +1,76 @@ import { expect, test } from "@playwright/test"; -test("user should be able to use youtube transcripts component", async ({ - page, -}) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +test( + "user should be able to use youtube transcripts component", + { tag: ["@release", "@components"] }, + async ({ page }) => { + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - await page.waitForSelector('[id="new-project-btn"]', { - 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(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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(); - } + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); + } - await page.getByTestId("blank-flow").click(); - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("youtube"); + await page.getByTestId("blank-flow").click(); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("youtube"); - await page.waitForTimeout(1000); - - await page - .locator('//*[@id="toolsYouTube Transcripts"]') - .dragTo(page.locator('//*[@id="react-flow-id"]')); - await page.mouse.up(); - await page.mouse.down(); - await page.getByTestId("fit_view").click(); - - 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(); - } - await page - .getByTestId("textarea_str_url") - .fill("https://www.youtube.com/watch?v=VqhCQZaH4Vs"); + await page + .locator('//*[@id="toolsYouTube Transcripts"]') + .dragTo(page.locator('//*[@id="react-flow-id"]')); + await page.mouse.up(); + await page.mouse.down(); + await page.getByTestId("fit_view").click(); - await page.getByTestId("textarea_str_language").fill("en"); + let outdatedComponents = await page + .getByTestId("icon-AlertTriangle") + .count(); - await page.getByTestId("button_run_youtube transcripts").click(); + while (outdatedComponents > 0) { + await page.getByTestId("icon-AlertTriangle").first().click(); + await page.waitForTimeout(1000); + outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); + } - await page.waitForSelector("text=built successfully", { timeout: 30000 }); + await page + .getByTestId("textarea_str_url") + .fill("https://www.youtube.com/watch?v=VqhCQZaH4Vs"); - await page.getByTestId("output-inspection-data").first().click(); + await page.getByTestId("textarea_str_language").fill("en"); - await page.waitForTimeout(1000); + await page.getByTestId("button_run_youtube transcripts").click(); - await page.getByRole("gridcell").first().click(); + await page.waitForSelector("text=built successfully", { timeout: 30000 }); - await page.waitForTimeout(1000); + await page.getByTestId("output-inspection-data").first().click(); - const value = await page.getByPlaceholder("Empty").inputValue(); - expect(value.length).toBeGreaterThan(10); -}); + await page.waitForTimeout(1000); + + await page.getByRole("gridcell").first().click(); + + await page.waitForTimeout(1000); + + const value = await page.getByPlaceholder("Empty").inputValue(); + expect(value.length).toBeGreaterThan(10); + }, +); diff --git a/src/frontend/tests/extended/regression/general-bugs-shard-3836.spec.ts b/src/frontend/tests/extended/regression/general-bugs-shard-3836.spec.ts index 8e3c824ef..dbb017926 100644 --- a/src/frontend/tests/extended/regression/general-bugs-shard-3836.spec.ts +++ b/src/frontend/tests/extended/regression/general-bugs-shard-3836.spec.ts @@ -2,124 +2,128 @@ import { expect, test } from "@playwright/test"; import * as dotenv from "dotenv"; import path from "path"; -test("user must be able to send an image on chat using advanced tool on ChatInputComponent", async ({ - page, -}) => { - test.skip( - !process?.env?.OPENAI_API_KEY, - "OPENAI_API_KEY required to run this test", - ); +test( + "user must be able to send an image on chat using advanced tool on ChatInputComponent", + { 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.waitForTimeout(1000); - - let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); + if (!process.env.CI) { + dotenv.config({ path: path.resolve(__dirname, "../../.env") }); } - } 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.goto("/"); - await page.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Basic Prompting" }).click(); - 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 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(); - } + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; + } - const apiKeyInput = page.getByTestId("popover-anchor-input-api_key"); - const isApiKeyInputVisible = await apiKeyInput.isVisible(); + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); + } - if (isApiKeyInputVisible) { - await apiKeyInput.fill(process.env.OPENAI_API_KEY ?? ""); - } + await page.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Basic Prompting" }).click(); + await page.waitForSelector('[data-testid="fit_view"]', { + timeout: 100000, + }); - await page.getByTestId("dropdown_str_model_name").click(); - await page.getByTestId("gpt-4o-1-option").click(); + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); - await page.waitForSelector("text=Chat Input", { timeout: 30000 }); + let outdatedComponents = await page + .getByTestId("icon-AlertTriangle") + .count(); - await page.getByText("Chat Input", { exact: true }).click(); - await page.getByTestId("more-options-modal").click(); - await page.getByTestId("advanced-button-modal").click(); - await page.getByTestId("showfiles").click(); - await page.getByText("Close").last().click(); + while (outdatedComponents > 0) { + await page.getByTestId("icon-AlertTriangle").first().click(); + await page.waitForTimeout(1000); + outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); + } - await page.waitForTimeout(500); + 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 userQuestion = "What is this image?"; - await page.getByTestId("textarea_str_input_value").fill(userQuestion); + const apiKeyInput = page.getByTestId("popover-anchor-input-api_key"); + const isApiKeyInputVisible = await apiKeyInput.isVisible(); - const filePath = "tests/assets/chain.png"; + if (isApiKeyInputVisible) { + await apiKeyInput.fill(process.env.OPENAI_API_KEY ?? ""); + } - await page.click('[data-testid="button_upload_file"]'); + await page.getByTestId("dropdown_str_model_name").click(); + await page.getByTestId("gpt-4o-1-option").click(); - const [fileChooser] = await Promise.all([ - page.waitForEvent("filechooser"), - page.click('[data-testid="button_upload_file"]'), - ]); + await page.waitForSelector("text=Chat Input", { timeout: 30000 }); - await fileChooser.setFiles(filePath); + await page.getByText("Chat Input", { exact: true }).click(); + await page.getByTestId("more-options-modal").click(); + await page.getByTestId("advanced-button-modal").click(); + await page.getByTestId("showfiles").click(); + await page.getByText("Close").last().click(); - await page.keyboard.press("Escape"); + await page.waitForTimeout(500); - await page.getByTestId("button_run_chat output").click(); - await page.getByText("built successfully").last().click({ - timeout: 15000, - }); + const userQuestion = "What is this image?"; + await page.getByTestId("textarea_str_input_value").fill(userQuestion); - await page.getByText("Playground", { exact: true }).last().click(); + const filePath = "tests/assets/chain.png"; - await page.waitForTimeout(500); + await page.click('[data-testid="button_upload_file"]'); - await page.waitForSelector('[data-testid="button-send"]', { - timeout: 100000, - }); + const [fileChooser] = await Promise.all([ + page.waitForEvent("filechooser"), + page.click('[data-testid="button_upload_file"]'), + ]); - await page.waitForSelector("text=chain.png", { timeout: 30000 }); + await fileChooser.setFiles(filePath); - expect(await page.getByAltText("generated image").isVisible()).toBeTruthy(); + await page.keyboard.press("Escape"); - expect( - await page.getByTestId(`chat-message-User-${userQuestion}`).isVisible(), - ).toBeTruthy(); + await page.getByTestId("button_run_chat output").click(); + await page.getByText("built successfully").last().click({ + timeout: 15000, + }); - const textContents = await page - .getByTestId("div-chat-message") - .allTextContents(); + await page.getByText("Playground", { exact: true }).last().click(); - expect(textContents[0]).toContain("chain"); -}); + await page.waitForTimeout(500); + + await page.waitForSelector('[data-testid="button-send"]', { + timeout: 100000, + }); + + await page.waitForSelector("text=chain.png", { timeout: 30000 }); + + expect(await page.getByAltText("generated image").isVisible()).toBeTruthy(); + + expect( + await page.getByTestId(`chat-message-User-${userQuestion}`).isVisible(), + ).toBeTruthy(); + + const textContents = await page + .getByTestId("div-chat-message") + .allTextContents(); + + expect(textContents[0]).toContain("chain"); + }, +); diff --git a/src/frontend/tests/extended/regression/general-bugs-shard-3909.spec.ts b/src/frontend/tests/extended/regression/general-bugs-shard-3909.spec.ts index dd0cac53f..e0be7b7b2 100644 --- a/src/frontend/tests/extended/regression/general-bugs-shard-3909.spec.ts +++ b/src/frontend/tests/extended/regression/general-bugs-shard-3909.spec.ts @@ -2,72 +2,78 @@ import { expect, test } from "@playwright/test"; import * as dotenv from "dotenv"; import path from "path"; -test("user must be able to create a new flow clicking on New Flow button", async ({ - page, -}) => { - test.skip( - !process?.env?.OPENAI_API_KEY, - "OPENAI_API_KEY required to run this test", - ); +test( + "user must be able to create a new flow clicking on New Flow button", + { tag: ["@release"] }, + 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.waitForTimeout(1000); - - let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); + if (!process.env.CI) { + dotenv.config({ path: path.resolve(__dirname, "../../.env") }); } - } catch (error) { - modalCount = 0; - } - while (modalCount === 0) { + await page.goto("/"); + + await page.waitForTimeout(1000); + + 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.getByText("Close").last().click(); + + await page.getByTestId("add-folder-button").click(); + + await page.getByText("New Folder").last().click(); + + await page.waitForSelector("text=new flow", { timeout: 30000 }); + + await page.waitForTimeout(1000); + + expect( + ( + await page.waitForSelector("text=new flow", { + timeout: 30000, + }) + ).isVisible(), + ); + await page.getByText("New Flow", { exact: true }).click(); - await page.waitForTimeout(3000); - modalCount = await page.getByTestId("modal-title")?.count(); - } - await page.getByText("Close").last().click(); + await page.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Basic Prompting" }).click(); + await page.waitForSelector("text=playground", { timeout: 30000 }); + await page.waitForSelector("text=api", { timeout: 30000 }); + await page.waitForSelector("text=share", { timeout: 30000 }); - await page.getByTestId("add-folder-button").click(); + await page.waitForTimeout(1000); - await page.getByText("New Folder").last().click(); - - await page.waitForSelector("text=new flow", { timeout: 30000 }); - - await page.waitForTimeout(1000); - - expect( - ( - await page.waitForSelector("text=new flow", { - timeout: 30000, - }) - ).isVisible(), - ); - - await page.getByText("New Flow", { exact: true }).click(); - - await page.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Basic Prompting" }).click(); - await page.waitForSelector("text=playground", { timeout: 30000 }); - await page.waitForSelector("text=api", { timeout: 30000 }); - await page.waitForSelector("text=share", { timeout: 30000 }); - - await page.waitForTimeout(1000); - - expect( - await page.getByTestId("button_run_chat output").isVisible(), - ).toBeTruthy(); - expect(await page.getByTestId("button_run_openai").isVisible()).toBeTruthy(); - expect(await page.getByTestId("button_run_prompt").isVisible()).toBeTruthy(); - expect( - await page.getByTestId("button_run_chat input").isVisible(), - ).toBeTruthy(); -}); + expect( + await page.getByTestId("button_run_chat output").isVisible(), + ).toBeTruthy(); + expect( + await page.getByTestId("button_run_openai").isVisible(), + ).toBeTruthy(); + expect( + await page.getByTestId("button_run_prompt").isVisible(), + ).toBeTruthy(); + expect( + await page.getByTestId("button_run_chat input").isVisible(), + ).toBeTruthy(); + }, +); diff --git a/src/frontend/tests/extended/regression/generalBugs-shard-1.spec.ts b/src/frontend/tests/extended/regression/generalBugs-shard-1.spec.ts index 2cda5540f..a3536689b 100644 --- a/src/frontend/tests/extended/regression/generalBugs-shard-1.spec.ts +++ b/src/frontend/tests/extended/regression/generalBugs-shard-1.spec.ts @@ -2,106 +2,112 @@ import { test } from "@playwright/test"; import * as dotenv from "dotenv"; import path from "path"; -test("should delete rows from table message", 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(); +test( + "should delete rows from table message", + { tag: ["@release"] }, + 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") }); } - } catch (error) { - modalCount = 0; - } + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - 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('[id="new-project-btn"]', { + timeout: 30000, + }); - await page.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Basic Prompting" }).click(); - await page.waitForSelector('[data-testid="fit_view"]', { - timeout: 100000, - }); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; + } - await page.getByTestId("fit_view").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); + } - let outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); + await page.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Basic Prompting" }).click(); + 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 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(); - 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(); - } + await page.getByTestId("button_run_chat output").click(); + await page.waitForSelector("text=built successfully", { timeout: 30000 }); - const apiKeyInput = page.getByTestId("popover-anchor-input-api_key"); - const isApiKeyInputVisible = await apiKeyInput.isVisible(); + await page.getByText("built successfully").last().click({ + timeout: 30000, + }); - if (isApiKeyInputVisible) { - await apiKeyInput.fill(process.env.OPENAI_API_KEY ?? ""); - } + await page.waitForTimeout(2000); - await page.getByTestId("dropdown_str_model_name").click(); - await page.getByTestId("gpt-4o-1-option").click(); + await page.getByTestId("user-profile-settings").click(); - await page.waitForTimeout(1000); + await page.waitForTimeout(500); - await page.getByTestId("button_run_chat output").click(); - await page.waitForSelector("text=built successfully", { timeout: 30000 }); + await page.waitForSelector('text="Settings"'); + await page.getByText("Settings").last().click(); - await page.getByText("built successfully").last().click({ - timeout: 30000, - }); + await page.waitForSelector('text="Messages"'); + await page.getByText("Messages").last().click(); - await page.waitForTimeout(2000); + await page.waitForSelector(".ag-checkbox-input"); + await page.locator(".ag-checkbox-input").first().click(); - await page.getByTestId("user-profile-settings").click(); + await page.waitForTimeout(500); - await page.waitForTimeout(500); + await page.waitForSelector('[data-testid="icon-Trash2"]:first-child'); + await page.getByTestId("icon-Trash2").first().click(); - await page.waitForSelector('text="Settings"'); - await page.getByText("Settings").last().click(); + await page.waitForTimeout(500); - await page.waitForSelector('text="Messages"'); - await page.getByText("Messages").last().click(); - - await page.waitForSelector(".ag-checkbox-input"); - await page.locator(".ag-checkbox-input").first().click(); - - await page.waitForTimeout(500); - - await page.waitForSelector('[data-testid="icon-Trash2"]:first-child'); - await page.getByTestId("icon-Trash2").first().click(); - - await page.waitForTimeout(500); - - await page.waitForSelector("text=No Data Available", { timeout: 30000 }); - await page.getByText("No Data Available").isVisible(); -}); + await page.waitForSelector("text=No Data Available", { timeout: 30000 }); + await page.getByText("No Data Available").isVisible(); + }, +); diff --git a/src/frontend/tests/extended/regression/generalBugs-shard-10.spec.ts b/src/frontend/tests/extended/regression/generalBugs-shard-10.spec.ts index b138cde56..50a86f9a9 100644 --- a/src/frontend/tests/extended/regression/generalBugs-shard-10.spec.ts +++ b/src/frontend/tests/extended/regression/generalBugs-shard-10.spec.ts @@ -2,121 +2,125 @@ import { expect, test } from "@playwright/test"; import * as dotenv from "dotenv"; import path from "path"; -test("freeze must work correctly", async ({ page }) => { - test.skip( - !process?.env?.OPENAI_API_KEY, - "OPENAI_API_KEY required to run this test", - ); +test( + "freeze must work correctly", + { tag: ["@release", "@api", "@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.waitForTimeout(1000); - - const promptText = "answer as you are a dog"; - const newPromptText = "answer as you are a bird"; - - let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); + if (!process.env.CI) { + dotenv.config({ path: path.resolve(__dirname, "../../.env") }); } - } 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.goto("/"); + await page.waitForTimeout(1000); - await page.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Basic Prompting" }).click(); - await page.waitForTimeout(1000); + const promptText = "answer as you are a dog"; + const newPromptText = "answer as you are a bird"; - await page.getByTestId("fit_view").click(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; + } - await page.getByText("openai").first().click(); - await page.keyboard.press("Delete"); + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); + } - //connection 1 + await page.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Basic Prompting" }).click(); + await page.waitForTimeout(1000); - const elementPrompt = await page - .getByTestId("handle-prompt-shownode-prompt message-right") - .first(); - await elementPrompt.hover(); - await page.mouse.down(); + await page.getByTestId("fit_view").click(); - await page.locator('//*[@id="react-flow-id"]').hover(); + await page.getByText("openai").first().click(); + await page.keyboard.press("Delete"); - const elementChatOutput = await page - .getByTestId("handle-chatoutput-shownode-text-left") - .first(); - await elementChatOutput.hover(); - await page.mouse.up(); + //connection 1 - await page.locator('//*[@id="react-flow-id"]').hover(); + const elementPrompt = await page + .getByTestId("handle-prompt-shownode-prompt message-right") + .first(); + await elementPrompt.hover(); + await page.mouse.down(); - await page.getByTestId("button_open_prompt_modal").click(); + await page.locator('//*[@id="react-flow-id"]').hover(); - await page.getByTestId("modal-promptarea_prompt_template").fill(promptText); + const elementChatOutput = await page + .getByTestId("handle-chatoutput-shownode-text-left") + .first(); + await elementChatOutput.hover(); + await page.mouse.up(); - await page.getByText("Check & Save").click(); + await page.locator('//*[@id="react-flow-id"]').hover(); - await page.waitForTimeout(1000); + await page.getByTestId("button_open_prompt_modal").click(); - await page.getByTestId("button_run_chat output").click(); + await page.getByTestId("modal-promptarea_prompt_template").fill(promptText); - await page.waitForSelector("text=built successfully", { timeout: 30000 }); + await page.getByText("Check & Save").click(); - await page.getByTestId("playground-btn-flow-io").click(); + await page.waitForTimeout(1000); - const textContents = await page - .getByTestId("div-chat-message") - .allTextContents(); + await page.getByTestId("button_run_chat output").click(); - const concatAllText = textContents.join(" "); + await page.waitForSelector("text=built successfully", { timeout: 30000 }); - await page.waitForTimeout(1000); - await page.getByText("Close").last().click(); + await page.getByTestId("playground-btn-flow-io").click(); - await page.getByText("Prompt", { exact: true }).click(); - await page.getByTestId("more-options-modal").click(); + const textContents = await page + .getByTestId("div-chat-message") + .allTextContents(); - await page.getByText("Freeze", { exact: true }).last().click(); + const concatAllText = textContents.join(" "); - await page.waitForTimeout(1000); - await page.locator('//*[@id="react-flow-id"]').click(); + await page.waitForTimeout(1000); + await page.getByText("Close").last().click(); - expect(page.getByTestId("icon-Snowflake").first()).toBeVisible(); + await page.getByText("Prompt", { exact: true }).click(); + await page.getByTestId("more-options-modal").click(); - await page.locator('//*[@id="react-flow-id"]').click(); + await page.getByText("Freeze", { exact: true }).last().click(); - await page.getByTestId("button_open_prompt_modal").click(); + await page.waitForTimeout(1000); + await page.locator('//*[@id="react-flow-id"]').click(); - await page.getByTestId("edit-prompt-sanitized").first().click(); + expect(page.getByTestId("icon-Snowflake").first()).toBeVisible(); - await page - .getByTestId("modal-promptarea_prompt_template") - .fill(newPromptText); + await page.locator('//*[@id="react-flow-id"]').click(); - await page.getByText("Check & Save").click(); + await page.getByTestId("button_open_prompt_modal").click(); - await page.getByTestId("button_run_chat output").click(); + await page.getByTestId("edit-prompt-sanitized").first().click(); - await page.waitForSelector("text=built successfully", { timeout: 30000 }); + await page + .getByTestId("modal-promptarea_prompt_template") + .fill(newPromptText); - await page.getByTestId("playground-btn-flow-io").click(); + await page.getByText("Check & Save").click(); - const textContents2 = await page - .getByTestId("div-chat-message") - .allTextContents(); + await page.getByTestId("button_run_chat output").click(); - const concatAllText2 = textContents2.join(" "); + await page.waitForSelector("text=built successfully", { timeout: 30000 }); - expect(concatAllText2).toBe(concatAllText); -}); + await page.getByTestId("playground-btn-flow-io").click(); + + const textContents2 = await page + .getByTestId("div-chat-message") + .allTextContents(); + + const concatAllText2 = textContents2.join(" "); + + expect(concatAllText2).toBe(concatAllText); + }, +); diff --git a/src/frontend/tests/extended/regression/generalBugs-shard-11.spec.ts b/src/frontend/tests/extended/regression/generalBugs-shard-11.spec.ts index 19dcc2685..448b92be7 100644 --- a/src/frontend/tests/extended/regression/generalBugs-shard-11.spec.ts +++ b/src/frontend/tests/extended/regression/generalBugs-shard-11.spec.ts @@ -1,133 +1,139 @@ import { expect, test } from "@playwright/test"; -test("user should be able to use ComposIO without getting api_key error", async ({ - page, -}) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +test( + "user should be able to use ComposIO without getting api_key error", + { tag: ["@release"] }, + async ({ page }) => { + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - await page.waitForSelector('[id="new-project-btn"]', { - timeout: 30000, - }); + await page.waitForSelector('[id="new-project-btn"]', { + timeout: 30000, + }); - let modalCount = 0; - try { - const modalTitleElement = await page.getByTestId("modal-title"); - modalCount = await modalTitleElement.count(); - } catch (error) { - modalCount = 0; - } + let modalCount = 0; + try { + const modalTitleElement = await page.getByTestId("modal-title"); + 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(); - } + 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("composio"); + 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("composio"); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - const modelElement = await page.getByTestId("composioComposio Tools"); - const targetElement = await page.locator('//*[@id="react-flow-id"]'); - await modelElement.dragTo(targetElement); + const modelElement = await page.getByTestId("composioComposio Tools"); + const targetElement = await page.locator('//*[@id="react-flow-id"]'); + await modelElement.dragTo(targetElement); - await page.mouse.up(); - await page.mouse.down(); + 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("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - expect(await page.getByText("api_key").isVisible()).toBe(false); -}); + expect(await page.getByText("api_key").isVisible()).toBe(false); + }, +); -test("user should be able to use connect tools", async ({ page }) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +test( + "user should be able to use connect tools", + { tag: ["@release", "@api", "@components"] }, + async ({ page }) => { + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - await page.waitForSelector('[id="new-project-btn"]', { - timeout: 30000, - }); + await page.waitForSelector('[id="new-project-btn"]', { + timeout: 30000, + }); - let modalCount = 0; - try { - const modalTitleElement = await page.getByTestId("modal-title"); - modalCount = await modalTitleElement.count(); - } catch (error) { - modalCount = 0; - } + let modalCount = 0; + try { + const modalTitleElement = await page.getByTestId("modal-title"); + 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(); - } + 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("search api"); + 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("search api"); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - let modelElement = await page.getByTestId("toolsSearch API"); - let targetElement = await page.locator('//*[@id="react-flow-id"]'); - await modelElement.dragTo(targetElement); + let modelElement = await page.getByTestId("toolsSearch API"); + let targetElement = await page.locator('//*[@id="react-flow-id"]'); + await modelElement.dragTo(targetElement); - await page.mouse.up(); - await page.mouse.down(); + 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("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("tool calling agent"); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("tool calling agent"); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - modelElement = await page.getByTestId( - "langchain_utilitiesTool Calling Agent", - ); - targetElement = await page.locator('//*[@id="react-flow-id"]'); - await modelElement.dragTo(targetElement); + modelElement = await page.getByTestId( + "langchain_utilitiesTool Calling Agent", + ); + targetElement = await page.locator('//*[@id="react-flow-id"]'); + await modelElement.dragTo(targetElement); - await page.mouse.up(); - await page.mouse.down(); + 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("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); - //connection - const searchApiOutput = await page - .getByTestId("handle-searchapi-shownode-tool-right") - .nth(0); - await searchApiOutput.hover(); - await page.mouse.down(); - const toolCallingAgentInput = await page - .getByTestId("handle-toolcallingagent-shownode-tools-left") - .nth(0); - await toolCallingAgentInput.hover(); - await page.mouse.up(); + //connection + const searchApiOutput = await page + .getByTestId("handle-searchapi-shownode-tool-right") + .nth(0); + await searchApiOutput.hover(); + await page.mouse.down(); + const toolCallingAgentInput = await page + .getByTestId("handle-toolcallingagent-shownode-tools-left") + .nth(0); + await toolCallingAgentInput.hover(); + await page.mouse.up(); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - expect(await page.locator(".react-flow__edge-interaction").count()).toBe(1); -}); + expect(await page.locator(".react-flow__edge-interaction").count()).toBe(1); + }, +); diff --git a/src/frontend/tests/extended/regression/generalBugs-shard-12.spec.ts b/src/frontend/tests/extended/regression/generalBugs-shard-12.spec.ts index 0dcd8644f..68c2e45a4 100644 --- a/src/frontend/tests/extended/regression/generalBugs-shard-12.spec.ts +++ b/src/frontend/tests/extended/regression/generalBugs-shard-12.spec.ts @@ -1,93 +1,95 @@ import { expect, test } from "@playwright/test"; -test("user should be able to connect RetrieverTool to another components", 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"); - 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("retriever"); - - await page.waitForTimeout(1000); - - let modelElement = await page.getByTestId("toolsRetrieverTool"); - let targetElement = await page.locator('//*[@id="react-flow-id"]'); - await modelElement.dragTo(targetElement); - - await page.mouse.up(); - await page.mouse.down(); - - await page.getByTestId("fit_view").click(); - await page.getByTestId("zoom_out").click(); - - await page.waitForTimeout(1000); - - await page.getByTestId("zoom_out").click(); - await page - .locator('//*[@id="react-flow-id"]') - .hover() - .then(async () => { - await page.mouse.down(); - await page.mouse.move(-300, 300); +test( + "user should be able to connect RetrieverTool to another components", + { tag: ["@release"] }, + async ({ page }) => { + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, }); - await page.mouse.up(); + await page.waitForSelector('[id="new-project-btn"]', { + timeout: 30000, + }); - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("chroma"); + let modalCount = 0; + try { + const modalTitleElement = await page.getByTestId("modal-title"); + modalCount = await modalTitleElement.count(); + } catch (error) { + modalCount = 0; + } - await page.waitForTimeout(1000); + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title").count(); + } - modelElement = await page.getByTestId("vectorstoresChroma DB"); - targetElement = await page.locator('//*[@id="react-flow-id"]'); - await modelElement.dragTo(targetElement); + 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("retriever"); - await page.mouse.up(); - await page.mouse.down(); + await page.waitForTimeout(1000); - await page.waitForTimeout(1000); + let modelElement = await page.getByTestId("toolsRetrieverTool"); + let targetElement = await page.locator('//*[@id="react-flow-id"]'); + await modelElement.dragTo(targetElement); - await page.getByTestId("fit_view").click(); - await page.getByTestId("fit_view").click(); + await page.mouse.up(); + await page.mouse.down(); - //connection - const chromaDbOutput = await page - .getByTestId("handle-chroma-shownode-retriever-right") - .nth(0); - await chromaDbOutput.hover(); - await page.mouse.down(); - const retrieverToolInput = await page - .getByTestId("handle-retrievertool-shownode-retriever-left") - .nth(0); - await retrieverToolInput.hover(); - await page.mouse.up(); + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - expect(await page.locator(".react-flow__edge-interaction").count()).toBe(1); -}); + await page.getByTestId("zoom_out").click(); + await page + .locator('//*[@id="react-flow-id"]') + .hover() + .then(async () => { + await page.mouse.down(); + await page.mouse.move(-300, 300); + }); + + await page.mouse.up(); + + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("chroma"); + + await page.waitForTimeout(1000); + + modelElement = await page.getByTestId("vectorstoresChroma DB"); + targetElement = await page.locator('//*[@id="react-flow-id"]'); + await modelElement.dragTo(targetElement); + + await page.mouse.up(); + await page.mouse.down(); + + await page.waitForTimeout(1000); + + await page.getByTestId("fit_view").click(); + await page.getByTestId("fit_view").click(); + + //connection + const chromaDbOutput = await page + .getByTestId("handle-chroma-shownode-retriever-right") + .nth(0); + await chromaDbOutput.hover(); + await page.mouse.down(); + const retrieverToolInput = await page + .getByTestId("handle-retrievertool-shownode-retriever-left") + .nth(0); + await retrieverToolInput.hover(); + await page.mouse.up(); + + await page.waitForTimeout(1000); + + expect(await page.locator(".react-flow__edge-interaction").count()).toBe(1); + }, +); diff --git a/src/frontend/tests/extended/regression/generalBugs-shard-13.spec.ts b/src/frontend/tests/extended/regression/generalBugs-shard-13.spec.ts index 11c7a3f38..6962ef80a 100644 --- a/src/frontend/tests/extended/regression/generalBugs-shard-13.spec.ts +++ b/src/frontend/tests/extended/regression/generalBugs-shard-13.spec.ts @@ -2,126 +2,128 @@ import { test } from "@playwright/test"; import * as dotenv from "dotenv"; import path from "path"; -test("should be able to share a component on the store by clicking on the share button on the canvas", async ({ - page, -}) => { - test.skip( - !process?.env?.STORE_API_KEY, - "STORE_API_KEY required to run this test", - ); +test( + "should be able to share a component on the store by clicking on the share button on the canvas", + { tag: ["@release"] }, + async ({ page }) => { + test.skip( + !process?.env?.STORE_API_KEY, + "STORE_API_KEY required to run this test", + ); - if (!process.env.CI) { - dotenv.config({ path: path.resolve(__dirname, "../../.env") }); - } - - await page.goto("/"); - await page.waitForTimeout(1000); - - let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); + if (!process.env.CI) { + dotenv.config({ path: path.resolve(__dirname, "../../.env") }); } - } catch (error) { - modalCount = 0; - } - while (modalCount === 0) { + await page.goto("/"); + await page.waitForTimeout(1000); + + 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(5000); + modalCount = await page.getByTestId("modal-title")?.count(); + } + + await page.getByText("Close", { exact: true }).click(); + + await page.waitForTimeout(1000); + + await page.getByTestId("user-profile-settings").click(); + await page.waitForTimeout(500); + + await page.getByText("Settings", { exact: true }).first().click(); + + await page.waitForTimeout(1000); + + await page + .getByPlaceholder("Insert your API Key") + .fill(process.env.STORE_API_KEY ?? ""); + + await page.getByTestId("api-key-save-button-store").click(); + + await page.waitForTimeout(1000); + + await page.getByText("Success! Your API Key has been saved.").isVisible(); + + await page.waitForTimeout(1000); + + await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { + timeout: 100000, + }); + + await page.getByTestId("icon-ChevronLeft").first().click(); + await page.waitForTimeout(1000); + await page.getByText("New Flow", { exact: true }).click(); - await page.waitForTimeout(5000); - modalCount = await page.getByTestId("modal-title")?.count(); - } - await page.getByText("Close", { exact: true }).click(); + await page.getByTestId("side_nav_options_all-templates").click(); + await page.getByRole("heading", { name: "Basic Prompting" }).click(); + await page.waitForSelector("text=share", { timeout: 10000 }); + await page.waitForSelector("text=playground", { timeout: 10000 }); + await page.waitForSelector("text=api", { timeout: 10000 }); - await page.waitForTimeout(1000); + await page.getByTestId("shared-button-flow").click(); - await page.getByTestId("user-profile-settings").click(); - await page.waitForTimeout(500); + await page.waitForTimeout(500); - await page.getByText("Settings", { exact: true }).first().click(); + await page.waitForSelector("text=Share Flow", { + timeout: 10000, + }); + await page.waitForSelector('[data-testid="shared-button-flow"]', { + timeout: 10000, + }); + await page.waitForSelector("text=Share Flow", { timeout: 10000 }); - await page.waitForTimeout(1000); + await page.getByTestId("share-modal-button-flow").click(); - await page - .getByPlaceholder("Insert your API Key") - .fill(process.env.STORE_API_KEY ?? ""); + let replace = await page.getByTestId("replace-button").isVisible(); - await page.getByTestId("api-key-save-button-store").click(); + if (replace) { + await page.getByTestId("replace-button").click(); + } - await page.waitForTimeout(1000); + await page.waitForSelector("text=flow shared successfully ", { + timeout: 10000, + }); - await page.getByText("Success! Your API Key has been saved.").isVisible(); + await page.waitForTimeout(500); - await page.waitForTimeout(1000); + await page.waitForSelector("text=share", { timeout: 10000 }); + await page.waitForSelector("text=playground", { timeout: 10000 }); + await page.waitForSelector("text=api", { timeout: 10000 }); - await page.waitForSelector('[data-testid="icon-ChevronLeft"]', { - timeout: 100000, - }); + await page.getByTestId("shared-button-flow").click(); - await page.getByTestId("icon-ChevronLeft").first().click(); - await page.waitForTimeout(1000); + await page.waitForTimeout(500); - await page.getByText("New Flow", { exact: true }).click(); + await page.waitForSelector("text=Publish workflow to the Langflow Store.", { + timeout: 10000, + }); + await page.waitForSelector('[data-testid="shared-button-flow"]', { + timeout: 10000, + }); + await page.waitForSelector("text=Share Flow", { timeout: 10000 }); - await page.getByTestId("side_nav_options_all-templates").click(); - await page.getByRole("heading", { name: "Basic Prompting" }).click(); - await page.waitForSelector("text=share", { timeout: 10000 }); - await page.waitForSelector("text=playground", { timeout: 10000 }); - await page.waitForSelector("text=api", { timeout: 10000 }); + await page.getByTestId("share-modal-button-flow").click(); - await page.getByTestId("shared-button-flow").click(); + replace = await page.getByTestId("replace-button").isVisible(); - await page.waitForTimeout(500); + if (replace) { + await page.getByTestId("replace-button").click(); + } - await page.waitForSelector("text=Share Flow", { - timeout: 10000, - }); - await page.waitForSelector('[data-testid="shared-button-flow"]', { - timeout: 10000, - }); - await page.waitForSelector("text=Share Flow", { timeout: 10000 }); - - await page.getByTestId("share-modal-button-flow").click(); - - let replace = await page.getByTestId("replace-button").isVisible(); - - if (replace) { - await page.getByTestId("replace-button").click(); - } - - await page.waitForSelector("text=flow shared successfully ", { - timeout: 10000, - }); - - await page.waitForTimeout(500); - - await page.waitForSelector("text=share", { timeout: 10000 }); - await page.waitForSelector("text=playground", { timeout: 10000 }); - await page.waitForSelector("text=api", { timeout: 10000 }); - - await page.getByTestId("shared-button-flow").click(); - - await page.waitForTimeout(500); - - await page.waitForSelector("text=Publish workflow to the Langflow Store.", { - timeout: 10000, - }); - await page.waitForSelector('[data-testid="shared-button-flow"]', { - timeout: 10000, - }); - await page.waitForSelector("text=Share Flow", { timeout: 10000 }); - - await page.getByTestId("share-modal-button-flow").click(); - - replace = await page.getByTestId("replace-button").isVisible(); - - if (replace) { - await page.getByTestId("replace-button").click(); - } - - await page.waitForSelector("text=flow shared successfully ", { - timeout: 10000, - }); -}); + await page.waitForSelector("text=flow shared successfully ", { + timeout: 10000, + }); + }, +); diff --git a/src/frontend/tests/extended/regression/generalBugs-shard-2.spec.ts b/src/frontend/tests/extended/regression/generalBugs-shard-2.spec.ts index a4a80ca70..6fe984a2f 100644 --- a/src/frontend/tests/extended/regression/generalBugs-shard-2.spec.ts +++ b/src/frontend/tests/extended/regression/generalBugs-shard-2.spec.ts @@ -2,75 +2,81 @@ import { expect, test } from "@playwright/test"; import * as dotenv from "dotenv"; import path from "path"; -test("should use webhook component on API", 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(); +test( + "should use webhook component on API", + { + tag: ["@release"], + }, + 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") }); } - } catch (error) { - modalCount = 0; - } + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - 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('[id="new-project-btn"]', { + timeout: 30000, + }); - await page.getByTestId("blank-flow").click(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; + } - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("webhook"); + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); + } - await page.waitForTimeout(1000); + await page.getByTestId("blank-flow").click(); - await page - .getByTestId("dataWebhook") - .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("webhook"); - await page.waitForSelector('[data-testid="fit_view"]', { - timeout: 100000, - }); + await page.waitForTimeout(1000); - await page.getByTestId("fit_view").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); + await page + .getByTestId("dataWebhook") + .dragTo(page.locator('//*[@id="react-flow-id"]')); + await page.mouse.up(); + await page.mouse.down(); - await page.waitForTimeout(1000); - await page.getByText("API", { exact: true }).click(); + await page.waitForSelector('[data-testid="fit_view"]', { + timeout: 100000, + }); - await page.getByText("Webhook cURL", { exact: true }).click(); - await page.getByRole("tab", { name: "Webhook cURL" }).click(); + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); - await page.getByTestId("icon-Copy").last().click(); + await page.waitForTimeout(1000); + await page.getByText("API", { exact: true }).click(); - const handle = await page.evaluateHandle(() => - navigator.clipboard.readText(), - ); - const clipboardContent = await handle.jsonValue(); - expect(clipboardContent.length).toBeGreaterThan(0); - expect(clipboardContent).toContain("curl -X POST"); - expect(clipboardContent).toContain("webhook"); - await page.getByRole("tab", { name: "Tweaks" }).click(); -}); + await page.getByText("Webhook cURL", { exact: true }).click(); + await page.getByRole("tab", { name: "Webhook cURL" }).click(); + + await page.getByTestId("icon-Copy").last().click(); + + const handle = await page.evaluateHandle(() => + navigator.clipboard.readText(), + ); + const clipboardContent = await handle.jsonValue(); + expect(clipboardContent.length).toBeGreaterThan(0); + expect(clipboardContent).toContain("curl -X POST"); + expect(clipboardContent).toContain("webhook"); + await page.getByRole("tab", { name: "Tweaks" }).click(); + }, +); diff --git a/src/frontend/tests/extended/regression/generalBugs-shard-3.spec.ts b/src/frontend/tests/extended/regression/generalBugs-shard-3.spec.ts index 8e9b0f6ba..65b11718b 100644 --- a/src/frontend/tests/extended/regression/generalBugs-shard-3.spec.ts +++ b/src/frontend/tests/extended/regression/generalBugs-shard-3.spec.ts @@ -2,278 +2,292 @@ import { expect, test } from "@playwright/test"; import * as dotenv from "dotenv"; import path from "path"; -test("should copy code from playground modal", async ({ page }) => { - test.skip( - !process?.env?.OPENAI_API_KEY, - "OPENAI_API_KEY required to run this test", - ); +test( + "should copy code from playground modal", + { + tag: ["@release"], + }, + 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.locator("span").filter({ hasText: "My Collection" }).isVisible(); - 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(); + if (!process.env.CI) { + dotenv.config({ path: path.resolve(__dirname, "../../.env") }); } - } 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.goto("/"); + await page.locator("span").filter({ hasText: "My Collection" }).isVisible(); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - await page.waitForSelector('[data-testid="blank-flow"]', { - timeout: 30000, - }); + await page.waitForSelector('[id="new-project-btn"]', { + timeout: 30000, + }); - await page.getByTestId("blank-flow").click(); - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("chat output"); - await page.waitForTimeout(1000); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; + } - await page - .getByTestId("outputsChat Output") - .dragTo(page.locator('//*[@id="react-flow-id"]')); - await page.mouse.up(); - await page.mouse.down(); + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); + } - await page.getByTestId("fit_view").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); + await page.waitForSelector('[data-testid="blank-flow"]', { + timeout: 30000, + }); - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("chat input"); - await page.waitForTimeout(1000); - - await page - .getByTestId("inputsChat 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("fit_view").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); - - 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(); - await page.getByTestId("zoom_out").click(); - - let outdatedComponents = await page.getByTestId("icon-AlertTriangle").count(); - - while (outdatedComponents > 0) { - await page.getByTestId("icon-AlertTriangle").first().click(); + await page.getByTestId("blank-flow").click(); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("chat output"); 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 + .getByTestId("outputsChat Output") + .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("zoom_out").click(); + + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("chat input"); 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(); + await page + .getByTestId("inputsChat Input") + .dragTo(page.locator('//*[@id="react-flow-id"]')); + await page.mouse.up(); + await page.mouse.down(); - if (isApiKeyInputVisible) { - await apiKeyInput.fill(process.env.OPENAI_API_KEY ?? ""); - } + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("openai"); + await page.waitForTimeout(1000); - await page.getByTestId("dropdown_str_model_name").click(); - await page.getByTestId("gpt-4o-1-option").click(); + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); - const elementsChatInput = await page - .locator('[data-testid="handle-chatinput-shownode-message-right"]') - .all(); + await page + .getByTestId("modelsOpenAI") + .dragTo(page.locator('//*[@id="react-flow-id"]')); + await page.mouse.up(); + await page.mouse.down(); - let visibleElementHandle; + await page.waitForSelector('[data-testid="fit_view"]', { + timeout: 100000, + }); - for (const element of elementsChatInput) { - if (await element.isVisible()) { - visibleElementHandle = element; - break; + await page.getByTestId("fit_view").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(); + + 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(); } - } - // Click and hold on the first element - await page.getByTestId("zoom_in").click(); - await page.getByTestId("zoom_in").click(); - - await page.locator(".react-flow__pane").click(); - - await visibleElementHandle.hover(); - await page.mouse.down(); - - const elementsOpenAiInput = await page - .locator('[data-testid="handle-openaimodel-shownode-input-left"]') - .all(); - - for (const element of elementsOpenAiInput) { - if (await element.isVisible()) { - visibleElementHandle = element; - break; + 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(); } - } - await visibleElementHandle.hover(); - await page.mouse.up(); + const apiKeyInput = page.getByTestId("popover-anchor-input-api_key"); + const isApiKeyInputVisible = await apiKeyInput.isVisible(); - const elementsOpenAiOutput = await page - .locator('[data-testid="handle-openaimodel-shownode-text-right"]') - .all(); - - for (const element of elementsOpenAiOutput) { - if (await element.isVisible()) { - visibleElementHandle = element; - break; + if (isApiKeyInputVisible) { + await apiKeyInput.fill(process.env.OPENAI_API_KEY ?? ""); } - } - // Click and hold on the first element - await visibleElementHandle.hover(); - await page.mouse.down(); + await page.getByTestId("dropdown_str_model_name").click(); + await page.getByTestId("gpt-4o-1-option").click(); - // Move to the second element - const elementsChatOutput = await page - .getByTestId("handle-chatoutput-shownode-text-left") - .all(); + const elementsChatInput = await page + .locator('[data-testid="handle-chatinput-shownode-message-right"]') + .all(); - for (const element of elementsChatOutput) { - if (await element.isVisible()) { - visibleElementHandle = element; - break; + let visibleElementHandle; + + for (const element of elementsChatInput) { + if (await element.isVisible()) { + visibleElementHandle = element; + break; + } } - } - await visibleElementHandle.hover(); - await page.mouse.up(); + // Click and hold on the first element + await page.getByTestId("zoom_in").click(); + await page.getByTestId("zoom_in").click(); - await page.getByTestId("fit_view").click(); - await page.getByText("Playground", { exact: true }).last().click(); - await page.waitForSelector('[data-testid="input-chat-playground"]', { - timeout: 100000, - }); - await page.getByTestId("input-chat-playground").click(); - await page - .getByTestId("input-chat-playground") - .fill("Could you provide a Python example for a 'Hello, World!' program?"); + await page.locator(".react-flow__pane").click(); - await page.waitForSelector('[data-testid="button-send"]', { - timeout: 100000, - }); + await visibleElementHandle.hover(); + await page.mouse.down(); - await page.getByTestId("button-send").click(); + const elementsOpenAiInput = await page + .locator('[data-testid="handle-openaimodel-shownode-input-left"]') + .all(); - await page.getByRole("tab", { name: "python" }).isVisible({ - timeout: 100000, - }); - - await page.waitForSelector('[data-testid="copy-code-button"]', { - state: "visible", - timeout: 30000, - }); - - await page.waitForTimeout(1000); - await page.getByTestId("copy-code-button").last().click(); - - const handle = await page.evaluateHandle(() => - navigator.clipboard.readText(), - ); - const clipboardContent = await handle.jsonValue(); - expect(clipboardContent.length).toBeGreaterThan(0); - expect(clipboardContent).toContain("Hello"); -}); - -test("playground button should be enabled or disabled", async ({ page }) => { - await page.goto("/"); - await page.locator("span").filter({ hasText: "My Collection" }).isVisible(); - 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(); + for (const element of elementsOpenAiInput) { + if (await element.isVisible()) { + visibleElementHandle = element; + break; + } } - } 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 visibleElementHandle.hover(); + await page.mouse.up(); - await page.waitForSelector('[data-testid="blank-flow"]', { - timeout: 30000, - }); + const elementsOpenAiOutput = await page + .locator('[data-testid="handle-openaimodel-shownode-text-right"]') + .all(); - await page.getByTestId("blank-flow").click(); + for (const element of elementsOpenAiOutput) { + if (await element.isVisible()) { + visibleElementHandle = element; + break; + } + } - expect(await page.getByTestId("playground-btn-flow").isDisabled()); + // Click and hold on the first element + await visibleElementHandle.hover(); + await page.mouse.down(); - expect(await page.getByText("Langflow Chat").isHidden()); + // Move to the second element + const elementsChatOutput = await page + .getByTestId("handle-chatoutput-shownode-text-left") + .all(); - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("chat output"); + for (const element of elementsChatOutput) { + if (await element.isVisible()) { + visibleElementHandle = element; + break; + } + } - await page.waitForTimeout(1000); + await visibleElementHandle.hover(); + await page.mouse.up(); - await page - .locator('//*[@id="outputsChat 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("fit_view").click(); + await page.getByText("Playground", { exact: true }).last().click(); + await page.waitForSelector('[data-testid="input-chat-playground"]', { + timeout: 100000, + }); + await page.getByTestId("input-chat-playground").click(); + await page + .getByTestId("input-chat-playground") + .fill( + "Could you provide a Python example for a 'Hello, World!' program?", + ); - await page.waitForTimeout(1000); + await page.waitForSelector('[data-testid="button-send"]', { + timeout: 100000, + }); - await page.getByTestId("playground-btn-flow-io").click({ force: true }); + await page.getByTestId("button-send").click(); - expect(await page.getByText("Langflow Chat").isVisible()); -}); + await page.getByRole("tab", { name: "python" }).isVisible({ + timeout: 100000, + }); + + await page.waitForSelector('[data-testid="copy-code-button"]', { + state: "visible", + timeout: 30000, + }); + + await page.waitForTimeout(1000); + await page.getByTestId("copy-code-button").last().click(); + + const handle = await page.evaluateHandle(() => + navigator.clipboard.readText(), + ); + const clipboardContent = await handle.jsonValue(); + expect(clipboardContent.length).toBeGreaterThan(0); + expect(clipboardContent).toContain("Hello"); + }, +); + +test( + "playground button should be enabled or disabled", + { tag: ["@release", "@api", "@workspace"] }, + async ({ page }) => { + await page.goto("/"); + await page.locator("span").filter({ hasText: "My Collection" }).isVisible(); + 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(); + + expect(await page.getByTestId("playground-btn-flow").isDisabled()); + + expect(await page.getByText("Langflow Chat").isHidden()); + + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("chat output"); + + await page.waitForTimeout(1000); + + await page + .locator('//*[@id="outputsChat 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.waitForTimeout(1000); + + await page.getByTestId("playground-btn-flow-io").click({ force: true }); + + expect(await page.getByText("Langflow Chat").isVisible()); + }, +); diff --git a/src/frontend/tests/extended/regression/generalBugs-shard-6.spec.ts b/src/frontend/tests/extended/regression/generalBugs-shard-6.spec.ts index b1fd0ab49..c42791cf8 100644 --- a/src/frontend/tests/extended/regression/generalBugs-shard-6.spec.ts +++ b/src/frontend/tests/extended/regression/generalBugs-shard-6.spec.ts @@ -1,44 +1,45 @@ import { expect, test } from "@playwright/test"; -test("should be able to see error when something goes wrong on Code Modal", async ({ - page, -}) => { - await page.goto("/"); +test( + "should be able to see error when something goes wrong on Code Modal", + { tag: ["@release"] }, + async ({ page }) => { + await page.goto("/"); - let modalCount = 0; + let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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(); - } + 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.waitForSelector('[data-testid="blank-flow"]', { + timeout: 30000, + }); - await page.getByTestId("blank-flow").click(); + await page.getByTestId("blank-flow").click(); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page.getByTestId("sidebar-custom-component-button").click(); + await page.getByTestId("sidebar-custom-component-button").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("div-generic-node").click(); - await page.getByTestId("code-button-modal").click(); + await page.getByTestId("div-generic-node").click(); + await page.getByTestId("code-button-modal").click(); - const customCodeWithError = ` + const customCodeWithError = ` # from langflow.field_typing import Data from langflow.custom import Component from langflow.io import MessageTextInput, Output @@ -66,14 +67,17 @@ class CustomComponent(Component): return data `; - await page.locator("textarea").press("Control+a"); - await page.locator("textarea").fill(customCodeWithError); + await page.locator("textarea").press("Control+a"); + await page.locator("textarea").fill(customCodeWithError); - await page.getByText("Check & Save").last().click(); + await page.getByText("Check & Save").last().click(); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - const error = await page.getByTestId("title_error_code_modal").textContent(); + const error = await page + .getByTestId("title_error_code_modal") + .textContent(); - expect(error!.length).toBeGreaterThan(20); -}); + expect(error!.length).toBeGreaterThan(20); + }, +); diff --git a/src/frontend/tests/extended/regression/generalBugs-shard-7.spec.ts b/src/frontend/tests/extended/regression/generalBugs-shard-7.spec.ts index b2e2a98aa..25176a7bc 100644 --- a/src/frontend/tests/extended/regression/generalBugs-shard-7.spec.ts +++ b/src/frontend/tests/extended/regression/generalBugs-shard-7.spec.ts @@ -2,96 +2,101 @@ import { expect, test } from "@playwright/test"; import uaParser from "ua-parser-js"; // TODO: This test might not be needed anymore -test("should be able to select all with ctrl + A on advanced modal", async ({ - page, -}) => { - await page.goto("/"); +test( + "should be able to select all with ctrl + A on advanced modal", + { tag: ["@release"] }, + async ({ page }) => { + await page.goto("/"); - let modalCount = 0; + let modalCount = 0; - try { - const modalTitleElement = await page?.getByTestId("modal-title"); - if (modalTitleElement) { - modalCount = await modalTitleElement.count(); + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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(); - } + 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.waitForSelector('[data-testid="blank-flow"]', { + timeout: 30000, + }); - await page.getByTestId("blank-flow").click(); + await page.getByTestId("blank-flow").click(); - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("ollama"); - await page.waitForTimeout(1000); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("ollama"); + await page.waitForTimeout(1000); - await page - .getByTestId("embeddingsOllama Embeddings") - .dragTo(page.locator('//*[@id="react-flow-id"]')); + await page + .getByTestId("embeddingsOllama Embeddings") + .dragTo(page.locator('//*[@id="react-flow-id"]')); - await page.getByTestId("fit_view").click(); - await page.getByTestId("zoom_out").click(); - await page.getByTestId("zoom_out").click(); + await page.getByTestId("fit_view").click(); + await page.getByTestId("zoom_out").click(); + await page.getByTestId("zoom_out").click(); - const getUA = await page.evaluate(() => navigator.userAgent); - const userAgentInfo = uaParser(getUA); + const getUA = await page.evaluate(() => navigator.userAgent); + const userAgentInfo = uaParser(getUA); - await page.getByTestId("div-generic-node").click(); + await page.getByTestId("div-generic-node").click(); - await page.keyboard.press(`ControlOrMeta+Shift+A`); + await page.keyboard.press(`ControlOrMeta+Shift+A`); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page - .getByPlaceholder("Type something...") - .nth(2) - .fill("ollama_test_ctrl_a_first_input"); - let value = await page - .getByPlaceholder("Type something...") - .nth(2) - .inputValue(); - expect(value).toBe("ollama_test_ctrl_a_first_input"); + await page + .getByPlaceholder("Type something...") + .nth(2) + .fill("ollama_test_ctrl_a_first_input"); + let value = await page + .getByPlaceholder("Type something...") + .nth(2) + .inputValue(); + expect(value).toBe("ollama_test_ctrl_a_first_input"); - await page - .getByPlaceholder("Type something...") - .last() - .fill("ollama_test_ctrl_a_second_input"); - let secondValue = await page - .getByPlaceholder("Type something...") - .last() - .inputValue(); - expect(secondValue).toBe("ollama_test_ctrl_a_second_input"); + await page + .getByPlaceholder("Type something...") + .last() + .fill("ollama_test_ctrl_a_second_input"); + let secondValue = await page + .getByPlaceholder("Type something...") + .last() + .inputValue(); + expect(secondValue).toBe("ollama_test_ctrl_a_second_input"); - await page.getByPlaceholder("Type something...").last().click(); - await page.waitForTimeout(1000); + await page.getByPlaceholder("Type something...").last().click(); + await page.waitForTimeout(1000); - await page.keyboard.press("ControlOrMeta+a"); + await page.keyboard.press("ControlOrMeta+a"); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page.keyboard.press("ControlOrMeta+c"); + await page.keyboard.press("ControlOrMeta+c"); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page.getByPlaceholder("Type something...").nth(2).click(); + await page.getByPlaceholder("Type something...").nth(2).click(); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page.keyboard.press("ControlOrMeta+a"); + await page.keyboard.press("ControlOrMeta+a"); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page.keyboard.press("ControlOrMeta+v"); + await page.keyboard.press("ControlOrMeta+v"); - value = await page.getByPlaceholder("Type something...").nth(2).inputValue(); - expect(value).toBe("ollama_test_ctrl_a_second_input"); -}); + value = await page + .getByPlaceholder("Type something...") + .nth(2) + .inputValue(); + expect(value).toBe("ollama_test_ctrl_a_second_input"); + }, +); diff --git a/src/frontend/tests/extended/regression/generalBugs-shard-8.spec.ts b/src/frontend/tests/extended/regression/generalBugs-shard-8.spec.ts index 2112a89dc..79e15a21f 100644 --- a/src/frontend/tests/extended/regression/generalBugs-shard-8.spec.ts +++ b/src/frontend/tests/extended/regression/generalBugs-shard-8.spec.ts @@ -1,43 +1,47 @@ import { test } from "@playwright/test"; -test("should interact with api request", async ({ page }) => { - await page.goto("/"); - await page.waitForSelector('[data-testid="mainpage_title"]', { - timeout: 30000, - }); +test( + "should interact with api request", + { tag: ["@release"] }, + async ({ page }) => { + await page.goto("/"); + await page.waitForSelector('[data-testid="mainpage_title"]', { + timeout: 30000, + }); - await page.waitForSelector('[id="new-project-btn"]', { - 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(); + let modalCount = 0; + try { + const modalTitleElement = await page?.getByTestId("modal-title"); + if (modalTitleElement) { + modalCount = await modalTitleElement.count(); + } + } catch (error) { + modalCount = 0; } - } 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.getByTestId("blank-flow").click(); - await page.getByTestId("sidebar-search-input").click(); - await page.getByTestId("sidebar-search-input").fill("api request"); + while (modalCount === 0) { + await page.getByText("New Flow", { exact: true }).click(); + await page.waitForTimeout(3000); + modalCount = await page.getByTestId("modal-title")?.count(); + } + await page.getByTestId("blank-flow").click(); + await page.getByTestId("sidebar-search-input").click(); + await page.getByTestId("sidebar-search-input").fill("api request"); - await page.waitForTimeout(1000); + await page.waitForTimeout(1000); - await page - .getByTestId("dataAPI Request") - .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("zoom_out").click(); -}); + await page + .getByTestId("dataAPI Request") + .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("zoom_out").click(); + }, +); diff --git a/src/frontend/tsconfig.json b/src/frontend/tsconfig.json index a433a5608..ea8cff3ba 100644 --- a/src/frontend/tsconfig.json +++ b/src/frontend/tsconfig.json @@ -27,33 +27,33 @@ "tests/core/saveComponents.spec.ts", "tests/extended/actionsMainPage-shard-1.spec.ts", "tests/core/auto_login.spec.ts", - "tests/core/unit/chatInputOutput.spec.ts", + "tests/fe-components/chatInputOutput.spec.ts", "tests/extended/integrations/chatInputOutputUser-shard-2.spec.ts", - "tests/core/unit/codeAreaModalComponent.spec.ts", + "tests/fe-components/codeAreaModalComponent.spec.ts", "tests/extended/features/curlApiGeneration.spec.ts", "tests/extended/features/deleteFlows.spec.ts", "tests/extended/features/dragAndDrop.spec.ts", - "tests/core/unit/dropdownComponent.spec.ts", - "tests/core/unit/fileUploadComponent.spec.ts", + "tests/fe-components/dropdownComponent.spec.ts", + "tests/fe-components/fileUploadComponent.spec.ts", "tests/core/filterEdge.spec.ts", - "tests/core/unit/floatComponent.spec.ts", + "tests/fe-components/floatComponent.spec.ts", "tests/extended/features/flowPage.spec.ts", "tests/extended/features/flowSettings.spec.ts", "tests/extended/regression/generalBugs-shard-0.spec.ts", "tests/core/globalVariables.spec.ts", "tests/core/group.spec.ts", "tests/extended/folders.spec.ts", - "tests/core/unit/inputComponent.spec.ts", + "tests/fe-components/inputComponent.spec.ts", "tests/core/inputListComponent.spec.ts", - "tests/core/unit/intComponent.spec.ts", + "tests/fe-components/intComponent.spec.ts", "tests/core/keyPairListComponent.spec.ts", "tests/extended/features/langflowShortcuts.spec.ts", "tests/core/nestedComponent.spec.ts", - "tests/core/unit/promptModalComponent.spec.ts", + "tests/fe-components/promptModalComponent.spec.ts", "tests/core/python_api_generation.spec.ts", - "tests/core/unit/textAreaModalComponent.spec.ts", + "tests/fe-components/textAreaModalComponent.spec.ts", "tests/core/textInputOutput.spec.ts", - "tests/core/unit/toggleComponent.spec.ts", + "tests/fe-components/toggleComponent.spec.ts", "tests/core/tweaks_test.spec.ts", "tests/extended/features/twoEdges.spec.ts", "tests/extended/features/userSettings.spec.ts",