@grafana/plugin-e2e 3.9.0 → 3.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/fixtures/alertRuleEditPage.js +2 -21
- package/dist/fixtures/commands/createDataSource.js +1 -2
- package/dist/fixtures/commands/gotoAlertRuleEditPage.js +2 -21
- package/dist/fixtures/page.js +2 -2
- package/dist/index.d.ts +69 -1
- package/dist/index.js +7 -0
- package/dist/models/components/ColorPicker.js +4 -4
- package/dist/models/components/DataSourcePicker.js +2 -21
- package/dist/models/components/Panel.js +4 -23
- package/dist/models/components/PanelEditOptionsGroup.js +4 -4
- package/dist/models/components/RadioGroup.js +2 -2
- package/dist/models/components/Switch.js +3 -3
- package/dist/models/components/TimeRange.js +2 -21
- package/dist/models/pages/AlertRuleEditPage.js +4 -23
- package/dist/models/pages/AnnotationEditPage.js +3 -22
- package/dist/models/pages/AnnotationPage.js +2 -21
- package/dist/models/pages/DashboardPage.js +9 -28
- package/dist/models/pages/ExplorePage.js +3 -22
- package/dist/models/pages/PanelEditPage.js +8 -27
- package/dist/models/pages/VariableEditPage.js +3 -22
- package/dist/utils/version.js +107 -0
- package/package.json +2 -6
|
@@ -1,29 +1,10 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var version = require('../utils/version.js');
|
|
4
4
|
var AlertRuleEditPage = require('../models/pages/AlertRuleEditPage.js');
|
|
5
5
|
|
|
6
|
-
function _interopNamespaceDefault(e) {
|
|
7
|
-
var n = Object.create(null);
|
|
8
|
-
if (e) {
|
|
9
|
-
Object.keys(e).forEach(function (k) {
|
|
10
|
-
if (k !== 'default') {
|
|
11
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
12
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
13
|
-
enumerable: true,
|
|
14
|
-
get: function () { return e[k]; }
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
n.default = e;
|
|
20
|
-
return Object.freeze(n);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
var semver__namespace = /*#__PURE__*/_interopNamespaceDefault(semver);
|
|
24
|
-
|
|
25
6
|
const alertRuleEditPage = async ({ page, selectors, grafanaVersion, request }, use, testInfo) => {
|
|
26
|
-
if (
|
|
7
|
+
if (version.lt(grafanaVersion, "9.5.0")) {
|
|
27
8
|
console.log(
|
|
28
9
|
"Testing alert rules with plugin-e2e is only supported for Grafana 9.5.0 and later. Checkout https://grafana.com/developers/plugin-tools/e2e-test-a-plugin/test-a-data-source-plugin/annotation-queries#test-the-entire-annotation-query-execution-flow to see how to skip tests for a range of Grafana versions."
|
|
29
10
|
);
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var uuid = require('uuid');
|
|
4
3
|
var test = require('@playwright/test');
|
|
5
4
|
|
|
6
5
|
const createDataSourceViaAPI = async (grafanaAPIClient, datasource) => {
|
|
7
6
|
const { type, name } = datasource;
|
|
8
|
-
const dsName = name ?? `${type}-${
|
|
7
|
+
const dsName = name ?? `${type}-${crypto.randomUUID()}`;
|
|
9
8
|
const existingDataSource = await grafanaAPIClient.getDataSourceByName(dsName);
|
|
10
9
|
if (existingDataSource.ok()) {
|
|
11
10
|
const json = await existingDataSource.json();
|
|
@@ -1,30 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var version = require('../../utils/version.js');
|
|
4
4
|
var AlertRuleEditPage = require('../../models/pages/AlertRuleEditPage.js');
|
|
5
5
|
|
|
6
|
-
function _interopNamespaceDefault(e) {
|
|
7
|
-
var n = Object.create(null);
|
|
8
|
-
if (e) {
|
|
9
|
-
Object.keys(e).forEach(function (k) {
|
|
10
|
-
if (k !== 'default') {
|
|
11
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
12
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
13
|
-
enumerable: true,
|
|
14
|
-
get: function () { return e[k]; }
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
n.default = e;
|
|
20
|
-
return Object.freeze(n);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
var semver__namespace = /*#__PURE__*/_interopNamespaceDefault(semver);
|
|
24
|
-
|
|
25
6
|
const gotoAlertRuleEditPage = async ({ request, page, selectors, grafanaVersion }, use, testInfo) => {
|
|
26
7
|
await use(async (args) => {
|
|
27
|
-
if (
|
|
8
|
+
if (version.lt(grafanaVersion, "9.5.0")) {
|
|
28
9
|
console.log(
|
|
29
10
|
"Testing alert rules with plugin-e2e is only supported for Grafana 9.4.0 and later. Checkout https://grafana.com/developers/plugin-tools/e2e-test-a-plugin/test-a-data-source-plugin/annotation-queries#test-the-entire-annotation-query-execution-flow to see how to skip tests for a range of Grafana versions."
|
|
30
11
|
);
|
package/dist/fixtures/page.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var version = require('../utils/version.js');
|
|
4
4
|
var options = require('../options.js');
|
|
5
5
|
var openFeature = require('./openFeature.js');
|
|
6
6
|
var overrideGrafanaBootData = require('./scripts/overrideGrafanaBootData.js');
|
|
@@ -17,7 +17,7 @@ const page = async ({ page: page2, featureToggles, openFeature: openFeature$1, u
|
|
|
17
17
|
console.error("Failed to set feature toggles", error);
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
|
-
if (hasOpenFeature &&
|
|
20
|
+
if (hasOpenFeature && version.gte(grafanaVersion, "12.1.0")) {
|
|
21
21
|
await openFeature.setupOpenFeatureRoutes(page2, mergedFlags, openFeature$1.latency ?? 0, selectors);
|
|
22
22
|
}
|
|
23
23
|
await page2.goto("/");
|
package/dist/index.d.ts
CHANGED
|
@@ -1444,6 +1444,74 @@ declare const isFeatureEnabled: (page: Page, featureToggle: string) => Promise<b
|
|
|
1444
1444
|
|
|
1445
1445
|
declare const DEFAULT_A11Y_TAGS: string[];
|
|
1446
1446
|
|
|
1447
|
+
/**
|
|
1448
|
+
* Returns true when version `a` is greater than or equal to version `b`.
|
|
1449
|
+
*
|
|
1450
|
+
* Follows semver precedence rules: a release has higher precedence than any
|
|
1451
|
+
* pre-release of the same `MAJOR.MINOR.PATCH` (`1.2.3` > `1.2.3-anything`).
|
|
1452
|
+
* Pre-release identifiers are compared dot-separated, numerics numerically
|
|
1453
|
+
* and non-numerics lexicographically (`1.2.3-2` < `1.2.3-10`).
|
|
1454
|
+
*
|
|
1455
|
+
* @param a - A semantic version string in the form `MAJOR.MINOR.PATCH[-PRE]`.
|
|
1456
|
+
* @param b - A semantic version string in the form `MAJOR.MINOR.PATCH[-PRE]`.
|
|
1457
|
+
*/
|
|
1458
|
+
declare const gte: (a: string, b: string) => boolean;
|
|
1459
|
+
/**
|
|
1460
|
+
* Returns true when version `a` is strictly less than version `b`.
|
|
1461
|
+
*
|
|
1462
|
+
* Follows semver precedence rules: a release has higher precedence than any
|
|
1463
|
+
* pre-release of the same `MAJOR.MINOR.PATCH` (`1.2.3-anything` < `1.2.3`).
|
|
1464
|
+
* Pre-release identifiers are compared dot-separated, numerics numerically
|
|
1465
|
+
* and non-numerics lexicographically.
|
|
1466
|
+
*
|
|
1467
|
+
* @param a - A semantic version string in the form `MAJOR.MINOR.PATCH[-PRE]`.
|
|
1468
|
+
* @param b - A semantic version string in the form `MAJOR.MINOR.PATCH[-PRE]`.
|
|
1469
|
+
*/
|
|
1470
|
+
declare const lt: (a: string, b: string) => boolean;
|
|
1471
|
+
/**
|
|
1472
|
+
* Returns true when version `a` is less than or equal to version `b`.
|
|
1473
|
+
*
|
|
1474
|
+
* Follows semver precedence rules. See {@link lt} for details.
|
|
1475
|
+
*
|
|
1476
|
+
* @param a - A semantic version string in the form `MAJOR.MINOR.PATCH[-PRE]`.
|
|
1477
|
+
* @param b - A semantic version string in the form `MAJOR.MINOR.PATCH[-PRE]`.
|
|
1478
|
+
*/
|
|
1479
|
+
declare const lte: (a: string, b: string) => boolean;
|
|
1480
|
+
/**
|
|
1481
|
+
* Returns true when version `a` is strictly greater than version `b`.
|
|
1482
|
+
*
|
|
1483
|
+
* Follows semver precedence rules. See {@link gte} for details.
|
|
1484
|
+
*
|
|
1485
|
+
* @param a - A semantic version string in the form `MAJOR.MINOR.PATCH[-PRE]`.
|
|
1486
|
+
* @param b - A semantic version string in the form `MAJOR.MINOR.PATCH[-PRE]`.
|
|
1487
|
+
*/
|
|
1488
|
+
declare const gt: (a: string, b: string) => boolean;
|
|
1489
|
+
/**
|
|
1490
|
+
* Returns true when version `a` is equal to version `b` per semver precedence.
|
|
1491
|
+
*
|
|
1492
|
+
* Build metadata (after `+`) is ignored. `1.2.3` and `1.2.3-pre` are not equal.
|
|
1493
|
+
*
|
|
1494
|
+
* @param a - A semantic version string in the form `MAJOR.MINOR.PATCH[-PRE]`.
|
|
1495
|
+
* @param b - A semantic version string in the form `MAJOR.MINOR.PATCH[-PRE]`.
|
|
1496
|
+
*/
|
|
1497
|
+
declare const eq: (a: string, b: string) => boolean;
|
|
1498
|
+
/**
|
|
1499
|
+
* Returns true when `version` satisfies the given range expression.
|
|
1500
|
+
*
|
|
1501
|
+
* Supports a small subset of semver range syntax suitable for Grafana version checks:
|
|
1502
|
+
* - Exact: `"1.2.3"` (equivalent to `=1.2.3`)
|
|
1503
|
+
* - Comparators: `">=1.2.3"`, `">1.2.3"`, `"<=1.2.3"`, `"<1.2.3"`, `"=1.2.3"`
|
|
1504
|
+
* - Conjunction (AND) via whitespace: `">=1.2.3 <2.0.0"`
|
|
1505
|
+
* - Disjunction (OR) via `||`: `">=1.2.3 <2.0.0 || >=3.0.0"`
|
|
1506
|
+
*
|
|
1507
|
+
* Caret (`^`) and tilde (`~`) prefixes and hyphen ranges are not supported.
|
|
1508
|
+
* Unrecognized comparator prefixes cause that comparator to evaluate to false.
|
|
1509
|
+
*
|
|
1510
|
+
* @param version - A semantic version string in the form `MAJOR.MINOR.PATCH[-PRE]`.
|
|
1511
|
+
* @param range - A range expression using the syntax described above.
|
|
1512
|
+
*/
|
|
1513
|
+
declare const satisfies: (version: string, range: string) => boolean;
|
|
1514
|
+
|
|
1447
1515
|
declare const test: _playwright_test.TestType<_playwright_test.PlaywrightTestArgs & _playwright_test.PlaywrightTestOptions & InternalFixtures & PluginFixture, _playwright_test.PlaywrightWorkerArgs & _playwright_test.PlaywrightWorkerOptions & PluginOptions>;
|
|
1448
1516
|
declare const expect: _playwright_test.Expect<{
|
|
1449
1517
|
toHaveAlert: (grafanaPage: GrafanaPage, severity: AlertVariant, options?: AlertPageOptions) => Promise<{
|
|
@@ -1561,5 +1629,5 @@ declare global {
|
|
|
1561
1629
|
}
|
|
1562
1630
|
}
|
|
1563
1631
|
|
|
1564
|
-
export { AnnotationEditPage, AnnotationPage, AppConfigPage, AppPage, Components, DEFAULT_A11Y_TAGS, DashboardPage, DataSourceConfigPage, DataSourcePicker, ExplorePage, GrafanaPage, Panel, PanelEditPage, PluginConfigPage, ScopedComponent, TimeRange, VariableEditPage, VariablePage, expect, isFeatureEnabled, isLegacyFeatureEnabled, test };
|
|
1632
|
+
export { AnnotationEditPage, AnnotationPage, AppConfigPage, AppPage, Components, DEFAULT_A11Y_TAGS, DashboardPage, DataSourceConfigPage, DataSourcePicker, ExplorePage, GrafanaPage, Panel, PanelEditPage, PluginConfigPage, ScopedComponent, TimeRange, VariableEditPage, VariablePage, eq, expect, gt, gte, isFeatureEnabled, isLegacyFeatureEnabled, lt, lte, satisfies, test };
|
|
1565
1633
|
export type { A11yViolationsOptions, AlertPageOptions, AlertRule, AlertRuleArgs, AlertVariant$1 as AlertVariant, AppPageNavigateOptions, AxeScanContext, ContainTextOptions, CreateDataSourceArgs, CreateDataSourcePageArgs, Credentials, Dashboard, DashboardEditViewArgs, DashboardPageArgs, DataSourceSettings, E2ESelectorGroups, FeatureFlagValue, GotoAppConfigPageArgs, GotoAppPageArgs, GrafanaPageArgs, InternalFixtures, NavigateOptions, OrgRole, PlaywrightArgs, PluginFixture, PluginOptions, PluginPageArgs, PluginTestCtx, ReadProvisionedAlertRuleArgs, ReadProvisionedDashboardArgs, ReadProvisionedDataSourceArgs, RequestOptions, TimeRangeArgs, TriggerRequestOptions, User, UserPreferences, Visualization, getByGrafanaSelectorOptions };
|
package/dist/index.js
CHANGED
|
@@ -61,6 +61,7 @@ var VariablePage = require('./models/pages/VariablePage.js');
|
|
|
61
61
|
var AppConfigPage = require('./models/pages/AppConfigPage.js');
|
|
62
62
|
var PluginConfigPage = require('./models/pages/PluginConfigPage.js');
|
|
63
63
|
var AppPage = require('./models/pages/AppPage.js');
|
|
64
|
+
var version = require('./utils/version.js');
|
|
64
65
|
|
|
65
66
|
const testWithInternal = test$1.test.extend({
|
|
66
67
|
bootData: bootData.bootData
|
|
@@ -137,5 +138,11 @@ exports.VariablePage = VariablePage.VariablePage;
|
|
|
137
138
|
exports.AppConfigPage = AppConfigPage.AppConfigPage;
|
|
138
139
|
exports.PluginConfigPage = PluginConfigPage.PluginConfigPage;
|
|
139
140
|
exports.AppPage = AppPage.AppPage;
|
|
141
|
+
exports.eq = version.eq;
|
|
142
|
+
exports.gt = version.gt;
|
|
143
|
+
exports.gte = version.gte;
|
|
144
|
+
exports.lt = version.lt;
|
|
145
|
+
exports.lte = version.lte;
|
|
146
|
+
exports.satisfies = version.satisfies;
|
|
140
147
|
exports.expect = expect;
|
|
141
148
|
exports.test = test;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var ComponentBase = require('./ComponentBase.js');
|
|
4
|
-
var
|
|
4
|
+
var version = require('../../utils/version.js');
|
|
5
5
|
var utils = require('../utils.js');
|
|
6
6
|
|
|
7
7
|
class ColorPicker extends ComponentBase.ComponentBase {
|
|
@@ -16,17 +16,17 @@ class ColorPicker extends ComponentBase.ComponentBase {
|
|
|
16
16
|
await colorInput.fill(rgbOrHex, options);
|
|
17
17
|
}
|
|
18
18
|
getCustomTab() {
|
|
19
|
-
if (
|
|
19
|
+
if (version.gte(this.ctx.grafanaVersion, "11.6.0")) {
|
|
20
20
|
return this.getContainer().getByRole("tab", { name: "Custom", exact: true });
|
|
21
21
|
}
|
|
22
22
|
return this.getContainer().getByRole("button", { name: "Custom", exact: true });
|
|
23
23
|
}
|
|
24
24
|
getContainer() {
|
|
25
25
|
const { grafanaVersion, page, selectors } = this.ctx;
|
|
26
|
-
if (
|
|
26
|
+
if (version.gte(grafanaVersion, "11.5.0")) {
|
|
27
27
|
return page.locator(utils.resolveGrafanaSelector(selectors.components.Portal.container));
|
|
28
28
|
}
|
|
29
|
-
if (
|
|
29
|
+
if (version.gte(grafanaVersion, "8.7.0")) {
|
|
30
30
|
return page.locator("#grafana-portal-container");
|
|
31
31
|
}
|
|
32
32
|
return page.locator("body > div").last();
|
|
@@ -1,28 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var version = require('../../utils/version.js');
|
|
4
4
|
var test = require('@playwright/test');
|
|
5
5
|
var ScopedComponent = require('./ScopedComponent.js');
|
|
6
6
|
|
|
7
|
-
function _interopNamespaceDefault(e) {
|
|
8
|
-
var n = Object.create(null);
|
|
9
|
-
if (e) {
|
|
10
|
-
Object.keys(e).forEach(function (k) {
|
|
11
|
-
if (k !== 'default') {
|
|
12
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
13
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
14
|
-
enumerable: true,
|
|
15
|
-
get: function () { return e[k]; }
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
n.default = e;
|
|
21
|
-
return Object.freeze(n);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
var semver__namespace = /*#__PURE__*/_interopNamespaceDefault(semver);
|
|
25
|
-
|
|
26
7
|
class DataSourcePicker extends ScopedComponent.ScopedComponent {
|
|
27
8
|
/**
|
|
28
9
|
* Sets the data source picker to the provided name
|
|
@@ -31,7 +12,7 @@ class DataSourcePicker extends ScopedComponent.ScopedComponent {
|
|
|
31
12
|
let datasourcePicker = (this.root || this.ctx.page).getByTestId(
|
|
32
13
|
this.ctx.selectors.components.DataSourcePicker.inputV2
|
|
33
14
|
);
|
|
34
|
-
if (
|
|
15
|
+
if (version.lt(this.ctx.grafanaVersion, "10.1.0")) {
|
|
35
16
|
datasourcePicker = this.getByGrafanaSelector(this.ctx.selectors.components.DataSourcePicker.container, {
|
|
36
17
|
root: this.root
|
|
37
18
|
}).locator("input");
|
|
@@ -1,27 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var version = require('../../utils/version.js');
|
|
4
4
|
var GrafanaPage = require('../pages/GrafanaPage.js');
|
|
5
5
|
|
|
6
|
-
function _interopNamespaceDefault(e) {
|
|
7
|
-
var n = Object.create(null);
|
|
8
|
-
if (e) {
|
|
9
|
-
Object.keys(e).forEach(function (k) {
|
|
10
|
-
if (k !== 'default') {
|
|
11
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
12
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
13
|
-
enumerable: true,
|
|
14
|
-
get: function () { return e[k]; }
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
n.default = e;
|
|
20
|
-
return Object.freeze(n);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
var semver__namespace = /*#__PURE__*/_interopNamespaceDefault(semver);
|
|
24
|
-
|
|
25
6
|
const ERROR_STATUS = "error";
|
|
26
7
|
class Panel extends GrafanaPage.GrafanaPage {
|
|
27
8
|
constructor(ctx, locator) {
|
|
@@ -47,7 +28,7 @@ class Panel extends GrafanaPage.GrafanaPage {
|
|
|
47
28
|
*/
|
|
48
29
|
get data() {
|
|
49
30
|
const panel = this.locator;
|
|
50
|
-
if (
|
|
31
|
+
if (version.lt(this.ctx.grafanaVersion, "12.2.0")) {
|
|
51
32
|
return panel.locator('[role="cell"]');
|
|
52
33
|
}
|
|
53
34
|
return panel.locator('[role="gridcell"]');
|
|
@@ -66,7 +47,7 @@ class Panel extends GrafanaPage.GrafanaPage {
|
|
|
66
47
|
this.ctx.selectors.components.Panels.Panel.menuItems(options?.parentItem ?? "")
|
|
67
48
|
);
|
|
68
49
|
let menuItem = this.getByGrafanaSelector(this.ctx.selectors.components.Panels.Panel.menuItems(item));
|
|
69
|
-
if (
|
|
50
|
+
if (version.lt(this.ctx.grafanaVersion, "9.5.0")) {
|
|
70
51
|
panelMenu = this.locator.getByRole("heading");
|
|
71
52
|
parentMenuItem = this.ctx.page.getByText(options?.parentItem ?? "");
|
|
72
53
|
menuItem = this.ctx.page.getByRole("menu").getByText(item);
|
|
@@ -112,7 +93,7 @@ class Panel extends GrafanaPage.GrafanaPage {
|
|
|
112
93
|
*/
|
|
113
94
|
getErrorIcon() {
|
|
114
95
|
let selector = this.ctx.selectors.components.Panels.Panel.status(ERROR_STATUS);
|
|
115
|
-
if (
|
|
96
|
+
if (version.lt(this.ctx.grafanaVersion, "9.5.0")) {
|
|
116
97
|
selector = this.ctx.selectors.components.Panels.Panel.headerCornerInfo(ERROR_STATUS);
|
|
117
98
|
}
|
|
118
99
|
return this.getByGrafanaSelector(selector, {
|
|
@@ -5,7 +5,7 @@ var UnitPicker = require('./UnitPicker.js');
|
|
|
5
5
|
var Select = require('./Select.js');
|
|
6
6
|
var MultiSelect = require('./MultiSelect.js');
|
|
7
7
|
var Switch = require('./Switch.js');
|
|
8
|
-
var
|
|
8
|
+
var version = require('../../utils/version.js');
|
|
9
9
|
var RadioGroup = require('./RadioGroup.js');
|
|
10
10
|
var utils = require('../utils.js');
|
|
11
11
|
|
|
@@ -34,7 +34,7 @@ class PanelEditOptionsGroup {
|
|
|
34
34
|
await this.getOptionsGroupToggle().click();
|
|
35
35
|
}
|
|
36
36
|
getRadioGroup(label) {
|
|
37
|
-
if (
|
|
37
|
+
if (version.gte(this.ctx.grafanaVersion, "10.2.0")) {
|
|
38
38
|
return new RadioGroup.RadioGroup(this.ctx, this.getFieldLocator(label).getByRole("radiogroup"));
|
|
39
39
|
}
|
|
40
40
|
return new RadioGroup.RadioGroup(this.ctx, this.getFieldLocator(label));
|
|
@@ -49,7 +49,7 @@ class PanelEditOptionsGroup {
|
|
|
49
49
|
return this.getFieldLocator(label).getByRole("spinbutton");
|
|
50
50
|
}
|
|
51
51
|
getSliderInput(label) {
|
|
52
|
-
if (
|
|
52
|
+
if (version.gte(this.ctx.grafanaVersion, "9.1.0") && version.lt(this.ctx.grafanaVersion, "13.1.0-25389005429")) {
|
|
53
53
|
return this.getNumberInput(label);
|
|
54
54
|
}
|
|
55
55
|
return this.getTextInput(label);
|
|
@@ -74,7 +74,7 @@ class PanelEditOptionsGroup {
|
|
|
74
74
|
}
|
|
75
75
|
getOptionsGroupToggle() {
|
|
76
76
|
const selector = utils.resolveGrafanaSelector(this.ctx.selectors.components.OptionsGroup.toggle(this.groupLabel));
|
|
77
|
-
if (
|
|
77
|
+
if (version.gte(this.ctx.grafanaVersion, "10.0.0")) {
|
|
78
78
|
return this.element.locator(selector);
|
|
79
79
|
}
|
|
80
80
|
return this.element.locator(selector).getByRole("button");
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var ComponentBase = require('./ComponentBase.js');
|
|
4
|
-
var
|
|
4
|
+
var version = require('../../utils/version.js');
|
|
5
5
|
|
|
6
6
|
class RadioGroup extends ComponentBase.ComponentBase {
|
|
7
7
|
constructor(ctx, element) {
|
|
8
8
|
super(ctx, element);
|
|
9
9
|
}
|
|
10
10
|
async check(labelOrValue, options) {
|
|
11
|
-
if (
|
|
11
|
+
if (version.gte(this.ctx.grafanaVersion, "10.2.0")) {
|
|
12
12
|
return this.element.getByLabel(labelOrValue, { exact: true }).check(options);
|
|
13
13
|
}
|
|
14
14
|
return this.element.getByText(labelOrValue, { exact: true }).check(options);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var ComponentBase = require('./ComponentBase.js');
|
|
4
|
-
var
|
|
4
|
+
var version = require('../../utils/version.js');
|
|
5
5
|
|
|
6
6
|
var __defProp = Object.defineProperty;
|
|
7
7
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
@@ -13,7 +13,7 @@ class Switch extends ComponentBase.ComponentBase {
|
|
|
13
13
|
this.group = group;
|
|
14
14
|
}
|
|
15
15
|
static getElement(ctx, group) {
|
|
16
|
-
if (
|
|
16
|
+
if (version.gte(ctx.grafanaVersion, "11.5.0")) {
|
|
17
17
|
return group.getByRole("switch");
|
|
18
18
|
} else {
|
|
19
19
|
return group.getByRole("checkbox");
|
|
@@ -32,7 +32,7 @@ class Switch extends ComponentBase.ComponentBase {
|
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
34
|
async getSwitch(options) {
|
|
35
|
-
if (
|
|
35
|
+
if (version.lt(this.ctx.grafanaVersion, "11.3.0")) {
|
|
36
36
|
const id = await this.element.getAttribute("id", options);
|
|
37
37
|
return this.group.locator(`label[for='${id}']`);
|
|
38
38
|
}
|
|
@@ -1,27 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var version = require('../../utils/version.js');
|
|
4
4
|
var ScopedComponent = require('./ScopedComponent.js');
|
|
5
5
|
|
|
6
|
-
function _interopNamespaceDefault(e) {
|
|
7
|
-
var n = Object.create(null);
|
|
8
|
-
if (e) {
|
|
9
|
-
Object.keys(e).forEach(function (k) {
|
|
10
|
-
if (k !== 'default') {
|
|
11
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
12
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
13
|
-
enumerable: true,
|
|
14
|
-
get: function () { return e[k]; }
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
n.default = e;
|
|
20
|
-
return Object.freeze(n);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
var semver__namespace = /*#__PURE__*/_interopNamespaceDefault(semver);
|
|
24
|
-
|
|
25
6
|
class TimeRange extends ScopedComponent.ScopedComponent {
|
|
26
7
|
/**
|
|
27
8
|
* Opens the time picker and sets the time range to the provided values
|
|
@@ -34,7 +15,7 @@ class TimeRange extends ScopedComponent.ScopedComponent {
|
|
|
34
15
|
await this.ctx.page.locator('[aria-controls="TimePickerContent"]').last().click();
|
|
35
16
|
}
|
|
36
17
|
if (zone) {
|
|
37
|
-
const changeTimeSettingsButton =
|
|
18
|
+
const changeTimeSettingsButton = version.gte(this.ctx.grafanaVersion, "11.0.0") ? this.getByGrafanaSelector(TimeZonePicker.changeTimeSettingsButton) : this.ctx.page.getByRole("button", { name: "Change time settings" });
|
|
38
19
|
await changeTimeSettingsButton.click();
|
|
39
20
|
await this.getByGrafanaSelector(TimeZonePicker.containerV2).click();
|
|
40
21
|
await this.getByGrafanaSelector(Select.option).filter({ hasText: zone }).click();
|
|
@@ -1,30 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var version = require('../../utils/version.js');
|
|
4
4
|
var GrafanaPage = require('./GrafanaPage.js');
|
|
5
5
|
var AlertRuleQuery = require('../components/AlertRuleQuery.js');
|
|
6
6
|
var test = require('@playwright/test');
|
|
7
7
|
var isFeatureToggleEnabled = require('../../fixtures/isFeatureToggleEnabled.js');
|
|
8
8
|
|
|
9
|
-
function _interopNamespaceDefault(e) {
|
|
10
|
-
var n = Object.create(null);
|
|
11
|
-
if (e) {
|
|
12
|
-
Object.keys(e).forEach(function (k) {
|
|
13
|
-
if (k !== 'default') {
|
|
14
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
15
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
16
|
-
enumerable: true,
|
|
17
|
-
get: function () { return e[k]; }
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
n.default = e;
|
|
23
|
-
return Object.freeze(n);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
var semver__namespace = /*#__PURE__*/_interopNamespaceDefault(semver);
|
|
27
|
-
|
|
28
9
|
const QUERY_AND_EXPRESSION_STEP_ID = "2";
|
|
29
10
|
const ALERT_PAGE_READY_TIMEOUT = 15e3;
|
|
30
11
|
class AlertRuleEditPage extends GrafanaPage.GrafanaPage {
|
|
@@ -45,7 +26,7 @@ class AlertRuleEditPage extends GrafanaPage.GrafanaPage {
|
|
|
45
26
|
* Returns a locator for hte alert rule name field
|
|
46
27
|
*/
|
|
47
28
|
get alertRuleNameField() {
|
|
48
|
-
if (
|
|
29
|
+
if (version.gte(this.ctx.grafanaVersion, "11.1.0")) {
|
|
49
30
|
return this.getByGrafanaSelector(this.ctx.selectors.components.AlertRules.ruleNameField);
|
|
50
31
|
}
|
|
51
32
|
return this.ctx.page.getByPlaceholder("Give your alert rule a name");
|
|
@@ -151,7 +132,7 @@ class AlertRuleEditPage extends GrafanaPage.GrafanaPage {
|
|
|
151
132
|
*/
|
|
152
133
|
async evaluate(options) {
|
|
153
134
|
await this.ctx.page.waitForTimeout(1e3);
|
|
154
|
-
if (
|
|
135
|
+
if (version.gte(this.ctx.grafanaVersion, "10.0.0")) {
|
|
155
136
|
await this.ctx.page.route(this.ctx.selectors.apis.Alerting.eval, async (route) => {
|
|
156
137
|
const response = await route.fetch();
|
|
157
138
|
if (!response.ok()) {
|
|
@@ -171,7 +152,7 @@ class AlertRuleEditPage extends GrafanaPage.GrafanaPage {
|
|
|
171
152
|
options
|
|
172
153
|
);
|
|
173
154
|
let evaluateButton = this.getByGrafanaSelector(this.ctx.selectors.components.AlertRules.previewButton);
|
|
174
|
-
if (
|
|
155
|
+
if (version.lt(this.ctx.grafanaVersion, "11.1.0")) {
|
|
175
156
|
evaluateButton = this.ctx.page.getByRole("button", { name: "Preview", exact: true });
|
|
176
157
|
}
|
|
177
158
|
await test.expect(evaluateButton).toBeVisible({ timeout: ALERT_PAGE_READY_TIMEOUT });
|
|
@@ -1,28 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var version = require('../../utils/version.js');
|
|
4
4
|
var DataSourcePicker = require('../components/DataSourcePicker.js');
|
|
5
5
|
var GrafanaPage = require('./GrafanaPage.js');
|
|
6
6
|
|
|
7
|
-
function _interopNamespaceDefault(e) {
|
|
8
|
-
var n = Object.create(null);
|
|
9
|
-
if (e) {
|
|
10
|
-
Object.keys(e).forEach(function (k) {
|
|
11
|
-
if (k !== 'default') {
|
|
12
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
13
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
14
|
-
enumerable: true,
|
|
15
|
-
get: function () { return e[k]; }
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
n.default = e;
|
|
21
|
-
return Object.freeze(n);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
var semver__namespace = /*#__PURE__*/_interopNamespaceDefault(semver);
|
|
25
|
-
|
|
26
7
|
var __defProp = Object.defineProperty;
|
|
27
8
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
28
9
|
var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
|
|
@@ -41,7 +22,7 @@ class AnnotationEditPage extends GrafanaPage.GrafanaPage {
|
|
|
41
22
|
const { Dashboard, AddDashboard } = this.ctx.selectors.pages;
|
|
42
23
|
const url = this.args.dashboard?.uid ? `${Dashboard.url(this.args.dashboard.uid)}?${Dashboard.Settings.Annotations.Edit.urlParams(this.args.id)}` : AddDashboard.Settings.Annotations.Edit.url(this.args.id);
|
|
43
24
|
await super.navigate(url, options);
|
|
44
|
-
if (
|
|
25
|
+
if (version.lt(this.ctx.grafanaVersion, "9.2.0") && this.args.id) {
|
|
45
26
|
const list = this.ctx.page.locator("tbody tr");
|
|
46
27
|
const variables = await list.all();
|
|
47
28
|
await variables[Number(this.args.id)].click();
|
|
@@ -56,7 +37,7 @@ class AnnotationEditPage extends GrafanaPage.GrafanaPage {
|
|
|
56
37
|
(resp) => resp.url().includes(this.ctx.selectors.apis.DataSource.query),
|
|
57
38
|
options
|
|
58
39
|
);
|
|
59
|
-
const testButton =
|
|
40
|
+
const testButton = version.gte(this.ctx.grafanaVersion, "11.0.0") ? this.getByGrafanaSelector(this.ctx.selectors.components.Annotations.editor.testButton) : this.ctx.page.getByRole("button", { name: "TEST" });
|
|
60
41
|
await testButton.click();
|
|
61
42
|
return responsePromise;
|
|
62
43
|
}
|
|
@@ -1,28 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var version = require('../../utils/version.js');
|
|
4
4
|
var AnnotationEditPage = require('./AnnotationEditPage.js');
|
|
5
5
|
var GrafanaPage = require('./GrafanaPage.js');
|
|
6
6
|
|
|
7
|
-
function _interopNamespaceDefault(e) {
|
|
8
|
-
var n = Object.create(null);
|
|
9
|
-
if (e) {
|
|
10
|
-
Object.keys(e).forEach(function (k) {
|
|
11
|
-
if (k !== 'default') {
|
|
12
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
13
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
14
|
-
enumerable: true,
|
|
15
|
-
get: function () { return e[k]; }
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
n.default = e;
|
|
21
|
-
return Object.freeze(n);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
var semver__namespace = /*#__PURE__*/_interopNamespaceDefault(semver);
|
|
25
|
-
|
|
26
7
|
class AnnotationPage extends GrafanaPage.GrafanaPage {
|
|
27
8
|
constructor(ctx, dashboard) {
|
|
28
9
|
super(ctx, dashboard);
|
|
@@ -45,7 +26,7 @@ class AnnotationPage extends GrafanaPage.GrafanaPage {
|
|
|
45
26
|
if (!this.dashboard?.uid) {
|
|
46
27
|
await this.getByGrafanaSelector(addAnnotationCTAV2).click();
|
|
47
28
|
} else {
|
|
48
|
-
const newQueryButton =
|
|
29
|
+
const newQueryButton = version.gte(this.ctx.grafanaVersion, "11.0.0") ? this.getByGrafanaSelector(addAnnotationCTAV2) : this.ctx.page.getByRole("button", { name: "New query" });
|
|
49
30
|
await newQueryButton.click();
|
|
50
31
|
}
|
|
51
32
|
const editIndex = await this.ctx.page.evaluate(() => {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var version = require('../../utils/version.js');
|
|
4
4
|
var test = require('@playwright/test');
|
|
5
5
|
var DataSourcePicker = require('../components/DataSourcePicker.js');
|
|
6
6
|
var GrafanaPage = require('./GrafanaPage.js');
|
|
@@ -10,25 +10,6 @@ var Panel = require('../components/Panel.js');
|
|
|
10
10
|
var isFeatureToggleEnabled = require('../../fixtures/isFeatureToggleEnabled.js');
|
|
11
11
|
var utils = require('../utils.js');
|
|
12
12
|
|
|
13
|
-
function _interopNamespaceDefault(e) {
|
|
14
|
-
var n = Object.create(null);
|
|
15
|
-
if (e) {
|
|
16
|
-
Object.keys(e).forEach(function (k) {
|
|
17
|
-
if (k !== 'default') {
|
|
18
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
19
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
20
|
-
enumerable: true,
|
|
21
|
-
get: function () { return e[k]; }
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
n.default = e;
|
|
27
|
-
return Object.freeze(n);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
var semver__namespace = /*#__PURE__*/_interopNamespaceDefault(semver);
|
|
31
|
-
|
|
32
13
|
var __defProp = Object.defineProperty;
|
|
33
14
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
34
15
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
@@ -76,10 +57,10 @@ class DashboardPage extends GrafanaPage.GrafanaPage {
|
|
|
76
57
|
*/
|
|
77
58
|
get toolbar() {
|
|
78
59
|
const { components, pages } = this.ctx.selectors;
|
|
79
|
-
if (
|
|
60
|
+
if (version.gte(this.ctx.grafanaVersion, "11.1.0")) {
|
|
80
61
|
return this.getByGrafanaSelector(pages.Dashboard.Controls);
|
|
81
62
|
}
|
|
82
|
-
return
|
|
63
|
+
return version.gte(this.ctx.grafanaVersion, "9.4.0") ? this.getByGrafanaSelector(components.NavToolbar.container) : this.ctx.page.locator(".page-toolbar");
|
|
83
64
|
}
|
|
84
65
|
/**
|
|
85
66
|
* Scrolls the page viewport-by-viewport to trigger below-fold panel queries.
|
|
@@ -143,7 +124,7 @@ class DashboardPage extends GrafanaPage.GrafanaPage {
|
|
|
143
124
|
*/
|
|
144
125
|
getPanelByTitle(title) {
|
|
145
126
|
let locator = this.getByGrafanaSelector(this.ctx.selectors.components.Panels.Panel.title(title));
|
|
146
|
-
if (
|
|
127
|
+
if (version.lt(this.ctx.grafanaVersion, "9.5.0")) {
|
|
147
128
|
locator = locator.locator("..").locator("..");
|
|
148
129
|
}
|
|
149
130
|
return new Panel.Panel(this.ctx, locator);
|
|
@@ -157,7 +138,7 @@ class DashboardPage extends GrafanaPage.GrafanaPage {
|
|
|
157
138
|
* await expect(panel.fieldNames()).toContainText(['time', 'temperature']);
|
|
158
139
|
*/
|
|
159
140
|
getPanelById(panelId) {
|
|
160
|
-
if (
|
|
141
|
+
if (version.lt(this.ctx.grafanaVersion, "11.3.0")) {
|
|
161
142
|
return new Panel.Panel(this.ctx, this.ctx.page.locator(`[data-panelid="${panelId}"]`));
|
|
162
143
|
}
|
|
163
144
|
return new Panel.Panel(this.ctx, this.ctx.page.locator(`[data-viz-panel-key="panel-${panelId}"]`));
|
|
@@ -168,7 +149,7 @@ class DashboardPage extends GrafanaPage.GrafanaPage {
|
|
|
168
149
|
async addPanel() {
|
|
169
150
|
const { components, pages, constants } = this.ctx.selectors;
|
|
170
151
|
let scenesEnabled = true;
|
|
171
|
-
if (
|
|
152
|
+
if (version.lt(this.ctx.grafanaVersion, "13.0.0")) {
|
|
172
153
|
scenesEnabled = await isFeatureToggleEnabled.isLegacyFeatureEnabled(this.ctx.page, "dashboardScene");
|
|
173
154
|
}
|
|
174
155
|
if (scenesEnabled && this.dashboard?.uid) {
|
|
@@ -183,7 +164,7 @@ class DashboardPage extends GrafanaPage.GrafanaPage {
|
|
|
183
164
|
await showMoreItems.click();
|
|
184
165
|
}
|
|
185
166
|
}
|
|
186
|
-
const useNewSidebarLayout =
|
|
167
|
+
const useNewSidebarLayout = version.gte(this.ctx.grafanaVersion, "13.0.0") && await isFeatureToggleEnabled.isLegacyFeatureEnabled(this.ctx.page, "dashboardNewLayouts");
|
|
187
168
|
if (useNewSidebarLayout) {
|
|
188
169
|
await this.ctx.page.waitForSelector(utils.resolveGrafanaSelector(this.ctx.selectors.components.Sidebar.container));
|
|
189
170
|
const newPanelButton = this.getByGrafanaSelector(components.Sidebar.newPanelButton);
|
|
@@ -191,9 +172,9 @@ class DashboardPage extends GrafanaPage.GrafanaPage {
|
|
|
191
172
|
await this.getByGrafanaSelector(pages.Dashboard.Sidebar.addButton).click();
|
|
192
173
|
}
|
|
193
174
|
await this.getByGrafanaSelector(components.Sidebar.newPanelButton).click();
|
|
194
|
-
const configureButton =
|
|
175
|
+
const configureButton = version.lt(this.ctx.grafanaVersion, "13.1.0") ? this.getByGrafanaSelector(components.Sidebar.container).getByRole("button", { name: "Configure" }) : this.getByGrafanaSelector(components.Sidebar.configurePanelButton);
|
|
195
176
|
await configureButton.click();
|
|
196
|
-
} else if (
|
|
177
|
+
} else if (version.gte(this.ctx.grafanaVersion, "9.5.0")) {
|
|
197
178
|
let addButton = this.getByGrafanaSelector(
|
|
198
179
|
components.PageToolbar.itemButton(constants.PageToolBar.itemButtonTitle)
|
|
199
180
|
);
|
|
@@ -1,30 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var version = require('../../utils/version.js');
|
|
4
4
|
var DataSourcePicker = require('../components/DataSourcePicker.js');
|
|
5
5
|
var GrafanaPage = require('./GrafanaPage.js');
|
|
6
6
|
var TimeRange = require('../components/TimeRange.js');
|
|
7
7
|
var Panel = require('../components/Panel.js');
|
|
8
8
|
|
|
9
|
-
function _interopNamespaceDefault(e) {
|
|
10
|
-
var n = Object.create(null);
|
|
11
|
-
if (e) {
|
|
12
|
-
Object.keys(e).forEach(function (k) {
|
|
13
|
-
if (k !== 'default') {
|
|
14
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
15
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
16
|
-
enumerable: true,
|
|
17
|
-
get: function () { return e[k]; }
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
n.default = e;
|
|
23
|
-
return Object.freeze(n);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
var semver__namespace = /*#__PURE__*/_interopNamespaceDefault(semver);
|
|
27
|
-
|
|
28
9
|
var __defProp = Object.defineProperty;
|
|
29
10
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
30
11
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
@@ -53,9 +34,9 @@ class ExplorePage extends GrafanaPage.GrafanaPage {
|
|
|
53
34
|
let locator = this.getByGrafanaSelector(this.ctx.selectors.components.Panels.Panel.title(suffix), {
|
|
54
35
|
startsWith: true
|
|
55
36
|
});
|
|
56
|
-
if (
|
|
37
|
+
if (version.lt(this.ctx.grafanaVersion, "9.3.0")) {
|
|
57
38
|
locator = page.getByText(suffix).locator("..").locator("..").locator("..");
|
|
58
|
-
} else if (
|
|
39
|
+
} else if (version.lt(this.ctx.grafanaVersion, "10.0.0")) {
|
|
59
40
|
locator = page.getByRole("button", { name: text }).locator("..");
|
|
60
41
|
}
|
|
61
42
|
return locator;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var version = require('../../utils/version.js');
|
|
4
4
|
var test = require('@playwright/test');
|
|
5
5
|
var DataSourcePicker = require('../components/DataSourcePicker.js');
|
|
6
6
|
var GrafanaPage = require('./GrafanaPage.js');
|
|
@@ -10,25 +10,6 @@ var utils = require('../utils.js');
|
|
|
10
10
|
var DashboardPage = require('./DashboardPage.js');
|
|
11
11
|
var PanelEditOptionsGroup = require('../components/PanelEditOptionsGroup.js');
|
|
12
12
|
|
|
13
|
-
function _interopNamespaceDefault(e) {
|
|
14
|
-
var n = Object.create(null);
|
|
15
|
-
if (e) {
|
|
16
|
-
Object.keys(e).forEach(function (k) {
|
|
17
|
-
if (k !== 'default') {
|
|
18
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
19
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
20
|
-
enumerable: true,
|
|
21
|
-
get: function () { return e[k]; }
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
n.default = e;
|
|
27
|
-
return Object.freeze(n);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
var semver__namespace = /*#__PURE__*/_interopNamespaceDefault(semver);
|
|
31
|
-
|
|
32
13
|
var __defProp = Object.defineProperty;
|
|
33
14
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
34
15
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
@@ -48,7 +29,7 @@ class PanelEditPage extends GrafanaPage.GrafanaPage {
|
|
|
48
29
|
const locator = this.getByGrafanaSelector(this.ctx.selectors.components.Panels.Panel.title(""), {
|
|
49
30
|
startsWith: true
|
|
50
31
|
});
|
|
51
|
-
if (
|
|
32
|
+
if (version.lt(this.ctx.grafanaVersion, "9.5.0")) {
|
|
52
33
|
return locator.locator("..").locator("..");
|
|
53
34
|
}
|
|
54
35
|
return locator;
|
|
@@ -66,7 +47,7 @@ class PanelEditPage extends GrafanaPage.GrafanaPage {
|
|
|
66
47
|
async toggleTableView() {
|
|
67
48
|
await utils.radioButtonSetChecked(this.ctx.page, "Table view", true);
|
|
68
49
|
let locator = this.getByGrafanaSelector(this.ctx.selectors.components.Panels.Panel.title(""));
|
|
69
|
-
if (
|
|
50
|
+
if (version.lt(this.ctx.grafanaVersion, "10.4.0")) {
|
|
70
51
|
locator = this.ctx.page.getByRole("table");
|
|
71
52
|
}
|
|
72
53
|
this.panel = new Panel.Panel(this.ctx, locator);
|
|
@@ -86,7 +67,7 @@ class PanelEditPage extends GrafanaPage.GrafanaPage {
|
|
|
86
67
|
const { OptionsGroup, PanelEditor } = this.ctx.selectors.components;
|
|
87
68
|
const sectionGroupTitle = "Panel options";
|
|
88
69
|
await this.collapseSection(sectionGroupTitle);
|
|
89
|
-
const vizInput =
|
|
70
|
+
const vizInput = version.gte(this.ctx.grafanaVersion, "11.0.0") ? this.getByGrafanaSelector(PanelEditor.OptionsPane.fieldInput(TITLE)) : this.getByGrafanaSelector(OptionsGroup.group(sectionGroupTitle)).locator("input").first();
|
|
90
71
|
await vizInput.fill(titleText);
|
|
91
72
|
await this.ctx.page.keyboard.press("Tab");
|
|
92
73
|
}
|
|
@@ -100,7 +81,7 @@ class PanelEditPage extends GrafanaPage.GrafanaPage {
|
|
|
100
81
|
if (showPanelEditElementCount > 0) {
|
|
101
82
|
await showPanelEditElement.click();
|
|
102
83
|
}
|
|
103
|
-
if (
|
|
84
|
+
if (version.gte(this.ctx.grafanaVersion, "12.4.0")) {
|
|
104
85
|
const allVisualizationsTab = components.Tab.title(constants.Tab.title);
|
|
105
86
|
if (!await this.getByGrafanaSelector(allVisualizationsTab).isVisible()) {
|
|
106
87
|
await this.getByGrafanaSelector(components.PanelEditor.toggleVizPicker).click();
|
|
@@ -110,7 +91,7 @@ class PanelEditPage extends GrafanaPage.GrafanaPage {
|
|
|
110
91
|
await this.getByGrafanaSelector(components.PanelEditor.toggleVizPicker).click();
|
|
111
92
|
}
|
|
112
93
|
await this.getByGrafanaSelector(components.PluginVisualization.item(visualization)).click();
|
|
113
|
-
const vizSelector =
|
|
94
|
+
const vizSelector = version.lt(this.ctx.grafanaVersion, "12.4.0") ? components.PanelEditor.toggleVizPicker : components.PanelEditor.OptionsPane.header;
|
|
114
95
|
await test.expect(
|
|
115
96
|
this.getByGrafanaSelector(vizSelector),
|
|
116
97
|
`Could not set visualization to ${visualization}. Ensure the panel is installed.`
|
|
@@ -133,7 +114,7 @@ class PanelEditPage extends GrafanaPage.GrafanaPage {
|
|
|
133
114
|
* Returns the name of the visualization currently selected in the panel editor
|
|
134
115
|
*/
|
|
135
116
|
getVisualizationName() {
|
|
136
|
-
const vizSelector =
|
|
117
|
+
const vizSelector = version.lt(this.ctx.grafanaVersion, "12.4.0") ? this.ctx.selectors.components.PanelEditor.toggleVizPicker : this.ctx.selectors.components.PanelEditor.OptionsPane.header;
|
|
137
118
|
return this.getByGrafanaSelector(vizSelector);
|
|
138
119
|
}
|
|
139
120
|
/**
|
|
@@ -141,7 +122,7 @@ class PanelEditPage extends GrafanaPage.GrafanaPage {
|
|
|
141
122
|
* In versions prior to 11.3.0, this method clicks the "Apply" button instead
|
|
142
123
|
*/
|
|
143
124
|
async backToDashboard() {
|
|
144
|
-
if (
|
|
125
|
+
if (version.gte(this.ctx.grafanaVersion, "11.3.0")) {
|
|
145
126
|
await this.getByGrafanaSelector(
|
|
146
127
|
this.ctx.selectors.components.NavToolbar.editDashboard.backToDashboardButton
|
|
147
128
|
).click();
|
|
@@ -1,29 +1,10 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var version = require('../../utils/version.js');
|
|
4
4
|
var test = require('@playwright/test');
|
|
5
5
|
var DataSourcePicker = require('../components/DataSourcePicker.js');
|
|
6
6
|
var GrafanaPage = require('./GrafanaPage.js');
|
|
7
7
|
|
|
8
|
-
function _interopNamespaceDefault(e) {
|
|
9
|
-
var n = Object.create(null);
|
|
10
|
-
if (e) {
|
|
11
|
-
Object.keys(e).forEach(function (k) {
|
|
12
|
-
if (k !== 'default') {
|
|
13
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
14
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
15
|
-
enumerable: true,
|
|
16
|
-
get: function () { return e[k]; }
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
n.default = e;
|
|
22
|
-
return Object.freeze(n);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
var semver__namespace = /*#__PURE__*/_interopNamespaceDefault(semver);
|
|
26
|
-
|
|
27
8
|
var __defProp = Object.defineProperty;
|
|
28
9
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
29
10
|
var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
|
|
@@ -42,7 +23,7 @@ class VariableEditPage extends GrafanaPage.GrafanaPage {
|
|
|
42
23
|
const { Dashboard, AddDashboard } = this.ctx.selectors.pages;
|
|
43
24
|
const url = this.args.dashboard?.uid ? `${Dashboard.url(this.args.dashboard.uid)}?${Dashboard.Settings.Variables.Edit.urlParams(this.args.id)}` : AddDashboard.Settings.Variables.Edit.url(this.args.id);
|
|
44
25
|
await super.navigate(url, options);
|
|
45
|
-
if (
|
|
26
|
+
if (version.lt(this.ctx.grafanaVersion, "9.2.0") && this.args.id) {
|
|
46
27
|
const list = await this.getByGrafanaSelector(
|
|
47
28
|
this.ctx.selectors.pages.Dashboard.Settings.Variables.List.table
|
|
48
29
|
).locator("tbody tr");
|
|
@@ -72,7 +53,7 @@ class VariableEditPage extends GrafanaPage.GrafanaPage {
|
|
|
72
53
|
* @example await this.ctx.page.waitForResponse((resp) => resp.url().includes('<url>')
|
|
73
54
|
*/
|
|
74
55
|
async runQuery() {
|
|
75
|
-
if (
|
|
56
|
+
if (version.gte(this.ctx.grafanaVersion, "9.2.0")) {
|
|
76
57
|
await this.getByGrafanaSelector(
|
|
77
58
|
this.ctx.selectors.pages.Dashboard.Settings.Variables.Edit.General.submitButton
|
|
78
59
|
).click();
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function parseVer(v) {
|
|
4
|
+
const cleaned = v.split("+")[0];
|
|
5
|
+
const dash = cleaned.indexOf("-");
|
|
6
|
+
const base = dash === -1 ? cleaned : cleaned.slice(0, dash);
|
|
7
|
+
const preStr = dash === -1 ? "" : cleaned.slice(dash + 1);
|
|
8
|
+
const [ma = 0, mi = 0, pa = 0] = base.split(".").map((s) => parseInt(s, 10));
|
|
9
|
+
return {
|
|
10
|
+
major: ma,
|
|
11
|
+
minor: mi,
|
|
12
|
+
patch: pa,
|
|
13
|
+
pre: preStr ? preStr.split(".") : null
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function cmpPre(a, b) {
|
|
17
|
+
const len = Math.max(a.length, b.length);
|
|
18
|
+
for (let i = 0; i < len; i++) {
|
|
19
|
+
const ai = a[i];
|
|
20
|
+
const bi = b[i];
|
|
21
|
+
if (ai === void 0) {
|
|
22
|
+
return -1;
|
|
23
|
+
}
|
|
24
|
+
if (bi === void 0) {
|
|
25
|
+
return 1;
|
|
26
|
+
}
|
|
27
|
+
const aIsNum = /^\d+$/.test(ai);
|
|
28
|
+
const bIsNum = /^\d+$/.test(bi);
|
|
29
|
+
if (aIsNum && bIsNum) {
|
|
30
|
+
const diff = parseInt(ai, 10) - parseInt(bi, 10);
|
|
31
|
+
if (diff !== 0) {
|
|
32
|
+
return diff;
|
|
33
|
+
}
|
|
34
|
+
} else if (aIsNum) {
|
|
35
|
+
return -1;
|
|
36
|
+
} else if (bIsNum) {
|
|
37
|
+
return 1;
|
|
38
|
+
} else if (ai < bi) {
|
|
39
|
+
return -1;
|
|
40
|
+
} else if (ai > bi) {
|
|
41
|
+
return 1;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return 0;
|
|
45
|
+
}
|
|
46
|
+
function cmp(a, b) {
|
|
47
|
+
const va = parseVer(a);
|
|
48
|
+
const vb = parseVer(b);
|
|
49
|
+
if (va.major !== vb.major) {
|
|
50
|
+
return va.major - vb.major;
|
|
51
|
+
}
|
|
52
|
+
if (va.minor !== vb.minor) {
|
|
53
|
+
return va.minor - vb.minor;
|
|
54
|
+
}
|
|
55
|
+
if (va.patch !== vb.patch) {
|
|
56
|
+
return va.patch - vb.patch;
|
|
57
|
+
}
|
|
58
|
+
if (!va.pre && !vb.pre) {
|
|
59
|
+
return 0;
|
|
60
|
+
}
|
|
61
|
+
if (!va.pre) {
|
|
62
|
+
return 1;
|
|
63
|
+
}
|
|
64
|
+
if (!vb.pre) {
|
|
65
|
+
return -1;
|
|
66
|
+
}
|
|
67
|
+
return cmpPre(va.pre, vb.pre);
|
|
68
|
+
}
|
|
69
|
+
const gte = (a, b) => cmp(a, b) >= 0;
|
|
70
|
+
const lt = (a, b) => cmp(a, b) < 0;
|
|
71
|
+
const lte = (a, b) => cmp(a, b) <= 0;
|
|
72
|
+
const gt = (a, b) => cmp(a, b) > 0;
|
|
73
|
+
const eq = (a, b) => cmp(a, b) === 0;
|
|
74
|
+
const satisfies = (version, range) => {
|
|
75
|
+
const orGroups = range.split("||").map((group) => group.trim());
|
|
76
|
+
return orGroups.some((group) => {
|
|
77
|
+
const comparators = group.split(/\s+/).filter(Boolean);
|
|
78
|
+
return comparators.every((comparator) => evalComparator(version, comparator));
|
|
79
|
+
});
|
|
80
|
+
};
|
|
81
|
+
function evalComparator(version, comparator) {
|
|
82
|
+
const match = comparator.match(/^(>=|<=|>|<|=)?(.+)$/);
|
|
83
|
+
if (!match) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
const [, op = "=", target] = match;
|
|
87
|
+
switch (op) {
|
|
88
|
+
case ">=":
|
|
89
|
+
return gte(version, target);
|
|
90
|
+
case "<=":
|
|
91
|
+
return lte(version, target);
|
|
92
|
+
case ">":
|
|
93
|
+
return gt(version, target);
|
|
94
|
+
case "<":
|
|
95
|
+
return lt(version, target);
|
|
96
|
+
case "=":
|
|
97
|
+
default:
|
|
98
|
+
return eq(version, target);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
exports.eq = eq;
|
|
103
|
+
exports.gt = gt;
|
|
104
|
+
exports.gte = gte;
|
|
105
|
+
exports.lt = lt;
|
|
106
|
+
exports.lte = lte;
|
|
107
|
+
exports.satisfies = satisfies;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@grafana/plugin-e2e",
|
|
3
|
-
"version": "3.9.
|
|
3
|
+
"version": "3.9.1",
|
|
4
4
|
"main": "./dist/index.js",
|
|
5
5
|
"types": "./dist/index.d.ts",
|
|
6
6
|
"files": [
|
|
@@ -46,14 +46,10 @@
|
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"@axe-core/playwright": "^4.11.1",
|
|
48
48
|
"@playwright/test": "^1.58.1",
|
|
49
|
-
"@types/uuid": "^11.0.0",
|
|
50
49
|
"dotenv": "^17.2.4"
|
|
51
50
|
},
|
|
52
51
|
"dependencies": {
|
|
53
52
|
"@grafana/e2e-selectors": "13.1.0-25644485979",
|
|
54
|
-
"semver": "^7.5.4",
|
|
55
|
-
"uuid": "^13.0.0",
|
|
56
53
|
"yaml": "^2.3.4"
|
|
57
|
-
}
|
|
58
|
-
"gitHead": "57e7611bcbbd068694bda70df57fa86008dd3353"
|
|
54
|
+
}
|
|
59
55
|
}
|