Repository: ToolJet/ToolJet
Pull request #12263: cypress spec for airtable and baserow
Author: login: Srimanitejas123
Created: 2025-03-17T07:52:07Z | Merged: 2025-03-20T05:18:16Z

#12039 , #12009




Diff:
diff --git a/cypress-tests/cypress/commands/commands.js b/cypress-tests/cypress/commands/commands.js
index 0f9a6c99969..e1103bf6ee7 100644
--- a/cypress-tests/cypress/commands/commands.js
+++ b/cypress-tests/cypress/commands/commands.js
@@ -116,7 +116,8 @@ Cypress.Commands.add(
       });
 
     const splitIntoFlatArray = (value) => {
-      const regex = /(\{|\}|\(|\)|\[|\]|,|:|;|=>|'[^']*'|[a-zA-Z0-9._]+|\s+)/g;
+      const regex =
+        /(\{|\}|\(|\)|\[|\]|,|:|;|=>|'[^']*'|"[^"]*"|[a-zA-Z0-9._]+|\s+)/g;
       let prefix = "";
       return (
         value.match(regex)?.reduce((acc, part) => {
@@ -132,6 +133,8 @@ Cypress.Commands.add(
             acc.push(prefix + " ");
           } else if (part === ":") {
             acc.push(prefix + ":");
+          } else if (part === '"') {
+            acc.push(prefix + ":");
           } else {
             acc.push(prefix + part);
             prefix = "";
@@ -142,13 +145,11 @@ Cypress.Commands.add(
     };
 
     if (Array.isArray(value)) {
-      cy.wrap(subject)
-        .last()
-        .realType(value, {
-          parseSpecialCharSequences: false,
-          delay: 0,
-          force: true,
-        });
+      cy.wrap(subject).last().realType(value, {
+        parseSpecialCharSequences: false,
+        delay: 0,
+        force: true,
+      });
     } else {
       splitIntoFlatArray(value).forEach((i) => {
         cy.wrap(subject)
@@ -228,9 +229,9 @@ Cypress.Commands.add(
       .invoke("text")
       .then((text) => {
         cy.wrap(subject).realType(createBackspaceText(text)),
-        {
-          delay: 0,
-        };
+          {
+            delay: 0,
+          };
       });
   }
 );
diff --git a/cypress-tests/cypress/constants/selectors/Plugins.js b/cypress-tests/cypress/constants/selectors/Plugins.js
new file mode 100644
index 00000000000..ff557e3dca0
--- /dev/null
+++ b/cypress-tests/cypress/constants/selectors/Plugins.js
@@ -0,0 +1,27 @@
+export const pluginSelectors = {
+  regionField: '[data-cy="region-section"] .react-select__control',
+  regionFieldValue: '[data-cy="region-section"] .react-select__single-value',
+  amazonsesAccesKey: '[data-cy="access-key-text-field"]',
+  operationDropdown: '[data-cy="operation-select-dropdown"]',
+  sendEmailInputField: '[data-cy="send-mail-to-input-field"]',
+  ccEmailInputField: '[data-cy="cc-to-input-field"]',
+  bccEmailInputField: '[data-cy="bcc-to-input-field"]',
+  sendEmailFromInputField: '[data-cy="send-mail-from-input-field"]',
+  emailSubjetInputField: '[data-cy="subject-input-field"]',
+  emailbodyInputField: '[data-cy="body-input-field"]',
+  amazonAthenaDbName: '[data-cy="database-text-field"]',
+};
+
+export const baserowSelectors = {
+  hostField: '[data-cy="host-select-dropdown"]',
+  baserowApiKey: '[data-cy="api-token-text-field"]',
+  table: '[data-cy="table-id-input-field"]',
+  rowIdinputfield: '[data-cy="row-id-input-field"]',
+};
+
+export const appWriteSelectors = {
+  projectID: '[data-cy="project-id-text-field"]',
+  collectionId: '[data-cy="collectionid-input-field"]',
+  documentId: '[data-cy="documentid-input-field"]',
+  bodyInput: '[data-cy="body-input-field"]',
+};
diff --git a/cypress-tests/cypress/constants/selectors/postgreSql.js b/cypress-tests/cypress/constants/selectors/postgreSql.js
index f1479a1d521..626d8844adb 100644
--- a/cypress-tests/cypress/constants/selectors/postgreSql.js
+++ b/cypress-tests/cypress/constants/selectors/postgreSql.js
@@ -88,3 +88,11 @@ export const postgreSqlSelector = {
 
   eventQuerySelectionField: '[data-cy="query-selection-field"]',
 };
+
+export const airTableSelector = {
+  operationSelectDropdown: '[data-cy="query-select-dropdown"]',
+  baseIdInputField: '[data-cy="base-id-input-field"]',
+  tableNameInputField: '[data-cy="table-name-input-field"]',
+  recordIdInputField: '[data-cy="record-id-input-field"]',
+  bodyInputField: '[data-cy="body-input-field"]',
+};
\ No newline at end of file
diff --git a/cypress-tests/cypress/constants/texts/airTable.js b/cypress-tests/cypress/constants/texts/airTable.js
new file mode 100644
index 00000000000..44df3cf9e10
--- /dev/null
+++ b/cypress-tests/cypress/constants/texts/airTable.js
@@ -0,0 +1,6 @@
+export const airtableText = {
+    airtable: "Airtable",
+    cypressairtable: "cypress-Airtable",
+    ApiKey: "Personal access token",
+    apikeyPlaceholder: "**************",
+  };
\ No newline at end of file
diff --git a/cypress-tests/cypress/constants/texts/amazonAthena.js b/cypress-tests/cypress/constants/texts/amazonAthena.js
new file mode 100644
index 00000000000..794815d4a7c
--- /dev/null
+++ b/cypress-tests/cypress/constants/texts/amazonAthena.js
@@ -0,0 +1,8 @@
+export const amazonAthenaText = {
+    AmazonAthena: "Amazon Athena",
+    cypressAmazonAthena: "cypress-Amazon Athena",
+    labelAccesskey: "Access key",
+    labelSecretKey: "Secret key",
+    placeholderEnteraAccessKey: "Enter access key",
+    placeholderSecretKey:"**************",
+  };
\ No newline at end of file
diff --git a/cypress-tests/cypress/constants/texts/amazonSes.js b/cypress-tests/cypress/constants/texts/amazonSes.js
new file mode 100644
index 00000000000..2abaed71ab8
--- /dev/null
+++ b/cypress-tests/cypress/constants/texts/amazonSes.js
@@ -0,0 +1,8 @@
+export const amazonSesText = {
+    AmazonSES: "Amazon SES",
+    cypressAmazonSES: "cypress-Amazon SES",
+    labelAccesskey: "Access key",
+    labelSecretKey: "Secret key",
+    placeholderAccessKey: "Enter access key",
+    placeholderSecretKey:"**************",
+  };
\ No newline at end of file
diff --git a/cypress-tests/cypress/constants/texts/appwrite.js b/cypress-tests/cypress/constants/texts/appwrite.js
new file mode 100644
index 00000000000..15b723d1cc4
--- /dev/null
+++ b/cypress-tests/cypress/constants/texts/appwrite.js
@@ -0,0 +1,12 @@
+export const appwriteText = {
+  appwrite: "Appwrite",
+  cypressAppwrite: "cypress-Appwrite",
+  host: "Host",
+  ProjectID: "Project ID",
+  DatabaseID: "Database ID",
+  SecretKey: "Secret Key",
+  SecretKeyPlaceholder: "**************",
+  hostPlaceholder: "Appwrite database host/endpoint",
+  projectIdPlaceholder: "Appwrite project id",
+  databaseIdPlaceholder: "Appwrite Database id",
+};
diff --git a/cypress-tests/cypress/constants/texts/baseRow.js b/cypress-tests/cypress/constants/texts/baseRow.js
new file mode 100644
index 00000000000..6f9958d9791
--- /dev/null
+++ b/cypress-tests/cypress/constants/texts/baseRow.js
@@ -0,0 +1,6 @@
+export const baseRowText = {
+    baserow: "baserow",
+    cypressBaseRow: "cypress-baserow",
+    lableApiToken: "API token",
+    placeholderApiToken:"**************",
+  };
\ No newline at end of file
diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/airTable.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/airTable.cy.js
new file mode 100644
index 00000000000..bade9e6c5c3
--- /dev/null
+++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/airTable.cy.js
@@ -0,0 +1,289 @@
+import { fake } from "Fixtures/fake";
+import { postgreSqlSelector, airTableSelector } from "Selectors/postgreSql";
+import { postgreSqlText } from "Texts/postgreSql";
+import { airtableText } from "Texts/airTable";
+import { commonSelectors } from "Selectors/common";
+import { commonText } from "Texts/common";
+
+import {
+  fillDataSourceTextField,
+  selectAndAddDataSource,
+} from "Support/utils/postgreSql";
+import { redisText } from "Texts/redis";
+
+import {
+  verifyCouldnotConnectWithAlert,
+  deleteDatasource,
+  closeDSModal,
+  addQuery,
+  addDsAndAddQuery,
+  selectDatasource,
+} from "Support/utils/dataSource";
+
+import { openQueryEditor } from "Support/utils/dataSource";
+import { dataSourceSelector } from "../../../../../constants/selectors/dataSource";
+
+const data = {};
+data.dsName = fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", "");
+data.dsName1 = fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", "");
+
+describe("Data source Airtable", () => {
+  beforeEach(() => {
+    cy.apiLogin();
+    cy.defaultWorkspaceLogin();
+  });
+
+  it("Should verify elements on connection AirTable form", () => {
+    cy.get(commonSelectors.globalDataSourceIcon).click();
+    closeDSModal();
+
+    cy.get(postgreSqlSelector.allDatasourceLabelAndCount).should(
+      "have.text",
+      postgreSqlText.allDataSources()
+    );
+    cy.get(postgreSqlSelector.commonlyUsedLabelAndCount).should(
+      "have.text",
+      postgreSqlText.commonlyUsed
+    );
+    cy.get(postgreSqlSelector.databaseLabelAndCount).should(
+      "have.text",
+      postgreSqlText.allDatabase()
+    );
+    cy.get(postgreSqlSelector.apiLabelAndCount).should(
+      "have.text",
+      postgreSqlText.allApis
+    );
+    cy.get(postgreSqlSelector.cloudStorageLabelAndCount).should(
+      "have.text",
+      postgreSqlText.allCloudStorage
+    );
+
+    selectAndAddDataSource("databases", airtableText.airtable, data.dsName);
+
+    cy.get(postgreSqlSelector.buttonSave).verifyVisibleElement(
+      "have.text",
+      postgreSqlText.buttonTextSave
+    );
+
+    cy.verifyToastMessage(
+      commonSelectors.toastMessage,
+      postgreSqlText.toastDSSaved
+    );
+    deleteDatasource(`cypress-${data.dsName}-airtable`);
+  });
+
+  it("Should verify the functionality of AirTable connection form.", () => {
+    selectAndAddDataSource("databases", airtableText.airtable, data.dsName);
+
+    fillDataSourceTextField(
+      airtableText.ApiKey,
+      airtableText.apikeyPlaceholder,
+      Cypress.env("airTable_apikey")
+    );
+    cy.get(postgreSqlSelector.buttonSave).click();
+
+    cy.verifyToastMessage(
+      commonSelectors.toastMessage,
+      postgreSqlText.toastDSSaved
+    );
+
+    cy.get(commonSelectors.globalDataSourceIcon).click();
+    cy.get(
+      `[data-cy="cypress-${data.dsName}-airtable-button"]`
+    ).verifyVisibleElement("have.text", `cypress-${data.dsName}-airtable`);
+    deleteDatasource(`cypress-${data.dsName}-airtable`);
+  });
+
+  it("Should able to run the query with valid conection", () => {
+    const airTable_apiKey = Cypress.env("airTable_apikey");
+    const airTable_baseId = Cypress.env("airtabelbaseId");
+    const airTable_tableName = Cypress.env("airtable_tableName");
+    const airTable_recordID = Cypress.env("airtable_recordId");
+
+    selectAndAddDataSource("databases", airtableText.airtable, data.dsName);
+
+    fillDataSourceTextField(
+      airtableText.ApiKey,
+      airtableText.apikeyPlaceholder,
+      airTable_apiKey
+    );
+
+    cy.wait(1000);
+    cy.get(postgreSqlSelector.buttonSave).click();
+    cy.verifyToastMessage(
+      commonSelectors.toastMessage,
+      postgreSqlText.toastDSSaved
+    );
+
+    cy.get(commonSelectors.globalDataSourceIcon).click();
+    cy.get(
+      `[data-cy="cypress-${data.dsName}-airtable-button"]`
+    ).verifyVisibleElement("have.text", `cypress-${data.dsName}-airtable`);
+    cy.get(commonSelectors.dashboardIcon).click();
+    cy.get(commonSelectors.appCreateButton).click();
+    cy.get(commonSelectors.appNameInput).click().type(data.dsName);
+    cy.get(commonSelectors.createAppButton).click();
+    cy.skipWalkthrough();
+
+    cy.get('[data-cy="show-ds-popover-button"]').click();
+    cy.get(".css-4e90k9").type(`${data.dsName}`);
+    cy.contains(`[id*="react-select-"]`, data.dsName).click();
+    cy.get('[data-cy="query-rename-input"]').clear().type(data.dsName);
+
+    // Verfiy List Recored operation
+
+    cy.get(airTableSelector.operationSelectDropdown)
+      .click()
+      .type("List records{enter}");
+
+    cy.get(airTableSelector.baseIdInputField).clearAndTypeOnCodeMirror(
+      airTable_baseId
+    );
+
+    cy.get(airTableSelector.tableNameInputField).clearAndTypeOnCodeMirror(
+      airTable_tableName
+    );
+
+    cy.get(dataSourceSelector.queryPreviewButton).click();
+    cy.verifyToastMessage(
+      commonSelectors.toastMessage,
+      `Query (${data.dsName}) completed.`
+    );
+
+    // Verfiy Retrieve record operation
+
+    cy.get(airTableSelector.operationSelectDropdown)
+      .click()
+      .type("Retrieve record{enter}");
+
+    cy.get(airTableSelector.baseIdInputField).clearAndTypeOnCodeMirror(
+      airTable_baseId
+    );
+    cy.get(airTableSelector.tableNameInputField).clearAndTypeOnCodeMirror(
+      airTable_tableName
+    );
+
+    cy.get(airTableSelector.recordIdInputField).clearAndTypeOnCodeMirror(
+      airTable_recordID
+    );
+
+    cy.get(dataSourceSelector.queryPreviewButton).click();
+    cy.verifyToastMessage(
+      commonSelectors.toastMessage,
+      `Query (${data.dsName}) completed.`
+    );
+
+    // Verfiy Create record operation
+
+    cy.get(airTableSelector.operationSelectDropdown)
+      .click()
+      .type("Create record{enter}");
+
+    cy.get(airTableSelector.baseIdInputField).clearAndTypeOnCodeMirror(
+      airTable_baseId
+    );
+
+    cy.get(airTableSelector.tableNameInputField).clearAndTypeOnCodeMirror(
+      airTable_tableName
+    );
+
+    cy.get(airTableSelector.bodyInputField)
+      .realClick()
+      .realType('[{"', { force: true, delay: 0 })
+      .realType("fields", { force: true, delay: 0 })
+      .realType('": {}', { force: true, delay: 0 });
+
+    cy.get(dataSourceSelector.queryPreviewButton).click();
+    cy.verifyToastMessage(
+      commonSelectors.toastMessage,
+      `Query (${data.dsName}) completed.`
+    );
+
+    // Verfiy Update record operation
+
+    cy.get('[data-cy="show-ds-popover-button"]').click();
+    cy.get(".css-4e90k9").type(`${data.dsName}`);
+    cy.contains(`[id*="react-select-"]`, data.dsName).click();
+    cy.get('[data-cy="query-rename-input"]').clear().type(data.dsName1);
+
+    cy.get(airTableSelector.operationSelectDropdown)
+      .click()
+      .type("Update record{enter}");
+
+    cy.get(airTableSelector.baseIdInputField).clearAndTypeOnCodeMirror(
+      airTable_baseId
+    );
+    cy.get(airTableSelector.tableNameInputField).clearAndTypeOnCodeMirror(
+      airTable_tableName
+    );
+
+    cy.get(airTableSelector.recordIdInputField).clearAndTypeOnCodeMirror(
+      airTable_recordID
+    );
+
+    cy.get(airTableSelector.bodyInputField)
+      .realClick()
+      .realType("{", { force: true, delay: 0 })
+      .realType("{enter}", { force: true, delay: 0 })
+      .realType('"Phone Number": "555_98"', { force: true, delay: 0 });
+
+    cy.get(dataSourceSelector.queryPreviewButton).click();
+    cy.verifyToastMessage(
+      commonSelectors.toastMessage,
+      `Query (${data.dsName1}) completed.`
+    );
+
+    // Verify Delete record operation
+
+    cy.get(airTableSelector.operationSelectDropdown)
+      .click()
+      .type("Delete record{enter}");
+
+    const recordId = Cypress._.uniqueId("recDummy_");
+
+    cy.request({
+      method: "POST",
+      url: `https://api.airtable.com/v0/${airTable_baseId}/${airTable_tableName}`,
+      headers: {
+        Authorization: `Bearer ${Cypress.env("airTable_apikey")}`,
+        "Content-Type": "application/json",
+      },
+      body: {
+        records: [
+          {
+            fields: {
+              "Employee ID": "E005",
+              "First Name": "test",
+              "Last Name": "abc",
+              Email: "doe@example.com",
+              "Phone Number": "555-12",
+            },
+          },
+        ],
+      },
+    }).then((createResponse) => {
+      const newRecordId = createResponse.body.records[0].id;
+
+      cy.get(airTableSelector.operationSelectDropdown)
+        .click()
+        .type("Delete record{enter}");
+
+      cy.get(airTableSelector.baseIdInputField).clearAndTypeOnCodeMirror(
+        airTable_baseId
+      );
+      cy.get(airTableSelector.tableNameInputField).clearAndTypeOnCodeMirror(
+        airTable_tableName
+      );
+
+      cy.get(airTableSelector.recordIdInputField).clearAndTypeOnCodeMirror(
+        newRecordId
+      );
+
+      cy.get(dataSourceSelector.queryPreviewButton).click();
+      cy.verifyToastMessage(
+        commonSelectors.toastMessage,
+        `Query (${data.dsName1}) completed.`
+      );
+    });
+  });
+});
diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/amazonAthena.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/amazonAthena.cy.js
new file mode 100644
index 00000000000..41bf4183b80
--- /dev/null
+++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/amazonAthena.cy.js
@@ -0,0 +1,207 @@
+import { fake } from "Fixtures/fake";
+import { postgreSqlSelector } from "Selectors/postgreSql";
+import { pluginSelectors } from "Selectors/plugins";
+import { postgreSqlText } from "Texts/postgreSql";
+import { amazonSesText } from "Texts/amazonSes";
+import { amazonAthenaText } from "Texts/amazonAthena";
+import { commonSelectors } from "Selectors/common";
+import { commonText } from "Texts/common";
+
+import {
+  fillDataSourceTextField,
+  selectAndAddDataSource,
+} from "Support/utils/postgreSql";
+
+import {
+  verifyCouldnotConnectWithAlert,
+  deleteDatasource,
+  closeDSModal,
+  addQuery,
+  addDsAndAddQuery,
+} from "Support/utils/dataSource";
+
+import { openQueryEditor } from "Support/utils/dataSource";
+import { dataSourceSelector } from "../../../../../constants/selectors/dataSource";
+
+const data = {};
+data.dsName = fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", "");
+
+describe("Data source amazon athena", () => {
+  beforeEach(() => {
+    cy.apiLogin();
+    cy.defaultWorkspaceLogin();
+    cy.intercept("POST", "/api/data_queries").as("createQuery");
+  });
+
+  it("Should verify elements on amazon athena connection form", () => {
+    const Accesskey = Cypress.env("amazonathena_accessKey");
+    const Secretkey = Cypress.env("amazonathena_secretKey");
+    const DbName = Cypress.env("amazonathena_DbName");
+
+    cy.get(commonSelectors.globalDataSourceIcon).click();
+    closeDSModal();
+
+    cy.get(postgreSqlSelector.allDatasourceLabelAndCount).should(
+      "have.text",
+      postgreSqlText.allDataSources()
+    );
+    cy.get(postgreSqlSelector.commonlyUsedLabelAndCount).should(
+      "have.text",
+      postgreSqlText.commonlyUsed
+    );
+    cy.get(postgreSqlSelector.databaseLabelAndCount).should(
+      "have.text",
+      postgreSqlText.allDatabase()
+    );
+    cy.get(postgreSqlSelector.apiLabelAndCount).should(
+      "have.text",
+      postgreSqlText.allApis
+    );
+    cy.get(postgreSqlSelector.cloudStorageLabelAndCount).should(
+      "have.text",
+      postgreSqlText.allCloudStorage
+    );
+
+    selectAndAddDataSource(
+      "databases",
+      amazonAthenaText.AmazonAthena,
+      data.dsName
+    );
+
+    cy.get(pluginSelectors.amazonAthenaDbName).click().type(DbName);
+
+    cy.get(pluginSelectors.amazonsesAccesKey).click().type(" ");
+
+    fillDataSourceTextField(
+      amazonSesText.labelSecretKey,
+      amazonAthenaText.placeholderSecretKey,
+      Secretkey
+    );
+
+    cy.get(".react-select__dropdown-indicator").eq(1).click();
+    cy.get(".react-select__option").contains("US West (N. California)").click();
+
+    cy.get(postgreSqlSelector.buttonTestConnection)
+      .verifyVisibleElement(
+        "have.text",
+        postgreSqlText.buttonTextTestConnection
+      )
+      .click();
+    cy.get(postgreSqlSelector.connectionFailedText).verifyVisibleElement(
+      "have.text",
+      postgreSqlText.couldNotConnect
+    );
+    cy.get(postgreSqlSelector.buttonSave)
+      .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave)
+      .click();
+    cy.verifyToastMessage(
+      commonSelectors.toastMessage,
+      postgreSqlText.toastDSSaved
+    );
+
+    deleteDatasource(`cypress-${data.dsName}-Amazon-Athena`);
+  });
+
+  it("Should verify the functionality of amazon athena connection form.", () => {
+    const Accesskey = Cypress.env("amazonathena_accessKey");
+    const Secretkey = Cypress.env("amazonathena_secretKey");
+    const DbName = Cypress.env("amazonathena_DbName");
+    selectAndAddDataSource(
+      "databases",
+      amazonAthenaText.AmazonAthena,
+      data.dsName
+    );
+
+    cy.get(pluginSelectors.amazonAthenaDbName).click().type(DbName);
+
+    cy.get(pluginSelectors.amazonsesAccesKey).click().type(Accesskey);
+
+    fillDataSourceTextField(
+      amazonSesText.labelSecretKey,
+      amazonAthenaText.placeholderSecretKey,
+      Secretkey
+    );
+
+    cy.get(".react-select__dropdown-indicator").eq(1).click();
+    cy.get(".react-select__option").contains("US West (N. California)").click();
+
+    cy.get(postgreSqlSelector.buttonTestConnection).click();
+    cy.get(postgreSqlSelector.textConnectionVerified, {
+      timeout: 10000,
+    }).should("have.text", postgreSqlText.labelConnectionVerified);
+    cy.get(postgreSqlSelector.buttonSave).click();
+
+    cy.verifyToastMessage(
+      commonSelectors.toastMessage,
+      postgreSqlText.toastDSSaved
+    );
+
+    deleteDatasource(`cypress-${data.dsName}-amazon-Athena`);
+  });
+
+  it("Should able to run the query with valid conection", () => {
+    const Accesskey = Cypress.env("amazonathena_accessKey");
+    const Secretkey = Cypress.env("amazonathena_secretKey");
+    const DbName = Cypress.env("amazonathena_DbName");
+    selectAndAddDataSource(
+      "databases",
+      amazonAthenaText.AmazonAthena,
+      data.dsName
+    );
+
+    cy.get(pluginSelectors.amazonAthenaDbName).click().type(DbName);
+
+    fillDataSourceTextField(
+      amazonAthenaText.labelAccesskey,
+      amazonAthenaText.placeholderEnteraAccessKey,
+      Cypress.env("amazonathena_accessKey")
+    );
+    fillDataSourceTextField(
+      amazonAthenaText.labelSecretKey,
+      amazonAthenaText.placeholderSecretKey,
+      Cypress.env("amazonathena_secretKey")
+    );
+
+    cy.get(".react-select__dropdown-indicator").eq(1).click();
+    cy.get(".react-select__option").contains("US West (N. California)").click();
+
+    cy.get(postgreSqlSelector.buttonTestConnection).click();
+    cy.get(postgreSqlSelector.textConnectionVerified, {
+      timeout: 10000,
+    }).should("have.text", postgreSqlText.labelConnectionVerified);
+
+    cy.get(postgreSqlSelector.buttonSave).click();
+
+    cy.verifyToastMessage(
+      commonSelectors.toastMessage,
+      postgreSqlText.toastDSSaved
+    );
+
+    cy.get(commonSelectors.globalDataSourceIcon).click();
+    cy.get(
+      `[data-cy="cypress-${data.dsName}-amazon-athena-button"]`
+    ).verifyVisibleElement("have.text", `cypress-${data.dsName}-amazon-athena`);
+    cy.wait(1000);
+
+    cy.get(commonSelectors.dashboardIcon).click();
+    cy.get(commonSelectors.appCreateButton).click();
+    cy.get(commonSelectors.appNameInput).click().type(data.dsName);
+    cy.get(commonSelectors.createAppButton).click();
+    cy.skipWalkthrough();
+
+    cy.get('[data-cy="show-ds-popover-button"]').click();
+    cy.get(".css-4e90k9").type(`${data.dsName}`);
+    cy.contains(`[id*="react-select-"]`, data.dsName).click();
+    cy.get('[data-cy="query-rename-input"]').clear().type(data.dsName);
+
+    cy.get('[data-cy="query-input-field"]').clearAndTypeOnCodeMirror(
+      "SHOW DATABASES;"
+    );
+
+    cy.get(dataSourceSelector.queryPreviewButton).click();
+    cy.verifyToastMessage(
+      commonSelectors.toastMessage,
+      `Query (${data.dsName}) completed.`
+    );
+  });
+});
diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/amazonses.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/amazonses.cy.js
new file mode 100644
index 00000000000..d1ec035a694
--- /dev/null
+++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/amazonses.cy.js
@@ -0,0 +1,204 @@
+import { fake } from "Fixtures/fake";
+import { postgreSqlSelector } from "Selectors/postgreSql";
+import { pluginSelectors } from "Selectors/plugins";
+import { postgreSqlText } from "Texts/postgreSql";
+import { amazonSesText } from "Texts/amazonSes";
+import { commonSelectors } from "Selectors/common";
+import { commonText } from "Texts/common";
+
+import {
+  fillDataSourceTextField,
+  selectAndAddDataSource,
+} from "Support/utils/postgreSql";
+
+import {
+  verifyCouldnotConnectWithAlert,
+  deleteDatasource,
+  closeDSModal,
+  addQuery,
+  addDsAndAddQuery,
+} from "Support/utils/dataSource";
+
+import { openQueryEditor } from "Support/utils/dataSource";
+import { dataSourceSelector } from "../../../../../constants/selectors/dataSource";
+
+const data = {};
+data.dsName = fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", "");
+
+describe("Data source amazon ses", () => {
+  beforeEach(() => {
+    cy.apiLogin();
+    cy.defaultWorkspaceLogin();
+    cy.intercept("POST", "/api/data_queries").as("createQuery");
+  });
+
+  it("Should verify elements on amazonses connection form", () => {
+    const Accesskey = Cypress.env("amazonSes_accessKey");
+    const Secretkey = Cypress.env("amazonSes_secretKey");
+
+    cy.get(commonSelectors.globalDataSourceIcon).click();
+    closeDSModal();
+
+    cy.get(postgreSqlSelector.allDatasourceLabelAndCount).should(
+      "have.text",
+      postgreSqlText.allDataSources()
+    );
+    cy.get(postgreSqlSelector.commonlyUsedLabelAndCount).should(
+      "have.text",
+      postgreSqlText.commonlyUsed
+    );
+    cy.get(postgreSqlSelector.databaseLabelAndCount).should(
+      "have.text",
+      postgreSqlText.allDatabase()
+    );
+    cy.get(postgreSqlSelector.apiLabelAndCount).should(
+      "have.text",
+      postgreSqlText.allApis
+    );
+    cy.get(postgreSqlSelector.cloudStorageLabelAndCount).should(
+      "have.text",
+      postgreSqlText.allCloudStorage
+    );
+
+    selectAndAddDataSource("databases", amazonSesText.AmazonSES, data.dsName);
+
+    cy.get(".react-select__dropdown-indicator").eq(1).click();
+    cy.get(".react-select__option").contains("US West (N. California)").click();
+
+    cy.get(pluginSelectors.amazonsesAccesKey).click().type(Accesskey);
+
+    fillDataSourceTextField(
+      amazonSesText.labelSecretKey,
+      "**************",
+      Secretkey
+    );
+
+    cy.get(postgreSqlSelector.buttonSave)
+      .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave)
+      .click();
+    cy.verifyToastMessage(
+      commonSelectors.toastMessage,
+      postgreSqlText.toastDSSaved
+    );
+
+    deleteDatasource(`cypress-${data.dsName}-Amazon-ses`);
+  });
+
+  it("Should verify the functionality of amazonses connection form.", () => {
+    selectAndAddDataSource("databases", amazonSesText.AmazonSES, data.dsName);
+
+    cy.get(".react-select__dropdown-indicator").eq(1).click();
+    cy.get(".react-select__option").contains("US West (N. California)").click();
+
+    fillDataSourceTextField(
+      amazonSesText.labelAccesskey,
+      amazonSesText.placeholderAccessKey,
+      Cypress.env("amazonSes_accessKey")
+    );
+    fillDataSourceTextField(
+      amazonSesText.labelSecretKey,
+      amazonSesText.placeholderSecretKey,
+      Cypress.env("amazonSes_secretKey")
+    );
+
+    cy.get(postgreSqlSelector.buttonSave).click();
+
+    cy.verifyToastMessage(
+      commonSelectors.toastMessage,
+      postgreSqlText.toastDSSaved
+    );
+
+    cy.get(commonSelectors.globalDataSourceIcon).click();
+    cy.get(
+      `[data-cy="cypress-${data.dsName}-amazon-ses-button"]`
+    ).verifyVisibleElement("have.text", `cypress-${data.dsName}-amazon-ses`);
+
+    deleteDatasource(`cypress-${data.dsName}-amazon-ses`);
+  });
+
+  it("Should able to run the query with valid conection", () => {
+    const email = "adish" + "@" + "tooljet.com";
+    selectAndAddDataSource("databases", amazonSesText.AmazonSES, data.dsName);
+
+    cy.get(".react-select__dropdown-indicator").eq(1).click();
+    cy.get(".react-select__option").contains("US West (N. California)").click();
+
+    fillDataSourceTextField(
+      amazonSesText.labelAccesskey,
+      amazonSesText.placeholderAccessKey,
+      Cypress.env("amazonSes_accessKey")
+    );
+    fillDataSourceTextField(
+      amazonSesText.labelSecretKey,
+      amazonSesText.placeholderSecretKey,
+      Cypress.env("amazonSes_secretKey")
+    );
+
+    cy.get(postgreSqlSelector.buttonSave).click();
+
+    cy.verifyToastMessage(
+      commonSelectors.toastMessage,
+      postgreSqlText.toastDSSaved
+    );
+
+    cy.get(commonSelectors.globalDataSourceIcon).click();
+    cy.get(
+      `[data-cy="cypress-${data.dsName}-amazon-ses-button"]`
+    ).verifyVisibleElement("have.text", `cypress-${data.dsName}-amazon-ses`);
+    cy.wait(1000);
+
+    cy.get(commonSelectors.dashboardIcon).click();
+    cy.get(commonSelectors.appCreateButton).click();
+    cy.get(commonSelectors.appNameInput).click().type(data.dsName);
+    cy.get(commonSelectors.createAppButton).click();
+    cy.skipWalkthrough();
+
+    cy.get('[data-cy="show-ds-popover-button"]').click();
+    cy.get(".css-4e90k9").type(`${data.dsName}`);
+    cy.contains(`[id*="react-select-"]`, data.dsName).click();
+    cy.get('[data-cy="query-rename-input"]').clear().type(data.dsName);
+
+    cy.get(pluginSelectors.operationDropdown)
+      .click()
+      .type("Email service{enter}");
+
+    cy.wait(500);
+
+    cy.get(pluginSelectors.sendEmailInputField)
+      .realClick()
+      .realType('{{["', { force: true, delay: 0 })
+      .realType("mekhla@tooljet.com", { force: true, delay: 0 });
+
+    cy.get(pluginSelectors.ccEmailInputField)
+      .realClick()
+      .realType('{{["', { force: true, delay: 0 })
+      .realType("mani@tooljet.com", { force: true, delay: 0 });
+
+    cy.get(pluginSelectors.bccEmailInputField)
+      .realClick()
+      .realType('{{["', { force: true, delay: 0 })
+      .realType("midhun@tooljet.com", { force: true, delay: 0 });
+
+    cy.get(pluginSelectors.sendEmailFromInputField)
+      .realClick()
+      .realType("adish", { force: true, delay: 0 })
+      .realType("@", { force: true, delay: 0 })
+      .realType("tooljet.com", { force: true, delay: 0 });
+
+    cy.get(pluginSelectors.emailSubjetInputField).clearAndTypeOnCodeMirror(
+      "Testmail for amazon ses"
+    );
+
+    cy.get(pluginSelectors.emailbodyInputField).clearAndTypeOnCodeMirror(
+      "Body text for amazon ses"
+    );
+
+    cy.wait(1000);
+
+    cy.get(dataSourceSelector.queryPreviewButton).click();
+    cy.verifyToastMessage(
+      commonSelectors.toastMessage,
+      `Query (${data.dsName}) completed.`
+    );
+  });
+});
diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/appWrite.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/appWrite.cy.js
new file mode 100644
index 00000000000..aeeb12529dd
--- /dev/null
+++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/appWrite.cy.js
@@ -0,0 +1,308 @@
+import { fake } from "Fixtures/fake";
+import { postgreSqlSelector } from "Selectors/postgreSql";
+import { postgreSqlText } from "Texts/postgreSql";
+import { appwriteText } from "Texts/appWrite";
+import { appWriteSelectors } from "Selectors/Plugins";
+import { commonSelectors } from "Selectors/common";
+import { commonText } from "Texts/common";
+
+import {
+  fillDataSourceTextField,
+  selectAndAddDataSource,
+} from "Support/utils/postgreSql";
+
+import {
+  verifyCouldnotConnectWithAlert,
+  deleteDatasource,
+  closeDSModal,
+  addQuery,
+  addDsAndAddQuery,
+} from "Support/utils/dataSource";
+
+import { openQueryEditor } from "Support/utils/dataSource";
+import { dataSourceSelector } from "../../../../../constants/selectors/dataSource";
+
+const data = {};
+data.dsName = fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", "");
+
+describe("Data source AppWrite", () => {
+  beforeEach(() => {
+    cy.apiLogin();
+    cy.defaultWorkspaceLogin();
+    cy.intercept("POST", "/api/data_queries").as("createQuery");
+  });
+
+  it("Should verify elements on appwrite connection form", () => {
+    const Host = Cypress.env("appwrite_host");
+    const ProjectID = Cypress.env("appwrite_projectID");
+    const DatabaseID = Cypress.env("appwrite_databaseID");
+    const SecretKey = Cypress.env("appwrite_secretkey");
+
+    cy.get(commonSelectors.globalDataSourceIcon).click();
+    closeDSModal();
+
+    cy.get(postgreSqlSelector.commonlyUsedLabelAndCount).should(
+      "have.text",
+      postgreSqlText.commonlyUsed
+    );
+
+    cy.get(postgreSqlSelector.apiLabelAndCount).should(
+      "have.text",
+      postgreSqlText.allApis
+    );
+    cy.get(postgreSqlSelector.cloudStorageLabelAndCount).should(
+      "have.text",
+      postgreSqlText.allCloudStorage
+    );
+
+    selectAndAddDataSource("databases", appwriteText.appwrite, data.dsName);
+
+    fillDataSourceTextField(
+      appwriteText.host,
+      appwriteText.hostPlaceholder,
+      Host
+    );
+
+    fillDataSourceTextField(
+      appwriteText.ProjectID,
+      appwriteText.projectIdPlaceholder,
+      ProjectID
+    );
+
+    fillDataSourceTextField(
+      appwriteText.DatabaseID,
+      appwriteText.databaseIdPlaceholder,
+      DatabaseID
+    );
+
+    fillDataSourceTextField(
+      appwriteText.SecretKey,
+      appwriteText.SecretKeyPlaceholder,
+      SecretKey
+    );
+
+    cy.get(postgreSqlSelector.buttonTestConnection).click();
+    cy.get(postgreSqlSelector.textConnectionVerified, {
+      timeout: 10000,
+    }).should("have.text", postgreSqlText.labelConnectionVerified);
+
+    cy.get(postgreSqlSelector.buttonSave)
+      .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave)
+      .click();
+    cy.verifyToastMessage(
+      commonSelectors.toastMessage,
+      postgreSqlText.toastDSSaved
+    );
+
+    deleteDatasource(`cypress-${data.dsName}-Appwrite`);
+  });
+
+  it("Should verify the functionality of appwrite connection form.", () => {
+    const Host = Cypress.env("appwrite_host");
+    const ProjectID = Cypress.env("appwrite_projectID");
+    const DatabaseID = Cypress.env("appwrite_databaseID");
+    const SecretKey = Cypress.env("appwrite_secretkey");
+
+    cy.get(commonSelectors.globalDataSourceIcon).click();
+    closeDSModal();
+
+    selectAndAddDataSource("databases", appwriteText.appwrite, data.dsName);
+
+    fillDataSourceTextField(
+      appwriteText.host,
+      appwriteText.hostPlaceholder,
+      Host
+    );
+
+    fillDataSourceTextField(
+      appwriteText.ProjectID,
+      appwriteText.projectIdPlaceholder,
+      ProjectID
+    );
+
+    fillDataSourceTextField(
+      appwriteText.DatabaseID,
+      appwriteText.databaseIdPlaceholder,
+      DatabaseID
+    );
+
+    fillDataSourceTextField(
+      appwriteText.SecretKey,
+      appwriteText.SecretKeyPlaceholder,
+      SecretKey
+    );
+
+    cy.get(postgreSqlSelector.buttonTestConnection).click();
+    cy.get(postgreSqlSelector.textConnectionVerified, {
+      timeout: 10000,
+    }).should("have.text", postgreSqlText.labelConnectionVerified);
+
+    cy.get(postgreSqlSelector.buttonSave)
+      .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave)
+      .click();
+    cy.verifyToastMessage(
+      commonSelectors.toastMessage,
+      postgreSqlText.toastDSSaved
+    );
+    deleteDatasource(`cypress-${data.dsName}-Appwrite`);
+  });
+
+  it("Should be able to run the query with a valid connection", () => {
+    const Host = Cypress.env("appwrite_host");
+    const ProjectID = Cypress.env("appwrite_projectID");
+    const DatabaseID = Cypress.env("appwrite_databaseID");
+    const SecretKey = Cypress.env("appwrite_secretkey");
+    const CollectionID = Cypress.env("appwrite_collectionID");
+
+    cy.get(commonSelectors.globalDataSourceIcon).click();
+    closeDSModal();
+
+    selectAndAddDataSource("databases", appwriteText.appwrite, data.dsName);
+
+    fillDataSourceTextField(
+      appwriteText.host,
+      appwriteText.hostPlaceholder,
+      Host
+    );
+    fillDataSourceTextField(
+      appwriteText.ProjectID,
+      appwriteText.projectIdPlaceholder,
+      ProjectID
+    );
+    fillDataSourceTextField(
+      appwriteText.DatabaseID,
+      appwriteText.databaseIdPlaceholder,
+      DatabaseID
+    );
+    fillDataSourceTextField(
+      appwriteText.SecretKey,
+      appwriteText.SecretKeyPlaceholder,
+      SecretKey
+    );
+
+    cy.get(postgreSqlSelector.buttonTestConnection).click();
+
+    cy.get(postgreSqlSelector.textConnectionVerified, {
+      timeout: 10000,
+    }).should("have.text", postgreSqlText.labelConnectionVerified);
+    cy.get(postgreSqlSelector.buttonSave)
+      .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave)
+      .click();
+
+    cy.verifyToastMessage(
+      commonSelectors.toastMessage,
+      postgreSqlText.toastDSSaved
+    );
+
+    cy.get(commonSelectors.globalDataSourceIcon).click();
+    cy.get(
+      `[data-cy="cypress-${data.dsName}-appwrite-button"]`
+    ).verifyVisibleElement("have.text", `cypress-${data.dsName}-appwrite`);
+    cy.wait(1000);
+
+    cy.get(commonSelectors.dashboardIcon).click();
+    cy.get(commonSelectors.appCreateButton).click();
+    cy.get(commonSelectors.appNameInput).click().type(data.dsName);
+    cy.get(commonSelectors.createAppButton).click();
+    cy.skipWalkthrough();
+
+    cy.get('[data-cy="show-ds-popover-button"]').click();
+    cy.get(".css-4e90k9").type(`${data.dsName}`);
+    cy.contains(`[id*="react-select-"]`, data.dsName).click();
+    cy.get('[data-cy="query-rename-input"]').clear().type(data.dsName);
+
+    // Create API document for delete operation
+
+    cy.request({
+      method: "POST",
+      url: `https://cloud.appwrite.io/v1/databases/${DatabaseID}/collections/${CollectionID}/documents`,
+      headers: {
+        "X-Appwrite-Project": ProjectID,
+        "X-Appwrite-Key": SecretKey,
+        "Content-Type": "application/json",
+      },
+      body: {
+        documentId: "unique()",
+        data: {
+          User_name: "test",
+          User_ID: 30,
+        },
+        permissions: ['read("any")'],
+      },
+    }).then((response) => {
+      expect(response.status).to.eq(201);
+      cy.wrap(response.body.$id).as("documentId");
+    });
+
+    // Verify all operations
+    const operations = [
+      "List documents",
+      "Get document",
+      "Add Document to Collection",
+      "Update document",
+      "Delete document",
+    ];
+
+    cy.get("@documentId").then((documentId) => {
+      operations.forEach((operation) => {
+        cy.get(".react-select__input")
+          .eq(1)
+          .type(`${operation}{enter}`, { force: true });
+
+        if (operation === "Get document") {
+          cy.get(appWriteSelectors.collectionId).clearAndTypeOnCodeMirror(
+            CollectionID
+          );
+
+          cy.get(appWriteSelectors.documentId).clearAndTypeOnCodeMirror(
+            Cypress.env("appwrite_documentID")
+          );
+        }
+
+        if (operation === "Add Document to Collection") {
+          cy.get(appWriteSelectors.collectionId).clearAndTypeOnCodeMirror(
+            CollectionID
+          );
+          cy.get(appWriteSelectors.bodyInput).clearAndTypeOnCodeMirror(
+            '{"User_name": "John Updated", "User_ID": 35}'
+          );
+        }
+
+        if (operation === "Update document") {
+          cy.get(appWriteSelectors.collectionId).clearAndTypeOnCodeMirror(
+            CollectionID
+          );
+
+          cy.get(appWriteSelectors.documentId).clearAndTypeOnCodeMirror(
+            Cypress.env("appwrite_documentID")
+          );
+          cy.get(appWriteSelectors.bodyInput).clearAndTypeOnCodeMirror(
+            '{"User_name": "John Updated", "User_ID": 35}'
+          );
+        }
+
+        if (operation === "List documents") {
+          cy.get(appWriteSelectors.collectionId).clearAndTypeOnCodeMirror(
+            CollectionID
+          );
+        }
+
+        if (operation === "Delete document") {
+          cy.get(appWriteSelectors.collectionId).clearAndTypeOnCodeMirror(
+            CollectionID
+          );
+          cy.get(appWriteSelectors.documentId).clearAndTypeOnCodeMirror(
+            documentId
+          );
+        }
+        cy.get(dataSourceSelector.queryPreviewButton).click();
+
+        // Verify toast message
+        cy.verifyToastMessage(
+          commonSelectors.toastMessage,
+          `Query (${data.dsName}) completed.`
+        );
+      });
+    });
+  });
+});
diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/baseRow.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/baseRow.cy.js
new file mode 100644
index 00000000000..b90e6aa5803
--- /dev/null
+++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/baseRow.cy.js
@@ -0,0 +1,219 @@
+import { fake } from "Fixtures/fake";
+import { postgreSqlSelector } from "Selectors/postgreSql";
+import { pluginSelectors, baserowSelectors } from "Selectors/plugins";
+import { postgreSqlText } from "Texts/postgreSql";
+import { amazonSesText } from "Texts/amazonSes";
+import { baseRowText } from "Texts/baseRow";
+import { amazonAthenaText } from "Texts/amazonAthena";
+import { commonSelectors } from "Selectors/common";
+import { commonText } from "Texts/common";
+
+import {
+  fillDataSourceTextField,
+  selectAndAddDataSource,
+} from "Support/utils/postgreSql";
+
+import {
+  verifyCouldnotConnectWithAlert,
+  deleteDatasource,
+  closeDSModal,
+  addQuery,
+  addDsAndAddQuery,
+} from "Support/utils/dataSource";
+
+import { openQueryEditor } from "Support/utils/dataSource";
+import { dataSourceSelector } from "../../../../../constants/selectors/dataSource";
+
+const data = {};
+data.dsName = fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", "");
+
+describe("Data source baserow", () => {
+  beforeEach(() => {
+    cy.apiLogin();
+    cy.defaultWorkspaceLogin();
+    cy.intercept("POST", "/api/data_queries").as("createQuery");
+  });
+
+  it("Should verify elements on baserow connection form", () => {
+    const Apikey = Cypress.env("baserow_apikey");
+
+    cy.get(commonSelectors.globalDataSourceIcon).click();
+    closeDSModal();
+
+    cy.get(postgreSqlSelector.allDatasourceLabelAndCount).should(
+      "have.text",
+      postgreSqlText.allDataSources()
+    );
+    cy.get(postgreSqlSelector.commonlyUsedLabelAndCount).should(
+      "have.text",
+      postgreSqlText.commonlyUsed
+    );
+    cy.get(postgreSqlSelector.databaseLabelAndCount).should(
+      "have.text",
+      postgreSqlText.allDatabase()
+    );
+    cy.get(postgreSqlSelector.apiLabelAndCount).should(
+      "have.text",
+      postgreSqlText.allApis
+    );
+    cy.get(postgreSqlSelector.cloudStorageLabelAndCount).should(
+      "have.text",
+      postgreSqlText.allCloudStorage
+    );
+
+    selectAndAddDataSource("databases", baseRowText.baserow, data.dsName);
+
+    fillDataSourceTextField(
+      baseRowText.lableApiToken,
+      baseRowText.placeholderApiToken,
+      Apikey
+    );
+
+    cy.get(".react-select__control").eq(1).click();
+
+    cy.get(".react-select__option").contains("Baserow Cloud").click();
+
+    cy.get(postgreSqlSelector.buttonSave)
+      .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave)
+      .click();
+    cy.verifyToastMessage(
+      commonSelectors.toastMessage,
+      postgreSqlText.toastDSSaved
+    );
+
+    deleteDatasource(`cypress-${data.dsName}-baserow`);
+  });
+
+  it("Should verify the functionality of baserow connection form.", () => {
+    const Apikey = Cypress.env("baserow_apikey");
+
+    selectAndAddDataSource("databases", baseRowText.baserow, data.dsName);
+
+    fillDataSourceTextField(
+      baseRowText.lableApiToken,
+      baseRowText.placeholderApiToken,
+      Apikey
+    );
+
+    cy.get(".react-select__control").eq(1).click();
+
+    cy.get(".react-select__option").contains("Baserow Cloud").click();
+
+    cy.get(postgreSqlSelector.buttonSave)
+      .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave)
+      .click();
+    cy.verifyToastMessage(
+      commonSelectors.toastMessage,
+      postgreSqlText.toastDSSaved
+    );
+    deleteDatasource(`cypress-${data.dsName}-baserow`);
+  });
+
+  it("Should be able to run the query with a valid connection", () => {
+    const baserowTableID = Cypress.env("baserow_tableid");
+    const baserowRowID = Cypress.env("baserow_rowid");
+    const Apikey = Cypress.env("baserow_apikey");
+
+    selectAndAddDataSource("databases", baseRowText.baserow, data.dsName);
+
+    fillDataSourceTextField(
+      baseRowText.lableApiToken,
+      baseRowText.placeholderApiToken,
+      Apikey
+    );
+
+    cy.get(".react-select__control").eq(1).click();
+    cy.get(".react-select__option").contains("Baserow Cloud").click();
+
+    cy.get(postgreSqlSelector.buttonSave)
+      .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave)
+      .click();
+    cy.verifyToastMessage(
+      commonSelectors.toastMessage,
+      postgreSqlText.toastDSSaved
+    );
+
+    cy.get(commonSelectors.globalDataSourceIcon).click();
+    cy.get(
+      `[data-cy="cypress-${data.dsName}-baserow-button"]`
+    ).verifyVisibleElement("have.text", `cypress-${data.dsName}-baserow`);
+    cy.wait(1000);
+
+    cy.log("Baserow Table ID:", baserowTableID);
+    cy.log("Row ID:", baserowRowID);
+    cy.log("API Key:", Apikey);
+
+    if (!baserowTableID || !Apikey) {
+      throw new Error("Missing required environment variables!");
+    }
+
+    cy.request({
+      method: "POST",
+      url: `https://api.baserow.io/api/database/rows/table/${baserowTableID}/`,
+      headers: { Authorization: `Token ${Apikey}` },
+      body: {
+        field_1: "Sample Data",
+        field_2: "Another Value",
+      },
+    }).then((response) => {
+      expect(response.status).to.eq(200);
+      const rowId = response.body.id;
+
+      cy.get(commonSelectors.dashboardIcon).click();
+      cy.get(commonSelectors.appCreateButton).click();
+      cy.get(commonSelectors.appNameInput).click().type(data.dsName);
+      cy.get(commonSelectors.createAppButton).click();
+      cy.skipWalkthrough();
+
+      cy.get('[data-cy="show-ds-popover-button"]').click();
+      cy.get(".css-4e90k9").type(`${data.dsName}`);
+      cy.contains(`[id*="react-select-"]`, data.dsName).click();
+      cy.get('[data-cy="query-rename-input"]').clear().type(data.dsName);
+
+      // Verify delete operation (Need to uncomment after bug fixes)
+
+      //   cy.get('[data-cy="operation-select-dropdown"]').click();
+      //   cy.get(".react-select__option").contains("Delete row").click();
+
+      //   cy.get(baserowSelectors.baserowTabelId).clearAndTypeOnCodeMirror(baserowTableID);
+      //   cy.get(baserowSelectors.rowIdinputfield).clearAndTypeOnCodeMirror(rowId.toString());
+
+      //   cy.get(dataSourceSelector.queryPreviewButton).click();
+      //   cy.verifyToastMessage(commonSelectors.toastMessage, `Query (${data.dsName}) completed.`);
+    });
+
+    // Verify other operations
+    const operations = [
+      "List fields",
+      "List rows",
+      "Get row",
+      "Create row",
+      "Update row",
+      "Move row",
+    ];
+
+    operations.forEach((operation) => {
+      cy.get('[data-cy="query-select-dropdown"]').click();
+      cy.get(".react-select__option").contains(operation).click();
+
+      cy.get(baserowSelectors.table).clearAndTypeOnCodeMirror(baserowTableID);
+
+      if (operation === "Get row") {
+        cy.get(baserowSelectors.rowIdinputfield).clearAndTypeOnCodeMirror(
+          baserowRowID
+        );
+      }
+      if (operation === "Move row") {
+        cy.get('[data-cy="before-id-input-field"]').clearAndTypeOnCodeMirror(
+          "1"
+        );
+      }
+
+      cy.get(dataSourceSelector.queryPreviewButton).click();
+      cy.verifyToastMessage(
+        commonSelectors.toastMessage,
+        `Query (${data.dsName}) completed.`
+      );
+    });
+  });
+});


Reviews:
user: login: Mekhla-Asopa
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-17T08:01:06Z
user: login: Mekhla-Asopa
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-03-19T13:51:54Z
user: login: Mekhla-Asopa
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-03-20T05:16:42Z

Review comments:
path: cypress-tests/cypress/constants/selectors/Plugins.js
user: login: Mekhla-Asopa
body: There is no need to add "baserow" as a prefix in the selector key because it is present inside "baserowSelectors"
created_at: 2025-03-17T08:01:05Z
author_association: COLLABORATOR
path: cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/aitTable.cy.js
user: login: Mekhla-Asopa
body: Please check file name, it should be airTable
created_at: 2025-03-19T13:51:54Z
author_association: COLLABORATOR

PR comments:
user: login: sonarqubecloud[bot]
created_at: 2025-03-20T04:20:59Z
body: ## [![Quality Gate Failed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-failed-20px.png 'Quality Gate Failed')](https://sonarcloud.io/dashboard?id=ToolJet_ToolJet&pullRequest=12263) **Quality Gate failed**  
Failed conditions  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/failed-16px.png '') [29.8% Duplication on New Code](https://sonarcloud.io/component_measures?id=ToolJet_ToolJet&pullRequest=12263&metric=new_duplicated_lines_density&view=list) (required ≤ 3%)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=ToolJet_ToolJet&pullRequest=12263)


author_association: NONE