From f36bcf2a6cb2dbbd9ea694b337fdebf3f4bd2883 Mon Sep 17 00:00:00 2001 From: sneha122 Date: Mon, 19 Jun 2023 15:23:34 +0530 Subject: [PATCH] feat: query creation dumb templates replaced with smart templates (#24234) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description This PR replaces dumb template that is shown on new query creation with smart templates. With current implementation whenever we create a new DB query, we see this template before writing the query, when we select any of the template options, it shows us template query like `SELECT * FROM users ORDER BY id LIMIT 10;` Since its a template query, users table may not exist in user's actual database, thus leading them to error results. Screenshot 2023-06-09 at 2 45 40 PM With new implementation, we are removing this template page, instead if we have the structure of the datasource available, we would simply get the first table from the structure, and create select query using that. This way we are populating query editor with user's actual table names rather than dumb table name like `users`. Thus leading users to create successful query Note: This change is done only for sql plugins like MySQL, MSSQL, PostgreSQL, Redshift, Oracle, Snowflake. #### PR fixes following issue(s) Fixes #23960 > if no issue exists, please create an issue and ask the maintainers about this first > > #### Media > A video or a GIF is preferred. when using Loom, don’t embed because it looks like it’s a GIF. instead, just link to the video > > #### Type of change - New feature (non-breaking change which adds functionality) > > > ## Testing > #### How Has This Been Tested? > Please describe the tests that you ran to verify your changes. Also list any relevant details for your test configuration. > Delete anything that is not relevant - [x] Manual - [ ] Jest - [x] Cypress > > #### Test Plan > Create a Connection on the DB > Create a Query from the established Query > Ensure the 1st table data is placed when Add Query button is clicked from the Review page > If the query is created from Entity explorer ensure the right table name is been added #### Issues raised during DP testing > Link issues raised during DP testing for better visibility and tracking (copy link from comments dropped on this PR) > > > ## Checklist: #### Dev activity - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my own code - [x] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] PR is being merged under a feature flag #### QA activity: - [ ] [Speedbreak features](https://github.com/appsmithorg/TestSmith/wiki/Test-plan-implementation#speedbreaker-features-to-consider-for-every-change) have been covered - [x] Test plan covers all impacted features and [areas of interest](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans/_edit#areas-of-interest) - [ ] Test plan has been peer reviewed by project stakeholders and other QA members - [x] Manually tested functionality on DP - [ ] We had an implementation alignment call with stakeholders post QA Round 2 - [x] Cypress test cases have been added and approved by SDET/manual QA - [x] Added `Test Plan Approved` label after Cypress tests were reviewed - [ ] Added `Test Plan Approved` label after JUnit tests were reviewed --------- Co-authored-by: “sneha122” <“sneha@appsmith.com”> Co-authored-by: Aishwarya UR --- .../ClientSide/Autocomplete/Sql_AC_Spec.ts | 2 +- .../Binding/JSObject_Postgress_Table_spec.js | 7 +- .../ClientSide/BugTests/Moment_Spec.ts | 1 - .../CopyQuery_RenameDatasource_spec.js | 3 +- .../Datasource_Structure_spec.js | 8 +- .../ExplorerTests/Query_Datasource_spec.js | 3 +- .../GitDiscardChange/DiscardChanges_spec.js | 1 - .../Git/GitSync/GitSyncedApps_spec.js | 1 - .../ClientSide/Linting/BasicLint_spec.ts | 1 - .../Snipping_mode_Basic_test.js | 7 +- .../OtherUIFeatures/EntityBottomBar_spec.ts | 3 +- .../OtherUIFeatures/Replay_Editor_spec.js | 3 +- .../Chart/Chart_Widget_Loading_spec.js | 19 +---- .../ListV2/ListV2_PageNo_PageSize_spec.js | 32 ++------ .../ListV2/Listv2_BasicServerSideData_spec.js | 29 +------ .../TableV1/Table_PropertyPane_spec.js | 15 ++-- .../TableV2/TableV2_PropertyPane_spec.js | 14 +++- .../ActionExecution/Block_Execution.ts | 2 - .../ServerSide/GenerateCRUD/MySQL1_Spec.ts | 2 - .../ServerSide/GenerateCRUD/MySQL2_Spec.ts | 2 - .../ServerSide/GenerateCRUD/Postgres2_Spec.ts | 3 +- .../ServerSide/OnLoadTests/JSOnLoad1_Spec.ts | 1 - .../JSOnLoad_cyclic_dependency_errors_spec.js | 4 +- .../OnLoadTests/PostgresConnections_spec.ts | 3 - .../ServerSide/Params/ExecutionParams_spec.js | 17 ++-- .../Postgres_DataTypes/Array_Spec.ts | 2 - .../Postgres_DataTypes/Binary_Spec.ts | 1 - .../Postgres_DataTypes/BooleanEnum_Spec.ts | 1 - .../Postgres_DataTypes/Character_Spec.ts | 1 - .../Postgres_DataTypes/DateTime_Spec.ts | 1 - .../Postgres_DataTypes/Json_Spec.ts | 17 ---- .../Postgres_DataTypes/Numeric_Spec.ts | 1 - .../Postgres_DataTypes/UUID_Spec.ts | 7 -- .../ServerSide/QueryPane/AddWidget_spec.js | 8 +- .../ServerSide/QueryPane/MySQL_Spec.ts | 2 - .../ServerSide/QueryPane/Postgres_Spec.js | 9 --- .../QueryPane/SwitchDatasource_spec.js | 5 -- .../e2e/Sanity/Datasources/MockDBs_Spec.ts | 4 +- .../Sanity/Datasources/MySQLNoiseTest_spec.js | 13 +-- .../cypress/support/Pages/DataSources.ts | 2 - app/client/cypress/support/queryCommands.js | 3 - app/client/src/constants/Datasource.ts | 3 + .../src/pages/Editor/FormControl.test.tsx | 79 ------------------- app/client/src/pages/Editor/FormControl.tsx | 76 ++++++++++++++---- .../src/pages/Editor/QueryEditor/index.tsx | 9 +-- app/client/src/sagas/QueryPaneSagas.ts | 1 - app/client/src/selectors/entitiesSelector.ts | 17 ++++ .../src/main/resources/templates/SELECT.sql | 4 +- .../src/main/resources/templates/SELECT.sql | 4 +- .../src/main/resources/templates/SELECT.sql | 4 +- .../src/main/resources/templates/SELECT.sql | 4 +- .../src/main/resources/templates/SELECT.sql | 4 +- .../src/main/resources/templates/SELECT.sql | 4 +- 53 files changed, 169 insertions(+), 300 deletions(-) delete mode 100644 app/client/src/pages/Editor/FormControl.test.tsx diff --git a/app/client/cypress/e2e/Regression/ClientSide/Autocomplete/Sql_AC_Spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Autocomplete/Sql_AC_Spec.ts index b8ffe1fbec..870b9b006d 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Autocomplete/Sql_AC_Spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Autocomplete/Sql_AC_Spec.ts @@ -13,7 +13,7 @@ describe("SQL Autocompletion", () => { dsName = $dsName; //Shows autocompletion hints in SQL", () => { dataSources.NavigateFromActiveDS(dsName, true); - agHelper.GetNClick(dataSources._templateMenu); + dataSources.EnterQuery(""); agHelper.TypeText(locators._codeMirrorTextArea, "select"); // Hints should exist agHelper.AssertElementExist(locators._hints); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Binding/JSObject_Postgress_Table_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Binding/JSObject_Postgress_Table_spec.js index 4e9fb75e52..2bc8d22ae8 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Binding/JSObject_Postgress_Table_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/Binding/JSObject_Postgress_Table_spec.js @@ -20,11 +20,8 @@ describe("Addwidget from Query and bind with other widgets", function () { datasourceName = httpResponse.response.body.data.name; cy.NavigateToActiveDSQueryPane(datasourceName); - cy.get(queryLocators.templateMenu).click(); - cy.get(".CodeMirror textarea") - .first() - .focus() - .type("SELECT * FROM configs LIMIT 10;"); + // Resetting the default query and rewriting a new one + _.dataSources.EnterQuery("SELECT * FROM configs LIMIT 10;"); // eslint-disable-next-line cypress/no-unnecessary-waiting cy.wait(1000); // Mock the response for this test diff --git a/app/client/cypress/e2e/Regression/ClientSide/BugTests/Moment_Spec.ts b/app/client/cypress/e2e/Regression/ClientSide/BugTests/Moment_Spec.ts index f63290dff3..ff4c69ecdd 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/BugTests/Moment_Spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/BugTests/Moment_Spec.ts @@ -28,7 +28,6 @@ describe("Bug #14299 - The data from the query does not show up on the widget", it("1. Creating query & JSObject", () => { query = `SELECT id, name, date_of_birth, date_of_death, nationality FROM public."astronauts" LIMIT 20;`; dataSources.NavigateFromActiveDS(dsName, true); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); agHelper.RenameWithInPane("getAstronauts"); jsEditor.CreateJSObject( diff --git a/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/CopyQuery_RenameDatasource_spec.js b/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/CopyQuery_RenameDatasource_spec.js index 8bdb8739ad..58b3dc1991 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/CopyQuery_RenameDatasource_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/CopyQuery_RenameDatasource_spec.js @@ -38,8 +38,7 @@ describe("Entity explorer tests related to copy query", function () { 200, ); - cy.get(queryLocators.templateMenu).click(); - cy.get(".CodeMirror textarea").first().focus().type("select * from users"); + dataSources.EnterQuery("select * from users"); cy.EvaluateCurrentValue("select * from users"); cy.get(".t--action-name-edit-field").click({ force: true }); diff --git a/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Datasource_Structure_spec.js b/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Datasource_Structure_spec.js index 68ada16cb3..1222949624 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Datasource_Structure_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Datasource_Structure_spec.js @@ -1,7 +1,10 @@ const explorer = require("../../../../locators/explorerlocators.json"); const queryLocators = require("../../../../locators/QueryEditor.json"); const apiwidget = require("../../../../locators/apiWidgetslocator.json"); -import { entityExplorer } from "../../../../support/Objects/ObjectsCore"; +import { + entityExplorer, + dataSources, +} from "../../../../support/Objects/ObjectsCore"; describe("Entity explorer datasource structure", function () { let datasourceName; @@ -71,7 +74,6 @@ describe("Entity explorer datasource structure", function () { it("2. Refresh datasource structure", function () { cy.NavigateToActiveDSQueryPane(datasourceName); - cy.get(queryLocators.templateMenu).click({ force: true }); //cy.GlobalSearchEntity(datasourceName); // cy.get(`.t--entity.datasource:contains(${datasourceName})`) @@ -87,7 +89,7 @@ describe("Entity explorer datasource structure", function () { const tableName = Math.random() .toString(36) .replace(/[^a-z]+/g, ""); - cy.typeValueNValidate(`CREATE TABLE public.${tableName} ( ID int );`); + dataSources.EnterQuery(`CREATE TABLE public.${tableName} ( ID int );`); cy.onlyQueryRun(); cy.wait("@postExecute").then(({ response }) => { expect(response.body.data.request.requestParams.Query.value).to.contain( diff --git a/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Query_Datasource_spec.js b/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Query_Datasource_spec.js index 9b2fc3ac9a..75eb1ea5e6 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Query_Datasource_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/ExplorerTests/Query_Datasource_spec.js @@ -83,8 +83,7 @@ describe("Entity explorer tests related to query and datasource", function () { 200, ); - // cy.get(queryLocators.templateMenu).click(); - cy.get(".CodeMirror textarea").first().focus().type("select * from users"); + dataSources.EnterQuery("select * from users"); cy.EvaluateCurrentValue("select * from users"); cy.get(".t--action-name-edit-field").click({ force: true }); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Git/GitDiscardChange/DiscardChanges_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Git/GitDiscardChange/DiscardChanges_spec.js index 4b6f5d2cc2..22a0442be9 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Git/GitDiscardChange/DiscardChanges_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/Git/GitDiscardChange/DiscardChanges_spec.js @@ -63,7 +63,6 @@ describe("Git discard changes:", function () { cy.wait("@getPage"); // create new postgres query dataSources.NavigateFromActiveDS(datasourceName, true); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(`SELECT * FROM public."category" LIMIT 10;`); agHelper.RenameWithInPane(query2); dataSources.RunQuery(); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Git/GitSync/GitSyncedApps_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Git/GitSync/GitSyncedApps_spec.js index 25162c12f4..9bfa3994d8 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Git/GitSync/GitSyncedApps_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/Git/GitSync/GitSyncedApps_spec.js @@ -288,7 +288,6 @@ describe("Git sync apps", function () { // create postgres select query //cy.CheckAndUnfoldEntityItem("Datasources"); dataSources.NavigateFromActiveDS(datasourceName, true); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery("SELECT * FROM users ORDER BY id LIMIT 10;"); agHelper.RenameWithInPane("get_users"); dataSources.RunQuery(); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Linting/BasicLint_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/Linting/BasicLint_spec.ts index 8a1d93feb9..aa51c4731c 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Linting/BasicLint_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/Linting/BasicLint_spec.ts @@ -47,7 +47,6 @@ const clickButtonAndAssertLintError = ( const createMySQLDatasourceQuery = () => { // Create Query dataSources.NavigateFromActiveDS(dsName, true); - agHelper.GetNClick(dataSources._templateMenu); const tableCreateQuery = `SELECT * FROM spacecrafts LIMIT 10;`; dataSources.EnterQuery(tableCreateQuery); }; diff --git a/app/client/cypress/e2e/Regression/ClientSide/MobileResponsiveTests/Snipping_mode_Basic_test.js b/app/client/cypress/e2e/Regression/ClientSide/MobileResponsiveTests/Snipping_mode_Basic_test.js index 3d52d5cdd9..555b89e200 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/MobileResponsiveTests/Snipping_mode_Basic_test.js +++ b/app/client/cypress/e2e/Regression/ClientSide/MobileResponsiveTests/Snipping_mode_Basic_test.js @@ -19,12 +19,7 @@ describe("Add widget - Postgress DataSource", function () { _.autoLayout.ConvertToAutoLayoutAndVerify(false); cy.NavigateToActiveDSQueryPane(datasourceName); - cy.get(queryLocators.templateMenu).click(); - cy.wait(500); - cy.get(".CodeMirror textarea") - .first() - .focus() - .type("select * from public.configs"); + _.dataSources.EnterQuery("select * from public.configs"); cy.WaitAutoSave(); cy.runQuery(); cy.get(queryEditor.suggestedTableWidget).click(); diff --git a/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/EntityBottomBar_spec.ts b/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/EntityBottomBar_spec.ts index 35d7b0a505..b831d95f0c 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/EntityBottomBar_spec.ts +++ b/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/EntityBottomBar_spec.ts @@ -97,7 +97,7 @@ describe("Entity bottom bar", () => { _.debuggerHelper.CloseBottomBar(); _.debuggerHelper.AssertClosed(); //Create and run query. - _.agHelper.GetNClick(_.dataSources._templateMenu); + _.dataSources.EnterQuery( "SELECT * FROM users ORDER BY id LIMIT 10;", 1000, @@ -131,7 +131,6 @@ describe("Entity bottom bar", () => { _.debuggerHelper.CloseBottomBar(); _.debuggerHelper.AssertClosed(); //Create and run query. - _.agHelper.GetNClick(_.dataSources._templateMenu); _.dataSources.EnterQuery("SELECT * FROM users ORDER BY id LIMIT 10;", 1000); _.dataSources.RunQuery(); //Verify if bottom bar is open on executing query. diff --git a/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Replay_Editor_spec.js b/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Replay_Editor_spec.js index 1ff268bee1..1dcd7043c5 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Replay_Editor_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/OtherUIFeatures/Replay_Editor_spec.js @@ -97,7 +97,8 @@ describe("Undo/Redo functionality", function () { it("3. Checks undo/redo in query editor", () => { dataSources.NavigateFromActiveDS(postgresDatasourceName, true); - cy.get(queryLocators.templateMenu).click(); + // Resetting the default query and rewriting a new one + dataSources.EnterQuery(""); cy.get(".CodeMirror textarea").first().focus().type("{{FirstAPI}}", { force: true, parseSpecialCharSequences: false, diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/Chart/Chart_Widget_Loading_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Widgets/Chart/Chart_Widget_Loading_spec.js index 93b8f3e311..c025a8bf12 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Widgets/Chart/Chart_Widget_Loading_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/Chart/Chart_Widget_Loading_spec.js @@ -35,18 +35,11 @@ describe("Chart Widget Skeleton Loading Functionality", function () { cy.wait(2000); _.dataSources.CreateMockDB("Users").then((dbName) => { _.dataSources.CreateQueryFromActiveTab(dbName, false); - _.agHelper.GetNClick(_.dataSources._templateMenuOption("Select")); _.dataSources.ToggleUsePreparedStatement(false); }); // Step6.2: writing query to get the schema - cy.get(".CodeMirror textarea") - .first() - .focus() - .type("SELECT * FROM users ORDER BY id LIMIT 10;", { - force: true, - parseSpecialCharSequences: false, - }); + _.dataSources.EnterQuery("SELECT * FROM users ORDER BY id LIMIT 10;"); cy.WaitAutoSave(); //Step7: @@ -120,16 +113,8 @@ describe("Chart Widget Skeleton Loading Functionality", function () { cy.get(queryLocators.switch).last().click({ force: true }); - cy.get(queryLocators.templateMenu).click(); - cy.xpath(queryLocators.query).click({ force: true }); + _.dataSources.EnterQuery("SELECT * FROM users ORDER BY id LIMIT 10;"); - cy.get(".CodeMirror textarea") - .first() - .focus() - .type("SELECT * FROM users ORDER BY id LIMIT 10;", { - force: true, - parseSpecialCharSequences: false, - }); cy.WaitAutoSave(); cy.runQuery(); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/ListV2_PageNo_PageSize_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/ListV2_PageNo_PageSize_spec.js index 288be8a296..ee8d8d1d57 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/ListV2_PageNo_PageSize_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/ListV2_PageNo_PageSize_spec.js @@ -165,20 +165,13 @@ describe("List widget V2 page number and page size", () => { cy.wait(2000); _.dataSources.CreateMockDB("Users").then((dbName) => { _.dataSources.CreateQueryFromActiveTab(dbName, false); - _.agHelper.GetNClick(_.dataSources._templateMenuOption("Select")); _.dataSources.ToggleUsePreparedStatement(false); }); // writing query to get the schema - cy.get(".CodeMirror textarea") - .first() - .focus() - .type( - "SELECT * FROM users OFFSET {{List1.pageNo * List1.pageSize}} LIMIT {{List1.pageSize}};", - { - force: true, - parseSpecialCharSequences: false, - }, - ); + _.dataSources.EnterQuery( + "SELECT * FROM users OFFSET {{List1.pageNo * List1.pageSize}} LIMIT {{List1.pageSize}};", + ); + cy.WaitAutoSave(); cy.runQuery(); @@ -222,21 +215,10 @@ describe("List widget V2 page number and page size", () => { // switching off Use Prepared Statement toggle cy.get(queryLocators.switch).last().click({ force: true }); - //.1: Click on Write query area - cy.get(queryLocators.templateMenu).click(); - cy.xpath(queryLocators.query).click({ force: true }); + _.dataSources.EnterQuery( + "SELECT * FROM users OFFSET {{List1.pageNo * 1}} LIMIT {{List1.pageSize}};", + ); - // writing query to get the schema - cy.get(".CodeMirror textarea") - .first() - .focus() - .type( - "SELECT * FROM users OFFSET {{List1.pageNo * 1}} LIMIT {{List1.pageSize}};", - { - force: true, - parseSpecialCharSequences: false, - }, - ); cy.WaitAutoSave(); cy.runQuery(); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/Listv2_BasicServerSideData_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/Listv2_BasicServerSideData_spec.js index 71f32c2b1d..43ce42fac3 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/Listv2_BasicServerSideData_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/ListV2/Listv2_BasicServerSideData_spec.js @@ -17,7 +17,6 @@ describe("List widget v2 - Basic server side data tests", () => { // Create sample(mock) user database. _.dataSources.CreateMockDB("Users").then((dbName) => { _.dataSources.CreateQueryFromActiveTab(dbName, false); - _.agHelper.GetNClick(_.dataSources._templateMenu); _.dataSources.ToggleUsePreparedStatement(false); _.dataSources.EnterQuery( "SELECT * FROM users OFFSET {{List1.pageNo * List1.pageSize}} LIMIT {{List1.pageSize}};", @@ -32,7 +31,6 @@ describe("List widget v2 - Basic server side data tests", () => { _.dataSources.NavigateToActiveTab(); cy.wait(1000); _.dataSources.CreateQueryFromActiveTab($dsName, false); - _.agHelper.GetNClick(_.dataSources._templateMenuOption("Select")); _.dataSources.ToggleUsePreparedStatement(false); _.dataSources.EnterQuery( "SELECT * FROM users OFFSET {{List1.pageNo * 1}} LIMIT {{List1.pageSize}};", @@ -358,19 +356,9 @@ describe("List widget v2 - Basic server side data tests", () => { }); //.1: Click on Write query area - cy.get(queryLocators.templateMenu).click(); - cy.xpath(queryLocators.query).click({ - force: true, - }); - // writing query to get the schema - cy.get(".CodeMirror textarea") - .first() - .focus() - .type("SELECT * FROM users LIMIT 20;", { - force: true, - parseSpecialCharSequences: false, - }); + _.dataSources.EnterQuery("SELECT * FROM users LIMIT 20;"); + cy.WaitAutoSave(); cy.runQuery(); @@ -412,19 +400,8 @@ describe("List widget v2 - Basic server side data tests", () => { }); //.1: Click on Write query area - cy.get(queryLocators.templateMenu).click(); - cy.xpath(queryLocators.query).click({ - force: true, - }); + _.dataSources.EnterQuery("SELECT * FROM users LIMIT 20;"); - // writing query to get the schema - cy.get(".CodeMirror textarea") - .first() - .focus() - .type("SELECT * FROM users LIMIT 20;", { - force: true, - parseSpecialCharSequences: false, - }); cy.WaitAutoSave(); cy.runQuery(); diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/TableV1/Table_PropertyPane_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Widgets/TableV1/Table_PropertyPane_spec.js index d51e2dd3d8..2332183cb3 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Widgets/TableV1/Table_PropertyPane_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/TableV1/Table_PropertyPane_spec.js @@ -18,7 +18,8 @@ describe("Table Widget property pane feature validation", function () { cy.openPropertyPane("tablewidget"); // Select show message in the "on selected row" dropdown cy.getAlert("onRowSelected", "Row is selected"); - _.deployMode.DeployApp(); + _.deployMode.DeployApp(_.locators._widgetInDeployed("tablewidget")); + _.table.WaitUntilTableLoad(0, 0, "v1"); // Select 1st row cy.isSelectRow(2); cy.wait(2000); @@ -32,7 +33,8 @@ describe("Table Widget property pane feature validation", function () { cy.openPropertyPane("tablewidget"); // Select show message in the "on selected row" dropdown cy.getAlert("onPageChange", "Page Changed"); - _.deployMode.DeployApp(); + _.deployMode.DeployApp(_.locators._widgetInDeployed("tablewidget")); + _.table.WaitUntilTableLoad(0, 0, "v1"); cy.wait(2000); // Change the page cy.get(widgetsPage.nextPageButton).click({ force: true }); @@ -46,7 +48,8 @@ describe("Table Widget property pane feature validation", function () { cy.openPropertyPane("tablewidget"); // Show Message on Search text change Action cy.getAlert("onSearchTextChanged", "Search Text Changed"); - _.deployMode.DeployApp(); + _.deployMode.DeployApp(_.locators._widgetInDeployed("tablewidget")); + _.table.WaitUntilTableLoad(0, 0, "v1"); // Change the Search text cy.get(widgetsPage.searchField).type("Hello"); cy.wait(2000); @@ -268,7 +271,8 @@ describe("Table Widget property pane feature validation", function () { cy.backFromPropertyPanel(); // Chage deat search text value to "data" cy.testJsontext("defaultsearchtext", "data"); - _.deployMode.DeployApp(); + _.deployMode.DeployApp(_.locators._widgetInDeployed("tablewidget")); + _.table.WaitUntilTableLoad(0, 0, "v1"); // Verify the deaullt search text cy.get(widgetsPage.searchField).should("have.value", "data"); _.deployMode.NavigateBacktoEditor(); @@ -282,7 +286,8 @@ describe("Table Widget property pane feature validation", function () { // Change default selected row value to 1 cy.get(widgetsPage.defaultSelectedRowField).type("1"); cy.wait(2000); - _.deployMode.DeployApp(); + _.deployMode.DeployApp(_.locators._widgetInDeployed("tablewidget")); + _.table.WaitUntilTableLoad(0, 0, "v1"); // Verify the default selected row cy.get(widgetsPage.selectedRow).should( "have.css", diff --git a/app/client/cypress/e2e/Regression/ClientSide/Widgets/TableV2/TableV2_PropertyPane_spec.js b/app/client/cypress/e2e/Regression/ClientSide/Widgets/TableV2/TableV2_PropertyPane_spec.js index cbb908a139..c908b9b43b 100644 --- a/app/client/cypress/e2e/Regression/ClientSide/Widgets/TableV2/TableV2_PropertyPane_spec.js +++ b/app/client/cypress/e2e/Regression/ClientSide/Widgets/TableV2/TableV2_PropertyPane_spec.js @@ -4,6 +4,8 @@ import { propPane, agHelper, deployMode, + draggableWidgets, + locators, } from "../../../../../support/Objects/ObjectsCore"; const widgetsPage = require("../../../../../locators/Widgets.json"); const commonlocators = require("../../../../../locators/commonlocators.json"); @@ -68,7 +70,8 @@ describe("Table Widget V2 property pane feature validation", function () { cy.openPropertyPane("tablewidgetv2"); // Select show message in the "on selected row" dropdown cy.getAlert("onRowSelected", "Row is selected"); - deployMode.DeployApp(); + deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.TABLE)); + table.WaitUntilTableLoad(0, 0, "v2"); // Select 1st row cy.isSelectRow(2); cy.wait(2000); @@ -82,7 +85,8 @@ describe("Table Widget V2 property pane feature validation", function () { cy.openPropertyPane("tablewidgetv2"); // Show Message on Search text change Action cy.getAlert("onSearchTextChanged", "Search Text Changed"); - deployMode.DeployApp(); + deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.TABLE)); + table.WaitUntilTableLoad(0, 0, "v2"); // Change the Search text cy.get(widgetsPage.searchField).type("Hello"); cy.wait(2000); @@ -99,7 +103,8 @@ describe("Table Widget V2 property pane feature validation", function () { }); // Select show message in the "on selected row" dropdown cy.getAlert("onPageChange", "Page Changed"); - deployMode.DeployApp(); + deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.TABLE)); + table.WaitUntilTableLoad(0, 0, "v2"); cy.wait(2000); // Change the page cy.get(widgetsPage.nextPageButton).click({ force: true }); @@ -335,7 +340,8 @@ describe("Table Widget V2 property pane feature validation", function () { // Chage deat search text value to "data" cy.backFromPropertyPanel(); cy.testJsontext("defaultsearchtext", "data"); - deployMode.DeployApp(); + deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.TABLE)); + table.WaitForTableEmpty("v2"); // Verify the deaullt search text cy.get(widgetsPage.searchField).should("have.value", "data"); deployMode.NavigateBacktoEditor(); diff --git a/app/client/cypress/e2e/Regression/ServerSide/ActionExecution/Block_Execution.ts b/app/client/cypress/e2e/Regression/ServerSide/ActionExecution/Block_Execution.ts index 3e6a00da7a..33342d53cb 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/ActionExecution/Block_Execution.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/ActionExecution/Block_Execution.ts @@ -21,7 +21,6 @@ describe("Block Action Execution when no field is present", () => { agHelper.Sleep(1000); dataSources.CreateQueryAfterDSSaved(); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery("SELECT * from users"); dataSources.AssertRunButtonDisability(false); dataSources.EnterQuery(""); @@ -37,7 +36,6 @@ describe("Block Action Execution when no field is present", () => { agHelper.Sleep(1000); dataSources.CreateQueryAfterDSSaved(); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery("SELECT * from users"); dataSources.AssertRunButtonDisability(false); dataSources.EnterQuery(""); diff --git a/app/client/cypress/e2e/Regression/ServerSide/GenerateCRUD/MySQL1_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/GenerateCRUD/MySQL1_Spec.ts index 990cfcb69f..270de68e34 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/GenerateCRUD/MySQL1_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/GenerateCRUD/MySQL1_Spec.ts @@ -147,7 +147,6 @@ describe("Validate MySQL Generate CRUD with JSON Form", () => { `; dataSources.NavigateFromActiveDS(dsName, true); - agHelper.GetNClick(dataSources._templateMenu); agHelper.RenameWithInPane("CreateProductLines"); dataSources.EnterQuery(tableCreateQuery); agHelper.FocusElement(locators._codeMirrorTextArea); @@ -274,7 +273,6 @@ describe("Validate MySQL Generate CRUD with JSON Form", () => { it("9. Validate Drop of the Newly Created - Stores - Table from MySQL datasource", () => { let deleteTblQuery = "DROP TABLE productlines;"; dataSources.NavigateFromActiveDS(dsName, true); - agHelper.GetNClick(dataSources._templateMenu); agHelper.RenameWithInPane("DropProductlines"); dataSources.EnterQuery(deleteTblQuery); agHelper.FocusElement(locators._codeMirrorTextArea); diff --git a/app/client/cypress/e2e/Regression/ServerSide/GenerateCRUD/MySQL2_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/GenerateCRUD/MySQL2_Spec.ts index ef27377e1e..2b7c66d0f4 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/GenerateCRUD/MySQL2_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/GenerateCRUD/MySQL2_Spec.ts @@ -58,7 +58,6 @@ describe("Validate MySQL Generate CRUD with JSON Form", () => { INSERT INTO Stores(store_id,name,store_status,store_address,store_secret_code) VALUES (2188,'Kind''s Jack and Jill Food Center','I','110 S Main Sigourney, IA 525910000 (41.333550830000036, -92.20522134099997)',NULL); INSERT INTO Stores(store_id,name,store_status,store_address,store_secret_code) VALUES (2190,'Central City Liquor, Inc.','A','1460 2nd Ave Des Moines, IA 503140000 (41.60557033500004, -93.61982683699995)',NULL);`; dataSources.NavigateFromActiveDS(dsName, true); - agHelper.GetNClick(dataSources._templateMenu); agHelper.RenameWithInPane("CreateStores"); dataSources.EnterQuery(tableCreateQuery); agHelper.FocusElement(locators._codeMirrorTextArea); @@ -364,7 +363,6 @@ describe("Validate MySQL Generate CRUD with JSON Form", () => { it("12. Validate Drop of the Newly Created - Stores - Table from MySQL datasource", () => { let deleteTblQuery = "DROP TABLE Stores;"; dataSources.NavigateFromActiveDS(dsName, true); - agHelper.GetNClick(dataSources._templateMenu); agHelper.RenameWithInPane("DropStores"); dataSources.EnterQuery(deleteTblQuery); agHelper.FocusElement(locators._codeMirrorTextArea); diff --git a/app/client/cypress/e2e/Regression/ServerSide/GenerateCRUD/Postgres2_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/GenerateCRUD/Postgres2_Spec.ts index ccfde1dc23..c1432f13d3 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/GenerateCRUD/Postgres2_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/GenerateCRUD/Postgres2_Spec.ts @@ -50,7 +50,7 @@ describe("Validate Postgres Generate CRUD with JSON Form", () => { `; dataSources.NavigateFromActiveDS(dsName, true); - agHelper.GetNClick(dataSources._templateMenu); + agHelper.RenameWithInPane("CreateVessels"); dataSources.EnterQuery(tableCreateQuery); agHelper.FocusElement(locators._codeMirrorTextArea); @@ -619,7 +619,6 @@ describe("Validate Postgres Generate CRUD with JSON Form", () => { it("17. Validate Drop of the Newly Created - Vessels - Table from Postgres datasource", () => { const deleteTblQuery = "DROP TABLE Vessels;"; dataSources.NavigateFromActiveDS(dsName, true); - agHelper.GetNClick(dataSources._templateMenu); agHelper.RenameWithInPane("DropVessels"); dataSources.EnterQuery(deleteTblQuery); agHelper.FocusElement(locators._codeMirrorTextArea); diff --git a/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/JSOnLoad1_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/JSOnLoad1_Spec.ts index f013113ecd..106d6561eb 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/JSOnLoad1_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/JSOnLoad1_Spec.ts @@ -39,7 +39,6 @@ describe("JSObjects OnLoad Actions tests", function () { ); jsEditor.EnableDisableAsyncFuncSettings("getEmployee", false, true); //Only before calling confirmation is enabled by User here dataSources.NavigateFromActiveDS(dsName, true); - agHelper.GetNClick(dataSources._templateMenu); agHelper.RenameWithInPane("GetEmployee"); cy.get("@jsObjName").then((jsObjName) => { jsName = jsObjName; diff --git a/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/JSOnLoad_cyclic_dependency_errors_spec.js b/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/JSOnLoad_cyclic_dependency_errors_spec.js index 7c098211e4..9684c25a84 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/JSOnLoad_cyclic_dependency_errors_spec.js +++ b/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/JSOnLoad_cyclic_dependency_errors_spec.js @@ -40,8 +40,8 @@ describe("Cyclic Dependency Informational Error Messages", function () { //Step1 : Create Mock Users DB dataSources.CreateMockDB("Users").then((dbName) => { dataSources.CreateQueryFromActiveTab(dbName, false); - agHelper.GetNClick(dataSources._templateMenuOption("Select")); dataSources.ToggleUsePreparedStatement(false); + dataSources.EnterQuery("SELECT * FROM users LIMIT 10"); }); entityExplorer.NavigateToSwitcher("Widgets"); cy.openPropertyPane("inputwidgetv2"); @@ -68,7 +68,7 @@ describe("Cyclic Dependency Informational Error Messages", function () { }); cy.wait(1000); cy.get(datasource.createQuery).click(); - agHelper.GetNClick(dataSources._templateMenuOption("Select")); + dataSources.EnterQuery("SELECT * FROM users LIMIT 10"); dataSources.ToggleUsePreparedStatement(false); entityExplorer.NavigateToSwitcher("Widgets"); cy.openPropertyPane("inputwidgetv2"); diff --git a/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/PostgresConnections_spec.ts b/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/PostgresConnections_spec.ts index a166c4ceda..ea4bd197a5 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/PostgresConnections_spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/OnLoadTests/PostgresConnections_spec.ts @@ -61,7 +61,6 @@ describe("Test Postgres number of connections on page load + Bug 11572, Bug 1120 //Create 10 queries for (let i = 1; i <= 10; i++) { dataSources.NavigateFromActiveDS(dsName_2, true); - agHelper.GetNClick(dataSources._templateMenu); agHelper.RenameWithInPane("Query_" + i); const userCreateQuery = `select table_name from information_schema.tables where table_schema='public' and table_type='BASE TABLE';`; dataSources.EnterQuery(userCreateQuery); @@ -92,7 +91,6 @@ describe("Test Postgres number of connections on page load + Bug 11572, Bug 1120 it("4. Run query to drop any open connections before deploy and then deploy app", () => { dataSources.NavigateFromActiveDS(dsName_1, true); - agHelper.GetNClick(dataSources._templateMenu); agHelper.RenameWithInPane("check_number_of_connections_1"); const userName = "test_conn_user_" + guid; const dropConnections = @@ -115,7 +113,6 @@ describe("Test Postgres number of connections on page load + Bug 11572, Bug 1120 it("5. Run query to check number of open connections after deploy", () => { dataSources.NavigateFromActiveDS(dsName_2, true); - agHelper.GetNClick(dataSources._templateMenu); agHelper.RenameWithInPane("check_number_of_connections_2"); const checkNoOfConnQuery = `select count(*) from pg_stat_activity where usename='test_conn_user_` + diff --git a/app/client/cypress/e2e/Regression/ServerSide/Params/ExecutionParams_spec.js b/app/client/cypress/e2e/Regression/ServerSide/Params/ExecutionParams_spec.js index 74803c2b1c..637ec2381b 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Params/ExecutionParams_spec.js +++ b/app/client/cypress/e2e/Regression/ServerSide/Params/ExecutionParams_spec.js @@ -1,7 +1,11 @@ const publishPage = require("../../../../locators/publishWidgetspage.json"); const queryLocators = require("../../../../locators/QueryEditor.json"); const datasource = require("../../../../locators/DatasourcesEditor.json"); -import { agHelper, deployMode } from "../../../../support/Objects/ObjectsCore"; +import { + agHelper, + deployMode, + dataSources, +} from "../../../../support/Objects/ObjectsCore"; describe("API Panel Test Functionality", function () { let datasourceName; @@ -25,17 +29,12 @@ describe("API Panel Test Functionality", function () { it("2. Create and runs query", () => { cy.NavigateToActiveDSQueryPane(datasourceName); - cy.get(queryLocators.templateMenu).click(); cy.get(queryLocators.settings).click({ force: true }); cy.get(queryLocators.switch).last().click({ force: true }); cy.xpath(queryLocators.query).click({ force: true }); - cy.get(".CodeMirror textarea") - .first() - .focus() - .type("select * from {{ this.params.tableName || 'users' }} limit 10", { - force: true, - parseSpecialCharSequences: false, - }); + dataSources.EnterQuery( + "select * from {{ this.params.tableName || 'users' }} limit 10", + ); cy.WaitAutoSave(); cy.runQuery(); }); diff --git a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Array_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Array_Spec.ts index a3799250fe..c5004f5206 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Array_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Array_Spec.ts @@ -28,7 +28,6 @@ describe("Array Datatype tests", function () { it("1. Creating table query - arraytypes + Bug 14493", () => { query = `CREATE TABLE arraytypes (serialId SERIAL not null primary key, name text, pay_by_quarter integer[], schedule text[][]);`; dataSources.NavigateFromActiveDS(dsName, true); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); agHelper.RenameWithInPane("createTable"); dataSources.RunQuery(); @@ -174,7 +173,6 @@ describe("Array Datatype tests", function () { agHelper.RenameWithInPane("verifyArrayFunctions"); query = `SELECT name FROM arraytypes WHERE pay_by_quarter[1] <> pay_by_quarter[2];`; - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); dataSources.RunQuery(); dataSources.AssertQueryResponseHeaders(["name"]); diff --git a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Binary_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Binary_Spec.ts index e4b6c921bb..2c43c66ad3 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Binary_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Binary_Spec.ts @@ -254,7 +254,6 @@ describe.skip("Binary Datatype tests", function () { //Validating zero octet query = `select encode('\\000'::bytea, 'hex') as "zero octet Hex", encode('\\000'::bytea, 'escape') as "zero octet Escape";`; - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); dataSources.RunQuery(); dataSources.AssertQueryResponseHeaders([ diff --git a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/BooleanEnum_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/BooleanEnum_Spec.ts index 4de84beb61..2342fdc474 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/BooleanEnum_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/BooleanEnum_Spec.ts @@ -164,7 +164,6 @@ describe("Boolean & Enum Datatype tests", function () { entityExplorer.ExpandCollapseEntity("Queries/JS"); entityExplorer.CreateNewDsQuery(dsName); agHelper.RenameWithInPane("verifyEnumOrdering"); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); dataSources.RunQuery(); dataSources.ReadQueryTableResponse(1).then(($cellData) => { diff --git a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Character_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Character_Spec.ts index 6d295505d0..17dd00e8cd 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Character_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Character_Spec.ts @@ -26,7 +26,6 @@ describe("Character Datatype tests", function () { it("1. Creating table - chartypes", () => { query = `create table charTypes(serialid serial primary key, "One(1)" char, "AsMany" varchar, "Limited(4)" varchar(4), "Unlimited" text)`; dataSources.NavigateFromActiveDS(dsName, true); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); agHelper.RenameWithInPane("createTable"); agHelper.FocusElement(locators._codeMirrorTextArea); diff --git a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/DateTime_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/DateTime_Spec.ts index 92295dbd40..b622b37057 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/DateTime_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/DateTime_Spec.ts @@ -29,7 +29,6 @@ describe("DateTime Datatype tests", function () { tstz TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, dater date NOT NULL, timer time NOT NULL, timertz time with time zone not null default now(), intervaler interval not null);`; dataSources.NavigateFromActiveDS(dsName, true); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); agHelper.RenameWithInPane("createTable"); agHelper.FocusElement(locators._codeMirrorTextArea); diff --git a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Json_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Json_Spec.ts index 8f82ff7a65..a49d47064d 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Json_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Json_Spec.ts @@ -38,7 +38,6 @@ describe("Json & JsonB Datatype tests", function () { it("1. Creating table query - jsonbooks", () => { query = `CREATE TABLE jsonbooks(serialId SERIAL PRIMARY KEY, details JSON)`; dataSources.NavigateFromActiveDS(dsName, true); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); agHelper.RenameWithInPane("createTable"); dataSources.RunQuery(); @@ -64,33 +63,28 @@ describe("Json & JsonB Datatype tests", function () { it("3. Creating all queries - jsonbooks", () => { query = `INSERT INTO jsonbooks(details) VALUES('{"customer": "{{InsertJSONForm.formData.customer}}", "title": "{{InsertJSONForm.formData.title}}", "type": {{InsertJSONForm.formData.type}}, "info": {"published": {{InsertJSONForm.formData.info.published}}, "price": {{InsertJSONForm.formData.info.price}}}}');`; entityExplorer.CreateNewDsQuery(dsName); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); agHelper.RenameWithInPane("insertRecord"); dataSources.ToggleUsePreparedStatement(false); query = `UPDATE public."jsonbooks" SET "details" = '{"customer": "{{UpdateJSONForm.formData.customer}}", "title": "{{UpdateJSONForm.formData.title}}", "type": {{UpdateJSONForm.formData.type}}, "info": {"published": {{UpdateJSONForm.formData.info.published}}, "price": {{UpdateJSONForm.formData.info.price}}}}' WHERE serialid = {{Table1.selectedRow.serialid}};`; entityExplorer.CreateNewDsQuery(dsName); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); agHelper.RenameWithInPane("updateRecord"); dataSources.ToggleUsePreparedStatement(false); query = `DELETE FROM public."jsonbooks" WHERE serialId ={{Table1.selectedRow.serialid}}`; entityExplorer.CreateNewDsQuery(dsName); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); agHelper.RenameWithInPane("deleteRecord"); query = `DELETE FROM public."jsonbooks"`; entityExplorer.CreateNewDsQuery(dsName); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); agHelper.RenameWithInPane("deleteAllRecords"); query = `drop table public."jsonbooks"`; entityExplorer.CreateNewDsQuery(dsName); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); agHelper.RenameWithInPane("dropTable"); @@ -194,7 +188,6 @@ describe("Json & JsonB Datatype tests", function () { //Verifying -> - returns results in json format query = `SELECT details -> 'title' AS "BookTitle" FROM jsonbooks;`; - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); agHelper.RenameWithInPane("verifyJsonFunctions"); dataSources.RunQuery(); @@ -361,14 +354,12 @@ describe("Json & JsonB Datatype tests", function () { it("15. Creating enum & table queries - jsonBbooks", () => { query = `CREATE TYPE genres AS ENUM ('Fiction', 'Thriller', 'Horror', 'Marketing & Sales', 'Self-Help', 'Psychology', 'Law', 'Politics', 'Productivity', 'Reference', 'Spirituality');`; dataSources.NavigateFromActiveDS(dsName, true); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); agHelper.RenameWithInPane("createEnum"); dataSources.RunQuery(); query = `CREATE TABLE "jsonBbooks" (serialId SERIAL PRIMARY KEY, details JSONB)`; entityExplorer.CreateNewDsQuery(dsName); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); agHelper.RenameWithInPane("createTable"); dataSources.RunQuery(); @@ -399,45 +390,38 @@ describe("Json & JsonB Datatype tests", function () { it("17. Creating all queries - jsonBbooks", () => { query = `INSERT INTO "jsonBbooks"(details) VALUES('{"title": "{{InsertJSONForm.formData.title}}", "genres": {{InsertJSONForm.formData.genres}}, "info": {"published": {{InsertJSONForm.formData.info.published}}, "publishedDate": "{{InsertJSONForm.formData.info.publishedDate}}"}}');`; entityExplorer.CreateNewDsQuery(dsName); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); agHelper.RenameWithInPane("insertRecord"); dataSources.ToggleUsePreparedStatement(false); query = `UPDATE public."jsonBbooks" SET "details" = '{"title": "{{UpdateJSONForm.formData.title}}", "genres": {{UpdateJSONForm.formData.genres}}, "info": {"published": {{UpdateJSONForm.formData.info.published}}, "publishedDate": "{{UpdateJSONForm.formData.info.publishedDate}}"}}' WHERE serialid = {{Table1.selectedRow.serialid}};`; entityExplorer.CreateNewDsQuery(dsName); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); agHelper.RenameWithInPane("updateRecord"); dataSources.ToggleUsePreparedStatement(false); query = `SELECT * from enum_range(NULL::genres)`; entityExplorer.CreateNewDsQuery(dsName); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); agHelper.RenameWithInPane("getEnum"); query = `DELETE FROM public."jsonBbooks" WHERE serialId ={{Table1.selectedRow.serialid}}`; entityExplorer.CreateNewDsQuery(dsName); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); agHelper.RenameWithInPane("deleteRecord"); query = `DELETE FROM public."jsonBbooks"`; entityExplorer.CreateNewDsQuery(dsName); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); agHelper.RenameWithInPane("deleteAllRecords"); query = `drop table public."jsonBbooks"`; entityExplorer.CreateNewDsQuery(dsName); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); agHelper.RenameWithInPane("dropTable"); query = `drop type genres`; entityExplorer.CreateNewDsQuery(dsName); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); agHelper.RenameWithInPane("dropEnum"); @@ -569,7 +553,6 @@ describe("Json & JsonB Datatype tests", function () { //Verifying @> contains query = `SELECT '["Fiction", "Thriller", "Horror"]'::jsonb @> '["Fiction", "Horror"]'::jsonb as "Result1", '["Fiction", "Horror"]'::jsonb @> '["Fiction", "Thriller", "Horror"]'::jsonb as "Result2", '{"name": "Alice", "agent": {"bot": true} }'::jsonb -> 'agent' ->> 'bot' is not null as "Filter"`; - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); dataSources.RunQuery(); dataSources.AssertQueryResponseHeaders(["Result1", "Result2", "Filter"]); diff --git a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Numeric_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Numeric_Spec.ts index b4247319f6..245493d33c 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Numeric_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/Numeric_Spec.ts @@ -26,7 +26,6 @@ describe("Numeric Datatype tests", function () { it("1. Creating table - numerictypes", () => { query = `create table numerictypes (serialId SERIAL not null primary key, bigintId bigint not null, decimalId decimal not null, numericId numeric not null)`; dataSources.NavigateFromActiveDS(dsName, true); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); agHelper.RenameWithInPane("createTable"); agHelper.FocusElement(locators._codeMirrorTextArea); diff --git a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/UUID_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/UUID_Spec.ts index cbbff1a429..a52d14ef0b 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/UUID_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/Postgres_DataTypes/UUID_Spec.ts @@ -47,7 +47,6 @@ describe("UUID Datatype tests", function () { it("2. Creating table query - uuidtype", () => { query = `CREATE table uuidtype (serialid SERIAL primary key, v1 uuid, v4 uuid, guid uuid, nil uuid);`; dataSources.NavigateFromActiveDS(dsName, true); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); agHelper.RenameWithInPane("createTable"); dataSources.RunQuery(); @@ -73,31 +72,26 @@ describe("UUID Datatype tests", function () { it("4. Creating all queries - uuidtype", () => { query = `INSERT INTO public."uuidtype" ("v1", "v4", "guid", "nil") VALUES ('{{version1.data[0]}}', '{{version4.data}}', '{{guid.data}}', '{{nill.data}}');`; entityExplorer.CreateNewDsQuery(dsName); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); agHelper.RenameWithInPane("insertRecord"); query = `UPDATE public."uuidtype" SET "v1" ='{{version1.data[0] ? version1.data[0] : Table1.selectedRow.v1}}', "v4" ='{{version4.data ? version4.data : Table1.selectedRow.v4}}', "guid" ='{{guid.data ? guid.data : Table1.selectedRow.guid}}', "nil" ='{{nill.data ? nill.data : Table1.selectedRow.nil}}' WHERE serialid = {{Table1.selectedRow.serialid}};`; entityExplorer.CreateNewDsQuery(dsName); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); agHelper.RenameWithInPane("updateRecord"); query = `DELETE FROM public."uuidtype"`; entityExplorer.CreateNewDsQuery(dsName); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); agHelper.RenameWithInPane("deleteAllRecords"); query = `drop table public."uuidtype"`; entityExplorer.CreateNewDsQuery(dsName); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); agHelper.RenameWithInPane("dropTable"); query = `DELETE FROM public."uuidtype" WHERE serialId = {{Table1.selectedRow.serialid}}`; entityExplorer.CreateNewDsQuery(dsName); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); agHelper.RenameWithInPane("deleteRecord"); @@ -273,7 +267,6 @@ describe("UUID Datatype tests", function () { //Validating use of extention query = `CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; CREATE EXTENSION IF NOT EXISTS "pgcrypto"`; - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(query); dataSources.RunQueryNVerifyResponseViews(1); dataSources.AssertQueryResponseHeaders(["affectedRows"]); diff --git a/app/client/cypress/e2e/Regression/ServerSide/QueryPane/AddWidget_spec.js b/app/client/cypress/e2e/Regression/ServerSide/QueryPane/AddWidget_spec.js index dcaf283d16..369acebff9 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/QueryPane/AddWidget_spec.js +++ b/app/client/cypress/e2e/Regression/ServerSide/QueryPane/AddWidget_spec.js @@ -1,5 +1,6 @@ const queryLocators = require("../../../../locators/QueryEditor.json"); const queryEditor = require("../../../../locators/QueryEditor.json"); +import { dataSources } from "../../../../support/Objects/ObjectsCore"; let datasourceName; @@ -14,12 +15,7 @@ describe("Add widget - Postgress DataSource", function () { it("1. Verify 'Add to widget [Widget Suggestion]' functionality - Postgress", () => { cy.NavigateToActiveDSQueryPane(datasourceName); - cy.get(queryLocators.templateMenu).click(); - cy.wait(500); - cy.get(".CodeMirror textarea") - .first() - .focus() - .type("select * from public.configs"); + dataSources.EnterQuery("select * from public.configs"); cy.WaitAutoSave(); cy.runQuery(); cy.get(queryEditor.suggestedTableWidget).click(); diff --git a/app/client/cypress/e2e/Regression/ServerSide/QueryPane/MySQL_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/QueryPane/MySQL_Spec.ts index 7cbc9158a3..34103136c2 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/QueryPane/MySQL_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/QueryPane/MySQL_Spec.ts @@ -15,7 +15,6 @@ describe("Validate MySQL query UI flows - Bug 14054", () => { it("2. Validate Describe & verify query response", () => { dataSources.NavigateFromActiveDS(dsName, true); - agHelper.GetNClick(dataSources._templateMenu); agHelper.RenameWithInPane("verifyDescribe"); runQueryNValidate("Describe customers;", [ "Field", @@ -49,7 +48,6 @@ describe("Validate MySQL query UI flows - Bug 14054", () => { it("3. Validate SHOW & verify query response", () => { dataSources.NavigateFromActiveDS(dsName, true); - agHelper.GetNClick(dataSources._templateMenu); agHelper.RenameWithInPane("verifyShow"); runQueryNValidate("SHOW tables;", ["Tables_in_fakeapi"]); runQueryNValidate("SHOW databases", ["Database"]); diff --git a/app/client/cypress/e2e/Regression/ServerSide/QueryPane/Postgres_Spec.js b/app/client/cypress/e2e/Regression/ServerSide/QueryPane/Postgres_Spec.js index 344456ccb7..549eb775de 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/QueryPane/Postgres_Spec.js +++ b/app/client/cypress/e2e/Regression/ServerSide/QueryPane/Postgres_Spec.js @@ -29,7 +29,6 @@ describe("Validate CRUD queries for Postgres along with UI flow verifications", entityExplorer.NavigateToSwitcher("Widgets"); cy.dragAndDropToCanvas("tablewidgetv2", { x: 100, y: 100 }); cy.NavigateToActiveDSQueryPane(datasourceName); - cy.get(queryLocators.templateMenu).click({ force: true }); agHelper.TypeDynamicInputValueNValidate( "select * from users limit {{Table1.pageSize}} OFFSET {{((Table1.pageNo - 1)*Table1.pageSize)}}", ".CodeEditorTarget", @@ -83,7 +82,6 @@ describe("Validate CRUD queries for Postgres along with UI flow verifications", (29, 'CRUD User29', 'IN PROGRESS', 'Male','cruduser29@ihg.com', '19624 Scofield Way', 'Editor'), (30, 'CRUD User30', 'APPROVED', 'Female','cruduser30@ihg.com', '19624 Scofield Way', 'Admin');`; - cy.get(queryLocators.templateMenu).click({ force: true }); //cy.typeValueNValidate(tableCreateQuery);//Since type method is slow for such big text - using paste! cy.get(".CodeMirror textarea").focus().paste(tableCreateQuery); cy.EvaluateCurrentValue(tableCreateQuery); @@ -94,7 +92,6 @@ describe("Validate CRUD queries for Postgres along with UI flow verifications", it("4. Validate Select record from Postgress datasource", () => { let selectQuery = "select * from public.users_crud"; cy.NavigateToActiveDSQueryPane(datasourceName); - cy.get(queryLocators.templateMenu).click({ force: true }); cy.typeValueNValidate(selectQuery); // cy.xpath(queryLocators.codeTextArea).paste(selectQuery); @@ -107,7 +104,6 @@ describe("Validate CRUD queries for Postgres along with UI flow verifications", let insertQuery = "INSERT INTO public.users_crud (id, name, gender, email) VALUES (31, 'CRUD User11','Male','cruduser31@ihg.com');"; cy.NavigateToActiveDSQueryPane(datasourceName); - cy.get(queryLocators.templateMenu).click({ force: true }); cy.typeValueNValidate(insertQuery); cy.runAndDeleteQuery(); }); @@ -116,7 +112,6 @@ describe("Validate CRUD queries for Postgres along with UI flow verifications", let updateQuery = "UPDATE public.users_crud SET status = 'PENDING', role = 'Viewer' WHERE id = 31;"; cy.NavigateToActiveDSQueryPane(datasourceName); - cy.get(queryLocators.templateMenu).click({ force: true }); cy.typeValueNValidate(updateQuery); cy.runAndDeleteQuery(); }); @@ -124,7 +119,6 @@ describe("Validate CRUD queries for Postgres along with UI flow verifications", it("7. Validate Delete record from Postgress datasource", () => { let deleteQuery = "DELETE FROM public.users_crud WHERE id = 31;"; cy.NavigateToActiveDSQueryPane(datasourceName); - cy.get(queryLocators.templateMenu).click({ force: true }); cy.typeValueNValidate(deleteQuery); cy.runAndDeleteQuery(); }); @@ -289,7 +283,6 @@ describe("Validate CRUD queries for Postgres along with UI flow verifications", it("10. Validate Drop of the Newly Created Table from Postgress datasource", () => { let deleteTblQuery = "DROP TABLE public.users_crud;"; dataSources.NavigateFromActiveDS(datasourceName, true); - agHelper.GetNClick(dataSources._templateMenu); dataSources.EnterQuery(deleteTblQuery); dataSources.RunQuery(); entityExplorer.ExpandCollapseEntity("Datasources"); @@ -303,7 +296,6 @@ describe("Validate CRUD queries for Postgres along with UI flow verifications", it("11. Bug 9425: The application is breaking when user run the query with wrong table name", function () { dataSources.NavigateFromActiveDS(datasourceName, true); - agHelper.GetNClick(dataSources._templateMenu); cy.typeValueNValidate("select * from public.users limit 10"); cy.runQuery(); cy.typeValueNValidate("select * from public.users_crud limit 10"); @@ -320,7 +312,6 @@ describe("Validate CRUD queries for Postgres along with UI flow verifications", it("12. Bug 14493: The application is breaking when user runs the query with result as empty array", function () { cy.NavigateToActiveDSQueryPane(datasourceName); - cy.get(queryLocators.templateMenu).click({ force: true }); cy.typeValueNValidate( "select * from public.users where name='Ayush1234' ORDER BY id LIMIT 10", ); diff --git a/app/client/cypress/e2e/Regression/ServerSide/QueryPane/SwitchDatasource_spec.js b/app/client/cypress/e2e/Regression/ServerSide/QueryPane/SwitchDatasource_spec.js index a91ff6b4ed..39a5fd6436 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/QueryPane/SwitchDatasource_spec.js +++ b/app/client/cypress/e2e/Regression/ServerSide/QueryPane/SwitchDatasource_spec.js @@ -63,11 +63,6 @@ describe("Switch datasource", function () { it("4. By switching datasources execute a query with both the datasources", function () { cy.NavigateToActiveDSQueryPane(postgresDatasourceName); - cy.get(queryLocators.templateMenu).click({ force: true }); - cy.get(".CodeMirror textarea") - .first() - .focus() - .type("select * from public.users limit 10"); cy.wait(3000); cy.runQuery(); cy.wait("@saveAction").should( diff --git a/app/client/cypress/e2e/Sanity/Datasources/MockDBs_Spec.ts b/app/client/cypress/e2e/Sanity/Datasources/MockDBs_Spec.ts index dc73c077a4..9d3cf5891f 100644 --- a/app/client/cypress/e2e/Sanity/Datasources/MockDBs_Spec.ts +++ b/app/client/cypress/e2e/Sanity/Datasources/MockDBs_Spec.ts @@ -43,7 +43,7 @@ describe( dataSources.CreateMockDB("Users").then((mockDBName) => { dsName = mockDBName; dataSources.CreateQueryFromActiveTab(mockDBName, false); - agHelper.GetNClick(dataSources._templateMenuOption("Select")); + dataSources.EnterQuery("SELECT * FROM users LIMIT 10"); dataSources.RunQueryNVerifyResponseViews(10); dataSources.NavigateToActiveTab(); agHelper @@ -53,7 +53,7 @@ describe( ); entityExplorer.CreateNewDsQuery(mockDBName); - agHelper.GetNClick(dataSources._templateMenuOption("Select")); + dataSources.EnterQuery("SELECT * FROM users LIMIT 10"); dataSources.RunQueryNVerifyResponseViews(10, false); dataSources.NavigateToActiveTab(); agHelper diff --git a/app/client/cypress/e2e/Sanity/Datasources/MySQLNoiseTest_spec.js b/app/client/cypress/e2e/Sanity/Datasources/MySQLNoiseTest_spec.js index 0a1e77154a..ca2803e517 100644 --- a/app/client/cypress/e2e/Sanity/Datasources/MySQLNoiseTest_spec.js +++ b/app/client/cypress/e2e/Sanity/Datasources/MySQLNoiseTest_spec.js @@ -1,6 +1,6 @@ const queryLocators = require("../../../locators/QueryEditor.json"); const datasourceEditor = require("../../../locators/DatasourcesEditor.json"); -import { agHelper } from "../../../support/Objects/ObjectsCore"; +import { agHelper, dataSources } from "../../../support/Objects/ObjectsCore"; const commonlocators = require("../../../locators/commonlocators.json"); describe("MySQL noise test", function () { @@ -29,15 +29,10 @@ describe("MySQL noise test", function () { cy.NavigateToActiveDSQueryPane(datasourceName); }); cy.get(queryLocators.queryNameField).type("NoiseTestQuery"); - cy.get(queryLocators.templateMenu).click(); // mySQL query to fetch data - cy.get(".CodeMirror textarea") - .first() - .focus() - .type("SELECT * FROM users where role = 'Admin' ORDER BY id LIMIT 10", { - force: true, - parseSpecialCharSequences: false, - }); + dataSources.EnterQuery( + "SELECT * FROM users where role = 'Admin' ORDER BY id LIMIT 10", + ); cy.WaitAutoSave(); cy.runQuery(); cy.NavigateToAPI_Panel(); diff --git a/app/client/cypress/support/Pages/DataSources.ts b/app/client/cypress/support/Pages/DataSources.ts index 17feb8d18b..b7b44b38a7 100644 --- a/app/client/cypress/support/Pages/DataSources.ts +++ b/app/client/cypress/support/Pages/DataSources.ts @@ -793,7 +793,6 @@ export class DataSources { ); if (queryName) this.agHelper.RenameWithInPane(queryName); if (query) { - this.agHelper.GetNClick(this._templateMenu); this.EnterQuery(query); } } @@ -997,7 +996,6 @@ export class DataSources { this.agHelper.RemoveEvaluatedPopUp(); //to close the evaluated pop-up this.ee.CreateNewDsQuery(dsName); if (query) { - this.agHelper.GetNClick(this._templateMenu); this.EnterQuery(query, sleep); } if (queryName) this.agHelper.RenameWithInPane(queryName); diff --git a/app/client/cypress/support/queryCommands.js b/app/client/cypress/support/queryCommands.js index dc90275398..6b997f78e3 100644 --- a/app/client/cypress/support/queryCommands.js +++ b/app/client/cypress/support/queryCommands.js @@ -165,9 +165,6 @@ Cypress.Commands.add("CreateMockQuery", (queryName) => { force: true, }); cy.assertPageSave(); - cy.get(queryEditor.templateMenu + " div") - .contains("Select") - .click({ force: true }); cy.runQuery(); // cy.wait(3000); // cy.get(queryEditor.runQuery) diff --git a/app/client/src/constants/Datasource.ts b/app/client/src/constants/Datasource.ts index e4b5a02606..3cb14ebb6b 100644 --- a/app/client/src/constants/Datasource.ts +++ b/app/client/src/constants/Datasource.ts @@ -25,3 +25,6 @@ export const DatasourceEditEntryPoints = { DATASOURCE_CARD_EDIT: "DATASOURCE_CARD_EDIT", DATASOURCE_FORM_EDIT: "DATASOURCE_FORM_EDIT", }; + +export const DB_QUERY_DEFAULT_TABLE_NAME = "<>"; +export const DB_QUERY_DEFAULT_TEMPLATE_TYPE = "SELECT"; diff --git a/app/client/src/pages/Editor/FormControl.test.tsx b/app/client/src/pages/Editor/FormControl.test.tsx deleted file mode 100644 index c502413313..0000000000 --- a/app/client/src/pages/Editor/FormControl.test.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import React from "react"; -import { render, screen } from "test/testUtils"; -import FormControl from "./FormControl"; -import { reduxForm } from "redux-form"; -import { mockCodemirrorRender } from "test/__mocks__/CodeMirrorEditorMock"; -import { PluginPackageName, PluginType } from "entities/Action"; -import { waitFor } from "@testing-library/dom"; -import userEvent from "@testing-library/user-event"; -import { EvaluationSubstitutionType } from "entities/DataTree/dataTreeFactory"; -import { DatasourceComponentTypes, UIComponentTypes } from "api/PluginApi"; - -function TestForm(props: any) { - return
{props.children}
; -} - -const ReduxFormDecorator = reduxForm({ - form: "TestForm", - initialValues: { name: "TestAction", datasource: { pluginId: "123" } }, -})(TestForm); - -describe("DynamicTextFieldControl", () => { - beforeEach(() => { - mockCodemirrorRender(); - }); - it("renders template menu correctly", () => { - const config = { - actionName: "TestAction", - configProperty: "actionConfiguration.body", - controlType: "DYNAMIC_TEXT_FIELD_CONTROL", - evaluationSubstitutionType: EvaluationSubstitutionType.TEMPLATE, - formName: "TestForm", - id: "test", - isValid: true, - label: "TestAction body", - onPropertyChange: jest.fn(), - pluginId: "123", - responseType: "TABLE", - }; - render( - - - , - { - url: "/?showTemplate=true", - initialState: { - entities: { - // @ts-expect-error: Types are not available - plugins: { - list: [ - { - id: "123", - name: "testPlugin", - type: PluginType.DB, - packageName: PluginPackageName.POSTGRES, - templates: { - CREATE: "test plugin template", - }, - uiComponent: UIComponentTypes.DbEditorForm, - datasourceComponent: DatasourceComponentTypes.AutoForm, - }, - ], - }, - }, - }, - }, - ); - const createTemplateButton = screen.getByText("Create"); - userEvent.click(createTemplateButton); - - waitFor(async () => { - await expect(screen.findByText("Create")).toBeNull(); - - // Test each word separately because they are in different spans - expect(screen.getByText("test")).toBeDefined(); - expect(screen.getByText("plugin")).toBeDefined(); - expect(screen.getByText("template")).toBeDefined(); - }); - }); -}); diff --git a/app/client/src/pages/Editor/FormControl.tsx b/app/client/src/pages/Editor/FormControl.tsx index 37b56d29e8..794b4d2495 100644 --- a/app/client/src/pages/Editor/FormControl.tsx +++ b/app/client/src/pages/Editor/FormControl.tsx @@ -1,4 +1,4 @@ -import React, { memo, useMemo, useState } from "react"; +import React, { memo, useEffect, useMemo, useState } from "react"; import type { ControlProps } from "components/formControls/BaseControl"; import { getViewType, @@ -19,9 +19,19 @@ import { QUERY_BODY_FIELDS } from "constants/QueryEditorConstants"; import { convertObjectToQueryParams, getQueryParams } from "utils/URLUtils"; import { QUERY_EDITOR_FORM_NAME } from "@appsmith/constants/forms"; import history from "utils/history"; -import TemplateMenu from "pages/Editor/QueryEditor/TemplateMenu"; -import { getAction } from "selectors/entitiesSelector"; +import { + getAction, + getDatasourceFirstTableName, + getPluginNameFromId, + getPluginTemplates, +} from "selectors/entitiesSelector"; import { get } from "lodash"; +import { + DB_QUERY_DEFAULT_TABLE_NAME, + DB_QUERY_DEFAULT_TEMPLATE_TYPE, +} from "constants/Datasource"; +import TemplateMenu from "./QueryEditor/TemplateMenu"; +import { SQL_DATASOURCES } from "../../constants/QueryEditorConstants"; export interface FormControlProps { config: ControlProps; @@ -52,6 +62,19 @@ function FormControl(props: FormControlProps) { }), shallowEqual, ); + const datasourceTableName: string = useSelector((state: AppState) => + getDatasourceFirstTableName(state, (formValues?.datasource as any)?.id), + ); + const pluginTemplates: Record = useSelector((state: AppState) => + getPluginTemplates(state), + ); + const pluginTemplate = !!formValues?.datasource?.pluginId + ? pluginTemplates[formValues?.datasource?.pluginId] + : undefined; + const pluginId: string = formValues?.pluginId || ""; + const pluginName: string = useSelector((state: AppState) => + getPluginNameFromId(state, pluginId), + ); // moving creation of template to the formControl layer, this way any formControl created can potentially have a template system. const isNewQuery = @@ -103,16 +126,28 @@ function FormControl(props: FormControlProps) { } } - const createTemplate = ( - template: string, - formName: string, - configProperty: string, - ) => { - updateQueryParams(); - dispatch( - change(formName || QUERY_EDITOR_FORM_NAME, configProperty, template), - ); - }; + useEffect(() => { + if ( + showTemplate && + !convertFormToRaw && + SQL_DATASOURCES.includes(pluginName) + ) { + const defaultTemplate = !!pluginTemplate + ? pluginTemplate[DB_QUERY_DEFAULT_TEMPLATE_TYPE] + : ""; + const smartTemplate = defaultTemplate + .replace(DB_QUERY_DEFAULT_TABLE_NAME, datasourceTableName) + .split("--")[0]; + dispatch( + change( + props?.formName || QUERY_EDITOR_FORM_NAME, + props.config.configProperty, + !!datasourceTableName ? smartTemplate : defaultTemplate, + ), + ); + updateQueryParams(); + } + }, [showTemplate]); const FormControlRenderMethod = (config = props.config) => { return FormControlFactory.createControl( @@ -130,6 +165,17 @@ function FormControl(props: FormControlProps) { viewTypes.push(...props.config.alternateViewTypes); } + const createTemplate = ( + template: string, + formName: string, + configProperty: string, + ) => { + updateQueryParams(); + dispatch( + change(formName || QUERY_EDITOR_FORM_NAME, configProperty, template), + ); + }; + return useMemo( () => !hidden ? ( @@ -146,7 +192,9 @@ function FormControl(props: FormControlProps) { className={`t--form-control-${props.config.controlType}`} data-replay-id={btoa(props.config.configProperty)} > - {showTemplate && !convertFormToRaw ? ( + {showTemplate && + !convertFormToRaw && + !SQL_DATASOURCES.includes(pluginName) ? ( createTemplate( diff --git a/app/client/src/pages/Editor/QueryEditor/index.tsx b/app/client/src/pages/Editor/QueryEditor/index.tsx index b6995d7a86..f6fb8d8e91 100644 --- a/app/client/src/pages/Editor/QueryEditor/index.tsx +++ b/app/client/src/pages/Editor/QueryEditor/index.tsx @@ -279,6 +279,9 @@ const mapStateToProps = (state: AppState, props: any): ReduxStateProps => { const { editorConfigs, settingConfigs } = plugins; const action = getAction(state, actionId) as QueryAction | SaaSAction; + const formData = getFormValues(QUERY_EDITOR_FORM_NAME)(state) as + | QueryAction + | SaaSAction; let pluginId; if (action) { pluginId = action.pluginId; @@ -319,10 +322,6 @@ const mapStateToProps = (state: AppState, props: any): ReduxStateProps => { let uiComponent = UIComponentTypes.DbEditorForm; if (!!pluginId) uiComponent = getUIComponent(pluginId, allPlugins); - const formData = getFormValues(QUERY_EDITOR_FORM_NAME)(state) as - | QueryAction - | SaaSAction; - return { actionId, pluginId, @@ -344,7 +343,7 @@ const mapStateToProps = (state: AppState, props: any): ReduxStateProps => { uiComponent, applicationId: getCurrentApplicationId(state), actionObjectDiff, - datasourceId: action.datasource?.id, + datasourceId: action?.datasource?.id, }; }; diff --git a/app/client/src/sagas/QueryPaneSagas.ts b/app/client/src/sagas/QueryPaneSagas.ts index 6eff1eee0b..5b19bb7fd6 100644 --- a/app/client/src/sagas/QueryPaneSagas.ts +++ b/app/client/src/sagas/QueryPaneSagas.ts @@ -319,7 +319,6 @@ function* handleQueryCreatedSaga(actionPayload: ReduxAction) { actionPayload.payload; const pageId: string = yield select(getCurrentPageId); if (pluginType !== PluginType.DB && pluginType !== PluginType.REMOTE) return; - yield put(initialize(QUERY_EDITOR_FORM_NAME, actionPayload.payload)); const pluginTemplates: Record = yield select( getPluginTemplates, ); diff --git a/app/client/src/selectors/entitiesSelector.ts b/app/client/src/selectors/entitiesSelector.ts index a6d354a464..508b982d4e 100644 --- a/app/client/src/selectors/entitiesSelector.ts +++ b/app/client/src/selectors/entitiesSelector.ts @@ -93,6 +93,23 @@ export const getDatasourceTablePrimaryColumn = } }; +export const getDatasourceFirstTableName = ( + state: AppState, + datasourceId: string, +) => { + if (!datasourceId) { + return ""; + } + const structure = getDatasourceStructureById(state, datasourceId); + + if (structure) { + if (!!structure.tables && structure.tables.length > 0) { + return structure.tables[0].name; + } + } + return ""; +}; + export const getIsFetchingDatasourceStructure = (state: AppState): boolean => { return state.entities.datasources.fetchingDatasourceStructure; }; diff --git a/app/server/appsmith-plugins/mssqlPlugin/src/main/resources/templates/SELECT.sql b/app/server/appsmith-plugins/mssqlPlugin/src/main/resources/templates/SELECT.sql index cb9af47286..f4d3905f05 100644 --- a/app/server/appsmith-plugins/mssqlPlugin/src/main/resources/templates/SELECT.sql +++ b/app/server/appsmith-plugins/mssqlPlugin/src/main/resources/templates/SELECT.sql @@ -1 +1,3 @@ -SELECT TOP 10 * FROM users where role = {{ roleDropdown.selectedOptionValue }} ORDER BY id; \ No newline at end of file +SELECT TOP 10 * FROM <>; + +-- Please enter a valid table name and hit RUN \ No newline at end of file diff --git a/app/server/appsmith-plugins/mysqlPlugin/src/main/resources/templates/SELECT.sql b/app/server/appsmith-plugins/mysqlPlugin/src/main/resources/templates/SELECT.sql index 8d4afd4c3b..4fc3e57b56 100644 --- a/app/server/appsmith-plugins/mysqlPlugin/src/main/resources/templates/SELECT.sql +++ b/app/server/appsmith-plugins/mysqlPlugin/src/main/resources/templates/SELECT.sql @@ -1 +1,3 @@ -SELECT * FROM users where role = 'Admin' ORDER BY id LIMIT 10 +SELECT * FROM <> LIMIT 10 + +-- Please enter a valid table name and hit RUN diff --git a/app/server/appsmith-plugins/oraclePlugin/src/main/resources/templates/SELECT.sql b/app/server/appsmith-plugins/oraclePlugin/src/main/resources/templates/SELECT.sql index 1001012697..de16978841 100755 --- a/app/server/appsmith-plugins/oraclePlugin/src/main/resources/templates/SELECT.sql +++ b/app/server/appsmith-plugins/oraclePlugin/src/main/resources/templates/SELECT.sql @@ -1 +1,3 @@ -SELECT* FROM users WHERE ROWNUM < 10 +SELECT* FROM <> WHERE ROWNUM < 10; + +-- Please enter a valid table name and hit RUN diff --git a/app/server/appsmith-plugins/postgresPlugin/src/main/resources/templates/SELECT.sql b/app/server/appsmith-plugins/postgresPlugin/src/main/resources/templates/SELECT.sql index b1ef2174eb..1c25fafff4 100644 --- a/app/server/appsmith-plugins/postgresPlugin/src/main/resources/templates/SELECT.sql +++ b/app/server/appsmith-plugins/postgresPlugin/src/main/resources/templates/SELECT.sql @@ -1 +1,3 @@ -SELECT * FROM users ORDER BY id LIMIT 10; \ No newline at end of file +SELECT * FROM <> LIMIT 10; + +-- Please enter a valid table name and hit RUN \ No newline at end of file diff --git a/app/server/appsmith-plugins/redshiftPlugin/src/main/resources/templates/SELECT.sql b/app/server/appsmith-plugins/redshiftPlugin/src/main/resources/templates/SELECT.sql index dd55e9cb3e..1c25fafff4 100644 --- a/app/server/appsmith-plugins/redshiftPlugin/src/main/resources/templates/SELECT.sql +++ b/app/server/appsmith-plugins/redshiftPlugin/src/main/resources/templates/SELECT.sql @@ -1 +1,3 @@ -SELECT * FROM users where role = 'Admin' ORDER BY id LIMIT 10; \ No newline at end of file +SELECT * FROM <> LIMIT 10; + +-- Please enter a valid table name and hit RUN \ No newline at end of file diff --git a/app/server/appsmith-plugins/snowflakePlugin/src/main/resources/templates/SELECT.sql b/app/server/appsmith-plugins/snowflakePlugin/src/main/resources/templates/SELECT.sql index dd55e9cb3e..1c25fafff4 100644 --- a/app/server/appsmith-plugins/snowflakePlugin/src/main/resources/templates/SELECT.sql +++ b/app/server/appsmith-plugins/snowflakePlugin/src/main/resources/templates/SELECT.sql @@ -1 +1,3 @@ -SELECT * FROM users where role = 'Admin' ORDER BY id LIMIT 10; \ No newline at end of file +SELECT * FROM <> LIMIT 10; + +-- Please enter a valid table name and hit RUN \ No newline at end of file