diff --git a/.eslintrc b/.eslintrc index e82415ae0..9631a668a 100644 --- a/.eslintrc +++ b/.eslintrc @@ -15,6 +15,7 @@ "functions": "always-multiline" } ], + "eol-last": ["error", "always"], "no-restricted-imports": 0, "no-param-reassign": ["error", { "ignorePropertyModificationsForRegex": ["^acc$"] }], "max-len": ["error", { "code": 130, "ignoreStrings": true, "ignoreRegExpLiterals": true }], diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 000000000..d4a43dd13 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +npm run pre-commit diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 000000000..cdd3b31f4 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,5 @@ +{ + "compilerOptions": { + "allowJs": true, + }, +} diff --git a/package-lock.json b/package-lock.json index 253521031..aec99feb9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -57,7 +57,8 @@ "eslint-config-airbnb-typescript": "^17.0.0", "eslint-config-prettier": "^8.2.0", "eslint-plugin-import": "^2.27.5", - "eslint-plugin-playwright": "^0.12.0" + "eslint-plugin-playwright": "^0.12.0", + "husky": "^8.0.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -3956,6 +3957,21 @@ "node": ">= 6" } }, + "node_modules/husky": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "dev": true, + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", diff --git a/package.json b/package.json index 5f7f19a00..b73f8a7a2 100644 --- a/package.json +++ b/package.json @@ -7,12 +7,15 @@ "url": "https://github.com/percona/pmm-ui-tests.git" }, "scripts": { + "gen:types": "npx codeceptjs def --config=pr.codecept.js", "lint:tests": "eslint --ext .js --fix tests/", "e2e": "npx codeceptjs run-multiple parallel --debug --steps --reporter mocha-multi -c pr.codecept.js --grep '(?=.*)^(?!.*@not-ui-pipeline)^(?!.*@not-pr-pipeline)'", "e2e:ia": "npx codeceptjs run -c pr.codecept.js --grep '@ia'", "e2e:stt": "npx codeceptjs run -c pr.codecept.js --grep '@stt'", "e2e:dbaas": "npx codeceptjs run -c pr.codecept.js --grep '@dbaas'", - "e2e:grafana-pr": "npx codeceptjs run -c pr.codecept.js --grep '@grafana-pr'" + "e2e:grafana-pr": "npx codeceptjs run -c pr.codecept.js --grep '@grafana-pr'", + "prepare": "husky install", + "pre-commit": "npm run lint:tests && echo 'Lint OK'" }, "dependencies": { "@faker-js/faker": "^5.5.3", @@ -63,6 +66,7 @@ "eslint-config-airbnb-typescript": "^17.0.0", "eslint-config-prettier": "^8.2.0", "eslint-plugin-import": "^2.27.5", - "eslint-plugin-playwright": "^0.12.0" + "eslint-plugin-playwright": "^0.12.0", + "husky": "^8.0.0" } } diff --git a/steps.d.ts b/steps.d.ts new file mode 100644 index 000000000..7bc2cc24f --- /dev/null +++ b/steps.d.ts @@ -0,0 +1,101 @@ +/// +type steps_file = typeof import('./tests/custom_steps.js'); +type codeceptjsConfig = typeof import('./pr.codecept.js'); +type credentials = typeof import('./tests/pages/credentials.js'); +type addInstanceAPI = typeof import('./tests/pages/api/addInstanceAPI.js'); +type addInstancePage = typeof import('./tests/pages/addInstancePage.js'); +type amiInstanceAPI = typeof import('./tests/pages/api/amiInstanceAPI.js'); +type adminPage = typeof import('./tests/pages/adminPage.js'); +type alertGroupsPage = typeof import('./tests/ia/pages/alertGroupsPage.js'); +type alertRulesPage = typeof import('./tests/ia/pages/alertRulesPage.js'); +type aiAdminPage = typeof import('./tests/ia/pages/alertingAdminPage.js'); +type alertmanagerAPI = typeof import('./tests/pages/api/alertmanagerAPI.js'); +type alertsAPI = typeof import('./tests/ia/pages/api/alertsAPI.js'); +type alertsPage = typeof import('./tests/ia/pages/alertsPage.js'); +type advisorsPage = typeof import('./tests/advisors/pages/advisorsPage.js'); +type amiInstanceSetupPage = typeof import('./tests/pages/amiInstanceSetupPage.js'); +type annotationAPI = typeof import('./tests/pages/api/annotationAPI.js'); +type backupAPI = typeof import('./tests/backup/pages/api/backupAPI.js'); +type backupInventoryPage = typeof import('./tests/backup/pages/inventoryPage.js'); +type changePasswordPage = typeof import('./tests/configuration/pages/changePasswordPage.js'); +type contactPointsAPI = typeof import('./tests/ia/pages/api/contactPointsAPI.js'); +type contactPointsPage = typeof import('./tests/ia/pages/contactPointsPage.js'); +type dashboardPage = typeof import('./tests/pages/dashboardPage.js'); +type databaseChecksPage = typeof import('./tests/advisors/pages/databaseChecksPage.js'); +type dbaasAPI = typeof import('./tests/DbaaS/api/dbaasAPI.js'); +type dbaasPage = typeof import('./tests/DbaaS/pages/dbaasPage.js'); +type dbaasActionsPage = typeof import('./tests/DbaaS/pages/dbaasActionsPage.js'); +type dbaasManageVersionPage = typeof import('./tests/DbaaS/pages/dbaasManageVersionPage.js'); +type dbClusterSummaryDashboardPage = typeof import('./tests/PageObjects/Dashboards/Experimental/dbClusterSummaryDashboard.js'); +type dumpAPI = typeof import('./tests/pages/api/dumpAPI.js'); +type dumpPage = typeof import('./tests/pages/dumpPage.js'); +type explorePage = typeof import('./tests/pages/explorePage.js'); +type experimentalPostgresqlDashboardsPage = typeof import('./tests/PageObjects/Dashboards/Postgresql/ExperimentalPostgresqlDashboards.js'); +type grafanaAPI = typeof import('./tests/pages/api/grafanaAPI.js'); +type homePage = typeof import('./tests/pages/homePage.js'); +type inventoryAPI = typeof import('./tests/pages/api/inventoryAPI.js'); +type mysqlTableDetailsPage = typeof import('./tests/pages/mysqlTableDetailsPage.js'); +type leftNavMenu = typeof import('./tests/pages/leftNavMenu.js'); +type links = typeof import('./tests/helper/linksHelper.js'); +type locationsPage = typeof import('./tests/backup/pages/locationsPage.js'); +type locationsAPI = typeof import('./tests/backup/pages/api/locationsAPI.js'); +type nPoliciesPage = typeof import('./tests/ia/pages/notificationPolicies.js'); +type psMySql = typeof import('./tests/helper/psMySql.js'); +type organizationEntitlementsPage = typeof import('./tests/pages/organizationEntitlementsPage.js'); +type organizationTicketsPage = typeof import('./tests/pages/organizationTicketsPage.js'); +type perconaPlatformPage = typeof import('./tests/pages/perconaPlatformPage/perconaPlatformPage.js'); +type pmmDemoPage = typeof import('./tests/pages/pmmDemoPage.js'); +type pmmInventoryPage = typeof import('./tests/configuration/pages/pmmInventoryPage.js'); +type agentsPage = typeof import('./tests/configuration/pages/agentsPage.js'); +type pmmServerAdminSettingsPage = typeof import('./tests/configuration/pages/pmmServerAdminSettingsPage.js'); +type pmmSettingsPage = typeof import('./tests/configuration/pages/pmmSettingsPage.js'); +type portalAPI = typeof import('./tests/pages/api/portalAPI.js'); +type profileAPI = typeof import('./tests/configuration/api/profileApi.js'); +type qanDetails = typeof import('./tests/QAN/pages/qanDetailsFragment.js'); +type qanFilters = typeof import('./tests/QAN/pages/qanFiltersFragment.js'); +type qanOverview = typeof import('./tests/QAN/pages/qanOverviewFragment.js'); +type qanPage = typeof import('./tests/QAN/pages/qanPage.js'); +type qanPagination = typeof import('./tests/QAN/pages/qanPaginationFragment.js'); +type remoteInstancesPage = typeof import('./tests/pages/remoteInstancesPage.js'); +type remoteInstancesHelper = typeof import('./tests/remoteInstances/remoteInstancesHelper.js'); +type restorePage = typeof import('./tests/backup/pages/restorePage.js'); +type rulesAPI = typeof import('./tests/ia/pages/api/rulesAPI.js'); +type ruleTemplatesPage = typeof import('./tests/ia/pages/ruleTemplatesPage.js'); +type scheduledAPI = typeof import('./tests/backup/pages/api/scheduledAPI.js'); +type scheduledPage = typeof import('./tests/backup/pages/scheduledPage.js'); +type searchDashboardsModal = typeof import('./tests/dashboards/pages/searchDashboardsModal.js'); +type serverApi = typeof import('./tests/pages/api/serverApi.js'); +type silencesPage = typeof import('./tests/ia/pages/silencesPage.js'); +type iaCommon = typeof import('./tests/ia/pages/iaCommonPage.js'); +type platformAPI = typeof import('./tests/pages/api/platformAPI.js'); +type advisorsAPI = typeof import('./tests/advisors/pages/api/advisorsAPI.js'); +type settingsAPI = typeof import('./tests/pages/api/settingsAPI.js'); +type templatesAPI = typeof import('./tests/ia/pages/api/templatesAPI.js'); +type qanAPI = typeof import('./tests/QAN/api/qanAPI.js'); +type environmentOverviewPage = typeof import('./tests/pages/environmentOverviewPage.js'); +type tooltips = typeof import('./tests/helper/tooltipHelper.js'); +type statsAndLicensePage = typeof import('./tests/server-admin/pages/statsAndLicensePage.js'); +type dataSourcePage = typeof import('./tests/pages/pmmSettingsPages/dataSourcePage.js'); +type pmmTourPage = typeof import('./tests/pages/pmmTourPage.js'); +type loginPage = typeof import('./tests/pages/loginPage.js'); +type nodesOverviewPage = typeof import('./tests/pages/nodesOverviewPage.js'); +type MongoDBHelper = import('./tests/helper/mongoDB.js'); +type PostgresqlDBHelper = import('codeceptjs-postgresqlhelper'); +type Grafana = import('./tests/helper/grafana_helper.js'); +type FileHelper = import('./tests/helper/file_helper.js'); +type PerformanceHelper = import('./tests/helper/performance_helper.js'); +type BrowserHelper = import('./tests/helper/browser_helper.js'); +type Mailosaur = import('codeceptjs-mailosaurhelper'); +type DbHelper = import('codeceptjs-dbhelper'); +type ChaiWrapper = import('codeceptjs-chai'); +type LocalStorageHelper = import('./tests/helper/localStorageHelper.js'); +type ApiHelper = import('./tests/helper/apiHelper.js'); + +declare namespace CodeceptJS { + interface SupportObject { I: I, current: any, codeceptjsConfig: codeceptjsConfig, credentials: credentials, addInstanceAPI: addInstanceAPI, addInstancePage: addInstancePage, amiInstanceAPI: amiInstanceAPI, adminPage: adminPage, alertGroupsPage: alertGroupsPage, alertRulesPage: alertRulesPage, aiAdminPage: aiAdminPage, alertmanagerAPI: alertmanagerAPI, alertsAPI: alertsAPI, alertsPage: alertsPage, advisorsPage: advisorsPage, amiInstanceSetupPage: amiInstanceSetupPage, annotationAPI: annotationAPI, backupAPI: backupAPI, backupInventoryPage: backupInventoryPage, changePasswordPage: changePasswordPage, contactPointsAPI: contactPointsAPI, contactPointsPage: contactPointsPage, dashboardPage: dashboardPage, databaseChecksPage: databaseChecksPage, dbaasAPI: dbaasAPI, dbaasPage: dbaasPage, dbaasActionsPage: dbaasActionsPage, dbaasManageVersionPage: dbaasManageVersionPage, dbClusterSummaryDashboardPage: dbClusterSummaryDashboardPage, dumpAPI: dumpAPI, dumpPage: dumpPage, explorePage: explorePage, experimentalPostgresqlDashboardsPage: experimentalPostgresqlDashboardsPage, grafanaAPI: grafanaAPI, homePage: homePage, inventoryAPI: inventoryAPI, mysqlTableDetailsPage: mysqlTableDetailsPage, leftNavMenu: leftNavMenu, links: links, locationsPage: locationsPage, locationsAPI: locationsAPI, nPoliciesPage: nPoliciesPage, psMySql: psMySql, organizationEntitlementsPage: organizationEntitlementsPage, organizationTicketsPage: organizationTicketsPage, perconaPlatformPage: perconaPlatformPage, pmmDemoPage: pmmDemoPage, pmmInventoryPage: pmmInventoryPage, agentsPage: agentsPage, pmmServerAdminSettingsPage: pmmServerAdminSettingsPage, pmmSettingsPage: pmmSettingsPage, portalAPI: portalAPI, profileAPI: profileAPI, qanDetails: qanDetails, qanFilters: qanFilters, qanOverview: qanOverview, qanPage: qanPage, qanPagination: qanPagination, remoteInstancesPage: remoteInstancesPage, remoteInstancesHelper: remoteInstancesHelper, restorePage: restorePage, rulesAPI: rulesAPI, ruleTemplatesPage: ruleTemplatesPage, scheduledAPI: scheduledAPI, scheduledPage: scheduledPage, searchDashboardsModal: searchDashboardsModal, serverApi: serverApi, silencesPage: silencesPage, iaCommon: iaCommon, platformAPI: platformAPI, advisorsAPI: advisorsAPI, settingsAPI: settingsAPI, templatesAPI: templatesAPI, qanAPI: qanAPI, environmentOverviewPage: environmentOverviewPage, tooltips: tooltips, statsAndLicensePage: statsAndLicensePage, dataSourcePage: dataSourcePage, pmmTourPage: pmmTourPage, loginPage: loginPage, nodesOverviewPage: nodesOverviewPage } + interface Methods extends Playwright, MongoDBHelper, PostgresqlDBHelper, Grafana, FileHelper, FileSystem, PerformanceHelper, BrowserHelper, REST, Mailosaur, DbHelper, ChaiWrapper, LocalStorageHelper, ApiHelper {} + interface I extends ReturnType, WithTranslation, WithTranslation, WithTranslation, WithTranslation, WithTranslation, WithTranslation, WithTranslation, WithTranslation, WithTranslation, WithTranslation, WithTranslation, WithTranslation {} + namespace Translation { + interface Actions {} + } +} diff --git a/tests/configuration/verifyPMMInventory_test.js b/tests/configuration/verifyPMMInventory_test.js index 04992d4b8..6b0e9e863 100644 --- a/tests/configuration/verifyPMMInventory_test.js +++ b/tests/configuration/verifyPMMInventory_test.js @@ -1,5 +1,4 @@ const assert = require('assert'); -const {de} = require("@faker-js/faker/lib/locales"); const { I, remoteInstancesPage, pmmInventoryPage, remoteInstancesHelper, @@ -305,14 +304,15 @@ Scenario( I.amOnPage(remoteInstancesPage.url); remoteInstancesPage.waitUntilRemoteInstancesPageLoaded(); remoteInstancesPage.openAddRemotePage('external'); - const inputs =await remoteInstancesPage.fillRemoteFields(externalExporterServiceName); + const inputs = await remoteInstancesPage.fillRemoteFields(externalExporterServiceName); + I.waitForVisible(remoteInstancesPage.fields.addService, 30); I.click(remoteInstancesPage.fields.addService); pmmInventoryPage.verifyRemoteServiceIsDisplayed(externalExporterServiceName); const newLabels = { - environment: `${inputs.environment} edited` || `${externalExporterServiceName} environment edited`, - cluster: `${inputs.cluster} edited` || `${externalExporterServiceName} cluster edited`, - replicationSet: `${inputs.replicationSet} edited` || `${externalExporterServiceName} replicationSet edited`, + environment: `${inputs.environment} edited` || `${externalExporterServiceName} environment edited`, + cluster: `${inputs.cluster} edited` || `${externalExporterServiceName} cluster edited`, + replicationSet: `${inputs.replicationSet} edited` || `${externalExporterServiceName} replicationSet edited`, }; pmmInventoryPage.openEditServiceWizard(externalExporterServiceName); @@ -334,12 +334,13 @@ Scenario( remoteInstancesPage.startMonitoringOfInstance(serviceName); remoteInstancesPage.verifyAddInstancePageOpened(); const inputs = await remoteInstancesPage.fillRemoteRDSFields(serviceName); + remoteInstancesPage.createRemoteInstance(serviceName); pmmInventoryPage.verifyRemoteServiceIsDisplayed(serviceName); const newLabels = { - environment: `${inputs.environment} edited` || `${serviceName} environment edited`, - cluster: `${inputs.cluster} edited` || `${serviceName} cluster edited`, - replicationSet: `${inputs.replicationSet} edited` || `${serviceName} replicationSet edited`, + environment: `${inputs.environment} edited` || `${serviceName} environment edited`, + cluster: `${inputs.cluster} edited` || `${serviceName} cluster edited`, + replicationSet: `${inputs.replicationSet} edited` || `${serviceName} replicationSet edited`, }; pmmInventoryPage.openEditServiceWizard(serviceName); @@ -373,9 +374,9 @@ Scenario( I.click(remoteInstancesPage.fields.addService); pmmInventoryPage.verifyRemoteServiceIsDisplayed(haproxyServiceName); const newLabels = { - environment: `${remoteInstancesHelper.remote_instance.haproxy.environment} edited` || `${haproxyServiceName} environment edited`, - cluster: `${remoteInstancesHelper.remote_instance.haproxy.clusterName} edited` || `${haproxyServiceName} cluster edited`, - replicationSet: `${remoteInstancesHelper.remote_instance.haproxy.replicationSet} edited` || `${haproxyServiceName} replicationSet edited`, + environment: `${remoteInstancesHelper.remote_instance.haproxy.environment} edited` || `${haproxyServiceName} environment edited`, + cluster: `${remoteInstancesHelper.remote_instance.haproxy.clusterName} edited` || `${haproxyServiceName} cluster edited`, + replicationSet: `${remoteInstancesHelper.remote_instance.haproxy.replicationSet} edited` || `${haproxyServiceName} replicationSet edited`, }; pmmInventoryPage.openEditServiceWizard(haproxyServiceName); @@ -403,13 +404,15 @@ Scenario( assert.ok(grabbedHostname.startsWith(serviceName), `Hostname is incorrect: ${grabbedHostname}`); I.seeInField(remoteInstancesPage.fields.serviceName, serviceName); const inputs = await remoteInstancesPage.fillRemoteRDSFields(serviceName); + remoteInstancesPage.createRemoteInstance(serviceName); pmmInventoryPage.verifyRemoteServiceIsDisplayed(serviceName); const newLabels = { - environment: `${inputs.environment} edited` || `${serviceName} environment edited`, - cluster: `${inputs.cluster} edited` || `${serviceName} cluster edited`, - replicationSet: `${inputs.replicationSet} edited` || `${serviceName} replicationSet edited`, + environment: `${inputs.environment} edited` || `${serviceName} environment edited`, + cluster: `${inputs.cluster} edited` || `${serviceName} cluster edited`, + replicationSet: `${inputs.replicationSet} edited` || `${serviceName} replicationSet edited`, }; + pmmInventoryPage.openEditServiceWizard(serviceName); pmmInventoryPage.updateServiceLabels(newLabels); I.click(pmmInventoryPage.fields.showServiceDetails(serviceName)); @@ -431,12 +434,13 @@ Data(azureServices).Scenario( remoteInstancesPage.startMonitoringOfInstance(current.instanceToMonitor); remoteInstancesPage.verifyAddInstancePageOpened(); const inputs = await remoteInstancesPage.fillRemoteRDSFields(serviceName); + I.click(remoteInstancesPage.fields.addService); pmmInventoryPage.verifyRemoteServiceIsDisplayed(serviceName); const newLabels = { - environment: `${inputs.environment} edited` || `${serviceName} environment edited`, - cluster: `${inputs.cluster} edited` || `${serviceName} cluster edited`, - replicationSet: `${inputs.replicationSet} edited` || `${serviceName} replicationSet edited`, + environment: `${inputs.environment} edited` || `${serviceName} environment edited`, + cluster: `${inputs.cluster} edited` || `${serviceName} cluster edited`, + replicationSet: `${inputs.replicationSet} edited` || `${serviceName} replicationSet edited`, }; pmmInventoryPage.openEditServiceWizard(serviceName); @@ -474,9 +478,9 @@ Data(aws_instances).Scenario('PMM-T2340 Verify adding and editing Aurora remote I.amOnPage(pmmInventoryPage.url); pmmInventoryPage.verifyRemoteServiceIsDisplayed(details.service_name); const newLabels = { - environment: `${details.environment} edited` || `${details.service_name} environment edited`, - cluster: `${details.cluster} edited` || `${details.service_name} cluster edited`, - replicationSet: `${details.replicationSet} edited` || `${details.service_name} replicationSet edited`, + environment: `${details.environment} edited` || `${details.service_name} environment edited`, + cluster: `${details.cluster} edited` || `${details.service_name} cluster edited`, + replicationSet: `${details.replicationSet} edited` || `${details.service_name} replicationSet edited`, }; pmmInventoryPage.openEditServiceWizard(details.service_name); diff --git a/tests/helper/file_helper.js b/tests/helper/file_helper.js index e5d7b1ced..fb4ce00fa 100644 --- a/tests/helper/file_helper.js +++ b/tests/helper/file_helper.js @@ -25,11 +25,13 @@ class FileHelper extends Helper { async fileSize(path, failOnError = true) { try { - let stats = fs.statSync(path); + const stats = fs.statSync(path); + return stats.size; } catch (e) { if (!failOnError) assert.ok(false, `Could not get file size: ${path}, because of error: ${e}`); } + return -1; } } diff --git a/tests/ia/pages/alertRulesPage.js b/tests/ia/pages/alertRulesPage.js index e04a339c3..28145439f 100644 --- a/tests/ia/pages/alertRulesPage.js +++ b/tests/ia/pages/alertRulesPage.js @@ -80,9 +80,11 @@ module.exports = { this.searchAndSelectResult('template', template); this.verifyAndReplaceInputField('ruleName', ruleName, editedRule.ruleName); const thresholdExists = await I.grabNumberOfVisibleElements(this.fields.resultsLocator(threshold)); - if (thresholdExists >0 ) { - this.verifyAndReplaceInputField('threshold', threshold, editedRule.threshold); + + if (thresholdExists > 0) { + this.verifyAndReplaceInputField('threshold', threshold, editedRule.threshold); } + this.verifyAndReplaceInputField('duration', duration, editedRule.duration); I.see(severity, this.fields.searchDropdown('severity')); this.searchAndSelectResult('severity', editedRule.severity); diff --git a/tests/pages/api/grafanaAPI.js b/tests/pages/api/grafanaAPI.js index 40faa1b3f..e131cfaf4 100644 --- a/tests/pages/api/grafanaAPI.js +++ b/tests/pages/api/grafanaAPI.js @@ -206,10 +206,12 @@ module.exports = { const headers = { Authorization: `Basic ${await I.getAuth()}` }; const resp = await I.sendGetRequest(`graph/api/dashboards/uid/${uid}`, headers); + assert.ok( - resp.status === 200, - `Failed to find dashboard with id '${uid}' . Response message is ${resp.data.message}`, + resp.status === 200, + `Failed to find dashboard with id '${uid}' . Response message is ${resp.data.message}`, ); + return resp.data; }, diff --git a/tests/pages/dumpPage.js b/tests/pages/dumpPage.js index 79ce22725..a0d675b1e 100644 --- a/tests/pages/dumpPage.js +++ b/tests/pages/dumpPage.js @@ -12,11 +12,11 @@ module.exports = { viewLogs: locate('span').withText('View logs'), log: (uid) => locate('div').withText(`Logs for ${uid}`), showServiceDetails: (uid) => `//label[@for='input-table-select-${uid}-id']//ancestor::tr//button[@data-testid="show-row-details"]`, - addressField: locate('input').withAttr({ id: `address` }), - nameField: locate('input').withAttr({ id: `name` }), - passwordField: locate('input').withAttr({ id: `password` }), - directoryField: locate('input').withAttr({ id: `directory` }), - saveAndExit: locate('button').withAttr({ type: `submit` }), + addressField: locate('input').withAttr({ id: 'address' }), + nameField: locate('input').withAttr({ id: 'name' }), + passwordField: locate('input').withAttr({ id: 'password' }), + directoryField: locate('input').withAttr({ id: 'directory' }), + saveAndExit: locate('button').withAttr({ type: 'submit' }), sftpMessage: 'The message was send successfully!', }, diff --git a/tests/qa-integration/pmm_pgsm_integration_test.js b/tests/qa-integration/pmm_pgsm_integration_test.js index d3c614072..587f9c2e7 100644 --- a/tests/qa-integration/pmm_pgsm_integration_test.js +++ b/tests/qa-integration/pmm_pgsm_integration_test.js @@ -233,8 +233,10 @@ Scenario( await dashboardPage.verifyThereAreNoGraphsWithoutData(1); const log = await I.verifyCommand(`docker exec ${container_name} cat pmm-agent.log`); - I.assertFalse(log.includes('Error opening connection to database \(postgres'), - 'The log wasn\'t supposed to contain errors regarding connection to postgress database but it does'); + I.assertFalse( + log.includes('Error opening connection to database \(postgres'), + 'The log wasn\'t supposed to contain errors regarding connection to postgress database but it does', + ); }, ); diff --git a/tests/qa-integration/pmm_ps_integration_test.js b/tests/qa-integration/pmm_ps_integration_test.js index 9687663a9..d09491765 100644 --- a/tests/qa-integration/pmm_ps_integration_test.js +++ b/tests/qa-integration/pmm_ps_integration_test.js @@ -47,7 +47,7 @@ Scenario( I.fillField(remoteInstancesPage.fields.environment, details.environment); I.fillField(remoteInstancesPage.fields.cluster, details.cluster); I.click(remoteInstancesPage.fields.addService); - //I.waitForVisible(pmmInventoryPage.fields.agentsLink, 30); + // I.waitForVisible(pmmInventoryPage.fields.agentsLink, 30); await inventoryAPI.verifyServiceExistsAndHasRunningStatus( { serviceType: 'MYSQL_SERVICE', diff --git a/tests/qa-integration/pmm_pxc_integration_test.js b/tests/qa-integration/pmm_pxc_integration_test.js index 814aa9b48..770528d5a 100644 --- a/tests/qa-integration/pmm_pxc_integration_test.js +++ b/tests/qa-integration/pmm_pxc_integration_test.js @@ -27,7 +27,7 @@ Scenario( const details = { serviceName: remoteServiceName, serviceType: 'MYSQL_SERVICE', - port: port, + port, username: connection.username, password: connection.password, host: container_name, @@ -47,7 +47,7 @@ Scenario( I.fillField(remoteInstancesPage.fields.environment, details.environment); I.fillField(remoteInstancesPage.fields.cluster, details.cluster); I.click(remoteInstancesPage.fields.addService); - //I.waitForVisible(pmmInventoryPage.fields.agentsLink, 30); + // I.waitForVisible(pmmInventoryPage.fields.agentsLink, 30); await inventoryAPI.verifyServiceExistsAndHasRunningStatus( { serviceType: 'MYSQL_SERVICE', diff --git a/tests/upgradePMM_test.js b/tests/upgradePMM_test.js index 6ddc025e9..27ba93b60 100644 --- a/tests/upgradePMM_test.js +++ b/tests/upgradePMM_test.js @@ -2,6 +2,7 @@ const assert = require('assert'); const faker = require('faker'); const { generate } = require('generate-password'); const { storageLocationConnection } = require('./backup/pages/testData'); + const { adminPage, remoteInstancesHelper, psMySql, pmmSettingsPage, dashboardPage, databaseChecksPage, scheduledAPI, locationsAPI, } = inject(); @@ -1241,47 +1242,48 @@ if (versionMinor >= 32) { ).retry(0); } -Scenario('PMM-12587-1 Verify duplicate dashboards dont break after upgrade @pre-upgrade @ovf-upgrade @ami-upgrade @pmm-upgrade', - async ({ - I, grafanaAPI, searchDashboardsModal - }) => { - - const insightFolder = await grafanaAPI.lookupFolderByName(searchDashboardsModal.folders.insight.name); - const experimentalFolder = await grafanaAPI.lookupFolderByName(searchDashboardsModal.folders.experimental.name); +Scenario( + 'PMM-12587-1 Verify duplicate dashboards dont break after upgrade @pre-upgrade @ovf-upgrade @ami-upgrade @pmm-upgrade', + async ({ + I, grafanaAPI, searchDashboardsModal, + }) => { + const insightFolder = await grafanaAPI.lookupFolderByName(searchDashboardsModal.folders.insight.name); + const experimentalFolder = await grafanaAPI.lookupFolderByName(searchDashboardsModal.folders.experimental.name); - const resp1 = await grafanaAPI.createCustomDashboard('test-dashboard', insightFolder.id); - const resp2 = await grafanaAPI.createCustomDashboard('test-dashboard', experimentalFolder.id); + const resp1 = await grafanaAPI.createCustomDashboard('test-dashboard', insightFolder.id); + const resp2 = await grafanaAPI.createCustomDashboard('test-dashboard', experimentalFolder.id); - await I.writeFileSync('./dashboard.json', JSON.stringify({ - DASHBOARD1_UID: resp1.uid, - DASHBOARD2_UID: resp2.uid - }),false); + await I.writeFileSync('./dashboard.json', JSON.stringify({ + DASHBOARD1_UID: resp1.uid, + DASHBOARD2_UID: resp2.uid, + }), false); - //Check if file with Dashboard info is present. - I.assertNotEqual(I.fileSize('./dashboard.json',false), 0, `Was expecting Dashboard info in the File, but its empty`); - },); + // Check if file with Dashboard info is present. + I.assertNotEqual(I.fileSize('./dashboard.json', false), 0, 'Was expecting Dashboard info in the File, but its empty'); + }, +); Scenario( - 'PMM-12587-2 Verify duplicate dashboards dont break after upgrade @post-upgrade @ovf-upgrade @ami-upgrade @pmm-upgrade', - async ({ - I, grafanaAPI, dashboardPage, - }) => { - const resp = JSON.parse(await I.readFileSync('./dashboard.json',false)); + 'PMM-12587-2 Verify duplicate dashboards dont break after upgrade @post-upgrade @ovf-upgrade @ami-upgrade @pmm-upgrade', + async ({ + I, grafanaAPI, dashboardPage, + }) => { + const resp = JSON.parse(await I.readFileSync('./dashboard.json', false)); - const resp1 = await grafanaAPI.getDashboard(resp.DASHBOARD1_UID); - const resp2 = await grafanaAPI.getDashboard(resp.DASHBOARD2_UID); + const resp1 = await grafanaAPI.getDashboard(resp.DASHBOARD1_UID); + const resp2 = await grafanaAPI.getDashboard(resp.DASHBOARD2_UID); - //Trim leading '/' from response url - const url1 = resp1.meta.url.replace(/^\/+/g, ''); - const url2 = resp2.meta.url.replace(/^\/+/g, ''); + // Trim leading '/' from response url + const url1 = resp1.meta.url.replace(/^\/+/g, ''); + const url2 = resp2.meta.url.replace(/^\/+/g, ''); - I.amOnPage(url1); - dashboardPage.waitForDashboardOpened(); - I.seeInCurrentUrl(url1); - I.amOnPage(url2); - dashboardPage.waitForDashboardOpened(); - I.seeInCurrentUrl(url2); - }, + I.amOnPage(url1); + dashboardPage.waitForDashboardOpened(); + I.seeInCurrentUrl(url1); + I.amOnPage(url2); + dashboardPage.waitForDashboardOpened(); + I.seeInCurrentUrl(url2); + }, ); // This test must be executed last