From 8217c8458c7ba1310bfecfd45753062c7e084276 Mon Sep 17 00:00:00 2001 From: shadabbuchh Date: Wed, 5 Feb 2025 14:54:25 +0530 Subject: [PATCH 01/11] test: Add cypress tests for Snowflake datasource functionalities --- .github/workflows/ci-test-custom-script.yml | 9 +- .github/workflows/ci-test-hosted.yml | 3 + .../workflows/ci-test-limited-with-count.yml | 220 ++++++++-------- .github/workflows/ci-test-limited.yml | 5 +- .../Datasources/Snowflake_Basic_Spec.ts | 234 ++++++++++++++++++ .../cypress/support/Objects/DataManager.ts | 8 + .../cypress/support/Pages/DataSources.ts | 41 +++ 7 files changed, 407 insertions(+), 113 deletions(-) create mode 100644 app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts diff --git a/.github/workflows/ci-test-custom-script.yml b/.github/workflows/ci-test-custom-script.yml index a4ccf88b57c0..87a7e247b03b 100644 --- a/.github/workflows/ci-test-custom-script.yml +++ b/.github/workflows/ci-test-custom-script.yml @@ -368,6 +368,9 @@ jobs: CYPRESS_SKIP_FLAKY: true CYPRESS_STATIC_ALLOCATION: true DEBUG: ${{secrets.CYPRESS_GREP_DEBUG }} # This is derived from secrets so that we can toggle it without having to change any workflow. Only acceptable value is: @cypress/grep + SNOWFLAKE_ACCOUNT_NAME: ${{ secrets.SNOWFLAKE_ACCOUNT_NAME }} + SNOWFLAKE_USERNAME: ${{ secrets.SNOWFLAKE_USERNAME }} + SNOWFLAKE_PASSWORD: ${{ secrets.SNOWFLAKE_PASSWORD }} with: browser: ${{ env.BROWSER_PATH }} install: false @@ -469,9 +472,9 @@ jobs: uses: actions/upload-artifact@v4 if: always() with: - name: docker-logs-${{ matrix.job }} - path: app/server/docker-logs.log - overwrite: true + name: docker-logs-${{ matrix.job }} + path: app/server/docker-logs.log + overwrite: true # Set status = success - name: Save the status of the run diff --git a/.github/workflows/ci-test-hosted.yml b/.github/workflows/ci-test-hosted.yml index 0b3850ba5625..0524127eab2d 100644 --- a/.github/workflows/ci-test-hosted.yml +++ b/.github/workflows/ci-test-hosted.yml @@ -244,6 +244,9 @@ jobs: CYPRESS_DB_PWD: ${{ secrets.CYPRESS_DB_PWD }} CYPRESS_S3_ACCESS: ${{ secrets.CYPRESS_S3_ACCESS }} CYPRESS_S3_SECRET: ${{ secrets.CYPRESS_S3_SECRET }} + SNOWFLAKE_ACCOUNT_NAME: ${{ secrets.SNOWFLAKE_ACCOUNT_NAME }} + SNOWFLAKE_USERNAME: ${{ secrets.SNOWFLAKE_USERNAME }} + SNOWFLAKE_PASSWORD: ${{ secrets.SNOWFLAKE_PASSWORD }} CYPRESS_STATIC_ALLOCATION: true with: browser: ${{ env.BROWSER_PATH }} diff --git a/.github/workflows/ci-test-limited-with-count.yml b/.github/workflows/ci-test-limited-with-count.yml index fbcb355ea507..fed79c6d676e 100644 --- a/.github/workflows/ci-test-limited-with-count.yml +++ b/.github/workflows/ci-test-limited-with-count.yml @@ -15,20 +15,20 @@ on: type: number default: 0 run_count: - description: 'Number of times to repeat the test run' + description: "Number of times to repeat the test run" required: false type: number default: 1 update_snapshot: - description: 'Give option to update snapshot (true/false)' - required: false - type: boolean - default: false + description: "Give option to update snapshot (true/false)" + required: false + type: boolean + default: false specs_to_run: - description: 'Cypress spec file(s) to run' + description: "Cypress spec file(s) to run" required: false type: string - default: 'no_data' + default: "no_data" workflow_call: inputs: @@ -42,20 +42,20 @@ on: type: number default: 0 run_count: - description: 'Number of times to repeat the test run' + description: "Number of times to repeat the test run" required: false type: number default: 1 update_snapshot: - description: 'Give option to update snapshot (true/false)' - required: false - type: boolean - default: false + description: "Give option to update snapshot (true/false)" + required: false + type: boolean + default: false specs_to_run: - description: 'Cypress spec file(s) to run' + description: "Cypress spec file(s) to run" required: false type: string - default: 'no_data' + default: "no_data" jobs: ci-test-limited: @@ -132,14 +132,14 @@ jobs: else echo "rerun=false" >> $GITHUB_OUTPUT fi - + - name: Upload existing snapshot data if: always() uses: actions/upload-artifact@v4 with: name: cypress-existing-compare-snapshots path: ${{ github.workspace }}/app/client/cypress/snapshots - overwrite: true + overwrite: true # Step to get specs from the file or use the provided specs - name: Get specs to run @@ -147,7 +147,7 @@ jobs: ls -l echo "[DEBUG] Checking inputs.specs_to_run: '${{ inputs.specs_to_run }}'" echo "[DEBUG] Checking github.event.inputs.specs_to_run: '${{ github.event.inputs.specs_to_run }}'" - + # Determine the source of the specs_to_run input if [[ -n "${{ inputs.specs_to_run }}" ]]; then specs_to_run="${{ inputs.specs_to_run }}" # For workflow_call @@ -202,7 +202,6 @@ jobs: # Log the final specs_to_run value echo "[DEBUG] Setting specs_to_run to GitHub environment variable: $specs_to_run" echo "specs_to_run=$specs_to_run" >> $GITHUB_ENV - # In case of run-id provided download the artifact from the previous run - name: Download Docker image artifact @@ -361,95 +360,98 @@ jobs: - name: Run the cypress test env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - CYPRESS_USERNAME: ${{ secrets.CYPRESS_USERNAME }} - CYPRESS_PASSWORD: ${{ secrets.CYPRESS_PASSWORD }} - CYPRESS_TESTUSERNAME1: ${{ secrets.CYPRESS_TESTUSERNAME1 }} - CYPRESS_TESTPASSWORD1: ${{ secrets.CYPRESS_TESTPASSWORD1 }} - CYPRESS_TESTUSERNAME2: ${{ secrets.CYPRESS_TESTUSERNAME2 }} - CYPRESS_TESTPASSWORD2: ${{ secrets.CYPRESS_TESTPASSWORD1 }} - CYPRESS_TESTUSERNAME3: ${{ secrets.CYPRESS_TESTUSERNAME3 }} - CYPRESS_TESTPASSWORD3: ${{ secrets.CYPRESS_TESTPASSWORD3 }} - CYPRESS_TESTUSERNAME4: ${{ secrets.CYPRESS_TESTUSERNAME4 }} - CYPRESS_TESTPASSWORD4: ${{ secrets.CYPRESS_TESTPASSWORD4 }} - CYPRESS_S3_ACCESS_KEY: ${{ secrets.CYPRESS_S3_ACCESS_KEY }} - CYPRESS_S3_SECRET_KEY: ${{ secrets.CYPRESS_S3_SECRET_KEY }} - CYPRESS_AIRTABLE_BEARER: ${{ secrets.AIRTABLE_BEARER }} - CYPRESS_ORACLE_HOST: ${{ secrets.ORACLE_HOST }} - CYPRESS_ORACLE_SERVICE: ${{ secrets.ORACLE_SERVICE }} - CYPRESS_ORACLE_USERNAME: ${{ secrets.ORACLE_USERNAME }} - CYPRESS_ORACLE_PASSWORD: ${{ secrets.ORACLE_PASSWORD }} - CYPRESS_FIRESTORE_PRIVATE_KEY: ${{ secrets.FIRESTORE_PRIVATE_KEY }} - CYPRESS_APPSMITH_OAUTH2_GOOGLE_CLIENT_ID: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_GOOGLE_CLIENT_ID }} - CYPRESS_APPSMITH_OAUTH2_GOOGLE_CLIENT_SECRET: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_GOOGLE_CLIENT_SECRET }} - CYPRESS_APPSMITH_OAUTH2_GITHUB_CLIENT_ID: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_GITHUB_CLIENT_ID }} - CYPRESS_APPSMITH_OAUTH2_GITHUB_CLIENT_SECRET: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_GITHUB_CLIENT_SECRET }} - CYPRESS_OAUTH_SAML_EMAIL: ${{ secrets.CYPRESS_OAUTH_SAML_EMAIL }} - CYPRESS_OAUTH_SAML_ENTITY_ID: ${{ secrets.CYPRESS_OAUTH_SAML_ENTITY_ID }} - CYPRESS_OAUTH_SAML_METADATA_URL: ${{ secrets.CYPRESS_OAUTH_SAML_METADATA_URL }} - CYPRESS_OAUTH_SAML_METADATA_XML: ${{ secrets.CYPRESS_OAUTH_SAML_METADATA_XML }} - CYPRESS_OAUTH_SAML_PUB_CERT: ${{ secrets.CYPRESS_OAUTH_SAML_PUB_CERT }} - CYPRESS_OAUTH_SAML_SSO_URL: ${{ secrets.CYPRESS_OAUTH_SAML_SSO_URL }} - CYPRESS_OAUTH_SAML_REDIRECT_URL: ${{ secrets.CYPRESS_OAUTH_SAML_REDIRECT_URL }} - CYPRESS_APPSMITH_OAUTH2_OIDC_CLIENT_ID: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_CLIENT_ID }} - CYPRESS_APPSMITH_OAUTH2_OIDC_CLIENT_SECRET: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_CLIENT_SECRET }} - CYPRESS_APPSMITH_OAUTH2_OIDC_AUTH_URL: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_AUTH_URL }} - CYPRESS_APPSMITH_OAUTH2_OIDC_TOKEN_URL: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_TOKEN_URL }} - CYPRESS_APPSMITH_OAUTH2_OIDC_USER_INFO: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_USER_INFO }} - CYPRESS_APPSMITH_OAUTH2_OIDC_JWKS_URL: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_JWKS_URL }} - CYPRESS_APPSMITH_OAUTH2_OIDC_OKTA_PASSWORD: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_OKTA_PASSWORD }} - CYPRESS_APPSMITH_OAUTH2_OIDC_DIRECT_URL: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_DIRECT_URL }} - CYPRESS_EXCLUDE_TAGS: "airgap" - CYPRESS_AIRGAPPED: false - APPSMITH_DISABLE_TELEMETRY: true - APPSMITH_GOOGLE_MAPS_API_KEY: ${{ secrets.APPSMITH_GOOGLE_MAPS_API_KEY }} - POSTGRES_PASSWORD: postgres - CYPRESS_VERIFY_TIMEOUT: 100000 - COMMIT_INFO_MESSAGE: ${{ env.COMMIT_INFO_MESSAGE }} - RUNID: ${{ github.run_id }} - ATTEMPT_NUMBER: ${{ github.run_attempt }} - REPOSITORY: ${{ github.repository }} - COMMITTER: ${{ env.COMMIT_INFO_AUTHOR }} - TAG: ${{ github.event_name }} - BRANCH: ${{ env.COMMIT_INFO_BRANCH }} - THIS_RUNNER: ${{ strategy.job-index }} - TOTAL_RUNNERS: ${{ strategy.job-total }} - CYPRESS_SPECS: ${{ env.specs_to_run }} - CYPRESS_RERUN: ${{steps.run_result.outputs.rerun}} - CYPRESS_DB_USER: ${{ secrets.CYPRESS_DB_USER }} - CYPRESS_DB_HOST: ${{ secrets.CYPRESS_DB_HOST }} - CYPRESS_DB_NAME: ${{ secrets.CYPRESS_DB_NAME }} - CYPRESS_DB_PWD: ${{ secrets.CYPRESS_DB_PWD }} - CYPRESS_S3_ACCESS: ${{ secrets.CYPRESS_S3_ACCESS }} - CYPRESS_S3_SECRET: ${{ secrets.CYPRESS_S3_SECRET }} - CYPRESS_STATIC_ALLOCATION: true - NODE_ENV: development + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + CYPRESS_USERNAME: ${{ secrets.CYPRESS_USERNAME }} + CYPRESS_PASSWORD: ${{ secrets.CYPRESS_PASSWORD }} + CYPRESS_TESTUSERNAME1: ${{ secrets.CYPRESS_TESTUSERNAME1 }} + CYPRESS_TESTPASSWORD1: ${{ secrets.CYPRESS_TESTPASSWORD1 }} + CYPRESS_TESTUSERNAME2: ${{ secrets.CYPRESS_TESTUSERNAME2 }} + CYPRESS_TESTPASSWORD2: ${{ secrets.CYPRESS_TESTPASSWORD1 }} + CYPRESS_TESTUSERNAME3: ${{ secrets.CYPRESS_TESTUSERNAME3 }} + CYPRESS_TESTPASSWORD3: ${{ secrets.CYPRESS_TESTPASSWORD3 }} + CYPRESS_TESTUSERNAME4: ${{ secrets.CYPRESS_TESTUSERNAME4 }} + CYPRESS_TESTPASSWORD4: ${{ secrets.CYPRESS_TESTPASSWORD4 }} + CYPRESS_S3_ACCESS_KEY: ${{ secrets.CYPRESS_S3_ACCESS_KEY }} + CYPRESS_S3_SECRET_KEY: ${{ secrets.CYPRESS_S3_SECRET_KEY }} + CYPRESS_AIRTABLE_BEARER: ${{ secrets.AIRTABLE_BEARER }} + CYPRESS_ORACLE_HOST: ${{ secrets.ORACLE_HOST }} + CYPRESS_ORACLE_SERVICE: ${{ secrets.ORACLE_SERVICE }} + CYPRESS_ORACLE_USERNAME: ${{ secrets.ORACLE_USERNAME }} + CYPRESS_ORACLE_PASSWORD: ${{ secrets.ORACLE_PASSWORD }} + CYPRESS_FIRESTORE_PRIVATE_KEY: ${{ secrets.FIRESTORE_PRIVATE_KEY }} + CYPRESS_APPSMITH_OAUTH2_GOOGLE_CLIENT_ID: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_GOOGLE_CLIENT_ID }} + CYPRESS_APPSMITH_OAUTH2_GOOGLE_CLIENT_SECRET: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_GOOGLE_CLIENT_SECRET }} + CYPRESS_APPSMITH_OAUTH2_GITHUB_CLIENT_ID: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_GITHUB_CLIENT_ID }} + CYPRESS_APPSMITH_OAUTH2_GITHUB_CLIENT_SECRET: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_GITHUB_CLIENT_SECRET }} + CYPRESS_OAUTH_SAML_EMAIL: ${{ secrets.CYPRESS_OAUTH_SAML_EMAIL }} + CYPRESS_OAUTH_SAML_ENTITY_ID: ${{ secrets.CYPRESS_OAUTH_SAML_ENTITY_ID }} + CYPRESS_OAUTH_SAML_METADATA_URL: ${{ secrets.CYPRESS_OAUTH_SAML_METADATA_URL }} + CYPRESS_OAUTH_SAML_METADATA_XML: ${{ secrets.CYPRESS_OAUTH_SAML_METADATA_XML }} + CYPRESS_OAUTH_SAML_PUB_CERT: ${{ secrets.CYPRESS_OAUTH_SAML_PUB_CERT }} + CYPRESS_OAUTH_SAML_SSO_URL: ${{ secrets.CYPRESS_OAUTH_SAML_SSO_URL }} + CYPRESS_OAUTH_SAML_REDIRECT_URL: ${{ secrets.CYPRESS_OAUTH_SAML_REDIRECT_URL }} + CYPRESS_APPSMITH_OAUTH2_OIDC_CLIENT_ID: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_CLIENT_ID }} + CYPRESS_APPSMITH_OAUTH2_OIDC_CLIENT_SECRET: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_CLIENT_SECRET }} + CYPRESS_APPSMITH_OAUTH2_OIDC_AUTH_URL: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_AUTH_URL }} + CYPRESS_APPSMITH_OAUTH2_OIDC_TOKEN_URL: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_TOKEN_URL }} + CYPRESS_APPSMITH_OAUTH2_OIDC_USER_INFO: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_USER_INFO }} + CYPRESS_APPSMITH_OAUTH2_OIDC_JWKS_URL: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_JWKS_URL }} + CYPRESS_APPSMITH_OAUTH2_OIDC_OKTA_PASSWORD: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_OKTA_PASSWORD }} + CYPRESS_APPSMITH_OAUTH2_OIDC_DIRECT_URL: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_DIRECT_URL }} + CYPRESS_EXCLUDE_TAGS: "airgap" + CYPRESS_AIRGAPPED: false + APPSMITH_DISABLE_TELEMETRY: true + APPSMITH_GOOGLE_MAPS_API_KEY: ${{ secrets.APPSMITH_GOOGLE_MAPS_API_KEY }} + POSTGRES_PASSWORD: postgres + CYPRESS_VERIFY_TIMEOUT: 100000 + COMMIT_INFO_MESSAGE: ${{ env.COMMIT_INFO_MESSAGE }} + RUNID: ${{ github.run_id }} + ATTEMPT_NUMBER: ${{ github.run_attempt }} + REPOSITORY: ${{ github.repository }} + COMMITTER: ${{ env.COMMIT_INFO_AUTHOR }} + TAG: ${{ github.event_name }} + BRANCH: ${{ env.COMMIT_INFO_BRANCH }} + THIS_RUNNER: ${{ strategy.job-index }} + TOTAL_RUNNERS: ${{ strategy.job-total }} + CYPRESS_SPECS: ${{ env.specs_to_run }} + CYPRESS_RERUN: ${{steps.run_result.outputs.rerun}} + CYPRESS_DB_USER: ${{ secrets.CYPRESS_DB_USER }} + CYPRESS_DB_HOST: ${{ secrets.CYPRESS_DB_HOST }} + CYPRESS_DB_NAME: ${{ secrets.CYPRESS_DB_NAME }} + CYPRESS_DB_PWD: ${{ secrets.CYPRESS_DB_PWD }} + CYPRESS_S3_ACCESS: ${{ secrets.CYPRESS_S3_ACCESS }} + CYPRESS_S3_SECRET: ${{ secrets.CYPRESS_S3_SECRET }} + SNOWFLAKE_ACCOUNT_NAME: ${{ secrets.SNOWFLAKE_ACCOUNT_NAME }} + SNOWFLAKE_USERNAME: ${{ secrets.SNOWFLAKE_USERNAME }} + SNOWFLAKE_PASSWORD: ${{ secrets.SNOWFLAKE_PASSWORD }} + CYPRESS_STATIC_ALLOCATION: true + NODE_ENV: development run: | - cd app/client - if [[ "${{ inputs.update_snapshot }}" == "true" ]]; then - echo "Running Cypress with snapshot updates..." - CYPRESS_updateSnapshots=true npx cypress-repeat-pro run -n "${{ inputs.run_count }}" --force \ - --spec "${{ inputs.specs_to_run }}" \ - --config-file "cypress_ci_custom.config.ts" \ - --browser "${{ env.BROWSER_PATH }}" - else - echo "Running Cypress tests without snapshot updates..." - npx cypress-repeat-pro run -n "${{ inputs.run_count }}" --force \ - --spec "${{ env.specs_to_run }}" \ - --config-file "cypress_ci_custom.config.ts" \ - --browser "${{ env.BROWSER_PATH }}" - fi - cat cy-repeat-summary.txt - # Define the path for the failure flag file - FAILURE_FLAG_FILE="ci_test_status.txt" + cd app/client + if [[ "${{ inputs.update_snapshot }}" == "true" ]]; then + echo "Running Cypress with snapshot updates..." + CYPRESS_updateSnapshots=true npx cypress-repeat-pro run -n "${{ inputs.run_count }}" --force \ + --spec "${{ inputs.specs_to_run }}" \ + --config-file "cypress_ci_custom.config.ts" \ + --browser "${{ env.BROWSER_PATH }}" + else + echo "Running Cypress tests without snapshot updates..." + npx cypress-repeat-pro run -n "${{ inputs.run_count }}" --force \ + --spec "${{ env.specs_to_run }}" \ + --config-file "cypress_ci_custom.config.ts" \ + --browser "${{ env.BROWSER_PATH }}" + fi + cat cy-repeat-summary.txt + # Define the path for the failure flag file + FAILURE_FLAG_FILE="ci_test_status.txt" - # Check for test results and store the status in the file - if ! grep -q "Total Failed: 0" cy-repeat-summary.txt; then - echo "ci_test_failed=true" > "$FAILURE_FLAG_FILE" - else - echo "ci_test_failed=false" > "$FAILURE_FLAG_FILE" - fi - cat "$FAILURE_FLAG_FILE" + # Check for test results and store the status in the file + if ! grep -q "Total Failed: 0" cy-repeat-summary.txt; then + echo "ci_test_failed=true" > "$FAILURE_FLAG_FILE" + else + echo "ci_test_failed=false" > "$FAILURE_FLAG_FILE" + fi + cat "$FAILURE_FLAG_FILE" - name: Trim number of cypress log files if: failure() @@ -468,9 +470,9 @@ jobs: if: always() uses: actions/upload-artifact@v4 with: - name: ci_test_status - path: ${{ github.workspace }}/app/client/ci_test_status.txt - overwrite: true + name: ci_test_status + path: ${{ github.workspace }}/app/client/ci_test_status.txt + overwrite: true - name: Upload failed test cypress logs artifact if: always() @@ -548,7 +550,7 @@ jobs: with: name: cypress-new-compare-snapshots path: ${{ github.workspace }}/app/client/cypress/snapshots - overwrite: true + overwrite: true # Set status = success - name: Save the status of the run diff --git a/.github/workflows/ci-test-limited.yml b/.github/workflows/ci-test-limited.yml index c6e249d00879..6eb38fe0e859 100644 --- a/.github/workflows/ci-test-limited.yml +++ b/.github/workflows/ci-test-limited.yml @@ -221,7 +221,7 @@ jobs: cd app/client chmod a+x ./cypress/setup-test-ci.sh ./cypress/setup-test-ci.sh - + - name: Install Google Chrome 129.0.6668.100 run: | sudo apt-get remove google-chrome-stable @@ -338,6 +338,9 @@ jobs: CYPRESS_DB_PWD: ${{ secrets.CYPRESS_DB_PWD }} CYPRESS_S3_ACCESS: ${{ secrets.CYPRESS_S3_ACCESS }} CYPRESS_S3_SECRET: ${{ secrets.CYPRESS_S3_SECRET }} + SNOWFLAKE_ACCOUNT_NAME: ${{ secrets.SNOWFLAKE_ACCOUNT_NAME }} + SNOWFLAKE_USERNAME: ${{ secrets.SNOWFLAKE_USERNAME }} + SNOWFLAKE_PASSWORD: ${{ secrets.SNOWFLAKE_PASSWORD }} CYPRESS_STATIC_ALLOCATION: true with: browser: ${{ env.BROWSER_PATH }} diff --git a/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts new file mode 100644 index 000000000000..53546d16a834 --- /dev/null +++ b/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts @@ -0,0 +1,234 @@ +import { + agHelper, + apiPage, + dataSources, + deployMode, + draggableWidgets, + entityItems, + locators, + table, +} from "../../../../support/Objects/ObjectsCore"; +import datasource from "../../../../../cypress/locators/DatasourcesEditor.json"; +import EditorNavigation, { + EntityType, + PageLeftPane, +} from "../../../../support/Pages/EditorNavigation"; +import { Widgets } from "../../../../support/Pages/DataSources"; +import BottomTabs from "../../../../support/Pages/IDE/BottomTabs"; +import { PluginActionForm } from "../../../../support/Pages/PluginActionForm"; + +let pluginActionForm = new PluginActionForm(); + +const myDsName = "SnowflakeDS1"; + +describe( + "Snowflake Basic Tests", + { tags: ["@tag.Datasource", "@tag.Git", "@tag.AccessControl"] }, + () => { + it("1. Validate the configuration of database", () => { + dataSources.NavigateToDSCreateNew(); + dataSources.CreatePlugIn("Snowflake"); + agHelper.AssertElementVisibility(dataSources._imgSnowflakeLogo, true, 1); + agHelper.GetNAssertContains(locators._dsName, "Untitled datasource 1"); + + // Attempt to rename the datasource with invalid and valid names + agHelper.GetNClick(locators._dsName); + agHelper.ClearTextField(locators._dsNameTxt, true); + agHelper.AssertTooltip("Please enter a valid name"); + agHelper.PressEnter(); + agHelper.ValidateToastMessage("Invalid name"); + agHelper.GetNClick(locators._dsName); + agHelper.TypeText(locators._dsNameTxt, myDsName); + agHelper.PressEnter(); + agHelper.AssertElementVisibility(dataSources._datasourceCard, true); + agHelper.AssertAttribute( + datasource.datasourceConfigUrl, + "placeholder", + "xy12345.ap-south-1.aws", + ); + // agHelper.ClearNType(datasource.datasourceConfigUrl, dataManager.dsValues[dataManager.defaultEnviorment].Snowflake_accountName); + // agHelper.ClearNType(dataSources._dsConfigProperties(0), dataManager.dsValues[dataManager.defaultEnviorment].Snowflake_warehouseName); + // agHelper.ClearNType(dataSources._dsConfigProperties(1), dataManager.dsValues[dataManager.defaultEnviorment].Snowflake_databaseName); + // agHelper.ClearNType(dataSources._dsConfigProperties(2), dataManager.dsValues[dataManager.defaultEnviorment].Snowflake_defaultSchema); + // agHelper.ClearNType(dataSources._dsConfigProperties(3), dataManager.dsValues[dataManager.defaultEnviorment].Snowflake_role); + // agHelper.AssertContains("Basic", "exist", dataSources._dsConfigAuthType); + // agHelper.ClearNType(dataSources._username, dataManager.dsValues[dataManager.defaultEnviorment].Snowflake_username); + // agHelper.ClearNType(dataSources._password, dataManager.dsValues[dataManager.defaultEnviorment].Snowflake_password); + + // Fill out the Snowflake configuration form and test/save the datasource + dataSources.FillSnowflakeDSForm(); + dataSources.TestSaveDatasource(); + }); + + it("2. Validate creating & running queries for the datasource", () => { + // Create and run a SELECT query, validating the response views + dataSources.CreateQueryAfterDSSaved( + "SELECT * FROM PUBLIC.DB1 LIMIT 10;", + "SelectQuery", + ); + dataSources.runQueryAndVerifyResponseViews({ + count: 2, + operator: "gte", + responseTypes: ["TABLE", "JSON", "RAW"], + }); + + // Create and run an INSERT query, validating the response + dataSources.CreateQueryForDS( + myDsName, + "INSERT INTO PUBLIC.DB1 (SALARY, ID, NAME, POSITION) VALUES (87000, 3, 'Ada', 'Jr. Developer');", + "InsertQuery", + ); + dataSources.runQueryAndVerifyResponseViews({ + count: 1, + operator: "eq", + responseTypes: ["TABLE", "JSON", "RAW"], + }); + + // Create and run an UPDATE query, validating the response + dataSources.CreateQueryForDS( + myDsName, + "UPDATE PUBLIC.DB1 SET SALARY = 90000 WHERE ID = 3;", + "UpdateQuery", + ); + dataSources.runQueryAndVerifyResponseViews({ + count: 1, + operator: "eq", + responseTypes: ["TABLE", "JSON", "RAW"], + }); + + // Create and run a DELETE query, validating the response + dataSources.CreateQueryForDS( + myDsName, + "DELETE FROM PUBLIC.DB1 WHERE ID = 3;", + "DeleteQuery", + ); + dataSources.runQueryAndVerifyResponseViews({ + count: 1, + operator: "eq", + responseTypes: ["TABLE", "JSON", "RAW"], + }); + }); + + it("3. Validate widget binding with queries & deploying the app", () => { + PageLeftPane.selectItem("SelectQuery", { ctrlKey: true, force: true }); + dataSources.AddSuggestedWidget(Widgets.Table); + deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.TABLE)); + table.WaitUntilTableLoad(0, 0, "v2"); + deployMode.NavigateBacktoEditor(); + EditorNavigation.SelectEntityByName("SelectQuery", EntityType.Query); + }); + + it("4. Validate deleting the datasource", () => { + // Delete all queries associated with the datasource + agHelper.ActionContextMenuWithInPane({ + action: "Delete", + entityType: entityItems.Query, + }); + PageLeftPane.selectItem("InsertQuery", { ctrlKey: true, force: true }); + agHelper.ActionContextMenuWithInPane({ + action: "Delete", + entityType: entityItems.Query, + }); + PageLeftPane.selectItem("UpdateQuery", { ctrlKey: true, force: true }); + agHelper.ActionContextMenuWithInPane({ + action: "Delete", + entityType: entityItems.Query, + }); + PageLeftPane.selectItem("DeleteQuery", { ctrlKey: true, force: true }); + agHelper.ActionContextMenuWithInPane({ + action: "Delete", + entityType: entityItems.Query, + }); + + // Delete the datasource and verify its removal + dataSources.DeleteDatasourceFromWithinDS(myDsName, 409); + deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.TABLE)); + table.WaitForTableEmpty("v2"); + deployMode.NavigateBacktoEditor(); + dataSources.DeleteDatasourceFromWithinDS(myDsName, 200); + }); + + it("5. Vlidate the user can create new queries from the datasource section in response tab", () => { + dataSources.NavigateToDSCreateNew(); + dataSources.CreatePlugIn("Snowflake"); + dataSources.FillSnowflakeDSForm(); + dataSources.TestSaveDatasource(); + + // Create, run, and validate SELECT, INSERT, UPDATE, and DELETE queries using templates + dataSources.createQueryWithDatasourceSchemaTemplate( + "Untitled datasource 1", + "DB1", + "Select", + ); + agHelper.RenameQuery("TemplateSelectQuery"); + apiPage.ToggleOnPageLoadRun(true); + pluginActionForm.toolbar.toggleSettings(); + apiPage.ToggleConfirmBeforeRunning(true); + agHelper.RefreshPage(); + agHelper.GetNClick(locators._confirmationdialogbtn("Yes")); + BottomTabs.response.validateRecordCount({ count: 2, operator: "gte" }); + + dataSources.createQueryWithDatasourceSchemaTemplate( + "Untitled datasource 1", + "DB1", + "Insert", + ); + dataSources.EnterQuery( + "INSERT INTO PUBLIC.DB1 (SALARY, ID, NAME, POSITION) VALUES (87000, 3, 'Ada', 'Jr. Developer');", + ); + agHelper.RenameQuery("TemplateInsertQuery"); + dataSources.runQueryAndVerifyResponseViews({ + count: 1, + operator: "eq", + responseTypes: ["TABLE", "JSON", "RAW"], + }); + + dataSources.createQueryWithDatasourceSchemaTemplate( + "Untitled datasource 1", + "DB1", + "Update", + ); + dataSources.EnterQuery( + "UPDATE PUBLIC.DB1 SET SALARY = 90000 WHERE ID = 3;", + ); + agHelper.RenameQuery("TemplateUpdateQuery"); + dataSources.runQueryAndVerifyResponseViews({ + count: 1, + operator: "eq", + responseTypes: ["TABLE", "JSON", "RAW"], + }); + + dataSources.createQueryWithDatasourceSchemaTemplate( + "Untitled datasource 1", + "DB1", + "Delete", + ); + dataSources.EnterQuery("DELETE FROM PUBLIC.DB1 WHERE ID = 3;"); + agHelper.RenameQuery("TemplateDeleteQuery"); + dataSources.runQueryAndVerifyResponseViews({ + count: 1, + operator: "eq", + responseTypes: ["TABLE", "JSON", "RAW"], + }); + + // Visit the documentation link + agHelper.GetNClick(locators._contextMenuInPane); + //cy.intercept("GET", "/api/v1/datasources/*/structure?ignoreCache=*").as("getDatasourceStructure"); + deployMode.StubWindowNAssert( + dataSources._queryDoc, + "querying-snowflake-db#querying-snowflake", + "getDatasourceStructure", + ); + }); + + it("6. Validate connection error when misconfiguring datasource", () => { + dataSources.NavigateToDSCreateNew(); + dataSources.CreatePlugIn("Snowflake"); + agHelper.GetNAssertContains(locators._dsName, "Untitled datasource 2"); + agHelper.AssertElementVisibility(dataSources._datasourceCard, true); + dataSources.FillSnowflakeDSForm(undefined, undefined, "wrongpassword"); + //agHelper.ClearNType(dataSources._password, "wrongpassword"); + dataSources.TestDatasource(false); + }); + }, +); diff --git a/app/client/cypress/support/Objects/DataManager.ts b/app/client/cypress/support/Objects/DataManager.ts index c4a27a021fb2..917bcd533c8a 100644 --- a/app/client/cypress/support/Objects/DataManager.ts +++ b/app/client/cypress/support/Objects/DataManager.ts @@ -108,6 +108,14 @@ export class DataManager { twilio_username: "random-username", twilio_password: "random-password", + + Snowflake_accountName: Cypress.env("SNOWFLAKE_ACCOUNT_NAME"), + Snowflake_warehouseName: "COMPUTE_WH", + Snowflake_databaseName: "TESTDB", + Snowflake_defaultSchema: "PUBLIC", + Snowflake_role: "SYSADMIN", + Snowflake_username: Cypress.env("SNOWFLAKE_USERNAME"), + Snowflake_password: Cypress.env("SNOWFLAKE_PASSWORD"), }, Staging: { diff --git a/app/client/cypress/support/Pages/DataSources.ts b/app/client/cypress/support/Pages/DataSources.ts index 8064c9eb4055..45f8985feb24 100644 --- a/app/client/cypress/support/Pages/DataSources.ts +++ b/app/client/cypress/support/Pages/DataSources.ts @@ -316,6 +316,10 @@ export class DataSources { private _dsSchemaEntityItem = ".t--entity-item"; private _entityTriggerElement = ".t--template-menu-trigger"; _dsSchemaTableResponse = ".t--table-response"; + _imgSnowflakeLogo = "//img[contains(@src, 'snowflake.svg')]"; + _dsConfigProperties = (index: number) => + "input[name*='datasourceConfiguration.properties[" + index + "]']"; + _dsConfigAuthType = `[data-testid*='datasourceConfiguration.authentication.authenticationType']`; public AssertDSEditViewMode(mode: AppModes) { if (mode == "Edit") this.agHelper.AssertElementAbsence(this._editButton); @@ -568,6 +572,43 @@ export class DataSources { ); } + public FillSnowflakeDSForm( + environment = this.dataManager.defaultEnviorment, + username = "", + password = "", + ) { + const accountName = + this.dataManager.dsValues[environment].Snowflake_accountName; + const warehouseName = + this.dataManager.dsValues[environment].Snowflake_warehouseName; + const databaseName = + this.dataManager.dsValues[environment].Snowflake_databaseName; + const schemaName = + this.dataManager.dsValues[environment].Snowflake_defaultSchema; + const role = this.dataManager.dsValues[environment].Snowflake_role; + this.agHelper.ClearNType(datasource.datasourceConfigUrl, accountName); + this.agHelper.ClearNType(this._dsConfigProperties(0), warehouseName); + this.agHelper.ClearNType(this._dsConfigProperties(1), databaseName); + this.agHelper.ClearNType(this._dsConfigProperties(2), schemaName); + this.agHelper.ClearNType(this._dsConfigProperties(3), role); + this.agHelper.AssertContains("Basic", "exist", this._dsConfigAuthType) + ? null + : this.agHelper.GetNClick(this._dsConfigAuthType) && + this.agHelper.ContainsNClick("Basic"); + this.agHelper.ClearNType( + this._username, + username == "" + ? this.dataManager.dsValues[environment].Snowflake_username + : username, + ); + this.agHelper.ClearNType( + this._password, + password == "" + ? this.dataManager.dsValues[environment].Snowflake_password + : password, + ); + } + public FillMongoDSForm( environment = this.dataManager.defaultEnviorment, shouldAddTrailingSpaces = false, From 48f94f04d6fb36e7eb3c667cc95705e2798e9741 Mon Sep 17 00:00:00 2001 From: shadabbuchh Date: Wed, 5 Feb 2025 15:06:20 +0530 Subject: [PATCH 02/11] removed comments & changed limited-tests file --- .../ServerSide/Datasources/Snowflake_Basic_Spec.ts | 12 +----------- app/client/cypress/limited-tests.txt | 4 ++-- 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts index 53546d16a834..5ff96b0b807c 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts @@ -46,14 +46,6 @@ describe( "placeholder", "xy12345.ap-south-1.aws", ); - // agHelper.ClearNType(datasource.datasourceConfigUrl, dataManager.dsValues[dataManager.defaultEnviorment].Snowflake_accountName); - // agHelper.ClearNType(dataSources._dsConfigProperties(0), dataManager.dsValues[dataManager.defaultEnviorment].Snowflake_warehouseName); - // agHelper.ClearNType(dataSources._dsConfigProperties(1), dataManager.dsValues[dataManager.defaultEnviorment].Snowflake_databaseName); - // agHelper.ClearNType(dataSources._dsConfigProperties(2), dataManager.dsValues[dataManager.defaultEnviorment].Snowflake_defaultSchema); - // agHelper.ClearNType(dataSources._dsConfigProperties(3), dataManager.dsValues[dataManager.defaultEnviorment].Snowflake_role); - // agHelper.AssertContains("Basic", "exist", dataSources._dsConfigAuthType); - // agHelper.ClearNType(dataSources._username, dataManager.dsValues[dataManager.defaultEnviorment].Snowflake_username); - // agHelper.ClearNType(dataSources._password, dataManager.dsValues[dataManager.defaultEnviorment].Snowflake_password); // Fill out the Snowflake configuration form and test/save the datasource dataSources.FillSnowflakeDSForm(); @@ -148,7 +140,7 @@ describe( dataSources.DeleteDatasourceFromWithinDS(myDsName, 200); }); - it("5. Vlidate the user can create new queries from the datasource section in response tab", () => { + it("5. Validate the user can create new queries from the datasource section in response tab", () => { dataSources.NavigateToDSCreateNew(); dataSources.CreatePlugIn("Snowflake"); dataSources.FillSnowflakeDSForm(); @@ -213,7 +205,6 @@ describe( // Visit the documentation link agHelper.GetNClick(locators._contextMenuInPane); - //cy.intercept("GET", "/api/v1/datasources/*/structure?ignoreCache=*").as("getDatasourceStructure"); deployMode.StubWindowNAssert( dataSources._queryDoc, "querying-snowflake-db#querying-snowflake", @@ -227,7 +218,6 @@ describe( agHelper.GetNAssertContains(locators._dsName, "Untitled datasource 2"); agHelper.AssertElementVisibility(dataSources._datasourceCard, true); dataSources.FillSnowflakeDSForm(undefined, undefined, "wrongpassword"); - //agHelper.ClearNType(dataSources._password, "wrongpassword"); dataSources.TestDatasource(false); }); }, diff --git a/app/client/cypress/limited-tests.txt b/app/client/cypress/limited-tests.txt index 00e32a4629d0..f661ac9b922d 100644 --- a/app/client/cypress/limited-tests.txt +++ b/app/client/cypress/limited-tests.txt @@ -1,7 +1,7 @@ # To run only limited tests - give the spec names in below format: -#cypress/e2e/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js +cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts # For running all specs - uncomment below: #cypress/e2e/**/**/* -cypress/e2e/Regression/ClientSide/Anvil/Widgets/* +#cypress/e2e/Regression/ClientSide/Anvil/Widgets/* #ci-test-limit uses this file to run minimum of specs. Do not run entire suite with this command. From d0a7abb1ee2e7f98a52c84cb62c8def36c48fdac Mon Sep 17 00:00:00 2001 From: shadabbuchh Date: Wed, 5 Feb 2025 16:15:01 +0530 Subject: [PATCH 03/11] reverted changes --- .github/workflows/ci-test-custom-script.yml | 9 +- .github/workflows/ci-test-hosted.yml | 3 - .../workflows/ci-test-limited-with-count.yml | 220 +++++++++--------- .github/workflows/ci-test-limited.yml | 5 +- app/client/cypress/limited-tests.txt | 4 +- .../cypress/support/Objects/DataManager.ts | 8 + 6 files changed, 123 insertions(+), 126 deletions(-) diff --git a/.github/workflows/ci-test-custom-script.yml b/.github/workflows/ci-test-custom-script.yml index 87a7e247b03b..a4ccf88b57c0 100644 --- a/.github/workflows/ci-test-custom-script.yml +++ b/.github/workflows/ci-test-custom-script.yml @@ -368,9 +368,6 @@ jobs: CYPRESS_SKIP_FLAKY: true CYPRESS_STATIC_ALLOCATION: true DEBUG: ${{secrets.CYPRESS_GREP_DEBUG }} # This is derived from secrets so that we can toggle it without having to change any workflow. Only acceptable value is: @cypress/grep - SNOWFLAKE_ACCOUNT_NAME: ${{ secrets.SNOWFLAKE_ACCOUNT_NAME }} - SNOWFLAKE_USERNAME: ${{ secrets.SNOWFLAKE_USERNAME }} - SNOWFLAKE_PASSWORD: ${{ secrets.SNOWFLAKE_PASSWORD }} with: browser: ${{ env.BROWSER_PATH }} install: false @@ -472,9 +469,9 @@ jobs: uses: actions/upload-artifact@v4 if: always() with: - name: docker-logs-${{ matrix.job }} - path: app/server/docker-logs.log - overwrite: true + name: docker-logs-${{ matrix.job }} + path: app/server/docker-logs.log + overwrite: true # Set status = success - name: Save the status of the run diff --git a/.github/workflows/ci-test-hosted.yml b/.github/workflows/ci-test-hosted.yml index 0524127eab2d..0b3850ba5625 100644 --- a/.github/workflows/ci-test-hosted.yml +++ b/.github/workflows/ci-test-hosted.yml @@ -244,9 +244,6 @@ jobs: CYPRESS_DB_PWD: ${{ secrets.CYPRESS_DB_PWD }} CYPRESS_S3_ACCESS: ${{ secrets.CYPRESS_S3_ACCESS }} CYPRESS_S3_SECRET: ${{ secrets.CYPRESS_S3_SECRET }} - SNOWFLAKE_ACCOUNT_NAME: ${{ secrets.SNOWFLAKE_ACCOUNT_NAME }} - SNOWFLAKE_USERNAME: ${{ secrets.SNOWFLAKE_USERNAME }} - SNOWFLAKE_PASSWORD: ${{ secrets.SNOWFLAKE_PASSWORD }} CYPRESS_STATIC_ALLOCATION: true with: browser: ${{ env.BROWSER_PATH }} diff --git a/.github/workflows/ci-test-limited-with-count.yml b/.github/workflows/ci-test-limited-with-count.yml index fed79c6d676e..fbcb355ea507 100644 --- a/.github/workflows/ci-test-limited-with-count.yml +++ b/.github/workflows/ci-test-limited-with-count.yml @@ -15,20 +15,20 @@ on: type: number default: 0 run_count: - description: "Number of times to repeat the test run" + description: 'Number of times to repeat the test run' required: false type: number default: 1 update_snapshot: - description: "Give option to update snapshot (true/false)" - required: false - type: boolean - default: false + description: 'Give option to update snapshot (true/false)' + required: false + type: boolean + default: false specs_to_run: - description: "Cypress spec file(s) to run" + description: 'Cypress spec file(s) to run' required: false type: string - default: "no_data" + default: 'no_data' workflow_call: inputs: @@ -42,20 +42,20 @@ on: type: number default: 0 run_count: - description: "Number of times to repeat the test run" + description: 'Number of times to repeat the test run' required: false type: number default: 1 update_snapshot: - description: "Give option to update snapshot (true/false)" - required: false - type: boolean - default: false + description: 'Give option to update snapshot (true/false)' + required: false + type: boolean + default: false specs_to_run: - description: "Cypress spec file(s) to run" + description: 'Cypress spec file(s) to run' required: false type: string - default: "no_data" + default: 'no_data' jobs: ci-test-limited: @@ -132,14 +132,14 @@ jobs: else echo "rerun=false" >> $GITHUB_OUTPUT fi - + - name: Upload existing snapshot data if: always() uses: actions/upload-artifact@v4 with: name: cypress-existing-compare-snapshots path: ${{ github.workspace }}/app/client/cypress/snapshots - overwrite: true + overwrite: true # Step to get specs from the file or use the provided specs - name: Get specs to run @@ -147,7 +147,7 @@ jobs: ls -l echo "[DEBUG] Checking inputs.specs_to_run: '${{ inputs.specs_to_run }}'" echo "[DEBUG] Checking github.event.inputs.specs_to_run: '${{ github.event.inputs.specs_to_run }}'" - + # Determine the source of the specs_to_run input if [[ -n "${{ inputs.specs_to_run }}" ]]; then specs_to_run="${{ inputs.specs_to_run }}" # For workflow_call @@ -202,6 +202,7 @@ jobs: # Log the final specs_to_run value echo "[DEBUG] Setting specs_to_run to GitHub environment variable: $specs_to_run" echo "specs_to_run=$specs_to_run" >> $GITHUB_ENV + # In case of run-id provided download the artifact from the previous run - name: Download Docker image artifact @@ -360,98 +361,95 @@ jobs: - name: Run the cypress test env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - CYPRESS_USERNAME: ${{ secrets.CYPRESS_USERNAME }} - CYPRESS_PASSWORD: ${{ secrets.CYPRESS_PASSWORD }} - CYPRESS_TESTUSERNAME1: ${{ secrets.CYPRESS_TESTUSERNAME1 }} - CYPRESS_TESTPASSWORD1: ${{ secrets.CYPRESS_TESTPASSWORD1 }} - CYPRESS_TESTUSERNAME2: ${{ secrets.CYPRESS_TESTUSERNAME2 }} - CYPRESS_TESTPASSWORD2: ${{ secrets.CYPRESS_TESTPASSWORD1 }} - CYPRESS_TESTUSERNAME3: ${{ secrets.CYPRESS_TESTUSERNAME3 }} - CYPRESS_TESTPASSWORD3: ${{ secrets.CYPRESS_TESTPASSWORD3 }} - CYPRESS_TESTUSERNAME4: ${{ secrets.CYPRESS_TESTUSERNAME4 }} - CYPRESS_TESTPASSWORD4: ${{ secrets.CYPRESS_TESTPASSWORD4 }} - CYPRESS_S3_ACCESS_KEY: ${{ secrets.CYPRESS_S3_ACCESS_KEY }} - CYPRESS_S3_SECRET_KEY: ${{ secrets.CYPRESS_S3_SECRET_KEY }} - CYPRESS_AIRTABLE_BEARER: ${{ secrets.AIRTABLE_BEARER }} - CYPRESS_ORACLE_HOST: ${{ secrets.ORACLE_HOST }} - CYPRESS_ORACLE_SERVICE: ${{ secrets.ORACLE_SERVICE }} - CYPRESS_ORACLE_USERNAME: ${{ secrets.ORACLE_USERNAME }} - CYPRESS_ORACLE_PASSWORD: ${{ secrets.ORACLE_PASSWORD }} - CYPRESS_FIRESTORE_PRIVATE_KEY: ${{ secrets.FIRESTORE_PRIVATE_KEY }} - CYPRESS_APPSMITH_OAUTH2_GOOGLE_CLIENT_ID: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_GOOGLE_CLIENT_ID }} - CYPRESS_APPSMITH_OAUTH2_GOOGLE_CLIENT_SECRET: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_GOOGLE_CLIENT_SECRET }} - CYPRESS_APPSMITH_OAUTH2_GITHUB_CLIENT_ID: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_GITHUB_CLIENT_ID }} - CYPRESS_APPSMITH_OAUTH2_GITHUB_CLIENT_SECRET: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_GITHUB_CLIENT_SECRET }} - CYPRESS_OAUTH_SAML_EMAIL: ${{ secrets.CYPRESS_OAUTH_SAML_EMAIL }} - CYPRESS_OAUTH_SAML_ENTITY_ID: ${{ secrets.CYPRESS_OAUTH_SAML_ENTITY_ID }} - CYPRESS_OAUTH_SAML_METADATA_URL: ${{ secrets.CYPRESS_OAUTH_SAML_METADATA_URL }} - CYPRESS_OAUTH_SAML_METADATA_XML: ${{ secrets.CYPRESS_OAUTH_SAML_METADATA_XML }} - CYPRESS_OAUTH_SAML_PUB_CERT: ${{ secrets.CYPRESS_OAUTH_SAML_PUB_CERT }} - CYPRESS_OAUTH_SAML_SSO_URL: ${{ secrets.CYPRESS_OAUTH_SAML_SSO_URL }} - CYPRESS_OAUTH_SAML_REDIRECT_URL: ${{ secrets.CYPRESS_OAUTH_SAML_REDIRECT_URL }} - CYPRESS_APPSMITH_OAUTH2_OIDC_CLIENT_ID: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_CLIENT_ID }} - CYPRESS_APPSMITH_OAUTH2_OIDC_CLIENT_SECRET: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_CLIENT_SECRET }} - CYPRESS_APPSMITH_OAUTH2_OIDC_AUTH_URL: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_AUTH_URL }} - CYPRESS_APPSMITH_OAUTH2_OIDC_TOKEN_URL: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_TOKEN_URL }} - CYPRESS_APPSMITH_OAUTH2_OIDC_USER_INFO: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_USER_INFO }} - CYPRESS_APPSMITH_OAUTH2_OIDC_JWKS_URL: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_JWKS_URL }} - CYPRESS_APPSMITH_OAUTH2_OIDC_OKTA_PASSWORD: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_OKTA_PASSWORD }} - CYPRESS_APPSMITH_OAUTH2_OIDC_DIRECT_URL: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_DIRECT_URL }} - CYPRESS_EXCLUDE_TAGS: "airgap" - CYPRESS_AIRGAPPED: false - APPSMITH_DISABLE_TELEMETRY: true - APPSMITH_GOOGLE_MAPS_API_KEY: ${{ secrets.APPSMITH_GOOGLE_MAPS_API_KEY }} - POSTGRES_PASSWORD: postgres - CYPRESS_VERIFY_TIMEOUT: 100000 - COMMIT_INFO_MESSAGE: ${{ env.COMMIT_INFO_MESSAGE }} - RUNID: ${{ github.run_id }} - ATTEMPT_NUMBER: ${{ github.run_attempt }} - REPOSITORY: ${{ github.repository }} - COMMITTER: ${{ env.COMMIT_INFO_AUTHOR }} - TAG: ${{ github.event_name }} - BRANCH: ${{ env.COMMIT_INFO_BRANCH }} - THIS_RUNNER: ${{ strategy.job-index }} - TOTAL_RUNNERS: ${{ strategy.job-total }} - CYPRESS_SPECS: ${{ env.specs_to_run }} - CYPRESS_RERUN: ${{steps.run_result.outputs.rerun}} - CYPRESS_DB_USER: ${{ secrets.CYPRESS_DB_USER }} - CYPRESS_DB_HOST: ${{ secrets.CYPRESS_DB_HOST }} - CYPRESS_DB_NAME: ${{ secrets.CYPRESS_DB_NAME }} - CYPRESS_DB_PWD: ${{ secrets.CYPRESS_DB_PWD }} - CYPRESS_S3_ACCESS: ${{ secrets.CYPRESS_S3_ACCESS }} - CYPRESS_S3_SECRET: ${{ secrets.CYPRESS_S3_SECRET }} - SNOWFLAKE_ACCOUNT_NAME: ${{ secrets.SNOWFLAKE_ACCOUNT_NAME }} - SNOWFLAKE_USERNAME: ${{ secrets.SNOWFLAKE_USERNAME }} - SNOWFLAKE_PASSWORD: ${{ secrets.SNOWFLAKE_PASSWORD }} - CYPRESS_STATIC_ALLOCATION: true - NODE_ENV: development + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + CYPRESS_USERNAME: ${{ secrets.CYPRESS_USERNAME }} + CYPRESS_PASSWORD: ${{ secrets.CYPRESS_PASSWORD }} + CYPRESS_TESTUSERNAME1: ${{ secrets.CYPRESS_TESTUSERNAME1 }} + CYPRESS_TESTPASSWORD1: ${{ secrets.CYPRESS_TESTPASSWORD1 }} + CYPRESS_TESTUSERNAME2: ${{ secrets.CYPRESS_TESTUSERNAME2 }} + CYPRESS_TESTPASSWORD2: ${{ secrets.CYPRESS_TESTPASSWORD1 }} + CYPRESS_TESTUSERNAME3: ${{ secrets.CYPRESS_TESTUSERNAME3 }} + CYPRESS_TESTPASSWORD3: ${{ secrets.CYPRESS_TESTPASSWORD3 }} + CYPRESS_TESTUSERNAME4: ${{ secrets.CYPRESS_TESTUSERNAME4 }} + CYPRESS_TESTPASSWORD4: ${{ secrets.CYPRESS_TESTPASSWORD4 }} + CYPRESS_S3_ACCESS_KEY: ${{ secrets.CYPRESS_S3_ACCESS_KEY }} + CYPRESS_S3_SECRET_KEY: ${{ secrets.CYPRESS_S3_SECRET_KEY }} + CYPRESS_AIRTABLE_BEARER: ${{ secrets.AIRTABLE_BEARER }} + CYPRESS_ORACLE_HOST: ${{ secrets.ORACLE_HOST }} + CYPRESS_ORACLE_SERVICE: ${{ secrets.ORACLE_SERVICE }} + CYPRESS_ORACLE_USERNAME: ${{ secrets.ORACLE_USERNAME }} + CYPRESS_ORACLE_PASSWORD: ${{ secrets.ORACLE_PASSWORD }} + CYPRESS_FIRESTORE_PRIVATE_KEY: ${{ secrets.FIRESTORE_PRIVATE_KEY }} + CYPRESS_APPSMITH_OAUTH2_GOOGLE_CLIENT_ID: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_GOOGLE_CLIENT_ID }} + CYPRESS_APPSMITH_OAUTH2_GOOGLE_CLIENT_SECRET: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_GOOGLE_CLIENT_SECRET }} + CYPRESS_APPSMITH_OAUTH2_GITHUB_CLIENT_ID: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_GITHUB_CLIENT_ID }} + CYPRESS_APPSMITH_OAUTH2_GITHUB_CLIENT_SECRET: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_GITHUB_CLIENT_SECRET }} + CYPRESS_OAUTH_SAML_EMAIL: ${{ secrets.CYPRESS_OAUTH_SAML_EMAIL }} + CYPRESS_OAUTH_SAML_ENTITY_ID: ${{ secrets.CYPRESS_OAUTH_SAML_ENTITY_ID }} + CYPRESS_OAUTH_SAML_METADATA_URL: ${{ secrets.CYPRESS_OAUTH_SAML_METADATA_URL }} + CYPRESS_OAUTH_SAML_METADATA_XML: ${{ secrets.CYPRESS_OAUTH_SAML_METADATA_XML }} + CYPRESS_OAUTH_SAML_PUB_CERT: ${{ secrets.CYPRESS_OAUTH_SAML_PUB_CERT }} + CYPRESS_OAUTH_SAML_SSO_URL: ${{ secrets.CYPRESS_OAUTH_SAML_SSO_URL }} + CYPRESS_OAUTH_SAML_REDIRECT_URL: ${{ secrets.CYPRESS_OAUTH_SAML_REDIRECT_URL }} + CYPRESS_APPSMITH_OAUTH2_OIDC_CLIENT_ID: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_CLIENT_ID }} + CYPRESS_APPSMITH_OAUTH2_OIDC_CLIENT_SECRET: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_CLIENT_SECRET }} + CYPRESS_APPSMITH_OAUTH2_OIDC_AUTH_URL: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_AUTH_URL }} + CYPRESS_APPSMITH_OAUTH2_OIDC_TOKEN_URL: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_TOKEN_URL }} + CYPRESS_APPSMITH_OAUTH2_OIDC_USER_INFO: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_USER_INFO }} + CYPRESS_APPSMITH_OAUTH2_OIDC_JWKS_URL: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_JWKS_URL }} + CYPRESS_APPSMITH_OAUTH2_OIDC_OKTA_PASSWORD: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_OKTA_PASSWORD }} + CYPRESS_APPSMITH_OAUTH2_OIDC_DIRECT_URL: ${{ secrets.CYPRESS_APPSMITH_OAUTH2_OIDC_DIRECT_URL }} + CYPRESS_EXCLUDE_TAGS: "airgap" + CYPRESS_AIRGAPPED: false + APPSMITH_DISABLE_TELEMETRY: true + APPSMITH_GOOGLE_MAPS_API_KEY: ${{ secrets.APPSMITH_GOOGLE_MAPS_API_KEY }} + POSTGRES_PASSWORD: postgres + CYPRESS_VERIFY_TIMEOUT: 100000 + COMMIT_INFO_MESSAGE: ${{ env.COMMIT_INFO_MESSAGE }} + RUNID: ${{ github.run_id }} + ATTEMPT_NUMBER: ${{ github.run_attempt }} + REPOSITORY: ${{ github.repository }} + COMMITTER: ${{ env.COMMIT_INFO_AUTHOR }} + TAG: ${{ github.event_name }} + BRANCH: ${{ env.COMMIT_INFO_BRANCH }} + THIS_RUNNER: ${{ strategy.job-index }} + TOTAL_RUNNERS: ${{ strategy.job-total }} + CYPRESS_SPECS: ${{ env.specs_to_run }} + CYPRESS_RERUN: ${{steps.run_result.outputs.rerun}} + CYPRESS_DB_USER: ${{ secrets.CYPRESS_DB_USER }} + CYPRESS_DB_HOST: ${{ secrets.CYPRESS_DB_HOST }} + CYPRESS_DB_NAME: ${{ secrets.CYPRESS_DB_NAME }} + CYPRESS_DB_PWD: ${{ secrets.CYPRESS_DB_PWD }} + CYPRESS_S3_ACCESS: ${{ secrets.CYPRESS_S3_ACCESS }} + CYPRESS_S3_SECRET: ${{ secrets.CYPRESS_S3_SECRET }} + CYPRESS_STATIC_ALLOCATION: true + NODE_ENV: development run: | - cd app/client - if [[ "${{ inputs.update_snapshot }}" == "true" ]]; then - echo "Running Cypress with snapshot updates..." - CYPRESS_updateSnapshots=true npx cypress-repeat-pro run -n "${{ inputs.run_count }}" --force \ - --spec "${{ inputs.specs_to_run }}" \ - --config-file "cypress_ci_custom.config.ts" \ - --browser "${{ env.BROWSER_PATH }}" - else - echo "Running Cypress tests without snapshot updates..." - npx cypress-repeat-pro run -n "${{ inputs.run_count }}" --force \ - --spec "${{ env.specs_to_run }}" \ - --config-file "cypress_ci_custom.config.ts" \ - --browser "${{ env.BROWSER_PATH }}" - fi - cat cy-repeat-summary.txt - # Define the path for the failure flag file - FAILURE_FLAG_FILE="ci_test_status.txt" + cd app/client + if [[ "${{ inputs.update_snapshot }}" == "true" ]]; then + echo "Running Cypress with snapshot updates..." + CYPRESS_updateSnapshots=true npx cypress-repeat-pro run -n "${{ inputs.run_count }}" --force \ + --spec "${{ inputs.specs_to_run }}" \ + --config-file "cypress_ci_custom.config.ts" \ + --browser "${{ env.BROWSER_PATH }}" + else + echo "Running Cypress tests without snapshot updates..." + npx cypress-repeat-pro run -n "${{ inputs.run_count }}" --force \ + --spec "${{ env.specs_to_run }}" \ + --config-file "cypress_ci_custom.config.ts" \ + --browser "${{ env.BROWSER_PATH }}" + fi + cat cy-repeat-summary.txt + # Define the path for the failure flag file + FAILURE_FLAG_FILE="ci_test_status.txt" - # Check for test results and store the status in the file - if ! grep -q "Total Failed: 0" cy-repeat-summary.txt; then - echo "ci_test_failed=true" > "$FAILURE_FLAG_FILE" - else - echo "ci_test_failed=false" > "$FAILURE_FLAG_FILE" - fi - cat "$FAILURE_FLAG_FILE" + # Check for test results and store the status in the file + if ! grep -q "Total Failed: 0" cy-repeat-summary.txt; then + echo "ci_test_failed=true" > "$FAILURE_FLAG_FILE" + else + echo "ci_test_failed=false" > "$FAILURE_FLAG_FILE" + fi + cat "$FAILURE_FLAG_FILE" - name: Trim number of cypress log files if: failure() @@ -470,9 +468,9 @@ jobs: if: always() uses: actions/upload-artifact@v4 with: - name: ci_test_status - path: ${{ github.workspace }}/app/client/ci_test_status.txt - overwrite: true + name: ci_test_status + path: ${{ github.workspace }}/app/client/ci_test_status.txt + overwrite: true - name: Upload failed test cypress logs artifact if: always() @@ -550,7 +548,7 @@ jobs: with: name: cypress-new-compare-snapshots path: ${{ github.workspace }}/app/client/cypress/snapshots - overwrite: true + overwrite: true # Set status = success - name: Save the status of the run diff --git a/.github/workflows/ci-test-limited.yml b/.github/workflows/ci-test-limited.yml index 6eb38fe0e859..c6e249d00879 100644 --- a/.github/workflows/ci-test-limited.yml +++ b/.github/workflows/ci-test-limited.yml @@ -221,7 +221,7 @@ jobs: cd app/client chmod a+x ./cypress/setup-test-ci.sh ./cypress/setup-test-ci.sh - + - name: Install Google Chrome 129.0.6668.100 run: | sudo apt-get remove google-chrome-stable @@ -338,9 +338,6 @@ jobs: CYPRESS_DB_PWD: ${{ secrets.CYPRESS_DB_PWD }} CYPRESS_S3_ACCESS: ${{ secrets.CYPRESS_S3_ACCESS }} CYPRESS_S3_SECRET: ${{ secrets.CYPRESS_S3_SECRET }} - SNOWFLAKE_ACCOUNT_NAME: ${{ secrets.SNOWFLAKE_ACCOUNT_NAME }} - SNOWFLAKE_USERNAME: ${{ secrets.SNOWFLAKE_USERNAME }} - SNOWFLAKE_PASSWORD: ${{ secrets.SNOWFLAKE_PASSWORD }} CYPRESS_STATIC_ALLOCATION: true with: browser: ${{ env.BROWSER_PATH }} diff --git a/app/client/cypress/limited-tests.txt b/app/client/cypress/limited-tests.txt index f661ac9b922d..00e32a4629d0 100644 --- a/app/client/cypress/limited-tests.txt +++ b/app/client/cypress/limited-tests.txt @@ -1,7 +1,7 @@ # To run only limited tests - give the spec names in below format: -cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts +#cypress/e2e/Regression/ClientSide/VisualTests/JSEditorIndent_spec.js # For running all specs - uncomment below: #cypress/e2e/**/**/* -#cypress/e2e/Regression/ClientSide/Anvil/Widgets/* +cypress/e2e/Regression/ClientSide/Anvil/Widgets/* #ci-test-limit uses this file to run minimum of specs. Do not run entire suite with this command. diff --git a/app/client/cypress/support/Objects/DataManager.ts b/app/client/cypress/support/Objects/DataManager.ts index 917bcd533c8a..87c02ae51a72 100644 --- a/app/client/cypress/support/Objects/DataManager.ts +++ b/app/client/cypress/support/Objects/DataManager.ts @@ -208,6 +208,14 @@ export class DataManager { twilio_username: "random-username", twilio_password: "random-password", + + Snowflake_accountName: Cypress.env("SNOWFLAKE_ACCOUNT_NAME"), + Snowflake_warehouseName: "COMPUTE_WH", + Snowflake_databaseName: "TESTDB", + Snowflake_defaultSchema: "PUBLIC", + Snowflake_role: "SYSADMIN", + Snowflake_username: Cypress.env("SNOWFLAKE_USERNAME"), + Snowflake_password: Cypress.env("SNOWFLAKE_PASSWORD"), }, }; From 42d76f7f2b78508f759987b91f5021f6ae7dd24a Mon Sep 17 00:00:00 2001 From: shadabbuchh Date: Thu, 6 Feb 2025 13:21:50 +0530 Subject: [PATCH 04/11] running 1st case --- .../ServerSide/Datasources/Snowflake_Basic_Spec.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts index 5ff96b0b807c..4e871cfb54fb 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts @@ -52,7 +52,7 @@ describe( dataSources.TestSaveDatasource(); }); - it("2. Validate creating & running queries for the datasource", () => { + it.skip("2. Validate creating & running queries for the datasource", () => { // Create and run a SELECT query, validating the response views dataSources.CreateQueryAfterDSSaved( "SELECT * FROM PUBLIC.DB1 LIMIT 10;", @@ -101,7 +101,7 @@ describe( }); }); - it("3. Validate widget binding with queries & deploying the app", () => { + it.skip("3. Validate widget binding with queries & deploying the app", () => { PageLeftPane.selectItem("SelectQuery", { ctrlKey: true, force: true }); dataSources.AddSuggestedWidget(Widgets.Table); deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.TABLE)); @@ -110,7 +110,7 @@ describe( EditorNavigation.SelectEntityByName("SelectQuery", EntityType.Query); }); - it("4. Validate deleting the datasource", () => { + it.skip("4. Validate deleting the datasource", () => { // Delete all queries associated with the datasource agHelper.ActionContextMenuWithInPane({ action: "Delete", @@ -140,7 +140,7 @@ describe( dataSources.DeleteDatasourceFromWithinDS(myDsName, 200); }); - it("5. Validate the user can create new queries from the datasource section in response tab", () => { + it.skip("5. Validate the user can create new queries from the datasource section in response tab", () => { dataSources.NavigateToDSCreateNew(); dataSources.CreatePlugIn("Snowflake"); dataSources.FillSnowflakeDSForm(); @@ -212,7 +212,7 @@ describe( ); }); - it("6. Validate connection error when misconfiguring datasource", () => { + it.skip("6. Validate connection error when misconfiguring datasource", () => { dataSources.NavigateToDSCreateNew(); dataSources.CreatePlugIn("Snowflake"); agHelper.GetNAssertContains(locators._dsName, "Untitled datasource 2"); From 657b754d4691b03840f284fcd155edcc9956e117 Mon Sep 17 00:00:00 2001 From: shadabbuchh Date: Thu, 6 Feb 2025 14:17:27 +0530 Subject: [PATCH 05/11] adding tags --- .../Datasources/Snowflake_Basic_Spec.ts | 418 +++++++++--------- app/client/cypress/tags.js | 1 + 2 files changed, 210 insertions(+), 209 deletions(-) diff --git a/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts index 4e871cfb54fb..52b037227576 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts @@ -1,17 +1,17 @@ import { - agHelper, - apiPage, - dataSources, - deployMode, - draggableWidgets, - entityItems, - locators, - table, + agHelper, + apiPage, + dataSources, + deployMode, + draggableWidgets, + entityItems, + locators, + table, } from "../../../../support/Objects/ObjectsCore"; import datasource from "../../../../../cypress/locators/DatasourcesEditor.json"; import EditorNavigation, { - EntityType, - PageLeftPane, + EntityType, + PageLeftPane, } from "../../../../support/Pages/EditorNavigation"; import { Widgets } from "../../../../support/Pages/DataSources"; import BottomTabs from "../../../../support/Pages/IDE/BottomTabs"; @@ -22,203 +22,203 @@ let pluginActionForm = new PluginActionForm(); const myDsName = "SnowflakeDS1"; describe( - "Snowflake Basic Tests", - { tags: ["@tag.Datasource", "@tag.Git", "@tag.AccessControl"] }, - () => { - it("1. Validate the configuration of database", () => { - dataSources.NavigateToDSCreateNew(); - dataSources.CreatePlugIn("Snowflake"); - agHelper.AssertElementVisibility(dataSources._imgSnowflakeLogo, true, 1); - agHelper.GetNAssertContains(locators._dsName, "Untitled datasource 1"); - - // Attempt to rename the datasource with invalid and valid names - agHelper.GetNClick(locators._dsName); - agHelper.ClearTextField(locators._dsNameTxt, true); - agHelper.AssertTooltip("Please enter a valid name"); - agHelper.PressEnter(); - agHelper.ValidateToastMessage("Invalid name"); - agHelper.GetNClick(locators._dsName); - agHelper.TypeText(locators._dsNameTxt, myDsName); - agHelper.PressEnter(); - agHelper.AssertElementVisibility(dataSources._datasourceCard, true); - agHelper.AssertAttribute( - datasource.datasourceConfigUrl, - "placeholder", - "xy12345.ap-south-1.aws", - ); - - // Fill out the Snowflake configuration form and test/save the datasource - dataSources.FillSnowflakeDSForm(); - dataSources.TestSaveDatasource(); - }); - - it.skip("2. Validate creating & running queries for the datasource", () => { - // Create and run a SELECT query, validating the response views - dataSources.CreateQueryAfterDSSaved( - "SELECT * FROM PUBLIC.DB1 LIMIT 10;", - "SelectQuery", - ); - dataSources.runQueryAndVerifyResponseViews({ - count: 2, - operator: "gte", - responseTypes: ["TABLE", "JSON", "RAW"], - }); - - // Create and run an INSERT query, validating the response - dataSources.CreateQueryForDS( - myDsName, - "INSERT INTO PUBLIC.DB1 (SALARY, ID, NAME, POSITION) VALUES (87000, 3, 'Ada', 'Jr. Developer');", - "InsertQuery", - ); - dataSources.runQueryAndVerifyResponseViews({ - count: 1, - operator: "eq", - responseTypes: ["TABLE", "JSON", "RAW"], - }); - - // Create and run an UPDATE query, validating the response - dataSources.CreateQueryForDS( - myDsName, - "UPDATE PUBLIC.DB1 SET SALARY = 90000 WHERE ID = 3;", - "UpdateQuery", - ); - dataSources.runQueryAndVerifyResponseViews({ - count: 1, - operator: "eq", - responseTypes: ["TABLE", "JSON", "RAW"], - }); - - // Create and run a DELETE query, validating the response - dataSources.CreateQueryForDS( - myDsName, - "DELETE FROM PUBLIC.DB1 WHERE ID = 3;", - "DeleteQuery", - ); - dataSources.runQueryAndVerifyResponseViews({ - count: 1, - operator: "eq", - responseTypes: ["TABLE", "JSON", "RAW"], - }); - }); - - it.skip("3. Validate widget binding with queries & deploying the app", () => { - PageLeftPane.selectItem("SelectQuery", { ctrlKey: true, force: true }); - dataSources.AddSuggestedWidget(Widgets.Table); - deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.TABLE)); - table.WaitUntilTableLoad(0, 0, "v2"); - deployMode.NavigateBacktoEditor(); - EditorNavigation.SelectEntityByName("SelectQuery", EntityType.Query); - }); - - it.skip("4. Validate deleting the datasource", () => { - // Delete all queries associated with the datasource - agHelper.ActionContextMenuWithInPane({ - action: "Delete", - entityType: entityItems.Query, - }); - PageLeftPane.selectItem("InsertQuery", { ctrlKey: true, force: true }); - agHelper.ActionContextMenuWithInPane({ - action: "Delete", - entityType: entityItems.Query, - }); - PageLeftPane.selectItem("UpdateQuery", { ctrlKey: true, force: true }); - agHelper.ActionContextMenuWithInPane({ - action: "Delete", - entityType: entityItems.Query, - }); - PageLeftPane.selectItem("DeleteQuery", { ctrlKey: true, force: true }); - agHelper.ActionContextMenuWithInPane({ - action: "Delete", - entityType: entityItems.Query, - }); - - // Delete the datasource and verify its removal - dataSources.DeleteDatasourceFromWithinDS(myDsName, 409); - deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.TABLE)); - table.WaitForTableEmpty("v2"); - deployMode.NavigateBacktoEditor(); - dataSources.DeleteDatasourceFromWithinDS(myDsName, 200); - }); - - it.skip("5. Validate the user can create new queries from the datasource section in response tab", () => { - dataSources.NavigateToDSCreateNew(); - dataSources.CreatePlugIn("Snowflake"); - dataSources.FillSnowflakeDSForm(); - dataSources.TestSaveDatasource(); - - // Create, run, and validate SELECT, INSERT, UPDATE, and DELETE queries using templates - dataSources.createQueryWithDatasourceSchemaTemplate( - "Untitled datasource 1", - "DB1", - "Select", - ); - agHelper.RenameQuery("TemplateSelectQuery"); - apiPage.ToggleOnPageLoadRun(true); - pluginActionForm.toolbar.toggleSettings(); - apiPage.ToggleConfirmBeforeRunning(true); - agHelper.RefreshPage(); - agHelper.GetNClick(locators._confirmationdialogbtn("Yes")); - BottomTabs.response.validateRecordCount({ count: 2, operator: "gte" }); - - dataSources.createQueryWithDatasourceSchemaTemplate( - "Untitled datasource 1", - "DB1", - "Insert", - ); - dataSources.EnterQuery( - "INSERT INTO PUBLIC.DB1 (SALARY, ID, NAME, POSITION) VALUES (87000, 3, 'Ada', 'Jr. Developer');", - ); - agHelper.RenameQuery("TemplateInsertQuery"); - dataSources.runQueryAndVerifyResponseViews({ - count: 1, - operator: "eq", - responseTypes: ["TABLE", "JSON", "RAW"], - }); - - dataSources.createQueryWithDatasourceSchemaTemplate( - "Untitled datasource 1", - "DB1", - "Update", - ); - dataSources.EnterQuery( - "UPDATE PUBLIC.DB1 SET SALARY = 90000 WHERE ID = 3;", - ); - agHelper.RenameQuery("TemplateUpdateQuery"); - dataSources.runQueryAndVerifyResponseViews({ - count: 1, - operator: "eq", - responseTypes: ["TABLE", "JSON", "RAW"], - }); - - dataSources.createQueryWithDatasourceSchemaTemplate( - "Untitled datasource 1", - "DB1", - "Delete", - ); - dataSources.EnterQuery("DELETE FROM PUBLIC.DB1 WHERE ID = 3;"); - agHelper.RenameQuery("TemplateDeleteQuery"); - dataSources.runQueryAndVerifyResponseViews({ - count: 1, - operator: "eq", - responseTypes: ["TABLE", "JSON", "RAW"], - }); - - // Visit the documentation link - agHelper.GetNClick(locators._contextMenuInPane); - deployMode.StubWindowNAssert( - dataSources._queryDoc, - "querying-snowflake-db#querying-snowflake", - "getDatasourceStructure", - ); - }); - - it.skip("6. Validate connection error when misconfiguring datasource", () => { - dataSources.NavigateToDSCreateNew(); - dataSources.CreatePlugIn("Snowflake"); - agHelper.GetNAssertContains(locators._dsName, "Untitled datasource 2"); - agHelper.AssertElementVisibility(dataSources._datasourceCard, true); - dataSources.FillSnowflakeDSForm(undefined, undefined, "wrongpassword"); - dataSources.TestDatasource(false); - }); - }, + "Snowflake Basic Tests", + { tags: ["@tag.Datasource", "@tag.Git", "@tag.AccessControl", "@tag.Snowflake"] }, + () => { + it("1. Validate the configuration of database", () => { + dataSources.NavigateToDSCreateNew(); + dataSources.CreatePlugIn("Snowflake"); + agHelper.AssertElementVisibility(dataSources._imgSnowflakeLogo, true, 1); + agHelper.GetNAssertContains(locators._dsName, "Untitled datasource 1"); + + // Attempt to rename the datasource with invalid and valid names + agHelper.GetNClick(locators._dsName); + agHelper.ClearTextField(locators._dsNameTxt, true); + agHelper.AssertTooltip("Please enter a valid name"); + agHelper.PressEnter(); + agHelper.ValidateToastMessage("Invalid name"); + agHelper.GetNClick(locators._dsName); + agHelper.TypeText(locators._dsNameTxt, myDsName); + agHelper.PressEnter(); + agHelper.AssertElementVisibility(dataSources._datasourceCard, true); + agHelper.AssertAttribute( + datasource.datasourceConfigUrl, + "placeholder", + "xy12345.ap-south-1.aws", + ); + + // Fill out the Snowflake configuration form and test/save the datasource + dataSources.FillSnowflakeDSForm(); + dataSources.TestSaveDatasource(); + }); + + it.skip("2. Validate creating & running queries for the datasource", () => { + // Create and run a SELECT query, validating the response views + dataSources.CreateQueryAfterDSSaved( + "SELECT * FROM PUBLIC.DB1 LIMIT 10;", + "SelectQuery", + ); + dataSources.runQueryAndVerifyResponseViews({ + count: 2, + operator: "gte", + responseTypes: ["TABLE", "JSON", "RAW"], + }); + + // Create and run an INSERT query, validating the response + dataSources.CreateQueryForDS( + myDsName, + "INSERT INTO PUBLIC.DB1 (SALARY, ID, NAME, POSITION) VALUES (87000, 3, 'Ada', 'Jr. Developer');", + "InsertQuery", + ); + dataSources.runQueryAndVerifyResponseViews({ + count: 1, + operator: "eq", + responseTypes: ["TABLE", "JSON", "RAW"], + }); + + // Create and run an UPDATE query, validating the response + dataSources.CreateQueryForDS( + myDsName, + "UPDATE PUBLIC.DB1 SET SALARY = 90000 WHERE ID = 3;", + "UpdateQuery", + ); + dataSources.runQueryAndVerifyResponseViews({ + count: 1, + operator: "eq", + responseTypes: ["TABLE", "JSON", "RAW"], + }); + + // Create and run a DELETE query, validating the response + dataSources.CreateQueryForDS( + myDsName, + "DELETE FROM PUBLIC.DB1 WHERE ID = 3;", + "DeleteQuery", + ); + dataSources.runQueryAndVerifyResponseViews({ + count: 1, + operator: "eq", + responseTypes: ["TABLE", "JSON", "RAW"], + }); + }); + + it.skip("3. Validate widget binding with queries & deploying the app", () => { + PageLeftPane.selectItem("SelectQuery", { ctrlKey: true, force: true }); + dataSources.AddSuggestedWidget(Widgets.Table); + deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.TABLE)); + table.WaitUntilTableLoad(0, 0, "v2"); + deployMode.NavigateBacktoEditor(); + EditorNavigation.SelectEntityByName("SelectQuery", EntityType.Query); + }); + + it.skip("4. Validate deleting the datasource", () => { + // Delete all queries associated with the datasource + agHelper.ActionContextMenuWithInPane({ + action: "Delete", + entityType: entityItems.Query, + }); + PageLeftPane.selectItem("InsertQuery", { ctrlKey: true, force: true }); + agHelper.ActionContextMenuWithInPane({ + action: "Delete", + entityType: entityItems.Query, + }); + PageLeftPane.selectItem("UpdateQuery", { ctrlKey: true, force: true }); + agHelper.ActionContextMenuWithInPane({ + action: "Delete", + entityType: entityItems.Query, + }); + PageLeftPane.selectItem("DeleteQuery", { ctrlKey: true, force: true }); + agHelper.ActionContextMenuWithInPane({ + action: "Delete", + entityType: entityItems.Query, + }); + + // Delete the datasource and verify its removal + dataSources.DeleteDatasourceFromWithinDS(myDsName, 409); + deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.TABLE)); + table.WaitForTableEmpty("v2"); + deployMode.NavigateBacktoEditor(); + dataSources.DeleteDatasourceFromWithinDS(myDsName, 200); + }); + + it.skip("5. Validate the user can create new queries from the datasource section in response tab", () => { + dataSources.NavigateToDSCreateNew(); + dataSources.CreatePlugIn("Snowflake"); + dataSources.FillSnowflakeDSForm(); + dataSources.TestSaveDatasource(); + + // Create, run, and validate SELECT, INSERT, UPDATE, and DELETE queries using templates + dataSources.createQueryWithDatasourceSchemaTemplate( + "Untitled datasource 1", + "DB1", + "Select", + ); + agHelper.RenameQuery("TemplateSelectQuery"); + apiPage.ToggleOnPageLoadRun(true); + pluginActionForm.toolbar.toggleSettings(); + apiPage.ToggleConfirmBeforeRunning(true); + agHelper.RefreshPage(); + agHelper.GetNClick(locators._confirmationdialogbtn("Yes")); + BottomTabs.response.validateRecordCount({ count: 2, operator: "gte" }); + + dataSources.createQueryWithDatasourceSchemaTemplate( + "Untitled datasource 1", + "DB1", + "Insert", + ); + dataSources.EnterQuery( + "INSERT INTO PUBLIC.DB1 (SALARY, ID, NAME, POSITION) VALUES (87000, 3, 'Ada', 'Jr. Developer');", + ); + agHelper.RenameQuery("TemplateInsertQuery"); + dataSources.runQueryAndVerifyResponseViews({ + count: 1, + operator: "eq", + responseTypes: ["TABLE", "JSON", "RAW"], + }); + + dataSources.createQueryWithDatasourceSchemaTemplate( + "Untitled datasource 1", + "DB1", + "Update", + ); + dataSources.EnterQuery( + "UPDATE PUBLIC.DB1 SET SALARY = 90000 WHERE ID = 3;", + ); + agHelper.RenameQuery("TemplateUpdateQuery"); + dataSources.runQueryAndVerifyResponseViews({ + count: 1, + operator: "eq", + responseTypes: ["TABLE", "JSON", "RAW"], + }); + + dataSources.createQueryWithDatasourceSchemaTemplate( + "Untitled datasource 1", + "DB1", + "Delete", + ); + dataSources.EnterQuery("DELETE FROM PUBLIC.DB1 WHERE ID = 3;"); + agHelper.RenameQuery("TemplateDeleteQuery"); + dataSources.runQueryAndVerifyResponseViews({ + count: 1, + operator: "eq", + responseTypes: ["TABLE", "JSON", "RAW"], + }); + + // Visit the documentation link + agHelper.GetNClick(locators._contextMenuInPane); + deployMode.StubWindowNAssert( + dataSources._queryDoc, + "querying-snowflake-db#querying-snowflake", + "getDatasourceStructure", + ); + }); + + it.skip("6. Validate connection error when misconfiguring datasource", () => { + dataSources.NavigateToDSCreateNew(); + dataSources.CreatePlugIn("Snowflake"); + agHelper.GetNAssertContains(locators._dsName, "Untitled datasource 2"); + agHelper.AssertElementVisibility(dataSources._datasourceCard, true); + dataSources.FillSnowflakeDSForm(undefined, undefined, "wrongpassword"); + dataSources.TestDatasource(false); + }); + }, ); diff --git a/app/client/cypress/tags.js b/app/client/cypress/tags.js index 048e6d6fff08..e37aec5dd5e6 100644 --- a/app/client/cypress/tags.js +++ b/app/client/cypress/tags.js @@ -56,6 +56,7 @@ module.exports = { "@tag.Settings", "@tag.SignIn", "@tag.Slider", + "@tag.Snowflake", "@tag.Statbox", "@tag.Switch", "@tag.Tab", From 0d5f28cab098f25fef2b79ca2b13558b2ecab03b Mon Sep 17 00:00:00 2001 From: shadabbuchh Date: Thu, 6 Feb 2025 15:26:22 +0530 Subject: [PATCH 06/11] update tests --- .../Datasources/Snowflake_Basic_Spec.ts | 425 +++++++++--------- 1 file changed, 216 insertions(+), 209 deletions(-) diff --git a/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts index 52b037227576..dc0e6e132342 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts @@ -1,17 +1,17 @@ import { - agHelper, - apiPage, - dataSources, - deployMode, - draggableWidgets, - entityItems, - locators, - table, + agHelper, + apiPage, + dataSources, + deployMode, + draggableWidgets, + entityItems, + locators, + table, } from "../../../../support/Objects/ObjectsCore"; import datasource from "../../../../../cypress/locators/DatasourcesEditor.json"; import EditorNavigation, { - EntityType, - PageLeftPane, + EntityType, + PageLeftPane, } from "../../../../support/Pages/EditorNavigation"; import { Widgets } from "../../../../support/Pages/DataSources"; import BottomTabs from "../../../../support/Pages/IDE/BottomTabs"; @@ -22,203 +22,210 @@ let pluginActionForm = new PluginActionForm(); const myDsName = "SnowflakeDS1"; describe( - "Snowflake Basic Tests", - { tags: ["@tag.Datasource", "@tag.Git", "@tag.AccessControl", "@tag.Snowflake"] }, - () => { - it("1. Validate the configuration of database", () => { - dataSources.NavigateToDSCreateNew(); - dataSources.CreatePlugIn("Snowflake"); - agHelper.AssertElementVisibility(dataSources._imgSnowflakeLogo, true, 1); - agHelper.GetNAssertContains(locators._dsName, "Untitled datasource 1"); - - // Attempt to rename the datasource with invalid and valid names - agHelper.GetNClick(locators._dsName); - agHelper.ClearTextField(locators._dsNameTxt, true); - agHelper.AssertTooltip("Please enter a valid name"); - agHelper.PressEnter(); - agHelper.ValidateToastMessage("Invalid name"); - agHelper.GetNClick(locators._dsName); - agHelper.TypeText(locators._dsNameTxt, myDsName); - agHelper.PressEnter(); - agHelper.AssertElementVisibility(dataSources._datasourceCard, true); - agHelper.AssertAttribute( - datasource.datasourceConfigUrl, - "placeholder", - "xy12345.ap-south-1.aws", - ); - - // Fill out the Snowflake configuration form and test/save the datasource - dataSources.FillSnowflakeDSForm(); - dataSources.TestSaveDatasource(); - }); - - it.skip("2. Validate creating & running queries for the datasource", () => { - // Create and run a SELECT query, validating the response views - dataSources.CreateQueryAfterDSSaved( - "SELECT * FROM PUBLIC.DB1 LIMIT 10;", - "SelectQuery", - ); - dataSources.runQueryAndVerifyResponseViews({ - count: 2, - operator: "gte", - responseTypes: ["TABLE", "JSON", "RAW"], - }); - - // Create and run an INSERT query, validating the response - dataSources.CreateQueryForDS( - myDsName, - "INSERT INTO PUBLIC.DB1 (SALARY, ID, NAME, POSITION) VALUES (87000, 3, 'Ada', 'Jr. Developer');", - "InsertQuery", - ); - dataSources.runQueryAndVerifyResponseViews({ - count: 1, - operator: "eq", - responseTypes: ["TABLE", "JSON", "RAW"], - }); - - // Create and run an UPDATE query, validating the response - dataSources.CreateQueryForDS( - myDsName, - "UPDATE PUBLIC.DB1 SET SALARY = 90000 WHERE ID = 3;", - "UpdateQuery", - ); - dataSources.runQueryAndVerifyResponseViews({ - count: 1, - operator: "eq", - responseTypes: ["TABLE", "JSON", "RAW"], - }); - - // Create and run a DELETE query, validating the response - dataSources.CreateQueryForDS( - myDsName, - "DELETE FROM PUBLIC.DB1 WHERE ID = 3;", - "DeleteQuery", - ); - dataSources.runQueryAndVerifyResponseViews({ - count: 1, - operator: "eq", - responseTypes: ["TABLE", "JSON", "RAW"], - }); - }); - - it.skip("3. Validate widget binding with queries & deploying the app", () => { - PageLeftPane.selectItem("SelectQuery", { ctrlKey: true, force: true }); - dataSources.AddSuggestedWidget(Widgets.Table); - deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.TABLE)); - table.WaitUntilTableLoad(0, 0, "v2"); - deployMode.NavigateBacktoEditor(); - EditorNavigation.SelectEntityByName("SelectQuery", EntityType.Query); - }); - - it.skip("4. Validate deleting the datasource", () => { - // Delete all queries associated with the datasource - agHelper.ActionContextMenuWithInPane({ - action: "Delete", - entityType: entityItems.Query, - }); - PageLeftPane.selectItem("InsertQuery", { ctrlKey: true, force: true }); - agHelper.ActionContextMenuWithInPane({ - action: "Delete", - entityType: entityItems.Query, - }); - PageLeftPane.selectItem("UpdateQuery", { ctrlKey: true, force: true }); - agHelper.ActionContextMenuWithInPane({ - action: "Delete", - entityType: entityItems.Query, - }); - PageLeftPane.selectItem("DeleteQuery", { ctrlKey: true, force: true }); - agHelper.ActionContextMenuWithInPane({ - action: "Delete", - entityType: entityItems.Query, - }); - - // Delete the datasource and verify its removal - dataSources.DeleteDatasourceFromWithinDS(myDsName, 409); - deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.TABLE)); - table.WaitForTableEmpty("v2"); - deployMode.NavigateBacktoEditor(); - dataSources.DeleteDatasourceFromWithinDS(myDsName, 200); - }); - - it.skip("5. Validate the user can create new queries from the datasource section in response tab", () => { - dataSources.NavigateToDSCreateNew(); - dataSources.CreatePlugIn("Snowflake"); - dataSources.FillSnowflakeDSForm(); - dataSources.TestSaveDatasource(); - - // Create, run, and validate SELECT, INSERT, UPDATE, and DELETE queries using templates - dataSources.createQueryWithDatasourceSchemaTemplate( - "Untitled datasource 1", - "DB1", - "Select", - ); - agHelper.RenameQuery("TemplateSelectQuery"); - apiPage.ToggleOnPageLoadRun(true); - pluginActionForm.toolbar.toggleSettings(); - apiPage.ToggleConfirmBeforeRunning(true); - agHelper.RefreshPage(); - agHelper.GetNClick(locators._confirmationdialogbtn("Yes")); - BottomTabs.response.validateRecordCount({ count: 2, operator: "gte" }); - - dataSources.createQueryWithDatasourceSchemaTemplate( - "Untitled datasource 1", - "DB1", - "Insert", - ); - dataSources.EnterQuery( - "INSERT INTO PUBLIC.DB1 (SALARY, ID, NAME, POSITION) VALUES (87000, 3, 'Ada', 'Jr. Developer');", - ); - agHelper.RenameQuery("TemplateInsertQuery"); - dataSources.runQueryAndVerifyResponseViews({ - count: 1, - operator: "eq", - responseTypes: ["TABLE", "JSON", "RAW"], - }); - - dataSources.createQueryWithDatasourceSchemaTemplate( - "Untitled datasource 1", - "DB1", - "Update", - ); - dataSources.EnterQuery( - "UPDATE PUBLIC.DB1 SET SALARY = 90000 WHERE ID = 3;", - ); - agHelper.RenameQuery("TemplateUpdateQuery"); - dataSources.runQueryAndVerifyResponseViews({ - count: 1, - operator: "eq", - responseTypes: ["TABLE", "JSON", "RAW"], - }); - - dataSources.createQueryWithDatasourceSchemaTemplate( - "Untitled datasource 1", - "DB1", - "Delete", - ); - dataSources.EnterQuery("DELETE FROM PUBLIC.DB1 WHERE ID = 3;"); - agHelper.RenameQuery("TemplateDeleteQuery"); - dataSources.runQueryAndVerifyResponseViews({ - count: 1, - operator: "eq", - responseTypes: ["TABLE", "JSON", "RAW"], - }); - - // Visit the documentation link - agHelper.GetNClick(locators._contextMenuInPane); - deployMode.StubWindowNAssert( - dataSources._queryDoc, - "querying-snowflake-db#querying-snowflake", - "getDatasourceStructure", - ); - }); - - it.skip("6. Validate connection error when misconfiguring datasource", () => { - dataSources.NavigateToDSCreateNew(); - dataSources.CreatePlugIn("Snowflake"); - agHelper.GetNAssertContains(locators._dsName, "Untitled datasource 2"); - agHelper.AssertElementVisibility(dataSources._datasourceCard, true); - dataSources.FillSnowflakeDSForm(undefined, undefined, "wrongpassword"); - dataSources.TestDatasource(false); - }); - }, + "Snowflake Basic Tests", + { + tags: [ + "@tag.Datasource", + "@tag.Git", + "@tag.AccessControl", + "@tag.Snowflake", + ], + }, + () => { + it("1. Validate the configuration of database", () => { + dataSources.NavigateToDSCreateNew(); + dataSources.CreatePlugIn("Snowflake"); + agHelper.AssertElementVisibility(dataSources._imgSnowflakeLogo, true, 1); + agHelper.GetNAssertContains(locators._dsName, "Untitled datasource 1"); + + // Attempt to rename the datasource with invalid and valid names + agHelper.GetNClick(locators._dsName); + agHelper.ClearTextField(locators._dsNameTxt, true); + agHelper.AssertTooltip("Please enter a valid name"); + agHelper.PressEnter(); + agHelper.ValidateToastMessage("Invalid name"); + agHelper.GetNClick(locators._dsName); + agHelper.TypeText(locators._dsNameTxt, myDsName); + agHelper.PressEnter(); + agHelper.AssertElementVisibility(dataSources._datasourceCard, true); + agHelper.AssertAttribute( + datasource.datasourceConfigUrl, + "placeholder", + "xy12345.ap-south-1.aws", + ); + + // Fill out the Snowflake configuration form and test/save the datasource + dataSources.FillSnowflakeDSForm(); + dataSources.TestSaveDatasource(); + }); + + it("2. Validate creating & running queries for the datasource", () => { + // Create and run a SELECT query, validating the response views + dataSources.CreateQueryAfterDSSaved( + "SELECT * FROM PUBLIC.DB1 LIMIT 10;", + "SelectQuery", + ); + dataSources.runQueryAndVerifyResponseViews({ + count: 2, + operator: "gte", + responseTypes: ["TABLE", "JSON", "RAW"], + }); + + // Create and run an INSERT query, validating the response + dataSources.CreateQueryForDS( + myDsName, + "INSERT INTO PUBLIC.DB1 (SALARY, ID, NAME, POSITION) VALUES (87000, 3, 'Ada', 'Jr. Developer');", + "InsertQuery", + ); + dataSources.runQueryAndVerifyResponseViews({ + count: 1, + operator: "eq", + responseTypes: ["TABLE", "JSON", "RAW"], + }); + + // Create and run an UPDATE query, validating the response + dataSources.CreateQueryForDS( + myDsName, + "UPDATE PUBLIC.DB1 SET SALARY = 90000 WHERE ID = 3;", + "UpdateQuery", + ); + dataSources.runQueryAndVerifyResponseViews({ + count: 1, + operator: "eq", + responseTypes: ["TABLE", "JSON", "RAW"], + }); + + // Create and run a DELETE query, validating the response + dataSources.CreateQueryForDS( + myDsName, + "DELETE FROM PUBLIC.DB1 WHERE ID = 3;", + "DeleteQuery", + ); + dataSources.runQueryAndVerifyResponseViews({ + count: 1, + operator: "eq", + responseTypes: ["TABLE", "JSON", "RAW"], + }); + }); + + it("3. Validate widget binding with queries & deploying the app", () => { + PageLeftPane.selectItem("SelectQuery", { ctrlKey: true, force: true }); + dataSources.AddSuggestedWidget(Widgets.Table); + deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.TABLE)); + table.WaitUntilTableLoad(0, 0, "v2"); + deployMode.NavigateBacktoEditor(); + EditorNavigation.SelectEntityByName("SelectQuery", EntityType.Query); + }); + + it("4. Validate deleting the datasource", () => { + // Delete all queries associated with the datasource + agHelper.ActionContextMenuWithInPane({ + action: "Delete", + entityType: entityItems.Query, + }); + PageLeftPane.selectItem("InsertQuery", { ctrlKey: true, force: true }); + agHelper.ActionContextMenuWithInPane({ + action: "Delete", + entityType: entityItems.Query, + }); + PageLeftPane.selectItem("UpdateQuery", { ctrlKey: true, force: true }); + agHelper.ActionContextMenuWithInPane({ + action: "Delete", + entityType: entityItems.Query, + }); + PageLeftPane.selectItem("DeleteQuery", { ctrlKey: true, force: true }); + agHelper.ActionContextMenuWithInPane({ + action: "Delete", + entityType: entityItems.Query, + }); + + // Delete the datasource and verify its removal + dataSources.DeleteDatasourceFromWithinDS(myDsName, 409); + deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.TABLE)); + table.WaitForTableEmpty("v2"); + deployMode.NavigateBacktoEditor(); + dataSources.DeleteDatasourceFromWithinDS(myDsName, 200); + }); + + it("5. Validate the user can create new queries from the datasource section in response tab", () => { + dataSources.NavigateToDSCreateNew(); + dataSources.CreatePlugIn("Snowflake"); + dataSources.FillSnowflakeDSForm(); + dataSources.TestSaveDatasource(); + + // Create, run, and validate SELECT, INSERT, UPDATE, and DELETE queries using templates + dataSources.createQueryWithDatasourceSchemaTemplate( + "Untitled datasource 1", + "DB1", + "Select", + ); + agHelper.RenameQuery("TemplateSelectQuery"); + apiPage.ToggleOnPageLoadRun(true); + pluginActionForm.toolbar.toggleSettings(); + apiPage.ToggleConfirmBeforeRunning(true); + agHelper.RefreshPage(); + agHelper.GetNClick(locators._confirmationdialogbtn("Yes")); + BottomTabs.response.validateRecordCount({ count: 2, operator: "gte" }); + + dataSources.createQueryWithDatasourceSchemaTemplate( + "Untitled datasource 1", + "DB1", + "Insert", + ); + dataSources.EnterQuery( + "INSERT INTO PUBLIC.DB1 (SALARY, ID, NAME, POSITION) VALUES (87000, 3, 'Ada', 'Jr. Developer');", + ); + agHelper.RenameQuery("TemplateInsertQuery"); + dataSources.runQueryAndVerifyResponseViews({ + count: 1, + operator: "eq", + responseTypes: ["TABLE", "JSON", "RAW"], + }); + + dataSources.createQueryWithDatasourceSchemaTemplate( + "Untitled datasource 1", + "DB1", + "Update", + ); + dataSources.EnterQuery( + "UPDATE PUBLIC.DB1 SET SALARY = 90000 WHERE ID = 3;", + ); + agHelper.RenameQuery("TemplateUpdateQuery"); + dataSources.runQueryAndVerifyResponseViews({ + count: 1, + operator: "eq", + responseTypes: ["TABLE", "JSON", "RAW"], + }); + + dataSources.createQueryWithDatasourceSchemaTemplate( + "Untitled datasource 1", + "DB1", + "Delete", + ); + dataSources.EnterQuery("DELETE FROM PUBLIC.DB1 WHERE ID = 3;"); + agHelper.RenameQuery("TemplateDeleteQuery"); + dataSources.runQueryAndVerifyResponseViews({ + count: 1, + operator: "eq", + responseTypes: ["TABLE", "JSON", "RAW"], + }); + + // Visit the documentation link + agHelper.GetNClick(locators._contextMenuInPane); + deployMode.StubWindowNAssert( + dataSources._queryDoc, + "querying-snowflake-db#querying-snowflake", + "getDatasourceStructure", + ); + }); + + it("6. Validate connection error when misconfiguring datasource", () => { + dataSources.NavigateToDSCreateNew(); + dataSources.CreatePlugIn("Snowflake"); + agHelper.GetNAssertContains(locators._dsName, "Untitled datasource 2"); + agHelper.AssertElementVisibility(dataSources._datasourceCard, true); + dataSources.FillSnowflakeDSForm(undefined, undefined, "wrongpassword"); + dataSources.TestDatasource(false); + }); + }, ); From 4bd8950f5510d66147a1ea8a7a7213074510028d Mon Sep 17 00:00:00 2001 From: shadabbuchh Date: Thu, 6 Feb 2025 17:33:00 +0530 Subject: [PATCH 07/11] fixing errors --- .../Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts index dc0e6e132342..2aca36fca326 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts @@ -112,7 +112,7 @@ describe( PageLeftPane.selectItem("SelectQuery", { ctrlKey: true, force: true }); dataSources.AddSuggestedWidget(Widgets.Table); deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.TABLE)); - table.WaitUntilTableLoad(0, 0, "v2"); + table.AssertTableLoaded(0, 0, "v2"); deployMode.NavigateBacktoEditor(); EditorNavigation.SelectEntityByName("SelectQuery", EntityType.Query); }); From 52991fd358dec29988b4e97570ebb454907317e1 Mon Sep 17 00:00:00 2001 From: shadabbuchh Date: Thu, 6 Feb 2025 17:46:39 +0530 Subject: [PATCH 08/11] further fixes --- .../ServerSide/Datasources/Snowflake_Basic_Spec.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts index 2aca36fca326..986c1860c3db 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts @@ -111,9 +111,9 @@ describe( it("3. Validate widget binding with queries & deploying the app", () => { PageLeftPane.selectItem("SelectQuery", { ctrlKey: true, force: true }); dataSources.AddSuggestedWidget(Widgets.Table); - deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.TABLE)); - table.AssertTableLoaded(0, 0, "v2"); - deployMode.NavigateBacktoEditor(); + //deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.TABLE)); + //table.AssertTableLoaded(0, 0, "v2"); + //deployMode.NavigateBacktoEditor(); EditorNavigation.SelectEntityByName("SelectQuery", EntityType.Query); }); From 7a54fc464d95e3e0a42e544081fc10d183437c47 Mon Sep 17 00:00:00 2001 From: shadabbuchh Date: Thu, 6 Feb 2025 18:18:00 +0530 Subject: [PATCH 09/11] fixing errors in CI --- .../ServerSide/Datasources/Snowflake_Basic_Spec.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts index 986c1860c3db..3f9a9620b4be 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts @@ -110,10 +110,11 @@ describe( it("3. Validate widget binding with queries & deploying the app", () => { PageLeftPane.selectItem("SelectQuery", { ctrlKey: true, force: true }); - dataSources.AddSuggestedWidget(Widgets.Table); - //deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.TABLE)); - //table.AssertTableLoaded(0, 0, "v2"); - //deployMode.NavigateBacktoEditor(); + dataSources.AddSuggestedWidget(Widgets.Table, undefined, true); + deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.TABLE)); + table.WaitUntilTableLoad(0, 0, "v2"); + // table.AssertTableLoaded(0, 0, "v2"); + deployMode.NavigateBacktoEditor(); EditorNavigation.SelectEntityByName("SelectQuery", EntityType.Query); }); From dfd387aa4f2e809f8f625354100a392888bfa023 Mon Sep 17 00:00:00 2001 From: shadabbuchh Date: Thu, 6 Feb 2025 21:22:12 +0530 Subject: [PATCH 10/11] Fixing more errors --- .../ServerSide/Datasources/Snowflake_Basic_Spec.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts index 3f9a9620b4be..e7e801208c33 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts @@ -4,18 +4,22 @@ import { dataSources, deployMode, draggableWidgets, + entityExplorer, entityItems, locators, + propPane, table, } from "../../../../support/Objects/ObjectsCore"; import datasource from "../../../../../cypress/locators/DatasourcesEditor.json"; import EditorNavigation, { EntityType, PageLeftPane, + PagePaneSegment, } from "../../../../support/Pages/EditorNavigation"; import { Widgets } from "../../../../support/Pages/DataSources"; import BottomTabs from "../../../../support/Pages/IDE/BottomTabs"; import { PluginActionForm } from "../../../../support/Pages/PluginActionForm"; +import { DRAG_AND_DROP } from "../../../../../src/ce/constants/messages"; let pluginActionForm = new PluginActionForm(); @@ -109,11 +113,12 @@ describe( }); it("3. Validate widget binding with queries & deploying the app", () => { - PageLeftPane.selectItem("SelectQuery", { ctrlKey: true, force: true }); - dataSources.AddSuggestedWidget(Widgets.Table, undefined, true); + PageLeftPane.switchSegment(PagePaneSegment.UI); + entityExplorer.DragDropWidgetNVerify(draggableWidgets.TABLE); + propPane.EnterJSContext("Table data", "{{SelectQuery.data}}"); deployMode.DeployApp(locators._widgetInDeployed(draggableWidgets.TABLE)); table.WaitUntilTableLoad(0, 0, "v2"); - // table.AssertTableLoaded(0, 0, "v2"); + table.AssertTableHeaderOrder("IDNAMEPOSITIONSALARY"); deployMode.NavigateBacktoEditor(); EditorNavigation.SelectEntityByName("SelectQuery", EntityType.Query); }); From 3adb00b2d4fbc211fe2ad6a347cf6b9bcca2ac56 Mon Sep 17 00:00:00 2001 From: shadabbuchh Date: Thu, 6 Feb 2025 21:49:23 +0530 Subject: [PATCH 11/11] removing unnecessary imports --- .../Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts b/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts index e7e801208c33..81b89a0cdf08 100644 --- a/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts +++ b/app/client/cypress/e2e/Regression/ServerSide/Datasources/Snowflake_Basic_Spec.ts @@ -16,10 +16,8 @@ import EditorNavigation, { PageLeftPane, PagePaneSegment, } from "../../../../support/Pages/EditorNavigation"; -import { Widgets } from "../../../../support/Pages/DataSources"; import BottomTabs from "../../../../support/Pages/IDE/BottomTabs"; import { PluginActionForm } from "../../../../support/Pages/PluginActionForm"; -import { DRAG_AND_DROP } from "../../../../../src/ce/constants/messages"; let pluginActionForm = new PluginActionForm();