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