diff --git a/cypress-tests/cypress/commands/apiCommands.js b/cypress-tests/cypress/commands/apiCommands.js index c625e6cc33..62d72f7cdc 100644 --- a/cypress-tests/cypress/commands/apiCommands.js +++ b/cypress-tests/cypress/commands/apiCommands.js @@ -52,7 +52,7 @@ Cypress.Commands.add("apiCreateGDS", (url, name, kind, options) => { log: false; } expect(response.status).to.equal(201); - Cypress.env(`${kind}`, response.body.id); + Cypress.env(`${name}`, response.body.id); Cypress.log({ name: "Create Data Source", @@ -80,13 +80,14 @@ Cypress.Commands.add("apiFetchDataSourcesId", () => { Cypress.log({ name: "DS Fetch", displayName: "Data Sources Fetched", - message: dataSources.map(ds => `\nKind: '${ds.kind}', Name: '${ds.id}'`).join(','), + message: dataSources + .map((ds) => `\nKind: '${ds.kind}', Name: '${ds.id}'`) + .join(","), }); }); }); }); - Cypress.Commands.add("apiCreateApp", (appName = "testApp") => { cy.window({ log: false }).then((win) => { win.localStorage.setItem("walkthroughCompleted", "true"); @@ -168,7 +169,6 @@ Cypress.Commands.add( Cypress.env("editingVersionId", responseData.editing_version.id); Cypress.env("environmentId", responseData.editorEnvironment.id); - }); cy.get(componentSelector, { timeout: 10000 }); } @@ -221,21 +221,21 @@ Cypress.Commands.add( const requestBody = envVar === "Enterprise" ? { - email: userEmail, - firstName: userName, - groups: [], - lastName: "", - role: userRole, - userMetadata: metaData, - } + email: userEmail, + firstName: userName, + groups: [], + lastName: "", + role: userRole, + userMetadata: metaData, + } : { - email: userEmail, - firstName: userName, - groups: [], - lastName: "", - role: userRole, - userMetadata: metaData, - }; + email: userEmail, + firstName: userName, + groups: [], + lastName: "", + role: userRole, + userMetadata: metaData, + }; cy.getCookie("tj_auth_token").then((cookie) => { cy.request( @@ -289,7 +289,9 @@ Cypress.Commands.add("apiAddQuery", (queryName, query, dataQueryId) => { Cypress.Commands.add( "apiAddQueryToApp", (queryName, options, dsName, dsKind) => { - cy.log(`${Cypress.env("server_host")}/api/data-queries/data-sources/${Cypress.env(dsKind)}/versions/${Cypress.env("editingVersionId")}`) + cy.log( + `${Cypress.env("server_host")}/api/data-queries/data-sources/${Cypress.env(dsKind)}/versions/${Cypress.env("editingVersionId")}` + ); cy.getCookie("tj_auth_token", { log: false }).then((cookie) => { const authToken = `tj_auth_token=${cookie.value}`; const workspaceId = Cypress.env("workspaceId"); @@ -737,3 +739,55 @@ Cypress.Commands.add("apiGetAppData", (appId = Cypress.env("appId")) => { }); }); }); + +Cypress.Commands.add("apiDeleteGDS", (name) => { + const dataSourceId = Cypress.env(`${name}`); + + cy.getCookie("tj_auth_token").then((cookie) => { + cy.request({ + method: "DELETE", + url: `${Cypress.env("server_host")}/api/data-sources/${dataSourceId}`, + headers: { + "Tj-Workspace-Id": Cypress.env("workspaceId"), + Cookie: `tj_auth_token=${cookie.value}`, + }, + failOnStatusCode: false, + }).then((response) => { + console.log("Delete response:", response); + + expect(response.status, "Delete status code").to.eq(200); + + Cypress.log({ + name: "Delete Data Source", + displayName: "Data source deleted", + message: `Name: '${name}' | ID: '${dataSourceId}'`, + }); + }); + }); +}); + +Cypress.Commands.add( + "apiUpdateGDS", + ({ name, options, envName = "development" }) => { + cy.getAuthHeaders().then((headers) => { + cy.apiGetEnvironments().then((environments) => { + const environment = environments.find((env) => env.name === envName); + const environmentId = environment.id; + const dataSourceId = Cypress.env(`${name}`); + + cy.request({ + method: "PUT", + url: `${Cypress.env("server_host")}/api/data-sources/${dataSourceId}?environment_id=${environmentId}`, + headers: headers, + body: { + name: name, + options: options, + }, + }).then((response) => { + expect(response.status).to.equal(200); + cy.log(`Datasource "${name}" updated successfully.`); + }); + }); + }); + } +); diff --git a/cypress-tests/cypress/constants/selectors/dataSource.js b/cypress-tests/cypress/constants/selectors/dataSource.js index 242747e8b1..bf5fc06dfa 100644 --- a/cypress-tests/cypress/constants/selectors/dataSource.js +++ b/cypress-tests/cypress/constants/selectors/dataSource.js @@ -28,7 +28,7 @@ export const dataSourceSelector = { buttonTestConnection: '[data-cy="test-connection-button"]', connectionFailedText: '[data-cy="test-connection-failed-text"]', buttonSave: '[data-cy="db-connection-save-button"] > .tj-base-btn', - dangerAlertNotSupportSSL: '.go3958317564', + dangerAlertNotSupportSSL: ".go3958317564", passwordTextField: '[data-cy="password-text-field"]', textConnectionVerified: '[data-cy="test-connection-verified-text"]', @@ -102,6 +102,12 @@ export const dataSourceSelector = { eventQuerySelectionField: '[data-cy="query-selection-field"]', connectionAlertText: '[data-cy="connection-alert-text"]', deleteDSButton: (datasourceName) => { - return `[data-cy="${cyParamName(datasourceName)}-delete-button"]` + return `[data-cy="${cyParamName(datasourceName)}-delete-button"]`; + }, + labelFieldName: (fieldName) => { + return `[data-cy="${cyParamName(fieldName)}-field-label"]`; + }, + dataSourceNameButton: (dataSourceName) => { + return `[data-cy="${cyParamName(dataSourceName)}-button"]`; }, }; diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/airTableHappyPath.cy.skip.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/airTableHappyPath.cy.js similarity index 79% rename from cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/airTableHappyPath.cy.skip.js rename to cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/airTableHappyPath.cy.js index 0733373ece..62a6bffcb1 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/airTableHappyPath.cy.skip.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/airTableHappyPath.cy.js @@ -69,25 +69,57 @@ describe("Data source 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.apiCreateGDS( + `${Cypress.env("server_host")}/api/data-sources`, + `cypress-${data.dsName}-airtable`, + "airtable", + [ + { + key: "personal_access_token", + value: "Invalid access token", + encrypted: true, + }, + ] + ); cy.get( - `[data-cy="cypress-${data.dsName}-airtable-button"]` - ).verifyVisibleElement("have.text", `cypress-${data.dsName}-airtable`); - deleteDatasource(`cypress-${data.dsName}-airtable`); + dataSourceSelector.dataSourceNameButton(`cypress-${data.dsName}-airtable`) + ) + .should("be.visible") + .click(); + + cy.get(postgreSqlSelector.buttonTestConnection).click(); + cy.get(dataSourceSelector.connectionFailedText, { + timeout: 10000, + }).should("have.text", postgreSqlText.couldNotConnect); + + cy.get(dataSourceSelector.connectionAlertText).verifyVisibleElement( + "have.text", + "Authentication failed: Invalid personal access token" + ); + cy.reload(); + cy.apiUpdateGDS({ + name: `cypress-${data.dsName}-airtable`, + options: [ + { + key: "personal_access_token", + value: `${Cypress.env("airTable_apikey")}`, + encrypted: true, + }, + ], + }); + cy.get( + dataSourceSelector.dataSourceNameButton(`cypress-${data.dsName}-airtable`) + ) + .should("be.visible") + .click(); + + cy.get(postgreSqlSelector.buttonTestConnection).click(); + cy.get(postgreSqlSelector.textConnectionVerified, { + timeout: 10000, + }).should("have.text", postgreSqlText.labelConnectionVerified); + + cy.apiDeleteGDS(`cypress-${data.dsName}-airtable`); }); it("Should able to run the query with valid conection", () => { @@ -96,30 +128,20 @@ describe("Data source Airtable", () => { 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.apiCreateGDS( + `${Cypress.env("server_host")}/api/data-sources`, + `cypress-${data.dsName}-airtable`, + "airtable", + [ + { + key: "personal_access_token", + value: `${airTable_apiKey}`, + encrypted: true, + }, + ] ); - - 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.apiCreateApp(`${data.dsName}-airtable-app`); + cy.openApp(); cy.get('[data-cy="show-ds-popover-button"]').click(); cy.get(".css-4e90k9").type(`${data.dsName}`); @@ -280,10 +302,9 @@ describe("Data source Airtable", () => { commonSelectors.toastMessage, `Query (${data.queryName}) completed.` ); - deleteAppandDatasourceAfterExecution( - data.dsName, - `cypress-${data.dsName}-airtable` - ); + + cy.apiDeleteApp(`${data.dsName}-airtable-app`); + cy.apiDeleteGDS(`cypress-${data.dsName}-airtable`); }); }); }); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/bigqueryHappyPath.cy.skip.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/bigqueryHappyPath.cy.js similarity index 79% rename from cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/bigqueryHappyPath.cy.skip.js rename to cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/bigqueryHappyPath.cy.js index 24a39a3acc..2bbe0787e7 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/bigqueryHappyPath.cy.skip.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/bigqueryHappyPath.cy.js @@ -66,10 +66,9 @@ describe("Data source BigQuery", () => { `cypress-${data.dataSourceName}-bigquery` ); - cy.get('[data-cy="label-private-key"]').verifyVisibleElement( - "have.text", - firestoreText.labelPrivateKey - ); + cy.get( + dataSourceSelector.labelFieldName(firestoreText.labelPrivateKey) + ).verifyVisibleElement("have.text", "Private key*"); cy.get(".datasource-edit-btn").should("be.visible"); cy.get(postgreSqlSelector.labelIpWhitelist).verifyVisibleElement( "have.text", @@ -98,7 +97,7 @@ describe("Data source BigQuery", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').verifyVisibleElement( + cy.get(dataSourceSelector.connectionAlertText).verifyVisibleElement( "have.text", bigqueryText.errorInvalidEmailId ); @@ -110,38 +109,30 @@ describe("Data source BigQuery", () => { }); it("Should verify the functionality of BigQuery connection form.", () => { - selectAndAddDataSource( - "databases", - bigqueryText.bigQuery, - data.dataSourceName - ); - - fillDataSourceTextField( - firestoreText.privateKey, - bigqueryText.placehlderPrivateKey, - `${JSON.stringify(Cypress.env("bigquery_pvt_key"))}`, - "contain", - { parseSpecialCharSequences: false, delay: 0 } + cy.get(commonSelectors.globalDataSourceIcon).click(); + cy.apiCreateGDS( + `${Cypress.env("server_host")}/api/data-sources`, + `cypress-${data.dataSourceName}-bigquery`, + "bigquery", + [ + { + key: "private_key", + value: `${JSON.stringify(Cypress.env("bigquery_pvt_key"))}`, + encrypted: true, + }, + ] ); + cy.get( + dataSourceSelector.dataSourceNameButton( + `cypress-${data.dataSourceName}-bigquery` + ) + ) + .should("be.visible") + .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.dataSourceName}-bigquery-button"]` - ).verifyVisibleElement( - "have.text", - `cypress-${data.dataSourceName}-bigquery` - ); - - deleteDatasource(`cypress-${data.dataSourceName}-bigquery`); + cy.apiDeleteGDS(`cypress-${data.dataSourceName}-bigquery`); }); }); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/cosmosDbHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/cosmosDbHappyPath.cy.js index bb5923ec7b..e450e52fc6 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/cosmosDbHappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/cosmosDbHappyPath.cy.js @@ -101,7 +101,7 @@ describe("Data sources", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').verifyVisibleElement( + cy.get(dataSourceSelector.connectionAlertText).verifyVisibleElement( "have.text", "Invalid URL" ); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/couchDbHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/couchDbHappyPath.cy.js index 8e4a17d173..06bfe675fd 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/couchDbHappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/couchDbHappyPath.cy.js @@ -127,7 +127,7 @@ describe("Data sources", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').verifyVisibleElement( + cy.get(dataSourceSelector.connectionAlertText).verifyVisibleElement( "have.text", "Invalid URL" ); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/dynamoDbHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/dynamoDbHappyPath.cy.js index 5ff912d2d8..3585fc9c4f 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/dynamoDbHappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/dynamoDbHappyPath.cy.js @@ -115,7 +115,7 @@ describe("Data source DynamoDB", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').verifyVisibleElement( + cy.get(dataSourceSelector.connectionAlertText).verifyVisibleElement( "have.text", dynamoDbText.errorMissingRegion ); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/elasticsearchHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/elasticsearchHappyPath.cy.js index 88627284ad..8faca425a0 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/elasticsearchHappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/elasticsearchHappyPath.cy.js @@ -122,7 +122,7 @@ describe("Data source Elasticsearch", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').verifyVisibleElement( + cy.get(dataSourceSelector.connectionAlertText).verifyVisibleElement( "have.text", elasticsearchText.errorConnectionRefused ); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/fireStoreHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/fireStoreHappyPath.cy.js index 674501b2db..31b6099d4c 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/fireStoreHappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/fireStoreHappyPath.cy.js @@ -94,7 +94,7 @@ describe("Data source Firestore", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').verifyVisibleElement( + cy.get(dataSourceSelector.connectionAlertText).verifyVisibleElement( "have.text", firestoreText.errorGcpKeyCouldNotBeParsed ); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/influxDbHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/influxDbHappyPath.cy.js index 24dc92359c..26db831cff 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/influxDbHappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/influxDbHappyPath.cy.js @@ -118,7 +118,7 @@ describe("Data sources", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').verifyVisibleElement( + cy.get(dataSourceSelector.connectionAlertText).verifyVisibleElement( "have.text", "Invalid URL" ); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/mariaDbHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/mariaDbHappyPath.cy.js index 58c8c30705..020ca4a40a 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/mariaDbHappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/mariaDbHappyPath.cy.js @@ -125,7 +125,7 @@ describe("Data sources", () => { "have.text", postgreSqlText.buttonTextSave ); - // cy.get('[data-cy="connection-alert-text"]').should("be.visible") + // cy.get(dataSourceSelector.connectionAlertText).should("be.visible") deleteDatasource(`cypress-${data.dataSourceName}-mariadb`); }); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/mongoDbHappyPath.cy.skip.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/mongoDbHappyPath.cy.skip.js index 5729ea18c8..1da8b5c6d7 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/mongoDbHappyPath.cy.skip.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/mongoDbHappyPath.cy.skip.js @@ -129,7 +129,7 @@ describe("Data source MongoDB", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').verifyVisibleElement( + cy.get(dataSourceSelector.connectionAlertText).verifyVisibleElement( "have.text", mongoDbText.errorConnectionRefused ); @@ -164,7 +164,7 @@ describe("Data source MongoDB", () => { }).verifyVisibleElement("have.text", postgreSqlText.couldNotConnect, { timeout: 95000, }); - cy.get('[data-cy="connection-alert-text"]').verifyVisibleElement( + cy.get(dataSourceSelector.connectionAlertText).verifyVisibleElement( "have.text", "Cannot read properties of null (reading '2')" ); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/postgresHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/postgresHappyPath.cy.js index 2da4902edd..43268fb85d 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/postgresHappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/postgresHappyPath.cy.js @@ -136,7 +136,7 @@ describe("Data sources", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').should("be.visible"); + cy.get(dataSourceSelector.connectionAlertText).should("be.visible"); deleteDatasource(`cypress-${data.dataSourceName}-postgresql`); }); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/redisHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/redisHappyPath.cy.js index ddceea1b52..7e4ed90b8d 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/redisHappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/redisHappyPath.cy.js @@ -3,7 +3,7 @@ import { postgreSqlSelector } from "Selectors/postgreSql"; import { postgreSqlText } from "Texts/postgreSql"; import { redisText } from "Texts/redis"; import { commonSelectors } from "Selectors/common"; -import { commonText } from "Texts/common"; +import { dataSourceSelector } from "Selectors/dataSource"; import { fillDataSourceTextField, @@ -96,7 +96,7 @@ describe("Data source Redis", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').should( + cy.get(dataSourceSelector.connectionAlertText).should( "have.text", redisText.errorMaxRetries ); @@ -137,7 +137,7 @@ describe("Data source Redis", () => { ); cy.get(postgreSqlSelector.buttonTestConnection).click(); - cy.get('[data-cy="connection-alert-text"]').should( + cy.get(dataSourceSelector.connectionAlertText).should( "have.text", redisText.errorInvalidUserOrPassword ); @@ -152,7 +152,7 @@ describe("Data source Redis", () => { "108299" ); cy.get(postgreSqlSelector.buttonTestConnection).click(); - cy.get('[data-cy="connection-alert-text"]').should( + cy.get(dataSourceSelector.connectionAlertText).should( "have.text", redisText.errorPort ); @@ -170,7 +170,7 @@ describe("Data source Redis", () => { ); cy.get(postgreSqlSelector.buttonTestConnection).click(); - cy.get('[data-cy="connection-alert-text"]').should( + cy.get(dataSourceSelector.connectionAlertText).should( "have.text", redisText.errorInvalidUserOrPassword ); @@ -187,7 +187,7 @@ describe("Data source Redis", () => { "redis" ); cy.get(postgreSqlSelector.buttonTestConnection).click(); - cy.get('[data-cy="connection-alert-text"]').should( + cy.get(dataSourceSelector.connectionAlertText).should( "have.text", redisText.errorInvalidUserOrPassword ); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/restAPIHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/restAPIHappyPath.cy.js index 825439e687..9ec852d6ce 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/restAPIHappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/restAPIHappyPath.cy.js @@ -329,9 +329,9 @@ describe("Data source Rest API", () => { ); cy.contains("Save").click(); cy.verifyToastMessage(commonSelectors.toastMessage, "Data Source Saved"); - deleteDatasource(`cypress-${data.dataSourceName}-restapi`); + cy.apiDeleteGDS(`cypress-${data.dataSourceName}-restapi`); }); - it("Should verify basic connection for Rest API", () => { + it("Should verify connection response for all methods", () => { cy.apiCreateGDS( `${Cypress.env("server_host")}/api/data-sources`, `cypress-${data.dataSourceName}-restapi`, @@ -367,88 +367,384 @@ describe("Data source Rest API", () => { ); cy.reload(); - cy.apiCreateApp(`${fake.companyName}-restAPI-App`); + cy.apiCreateApp(`${fake.companyName}-restAPI-CURD-App`); cy.openApp(); - createAndRunRestAPIQuery( - "get_restapi", - `cypress-${data.dataSourceName}-restapi`, - "GET", - "/api/users" - ); - createAndRunRestAPIQuery( - "post_restapi", - `cypress-${data.dataSourceName}-restapi`, - "POST", - "", - [["Content-Type", "application/json"]], - [], - { - price: 200, - name: "Violin", - }, - true, - "/api/users" - ); + createAndRunRestAPIQuery({ + queryName: "get_beeceptor_data", + dsName: `cypress-${data.dataSourceName}-restapi`, + method: "GET", + urlSuffix: "/api/users", + run: true, + }); + createAndRunRestAPIQuery({ + queryName: "post_restapi", + dsName: `cypress-${data.dataSourceName}-restapi`, + method: "POST", + headersList: [["Content-Type", "application/json"]], + rawBody: '{"price": 200,"name": "Violin"}', + urlSuffix: "/api/users", + expectedResponseShape: { price: 200, name: "Violin", id: true }, + }); cy.readFile("cypress/fixtures/restAPI/storedId.json").then( (postResponseID) => { const id1 = postResponseID.id; - createAndRunRestAPIQuery( - "put_restapi_id", - `cypress-${data.dataSourceName}-restapi`, - "PUT", - "", - [["Content-Type", "application/json"]], - [], - { - price: 500, - name: "Guitar", - }, - true, - `/api/users/${id1}` - ); - } - ); - cy.readFile("cypress/fixtures/restAPI/storedId.json").then( - (putResponseID) => { - const id2 = putResponseID.id; - createAndRunRestAPIQuery( - "patch_restapi_id", - `cypress-${data.dataSourceName}-restapi`, - "PATCH", - "", - [["Content-Type", "application/json"]], - [], - { price: 999 }, - true, - `/api/users/${id2}` - ); - } - ); - cy.readFile("cypress/fixtures/restAPI/storedId.json").then( - (patchResponseID) => { - const id3 = patchResponseID.id; - createAndRunRestAPIQuery( - "get_restapi_id", - `cypress-${data.dataSourceName}-restapi`, - "GET", - "", - [], - [], - true, - `/api/users/${id3}` - ); - createAndRunRestAPIQuery( - "delete_restapi_id", - `cypress-${data.dataSourceName}-restapi`, - "DELETE", - "", - [], - [], - true, - `/api/users/${id3}` - ); + createAndRunRestAPIQuery({ + queryName: "put_restapi_id", + dsName: `cypress-${data.dataSourceName}-restapi`, + method: "PUT", + headersList: [["Content-Type", "application/json"]], + rawBody: '{"price": 500,"name": "Guitar"}', + urlSuffix: `/api/users/${id1}`, + expectedResponseShape: { price: 500, name: "Guitar", id: id1 }, + }); + createAndRunRestAPIQuery({ + queryName: "patch_restapi_id", + dsName: `cypress-${data.dataSourceName}-restapi`, + method: "PATCH", + headersList: [["Content-Type", "application/json"]], + rawBody: '{"price": 999 }', + urlSuffix: `/api/users/${id1}`, + run: true, + expectedResponseShape: { price: 999, id: id1 }, + }); + createAndRunRestAPIQuery({ + queryName: "get_restapi_id", + dsName: `cypress-${data.dataSourceName}-restapi`, + method: "GET", + urlSuffix: `/api/users/${id1}`, + run: true, + expectedResponseShape: { price: 999, name: "Guitar", id: id1 }, + }); + createAndRunRestAPIQuery({ + queryName: "delete_restapi_id", + dsName: `cypress-${data.dataSourceName}-restapi`, + method: "DELETE", + urlSuffix: `/api/users/${id1}`, + run: true, + expectedResponseShape: { success: true }, + }); } ); + cy.apiDeleteGDS(`cypress-${data.dataSourceName}-restapi`); + }); + it("Should verify response for basic authentication type connection", () => { + cy.apiCreateGDS( + `${Cypress.env("server_host")}/api/data-sources`, + `cypress-${data.dataSourceName}-restapi`, + "restapi", + [ + { key: "url", value: "https://httpbin.org" }, + { key: "auth_type", value: "basic" }, + { key: "grant_type", value: "authorization_code" }, + { key: "add_token_to", value: "header" }, + { key: "header_prefix", value: "Bearer " }, + { key: "access_token_url", value: "" }, + { key: "client_id", value: "" }, + { + key: "client_secret", + encrypted: true, + credential_id: "b044a293-82b4-4381-84fd-d173c86a6a0c", + }, + { key: "audience", value: "" }, + { key: "scopes", value: "read, write" }, + { key: "username", value: "user", encrypted: false }, + { key: "password", value: "pass", encrypted: true }, + { + key: "bearer_token", + encrypted: true, + credential_id: "21caf3cb-dbde-43c7-9f42-77feffb63062", + }, + { key: "auth_url", value: "" }, + { key: "client_auth", value: "header" }, + { key: "headers", value: [["", ""]] }, + { key: "custom_query_params", value: [["", ""]], encrypted: false }, + { key: "custom_auth_params", value: [["", ""]] }, + { + key: "access_token_custom_headers", + value: [["", ""]], + encrypted: false, + }, + { key: "multiple_auth_enabled", value: false, encrypted: false }, + { key: "ssl_certificate", value: "none", encrypted: false }, + { key: "retry_network_errors", value: true, encrypted: false }, + { key: "url_parameters", value: [["", ""]], encrypted: false }, + { key: "tokenData", encrypted: false }, + ] + ); + cy.reload(); + cy.intercept("GET", "/api/library_apps").as("appLibrary"); + cy.apiCreateApp(`${fake.companyName}-restAPI-Basic-App`); + createAndRunRestAPIQuery({ + queryName: "get_basic_auth_valid", + dsName: `cypress-${data.dataSourceName}-restapi`, + method: "GET", + urlSuffix: "/basic-auth/user/pass", + expectedResponseShape: { authenticated: true, user: "user" }, + }); + createAndRunRestAPIQuery({ + queryName: "get_basic_auth_invalid", + dsName: `cypress-${data.dataSourceName}-restapi`, + method: "GET", + urlSuffix: "/basic-auth/invaliduser/invalidpass", + }); + cy.apiDeleteGDS(`cypress-${data.dataSourceName}-restapi`); + }); + it("Should verify response for bearer authentication type connection", () => { + cy.apiCreateGDS( + `${Cypress.env("server_host")}/api/data-sources`, + `cypress-${data.dataSourceName}-restapi`, + "restapi", + [ + { key: "url", value: "https://httpbin.org" }, + { key: "auth_type", value: "bearer" }, + { key: "grant_type", value: "authorization_code" }, + { key: "add_token_to", value: "header" }, + { key: "header_prefix", value: "Bearer " }, + { key: "access_token_url", value: "" }, + { key: "client_id", value: "" }, + { + key: "client_secret", + encrypted: true, + credential_id: "b044a293-82b4-4381-84fd-d173c86a6a0c", + }, + { key: "audience", value: "" }, + { key: "scopes", value: "read, write" }, + { key: "username", value: "", encrypted: false }, + { key: "password", value: "", encrypted: true }, + { + key: "bearer_token", + value: "my-token-123", + encrypted: true, + }, + { key: "auth_url", value: "" }, + { key: "client_auth", value: "header" }, + { key: "headers", value: [["", ""]] }, + { key: "custom_query_params", value: [["", ""]], encrypted: false }, + { key: "custom_auth_params", value: [["", ""]] }, + { + key: "access_token_custom_headers", + value: [["", ""]], + encrypted: false, + }, + { key: "multiple_auth_enabled", value: false, encrypted: false }, + { key: "ssl_certificate", value: "none", encrypted: false }, + { key: "retry_network_errors", value: true, encrypted: false }, + { key: "url_parameters", value: [["", ""]], encrypted: false }, + { key: "tokenData", encrypted: false }, + ] + ); + cy.reload(); + cy.intercept("GET", "/api/library_apps").as("appLibrary"); + cy.apiCreateApp(`${fake.companyName}-restAPI-Bearer-App`); + cy.openApp(); + createAndRunRestAPIQuery({ + queryName: "get_bearer_auth_valid", + dsName: `cypress-${data.dataSourceName}-restapi`, + method: "GET", + urlSuffix: "/bearer", + expectedResponseShape: { authenticated: true, token: "my-token-123" }, + }); + cy.intercept("GET", "api/data_sources?**").as("datasource"); + cy.apiCreateGDS( + `${Cypress.env("server_host")}/api/data-sources`, + `cypress-${data.dataSourceName}-restapi-invalid`, + "restapi", + [ + { key: "url", value: "https://httpbin.org" }, + { key: "auth_type", value: "bearer" }, + { key: "grant_type", value: "authorization_code" }, + { key: "add_token_to", value: "header" }, + { key: "header_prefix", value: "Bearer " }, + { key: "access_token_url", value: "" }, + { key: "client_id", value: "" }, + { + key: "client_secret", + encrypted: true, + credential_id: "b044a293-82b4-4381-84fd-d173c86a6a0c", + }, + { key: "audience", value: "" }, + { key: "scopes", value: "read, write" }, + { key: "username", value: "", encrypted: false }, + { key: "password", value: "", encrypted: true }, + { + key: "bearer_token", + value: "", + encrypted: true, + }, + { key: "auth_url", value: "" }, + { key: "client_auth", value: "header" }, + { key: "headers", value: [["", ""]] }, + { key: "custom_query_params", value: [["", ""]], encrypted: false }, + { key: "custom_auth_params", value: [["", ""]] }, + { + key: "access_token_custom_headers", + value: [["", ""]], + encrypted: false, + }, + { key: "multiple_auth_enabled", value: false, encrypted: false }, + { key: "ssl_certificate", value: "none", encrypted: false }, + { key: "retry_network_errors", value: true, encrypted: false }, + { key: "url_parameters", value: [["", ""]], encrypted: false }, + { key: "tokenData", encrypted: false }, + ] + ); + cy.apiCreateApp(`${fake.companyName}-restAPI-Bearer-invalid`); + cy.openApp(); + createAndRunRestAPIQuery({ + queryName: "get_bearer_auth_invalid", + dsName: `cypress-${data.dataSourceName}-restapi-invalid`, + method: "GET", + urlSuffix: "/bearer", + }); + cy.apiDeleteGDS(`cypress-${data.dataSourceName}-restapi`); + }); + it.skip("Should verify response for authentication code grant type connection", () => { + cy.apiCreateGDS( + `${Cypress.env("server_host")}/api/data-sources`, + `cypress-${data.dataSourceName}-restapi`, + "restapi", + [ + { + key: "url", + value: "https://dev-6lj2hoxdz5fg3m57.uk.auth0.com/api/v2/users", + }, + { key: "auth_type", value: "oauth2" }, + { key: "grant_type", value: "client_credentials" }, + { key: "add_token_to", value: "header" }, + { key: "header_prefix", value: "Bearer " }, + { + key: "access_token_url", + value: "https://dev-6lj2hoxdz5fg3m57.uk.auth0.com/oauth/token", + }, + { key: "client_id", value: "JBDuuLU9vaSTP6Do7zYSkw0GvVgWhfyZ" }, + { + key: "client_secret", + encrypted: true, + credential_id: "a6d26607-4d09-42a2-8bc0-e5c185c7c2f7", + }, + { + key: "audience", + value: "https://dev-6lj2hoxdz5fg3m57.uk.auth0.com/api/v2/", + }, + { key: "scopes", value: "" }, + { key: "username", value: "", encrypted: false }, + { + key: "password", + encrypted: true, + credential_id: "4502a906-b512-447a-a128-39f67e9778d2", + }, + { + key: "bearer_token", + encrypted: true, + credential_id: "c94262c7-d2c5-4d7f-96f8-657689f2b1f0", + }, + { key: "auth_url", value: "" }, + { key: "client_auth", value: "header" }, + { key: "headers", value: [["", ""]] }, + { key: "custom_query_params", value: [["", ""]], encrypted: false }, + { key: "custom_auth_params", value: [["", ""]] }, + { + key: "access_token_custom_headers", + value: [["", ""]], + encrypted: false, + }, + { key: "multiple_auth_enabled", value: false, encrypted: false }, + { key: "ssl_certificate", value: "none", encrypted: false }, + { key: "retry_network_errors", value: true, encrypted: false }, + ] + ); + cy.reload(); + cy.intercept("GET", "/api/library_apps").as("appLibrary"); + cy.apiCreateApp(`${fake.companyName}-client-Grant-RestAPI`); + }); + it("Should verify response for content-type", () => { + cy.apiCreateApp(`${fake.companyName}-restAPI-Content-App`); + createAndRunRestAPIQuery({ + queryName: "post_json", + dsName: "restapidefault", + method: "POST", + url: "https://jsonplaceholder.typicode.com/posts", + headersList: [["Content-Type", "application/json"]], + rawBody: '{"title": "foo","body": "bar","userId": 1}', + run: true, + urlSuffix: "", + expectedResponseShape: { id: true, title: "foo", body: "bar", userId: 1 }, + }); + createAndRunRestAPIQuery({ + queryName: "post_raw_text", + dsName: "restapidefault", + method: "POST", + url: "https://httpbin.org/post", + headersList: [["Content-Type", "text/plain"]], + rawBody: "This is plain text content", + jsonBody: null, + run: true, + expectedResponseShape: { data: "This is plain text content" }, + }); + createAndRunRestAPIQuery({ + queryName: "post_form_urlencoded", + dsName: "restapidefault", + method: "POST", + url: "https://httpbin.org/post", + headersList: [["Content-Type", "application/x-www-form-urlencoded"]], + bodyList: [ + ["name", "Jane"], + ["age", "30"], + ], + expectedResponseShape: { + "form.name": "Jane", + "form.age": "30", + }, + }); + createAndRunRestAPIQuery({ + queryName: "post_xml_soap", + dsName: "restapidefault", + method: "POST", + url: "http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso?WSDL", + headersList: [["Content-Type", "text/xml; charset=utf-8"]], + rawBody: ` + + + + + + `, + jsonBody: null, + bodyList: [], + cookiesList: [["session", "abc123"]], + paramsList: [["lang", "en"]], + run: true, + shouldSucceed: true, + expectedResponseShape: {}, + }); + // createAndRunRestAPIQuery({ + // queryName: "post_text_csv", + // dsName: "restapidefault", + // method: "POST", + // url: `https://tejasvi.free.beeceptor.com/csv-upload`, + // headersList: [["Content-Type", "text/csv"]], + // rawBody: + // "id,name,email\n1,Alice,alice@example.com\n2,Bob,bob@example.com", + // expectedResponseShape: { + // data: '{\n "status": "ok",\n "message": "File uploaded successfully",\n "body": id,name,email\n1,Alice,alice@example.com\n2,Bob,bob@example.com\n}', + // }, + // }); + // const filename = "tooljet.png"; + + // createAndRunRestAPIQuery({ + // queryName: "upload_image", + // dsName: "restapidefault", + // method: "POST", + // url: `https://tejasvi.free.beeceptor.commultipart-upload`, + // headersList: [["Content-Type", "multipart/form-data"]], + // bodyList: [ + // ["Image_File", "fixture:Image/tooljet.png"], + // ["filename", filename], + // ], + // expectedResponseShape: { + // filename: filename, + // }, + // }); }); }); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/s3HappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/s3HappyPath.cy.js index 73ccc703c3..79f2534f9e 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/s3HappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/s3HappyPath.cy.js @@ -120,7 +120,7 @@ describe("Data sources AWS S3", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').should( + cy.get(dataSourceSelector.connectionAlertText).should( "have.text", s3Text.alertRegionIsMissing ); @@ -144,7 +144,7 @@ describe("Data sources AWS S3", () => { ); cy.get(postgreSqlSelector.buttonTestConnection).click(); - cy.get('[data-cy="connection-alert-text"]').should( + cy.get(dataSourceSelector.connectionAlertText).should( "have.text", s3Text.alertRegionIsMissing ); @@ -170,7 +170,7 @@ describe("Data sources AWS S3", () => { .click(); cy.get(postgreSqlSelector.buttonTestConnection).click(); - cy.get('[data-cy="connection-alert-text"]').should( + cy.get(dataSourceSelector.connectionAlertText).should( "have.text", s3Text.alertInvalidUrl ); @@ -188,7 +188,7 @@ describe("Data sources AWS S3", () => { ); cy.get(postgreSqlSelector.buttonTestConnection).click(); - cy.get('[data-cy="connection-alert-text"]').should( + cy.get(dataSourceSelector.connectionAlertText).should( "have.text", s3Text.accessKeyError ); @@ -207,7 +207,7 @@ describe("Data sources AWS S3", () => { cy.get(postgreSqlSelector.buttonTestConnection).click(); - cy.get('[data-cy="connection-alert-text"]').should( + cy.get(dataSourceSelector.connectionAlertText).should( "have.text", s3Text.sinatureError ); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/smtpHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/smtpHappyPath.cy.js index 506fe5d660..15d716ae8e 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/smtpHappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/smtpHappyPath.cy.js @@ -105,7 +105,7 @@ describe("Data source SMTP", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').should( + cy.get(dataSourceSelector.connectionAlertText).should( "have.text", "Invalid credentials" ); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/snowflakeHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/snowflakeHappyPath.cy.js index 7c1fb5b588..e8419657bd 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/snowflakeHappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/snowflakeHappyPath.cy.js @@ -128,7 +128,7 @@ describe("Data sources", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').should( + cy.get(dataSourceSelector.connectionAlertText).should( "have.text", "Invalid account. The specified value must be a valid subdomain string." ); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/sqlServerHappyPath.cy.skip.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/sqlServerHappyPath.cy.skip.js index 954fb659b5..1ac953a42b 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/sqlServerHappyPath.cy.skip.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/sqlServerHappyPath.cy.skip.js @@ -132,7 +132,7 @@ describe("Data sources", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').verifyVisibleElement( + cy.get(dataSourceSelector.connectionAlertText).verifyVisibleElement( "have.text", "Failed to connect to localhost:1433 - Could not connect (sequence)" ); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/typeSenseHappyPath.cy.skip.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/typeSenseHappyPath.cy.skip.js index 4b4fe20e62..9e480da66c 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/typeSenseHappyPath.cy.skip.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/typeSenseHappyPath.cy.skip.js @@ -96,7 +96,7 @@ describe("Data sources", () => { "have.text", postgreSqlText.buttonTextSave ); - cy.get('[data-cy="connection-alert-text"]').should( + cy.get(dataSourceSelector.connectionAlertText).should( "have.text", "Ensure that apiKey is set" ); diff --git a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/version.cy.js b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/version.cy.js index c0f6064564..3432744fc3 100644 --- a/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/version.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/platform/ceTestcases/apps/version.cy.js @@ -114,17 +114,30 @@ describe("App Version", () => { cy.wait(3000); // cy.reload(); - cy.get(commonWidgetSelector.draggableWidget("text1")).should("be.visible", { timeout: 10000 }); + cy.get(commonWidgetSelector.draggableWidget("text1")).should("be.visible", { + timeout: 10000, + }); // Preview and release verification cy.openInCurrentTab(commonWidgetSelector.previewButton); cy.url().should("include", "/home?version=v2"); - cy.openApp("", Cypress.env("workspaceId"), Cypress.env("appId"), commonWidgetSelector.draggableWidget("text1")); + cy.openApp( + "", + Cypress.env("workspaceId"), + Cypress.env("appId"), + commonWidgetSelector.draggableWidget("text1") + ); releasedVersionAndVerify("v2"); }); it("should verify version management with components and queries", () => { // Initial setup with component and datasource + cy.apiCreateGDS( + `${Cypress.env("server_host")}/api/data-sources`, + data.datasourceName, + "restapi", + [{ key: "url", value: "https://jsonplaceholder.typicode.com/users" }] + ); cy.apiAddComponentToApp( data.appName, "text1", @@ -134,19 +147,15 @@ describe("App Version", () => { ); cy.waitForAutoSave(); - cy.apiCreateGDS( - `${Cypress.env("server_host")}/api/data-sources`, - data.datasourceName, - "restapi", - [{ key: "url", value: "https://jsonplaceholder.typicode.com/users" }] - ); createRestAPIQuery(data.query1, data.datasourceName, "", "", "/1", true); // Version v2 creation and verification navigateToCreateNewVersionModal("v1"); createNewVersion(["v2"], "v1"); - cy.get(commonWidgetSelector.draggableWidget("text1")) - .verifyVisibleElement("have.text", "Leanne Graham"); + cy.get(commonWidgetSelector.draggableWidget("text1")).verifyVisibleElement( + "have.text", + "Leanne Graham" + ); cy.get(`[data-cy="list-query-${data.query1}"]`).should("be.visible"); // Modify v2 with new components and queries @@ -170,67 +179,79 @@ describe("App Version", () => { create: { version: "v3", from: "v2" }, verify: { component: { selector: "textInput", value: "Ervin Howell" }, - query: data.query2 - } + query: data.query2, + }, }, { create: { version: "v4", from: "v1" }, verify: { component: { selector: "text1", text: "Leanne Graham" }, - query: data.query1 - } + query: data.query1, + }, }, { create: { version: "v5", from: "v3" }, verify: { component: { selector: "textInput", value: "Ervin Howell" }, - query: data.query2 - } - } + query: data.query2, + }, + }, ]; - versionChecks.forEach(check => { + versionChecks.forEach((check) => { navigateToCreateNewVersionModal(check.create.from); createNewVersion([check.create.version], check.create.from); if (check.verify.component.value) { - cy.get(commonWidgetSelector.draggableWidget(check.verify.component.selector)) - .verifyVisibleElement("have.value", check.verify.component.value); + cy.get( + commonWidgetSelector.draggableWidget(check.verify.component.selector) + ).verifyVisibleElement("have.value", check.verify.component.value); } else { - cy.get(commonWidgetSelector.draggableWidget(check.verify.component.selector)) - .verifyVisibleElement("have.text", check.verify.component.text); + cy.get( + commonWidgetSelector.draggableWidget(check.verify.component.selector) + ).verifyVisibleElement("have.text", check.verify.component.text); } - cy.get(`[data-cy="list-query-${check.verify.query}"]`).should("be.visible"); + cy.get(`[data-cy="list-query-${check.verify.query}"]`).should( + "be.visible" + ); }); // Release and version state verification releasedVersionAndVerify("v5"); - cy.get(appVersionSelectors.currentVersionField("v5")) - .should("have.class", "color-light-green"); + cy.get(appVersionSelectors.currentVersionField("v5")).should( + "have.class", + "color-light-green" + ); // Version switching and component verification cy.get(appVersionSelectors.currentVersionField("v5")).click(); cy.contains(`[id*="react-select-"]`, "v4").click(); - cy.get(appVersionSelectors.currentVersionField("v4")) - .should("not.have.class", "color-light-green"); - cy.get(commonWidgetSelector.draggableWidget("text1")) - .verifyVisibleElement("have.text", "Leanne Graham"); + cy.get(appVersionSelectors.currentVersionField("v4")).should( + "not.have.class", + "color-light-green" + ); + cy.get(commonWidgetSelector.draggableWidget("text1")).verifyVisibleElement( + "have.text", + "Leanne Graham" + ); cy.get(`[data-cy="list-query-${data.query1}"]`).should("be.visible"); // Preview and version switching verification cy.openInCurrentTab(commonWidgetSelector.previewButton); cy.url().should("include", "/home?version=v4"); - cy.get(commonWidgetSelector.draggableWidget("text1")) - .verifyVisibleElement("have.text", "Leanne Graham"); + cy.get(commonWidgetSelector.draggableWidget("text1")).verifyVisibleElement( + "have.text", + "Leanne Graham" + ); cy.get('[data-cy="preview-settings"]').click(); switchVersionAndVerify("v4", "v5"); - cy.get(commonWidgetSelector.draggableWidget("textInput")) - .verifyVisibleElement("have.value", "Ervin Howell"); + cy.get( + commonWidgetSelector.draggableWidget("textInput") + ).verifyVisibleElement("have.value", "Ervin Howell"); //url validation should be added after bug fix // cy.url().should("include", "/home?version=v5"); - }); }); diff --git a/cypress-tests/cypress/support/utils/dataSource.js b/cypress-tests/cypress/support/utils/dataSource.js index 4c1446636e..819a807a5f 100644 --- a/cypress-tests/cypress/support/utils/dataSource.js +++ b/cypress-tests/cypress/support/utils/dataSource.js @@ -255,7 +255,7 @@ export const createRestAPIQuery = ( }).then((response) => { const editingVersionId = response.body.editing_version.id; - const data_source_id = Cypress.env(kind); + const data_source_id = Cypress.env(`${dsName}`); const requestBody = { app_id: Cypress.env("appId"), diff --git a/cypress-tests/cypress/support/utils/restAPI.js b/cypress-tests/cypress/support/utils/restAPI.js index 2dfc225a65..f87c8d6f61 100644 --- a/cypress-tests/cypress/support/utils/restAPI.js +++ b/cypress-tests/cypress/support/utils/restAPI.js @@ -1,19 +1,31 @@ -export const createAndRunRestAPIQuery = ( +export const createAndRunRestAPIQuery = ({ queryName, dsName, method = "GET", url = "", + urlSuffix = "", headersList = [], bodyList = [], jsonBody = null, + rawBody = null, + cookiesList = [], + paramsList = [], run = true, - urlSuffix = "" -) => { + expectedResponseShape = {}, + authType = "", + authToken = "", +}) => { cy.getCookie("tj_auth_token").then((cookie) => { const headers = { "Tj-Workspace-Id": Cypress.env("workspaceId"), Cookie: `tj_auth_token=${cookie.value}`, }; + // if (authType === "bearer" || authType === "oauth2") { + // headers["Authorization"] = `Bearer ${authToken}`; + // } else if (authType === "basic") { + // headers["Authorization"] = `Basic ${btoa(authToken)}`; + // } + cy.request({ method: "GET", url: `${Cypress.env("server_host")}/api/apps/${Cypress.env("appId")}`, @@ -27,84 +39,108 @@ export const createAndRunRestAPIQuery = ( url: `${Cypress.env("server_host")}/api/data-sources/${Cypress.env("workspaceId")}/environments/${currentEnvironmentId}/versions/${editingVersionId}`, headers, }).then((dsResponse) => { - expect(dsResponse.status).to.eq(200); - const dataSource = dsResponse.body.data_sources.find( (ds) => ds.name === dsName ); - - if (!dataSource) { - throw new Error(`Data source '${dsName}' not found.`); - } - - const data_source_id = dataSource.id; - const useJsonBody = - ["POST", "PATCH", "PUT"].includes(method.toUpperCase()) && - jsonBody !== null; + const useJson = jsonBody !== null; + const useRaw = rawBody !== null; + const useForm = bodyList?.length && !useJson && !useRaw; const queryOptions = { method: method.toLowerCase(), url: url + urlSuffix, - url_params: [["", ""]], + url_params: paramsList.length ? paramsList : [["", ""]], headers: headersList.length ? headersList : [["", ""]], - body: !useJsonBody && bodyList.length ? bodyList : [["", ""]], - json_body: useJsonBody ? jsonBody : null, - body_toggle: useJsonBody, + cookies: cookiesList.length ? cookiesList : [["", ""]], + body: useForm ? bodyList : [["", ""]], + json_body: useJson ? jsonBody : null, + raw_body: useRaw ? rawBody : "", + body_toggle: useJson || useRaw, runOnPageLoad: run, transformationLanguage: "javascript", enableTransformation: false, }; - const requestBody = { app_id: Cypress.env("appId"), app_version_id: editingVersionId, name: queryName, kind: "restapi", options: queryOptions, - data_source_id, + data_source_id: dataSource.id, plugin_id: null, }; cy.request({ method: "POST", - url: `${Cypress.env("server_host")}/api/data-queries/data-sources/${data_source_id}/versions/${editingVersionId}`, + url: `${Cypress.env("server_host")}/api/data-queries/data-sources/${dataSource.id}/versions/${editingVersionId}`, headers, body: requestBody, }).then((createResponse) => { - expect(createResponse.status).to.equal(201); + expect(createResponse.status).to.eq(201); const queryId = createResponse.body.id; - cy.log("Query created successfully:", queryId); - const createdOptions = createResponse.body.options; - expect(createdOptions.method).to.equal(queryOptions.method); - expect(createdOptions.url).to.equal(queryOptions.url); - expect(createdOptions.headers).to.deep.equal(queryOptions.headers); - - if (useJsonBody) { - expect(createdOptions.json_body).to.deep.equal( - queryOptions.json_body - ); - expect(createdOptions.body_toggle).to.equal(true); - } else { - expect(createdOptions.body).to.deep.equal(queryOptions.body); - expect(createdOptions.body_toggle).to.equal(false); - } - - expect(createdOptions.runOnPageLoad).to.equal(run); - cy.log("Metadata verified successfully"); if (run) { cy.request({ method: "POST", url: `${Cypress.env("server_host")}/api/data-queries/${queryId}/run`, headers, + failOnStatusCode: false, }).then((runResponse) => { - expect([200, 201]).to.include(runResponse.status); - cy.log("Query executed successfully:", runResponse.body); - if (runResponse.body?.data.id) { - cy.writeFile("cypress/fixtures/restAPI/storedId.json", { - id: runResponse.body.data.id, - }); - cy.log("Stored ID:", runResponse.body.data.id); + const responseData = runResponse.body?.data; + const requestHeaders = + runResponse.body?.metadata?.request?.headers || {}; + + if (runResponse.body.status === "ok") { + expect([200, 201]).to.include(runResponse.status); + cy.log("Response:", responseData); + if ( + expectedResponseShape && + typeof expectedResponseShape === "object" + ) { + Object.entries(expectedResponseShape).forEach( + ([path, expected]) => { + const value = path + .split(".") + .reduce((obj, key) => obj?.[key], responseData); + + if (expected === true) { + expect(value).to.not.be.undefined; + } else { + expect(value).to.eq(expected); + } + } + ); + } + + const expectedContentType = headersList.find( + ([key]) => key.toLowerCase() === "content-type" + )?.[1]; + if (expectedContentType && requestHeaders["content-type"]) { + expect(requestHeaders["content-type"]).to.include( + expectedContentType + ); + } + if (Array.isArray(responseData)) { + responseData.forEach((item) => { + expect(item).to.have.any.keys("id", "name", "price"); + }); + } + if (responseData?.id) { + cy.writeFile("cypress/fixtures/restAPI/storedId.json", { + id: responseData.id, + }); + } + } else if (runResponse.body.status === "failed") { + expect(runResponse.body.message).to.eq( + "Query could not be completed" + ); + const statusCode = + runResponse.body?.metadata?.response?.statusCode; + expect([400, 401, 403, 404, 500]).to.include(statusCode); + cy.log( + "Failure validated as expected with status:", + statusCode + ); } }); }