From d974911b434311b2ca3c572555a84f6ad187028b Mon Sep 17 00:00:00 2001 From: Roman M Date: Mon, 27 Jan 2025 16:13:12 +0100 Subject: [PATCH 01/12] Add single quotes --- .../repeat_by_variable_issue_712.json | 463 ++++++++++++++++++ src/datasource/sql-query/sql-query-helper.ts | 3 +- 2 files changed, 465 insertions(+), 1 deletion(-) create mode 100644 docker/grafana/dashboards/repeat_by_variable_issue_712.json diff --git a/docker/grafana/dashboards/repeat_by_variable_issue_712.json b/docker/grafana/dashboards/repeat_by_variable_issue_712.json new file mode 100644 index 000000000..276330936 --- /dev/null +++ b/docker/grafana/dashboards/repeat_by_variable_issue_712.json @@ -0,0 +1,463 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 3785, + "links": [], + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 3, + "panels": [], + "title": "No repeat, no single quotes", + "type": "row" + }, + { + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 1 + }, + "id": 2, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "11.4.0", + "targets": [ + { + "adHocFilters": [], + "adHocValuesQuery": "", + "add_metadata": true, + "contextWindowSize": "10", + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "${datasource}" + }, + "editorMode": "builder", + "extrapolate": true, + "format": "table", + "interval": "", + "intervalFactor": 1, + "query": "SELECT (${type})", + "rawQuery": "/* grafana dashboard=Variable test 11.4, user=4 */\nSELECT ('foo','bar','baz')", + "refId": "A", + "round": "0s", + "showFormattedSQL": true, + "skip_comments": true, + "useWindowFuncForMacros": true + } + ], + "title": "No single quotes", + "type": "table" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 7 + }, + "id": 10, + "panels": [], + "title": "No repeat, single quotes", + "type": "row" + }, + { + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 8 + }, + "id": 9, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "11.4.0", + "targets": [ + { + "adHocFilters": [], + "adHocValuesQuery": "", + "add_metadata": true, + "contextWindowSize": "10", + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "${datasource}" + }, + "editorMode": "builder", + "extrapolate": true, + "format": "table", + "interval": "", + "intervalFactor": 1, + "query": "SELECT ('${type}')", + "rawQuery": "/* grafana dashboard=Variable test 11.4, user=4 */\nSELECT (''foo','bar','baz'')", + "refId": "A", + "round": "0s", + "showFormattedSQL": true, + "skip_comments": true, + "useWindowFuncForMacros": true + } + ], + "title": "No single quotes", + "type": "table" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 14 + }, + "id": 7, + "panels": [], + "title": "Repeat, single quotes", + "type": "row" + }, + { + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 15 + }, + "id": 8, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "11.4.0", + "repeat": "type", + "repeatDirection": "h", + "targets": [ + { + "adHocFilters": [], + "adHocValuesQuery": "", + "add_metadata": true, + "contextWindowSize": "10", + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "${datasource}" + }, + "editorMode": "builder", + "extrapolate": true, + "format": "table", + "interval": "", + "intervalFactor": 1, + "query": "SELECT ('${type}')", + "rawQuery": "/* grafana dashboard=Variable test 11.4, user=4 */\nSELECT (''foo','bar','baz'')", + "refId": "A", + "round": "0s", + "showFormattedSQL": true, + "skip_comments": true, + "useWindowFuncForMacros": true + } + ], + "title": "$type", + "type": "table" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 21 + }, + "id": 4, + "panels": [], + "title": "Repeat, no single quotes", + "type": "row" + }, + { + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 22 + }, + "id": 5, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "11.4.0", + "repeat": "type", + "repeatDirection": "h", + "targets": [ + { + "adHocFilters": [], + "adHocValuesQuery": "", + "add_metadata": true, + "contextWindowSize": "10", + "datasource": { + "type": "vertamedia-clickhouse-datasource", + "uid": "${datasource}" + }, + "editorMode": "builder", + "extrapolate": true, + "format": "table", + "interval": "", + "intervalFactor": 1, + "query": "SELECT (${type})", + "rawQuery": "/* grafana dashboard=Variable test 11.4, user=4 */\nSELECT (baz)", + "refId": "A", + "round": "0s", + "showFormattedSQL": true, + "skip_comments": true, + "useWindowFuncForMacros": true + } + ], + "title": "$type", + "type": "table" + } + ], + "preload": false, + "refresh": "", + "schemaVersion": 40, + "tags": [], + "templating": { + "list": [ + { + "current": { + "text": [ + "$__all" + ], + "value": [ + "$__all" + ] + }, + "includeAll": true, + "multi": true, + "name": "type", + "options": [ + { + "selected": false, + "text": "foo", + "value": "foo" + }, + { + "selected": false, + "text": "bar", + "value": "bar" + }, + { + "selected": false, + "text": "baz", + "value": "baz" + } + ], + "query": "foo, bar, baz", + "type": "custom" + }, + { + "current": { + "text": "Archer Sink", + "value": "a5617c9a-2798-477c-a708-a264b48dc43e" + }, + "name": "datasource", + "options": [], + "query": "vertamedia-clickhouse-datasource", + "refresh": 1, + "regex": "", + "type": "datasource" + } + ] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "Variable test 11.4", + "uid": "ceak279mxrim8d", + "version": 5, + "weekStart": "" +} diff --git a/src/datasource/sql-query/sql-query-helper.ts b/src/datasource/sql-query/sql-query-helper.ts index 8465a3bbc..5bc88e9a5 100644 --- a/src/datasource/sql-query/sql-query-helper.ts +++ b/src/datasource/sql-query/sql-query-helper.ts @@ -158,7 +158,7 @@ export class SqlQueryHelper { static interpolateQueryExpr(value: any, variable: any, defaultFormatFn: any) { // if no (`multiselect` or `include all`) and variable is not Array - do not escape if (!variable.multi && !variable.includeAll && !Array.isArray(value)) { - return value; + return `'${value}'` } if (!Array.isArray(value)) { return SqlQueryHelper.clickhouseEscape(value, variable); @@ -166,6 +166,7 @@ export class SqlQueryHelper { let escapedValues = value.map(function (v) { return SqlQueryHelper.clickhouseEscape(v, variable); }); + return escapedValues.join(','); } From 015cd19a1f10b79f038964c57424e7e90b243d0e Mon Sep 17 00:00:00 2001 From: antip00 Date: Fri, 31 Jan 2025 14:32:09 +0300 Subject: [PATCH 02/12] Changing expected metadata. --- tests/testflows/tests/automated/sql_editor.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/testflows/tests/automated/sql_editor.py b/tests/testflows/tests/automated/sql_editor.py index f66a44ff0..92fd62d60 100644 --- a/tests/testflows/tests/automated/sql_editor.py +++ b/tests/testflows/tests/automated/sql_editor.py @@ -57,7 +57,7 @@ def add_metadata_toggle(self): panel.click_on_the_visualization() with Then("I check reformatted query"): - assert "/* grafana dashboard=test_sql_editor, user=1 */" in sql_editor.get_reformatted_query(query_name='A'), error() + assert "/* grafana dashboard=test_sql_editor, user" in sql_editor.get_reformatted_query(query_name='A'), error() try: with Then("I click Add metadata toggle"): @@ -66,7 +66,7 @@ def add_metadata_toggle(self): with Then("I check reformatted query after clicking toggle"): with delay(): - assert not ("/* grafana dashboard=test_sql_editor, user=1 */" in sql_editor.get_reformatted_query(query_name='A')), error() + assert not ("/* grafana dashboard=test_sql_editor, user" in sql_editor.get_reformatted_query(query_name='A')), error() finally: with Finally("I return Add metadata toggle status back"): From b34e7e37d1ea6603cf898bf631267fe0235639cb Mon Sep 17 00:00:00 2001 From: antip00 Date: Fri, 31 Jan 2025 15:48:31 +0300 Subject: [PATCH 03/12] Update. --- tests/testflows/tests/automated/window_functions.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/testflows/tests/automated/window_functions.py b/tests/testflows/tests/automated/window_functions.py index 092608b2b..bb7c03817 100644 --- a/tests/testflows/tests/automated/window_functions.py +++ b/tests/testflows/tests/automated/window_functions.py @@ -90,6 +90,10 @@ def window_functions_outline(self, panel_name, panel_names, column=None): with delay(after=0.5): panel.click_discard_button() + with And("I discard changes for dashboard"): + with delay(): + dashboard.discard_changes_for_dashboard() + with Then("I save two csv files"): with delay(): with By("saving container id"): From e6f4cafb58570223dc0b2020922ef01e5a21589e Mon Sep 17 00:00:00 2001 From: antip00 Date: Fri, 31 Jan 2025 16:02:20 +0300 Subject: [PATCH 04/12] Update. --- tests/testflows/tests/automated/window_functions.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/testflows/tests/automated/window_functions.py b/tests/testflows/tests/automated/window_functions.py index bb7c03817..ca23ad419 100644 --- a/tests/testflows/tests/automated/window_functions.py +++ b/tests/testflows/tests/automated/window_functions.py @@ -90,10 +90,6 @@ def window_functions_outline(self, panel_name, panel_names, column=None): with delay(after=0.5): panel.click_discard_button() - with And("I discard changes for dashboard"): - with delay(): - dashboard.discard_changes_for_dashboard() - with Then("I save two csv files"): with delay(): with By("saving container id"): @@ -170,3 +166,7 @@ def feature(self): else: with Scenario(f"{panel_name} function"): window_functions_outline(panel_name=panel_name, panel_names=panel_names) + + with Finally("I discard changes for dashboard"): + with delay(): + dashboard.discard_changes_for_dashboard() \ No newline at end of file From 7bc372c74698e8b9dde0a26921e64f76444171bf Mon Sep 17 00:00:00 2001 From: antip00 Date: Fri, 31 Jan 2025 16:31:31 +0300 Subject: [PATCH 05/12] Update. --- tests/testflows/steps/dashboards/locators.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/testflows/steps/dashboards/locators.py b/tests/testflows/steps/dashboards/locators.py index 477696e59..cd942e49a 100644 --- a/tests/testflows/steps/dashboards/locators.py +++ b/tests/testflows/steps/dashboards/locators.py @@ -34,8 +34,8 @@ def check_mark(self, dashboard_name): def delete_button(self): driver: WebDriver = current().context.driver return driver.find_element( - SelectBy.CSS_SELECTOR, - f"[class='css-ttl745-button']" + SelectBy.XPATH, + f"//*[@data-testid='manage-actions']/button[span/text()='Delete']" ) @property From 2e64fbe7930ffe9a25bbbfaf87548a8ff14346ec Mon Sep 17 00:00:00 2001 From: antip00 Date: Fri, 31 Jan 2025 16:46:39 +0300 Subject: [PATCH 06/12] Update. --- tests/testflows/tests/automated/sql_editor.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/testflows/tests/automated/sql_editor.py b/tests/testflows/tests/automated/sql_editor.py index 92fd62d60..c7575987a 100644 --- a/tests/testflows/tests/automated/sql_editor.py +++ b/tests/testflows/tests/automated/sql_editor.py @@ -57,7 +57,8 @@ def add_metadata_toggle(self): panel.click_on_the_visualization() with Then("I check reformatted query"): - assert "/* grafana dashboard=test_sql_editor, user" in sql_editor.get_reformatted_query(query_name='A'), error() + assert "/* grafana dashboard" in sql_editor.get_reformatted_query(query_name='A'), error() + assert "test_sql_editor" in sql_editor.get_reformatted_query(query_name='A'), error() try: with Then("I click Add metadata toggle"): @@ -66,7 +67,8 @@ def add_metadata_toggle(self): with Then("I check reformatted query after clicking toggle"): with delay(): - assert not ("/* grafana dashboard=test_sql_editor, user" in sql_editor.get_reformatted_query(query_name='A')), error() + assert not ("/* grafana dashboard" in sql_editor.get_reformatted_query(query_name='A')), error() + assert not ("test_sql_editor" in sql_editor.get_reformatted_query(query_name='A')), error() finally: with Finally("I return Add metadata toggle status back"): From 2bd9447f08d3731a70ae58080fbebe8ea252057b Mon Sep 17 00:00:00 2001 From: antip00 Date: Mon, 3 Feb 2025 11:10:00 +0300 Subject: [PATCH 07/12] Updates. --- tests/testflows/steps/panel/locators.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/testflows/steps/panel/locators.py b/tests/testflows/steps/panel/locators.py index c2f0a36a4..7471fc15e 100644 --- a/tests/testflows/steps/panel/locators.py +++ b/tests/testflows/steps/panel/locators.py @@ -340,7 +340,7 @@ def refresh_button(self): def annotation_toggle(self, annotation_name): driver: WebDriver = current().context.driver - return driver.find_element(SelectBy.XPATH, f'//label[@data-testid="data-testid Dashboard template variables submenu Label {annotation_name}"]/..//label[@aria-label="Toggle switch"]') + return driver.find_element(SelectBy.XPATH, f'//label[@data-testid="data-testid Dashboard template variables submenu Label {annotation_name}"]/..//div/label') def label_textfield(self, label): driver: WebDriver = current().context.driver From 69c167d569514d55dac2aa05d3f5b27004d1ee89 Mon Sep 17 00:00:00 2001 From: antip00 Date: Mon, 3 Feb 2025 11:53:12 +0300 Subject: [PATCH 08/12] Updates. --- tests/testflows/tests/automated/e2e.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/testflows/tests/automated/e2e.py b/tests/testflows/tests/automated/e2e.py index 4bba0f47b..d46b2e2ad 100644 --- a/tests/testflows/tests/automated/e2e.py +++ b/tests/testflows/tests/automated/e2e.py @@ -188,6 +188,10 @@ def annotations_without_time_reformatting(self): with delay(): panel.take_screenshot_for_visualization(screenshot_name="event_tme_panel") + with Finally("I discard changes for panel"): + with delay(): + panel.click_discard_button() + with When("I go to Annotation event_time"): with delay(): dashboards.open_dashboard(dashboard_name="Annotation event_time") @@ -205,6 +209,14 @@ def annotations_without_time_reformatting(self): with delay(): panel.take_screenshot_for_visualization(screenshot_name="toUInt64_panel") + with Finally("I discard changes for panel"): + with delay(): + panel.click_discard_button() + + with And("I discard changes for dashboard"): + with delay(): + dashboard.discard_changes_for_dashboard() + with Then("I compare screenshots"): with delay(): assert actions.compare_screenshots_percent(screenshot_name_1="event_tme_panel", screenshot_name_2="toUInt64_panel") > 0.9, error() From a8d98d6dcac8c25b3e67386855cdea456e58bb78 Mon Sep 17 00:00:00 2001 From: antip00 Date: Mon, 3 Feb 2025 15:02:58 +0300 Subject: [PATCH 09/12] Fixing tests for new grafana version. --- .../alerting/alert_rules/new/locators.py | 4 +- tests/testflows/steps/panel/locators.py | 12 +++--- .../steps/panel/query_options/locators.py | 12 +++--- tests/testflows/steps/panel/view.py | 42 +++++++++---------- .../testflows/tests/automated/adhoc_macro.py | 28 ++++++++----- tests/testflows/tests/automated/e2e.py | 28 +++++++------ 6 files changed, 69 insertions(+), 57 deletions(-) diff --git a/tests/testflows/steps/alerting/alert_rules/new/locators.py b/tests/testflows/steps/alerting/alert_rules/new/locators.py index a2f71a87b..27b69b335 100644 --- a/tests/testflows/steps/alerting/alert_rules/new/locators.py +++ b/tests/testflows/steps/alerting/alert_rules/new/locators.py @@ -135,13 +135,13 @@ def new_folder_button(self): def new_folder_name_textfield(self): driver: WebDriver = current().context.driver return driver.find_element(SelectBy.XPATH, - f"/html/body/div[6]//*[@data-testid='data-testid alert-rule name-folder-name-field']") + f"//*[@data-testid='data-testid alert-rule name-folder-name-field']") @property def new_folder_create_button(self): driver: WebDriver = current().context.driver return driver.find_element(SelectBy.XPATH, - f"/html/body/div[6]//*[@data-testid='data-testid alert-rule name-folder-name-create-button']") + f"//*[@data-testid='data-testid alert-rule name-folder-name-create-button']") @property def new_evaluation_group_button(self): diff --git a/tests/testflows/steps/panel/locators.py b/tests/testflows/steps/panel/locators.py index 7471fc15e..22590da0d 100644 --- a/tests/testflows/steps/panel/locators.py +++ b/tests/testflows/steps/panel/locators.py @@ -316,22 +316,22 @@ def query_inspector_close_button(self): driver: WebDriver = current().context.driver return driver.find_element(SelectBy.CSS_SELECTOR, f'[data-testid="data-testid Drawer close"]') - def adhoc_dropdown(self, label, variable_number): + def adhoc_dropdown(self, label): driver: WebDriver = current().context.driver - return driver.find_element(SelectBy.XPATH, f'//label[@data-testid="data-testid Dashboard template variables submenu Label {label}"]/../div/div[1]/div[{variable_number}]//input') + return driver.find_element(SelectBy.XPATH, f'//*[@data-testid="data-testid Dashboard template variables submenu Label {label}"]/..//input') - def adhoc_grafana_single_value(self, label, variable_number): + def adhoc(self, adhoc_name): driver: WebDriver = current().context.driver - return driver.find_element(SelectBy.XPATH, f'//label[@data-testid="data-testid Dashboard template variables submenu Label {label}"]/../div/div[1]/div[{variable_number}]//*[contains(@class, "singleValue")]') + return driver.find_element(SelectBy.XPATH, f'//*[@aria-label="Edit filter with key {adhoc_name}"]') @property def add_adhoc_filter_button(self): driver: WebDriver = current().context.driver - return driver.find_element(SelectBy.CSS_SELECTOR, f'[data-testid="AdHocFilter-add"]') + return driver.find_element(SelectBy.CSS_SELECTOR, f'[placeholder="Filter by label values"]') def remove_adhoc_button(self, adhoc_name): driver: WebDriver = current().context.driver - return driver.find_element(SelectBy.CSS_SELECTOR, f'[data-testid="AdHocFilter-remove-{adhoc_name}"]') + return driver.find_element(SelectBy.CSS_SELECTOR, f'[aria-label="Remove filter with key {adhoc_name}"]') @property def refresh_button(self): diff --git a/tests/testflows/steps/panel/query_options/locators.py b/tests/testflows/steps/panel/query_options/locators.py index 7a1fb0862..00d97c052 100644 --- a/tests/testflows/steps/panel/query_options/locators.py +++ b/tests/testflows/steps/panel/query_options/locators.py @@ -15,36 +15,36 @@ def query_options_dropdown(self): def max_data_points_textfield(self): driver: WebDriver = current().context.driver return driver.find_element(SelectBy.XPATH, - f'//*[@class="gf-form" and .//text()="Max data points"]//input') + f'//input[@id="max-data-points-input"]') @property def interval_field(self): driver: WebDriver = current().context.driver return driver.find_element(SelectBy.XPATH, - f'//*[@class="gf-form" and .//text()="Interval"]/label[@class="gf-form-label width-6"]') + f'//*[@class="css-1t8vb7c"]') @property def min_interval_textfield(self): driver: WebDriver = current().context.driver - return driver.find_element(SelectBy.XPATH, f'//*[@class="gf-form" and .//text()="Min interval"]//input') + return driver.find_element(SelectBy.XPATH, f'//input[@id="min-interval-input"]') @property def relative_time_textfield(self): driver: WebDriver = current().context.driver return driver.find_element(SelectBy.XPATH, - f'//*[@class="gf-form" and .//text()="Relative time"]//input') + f'//input[@id="relative-time-input"]') @property def time_shift_textfield(self): driver: WebDriver = current().context.driver return driver.find_element(SelectBy.XPATH, - f'//*[@class="gf-form" and .//text()="Time shift"]//input') + f'//input[@id="time-shift-input"]') @property def hide_time_info_toggle(self): driver: WebDriver = current().context.driver return driver.find_element(SelectBy.XPATH, - f'//*[contains(@class,"InlineFieldRow") and .//text()="Hide time info"]//label[@aria-label="Toggle switch"]') + f'//div[@class="css-1n85obj"]//label[@for="hide-time-info-switch"]') @property def relative_time_info(self): diff --git a/tests/testflows/steps/panel/view.py b/tests/testflows/steps/panel/view.py index 6fba00595..293dd2e2b 100644 --- a/tests/testflows/steps/panel/view.py +++ b/tests/testflows/steps/panel/view.py @@ -574,80 +574,80 @@ def click_save_button(self): @TestStep(When) -def click_adhoc_dropdown(self, label, variable_number): +def click_adhoc_dropdown(self, adhoc_name): """Click adhoc dropdown.""" - locators.adhoc_dropdown(label=label, variable_number=variable_number).click() + locators.adhoc(adhoc_name=adhoc_name).click() @TestStep(When) -def get_adhoc_dropdown_value(self, label, variable_number): +def get_adhoc_dropdown_value(self, adhoc_name): """Get adhoc dropdown html.""" - return locators.adhoc_grafana_single_value(label=label, variable_number=variable_number).text + return locators.adhoc(adhoc_name=adhoc_name).text.split(' ')[2] @TestStep(When) -def change_adhoc_value_order(self, label, variable_number, value_order): +def change_adhoc_value_order(self, adhoc_name, adhoc_label, value_order=0): """Change adhoc value.""" with By("clicking on adhoc dropdown"): with delay(): - click_adhoc_dropdown(label=label, variable_number=variable_number) + click_adhoc_dropdown(adhoc_name=adhoc_name) with By("choosing value from adhoc dropdown"): with delay(): - choose_value_from_adhoc_dropdown(label=label, variable_number=variable_number, value_order=value_order) + choose_value_from_adhoc_dropdown(adhoc_label=adhoc_label, value_order=value_order) @TestStep(When) -def change_adhoc_value(self, label, variable_number, variable_value): +def change_adhoc_value(self,adhoc_name, adhoc_label, variable_value): """Change adhoc value.""" with By("clicking on adhoc dropdown"): with delay(): - click_adhoc_dropdown(label=label, variable_number=variable_number) + click_adhoc_dropdown(adhoc_name=adhoc_name) with By("entering value into adhoc dropdown"): with delay(): - enter_value_adhoc_dropdown(label=label, variable_number=variable_number, variable_value=variable_value) + enter_value_adhoc_dropdown(adhoc_label=adhoc_label, variable_value=variable_value) @TestStep(When) -def get_dropdown_values_set(self, label, variable_number): +def get_dropdown_values_set(self, adhoc_name, adhoc_label): """Get dropdown values set.""" values_set = set() with When(f"I get 0 dropdown value"): - change_adhoc_value_order(label=label, variable_number=variable_number, value_order=0) - value = get_adhoc_dropdown_value(label=label, variable_number=variable_number) + change_adhoc_value_order(adhoc_name=adhoc_name, adhoc_label=adhoc_label, value_order=0) + value = get_adhoc_dropdown_value(adhoc_name=adhoc_name) order = 1 while not (value in values_set): values_set.add(value) with When(f"I get {order} dropdown value"): - change_adhoc_value_order(label=label, variable_number=variable_number, value_order=order) - value = get_adhoc_dropdown_value(label=label, variable_number=variable_number) + change_adhoc_value_order(adhoc_name=adhoc_name, adhoc_label=adhoc_label, value_order=order) + value = get_adhoc_dropdown_value(adhoc_name=adhoc_name) order+=1 return values_set @TestStep(When) -def choose_value_from_adhoc_dropdown(self, label, variable_number, value_order): +def choose_value_from_adhoc_dropdown(self, adhoc_label, value_order): """Choose value from adhoc dropdown value.""" for i in range(value_order): - locators.adhoc_dropdown(label=label, variable_number=variable_number).send_keys(Keys.ARROW_DOWN) + locators.adhoc_dropdown(label=adhoc_label).send_keys(Keys.ARROW_DOWN) - locators.adhoc_dropdown(label=label, variable_number=variable_number).send_keys(Keys.ENTER) + locators.adhoc_dropdown(label=adhoc_label).send_keys(Keys.ENTER) @TestStep(When) -def enter_value_adhoc_dropdown(self, label, variable_number, variable_value): +def enter_value_adhoc_dropdown(self, adhoc_label, variable_value): """Enter value adhoc dropdown value.""" - locators.adhoc_dropdown(label=label, variable_number=variable_number).send_keys(variable_value) - locators.adhoc_dropdown(label=label, variable_number=variable_number).send_keys(Keys.ENTER) + locators.adhoc_dropdown(label=adhoc_label).send_keys(variable_value) + locators.adhoc_dropdown(label=adhoc_label).send_keys(Keys.ENTER) @TestStep(When) diff --git a/tests/testflows/tests/automated/adhoc_macro.py b/tests/testflows/tests/automated/adhoc_macro.py index b918c7a79..d9b1f63bb 100644 --- a/tests/testflows/tests/automated/adhoc_macro.py +++ b/tests/testflows/tests/automated/adhoc_macro.py @@ -37,11 +37,11 @@ def adhoc_macro_outline(self, dashboard_name, expected_adhoc_values, adhoc_label with And("I get default adhoc value"): with delay(): - default_adhoc_value = panel.get_adhoc_dropdown_value(label=adhoc_label, variable_number=3) + default_adhoc_value = panel.get_adhoc_dropdown_value(adhoc_name=adhoc_name) with When("I get every adhoc value"): with delay(): - adhoc_values = panel.get_dropdown_values_set(label=adhoc_label, variable_number=3) + adhoc_values = panel.get_dropdown_values_set(adhoc_name=adhoc_name, adhoc_label=adhoc_label) note(adhoc_values) assert adhoc_values == expected_adhoc_values, error() @@ -55,15 +55,19 @@ def adhoc_macro_outline(self, dashboard_name, expected_adhoc_values, adhoc_label with And("I enter adhoc name"): with delay(): - panel.enter_value_adhoc_dropdown(label=adhoc_label, variable_number=1, variable_value=adhoc_name) + panel.enter_value_adhoc_dropdown(adhoc_label=adhoc_label, variable_value=adhoc_name) + + with And("I enter adhoc operator '='"): + with delay(): + panel.enter_value_adhoc_dropdown(adhoc_label=adhoc_label, variable_value='=') with And("I enter default adhoc value"): with delay(): - panel.change_adhoc_value(label=adhoc_label, variable_number=3, variable_value=default_adhoc_value) + panel.enter_value_adhoc_dropdown(adhoc_label=adhoc_label, variable_value=default_adhoc_value) with And("I get every adhoc value after deleting and adding adhoc"): with delay(): - adhoc_values_after_deleting_and_adding_adhoc = panel.get_dropdown_values_set(label=adhoc_label, variable_number=3) + adhoc_values_after_deleting_and_adding_adhoc = panel.get_dropdown_values_set(adhoc_name=adhoc_name, adhoc_label=adhoc_label) with Then("I check adhoc correctly displays values after recreating adhoc"): assert adhoc_values_after_deleting_and_adding_adhoc == adhoc_values, error() @@ -86,7 +90,7 @@ def adhoc_macro_outline(self, dashboard_name, expected_adhoc_values, adhoc_label for adhoc_value in adhoc_values: with When(f"I define adhoc value as {adhoc_value}"): with delay(): - panel.change_adhoc_value(label=adhoc_label, variable_number=3, variable_value=adhoc_value) + panel.change_adhoc_value(adhoc_name=adhoc_name, adhoc_label=adhoc_label, variable_value=adhoc_value) with Then(f"I check reformatted query contains adhoc {adhoc_value}"): with delay(): @@ -131,17 +135,21 @@ def default_adhoc(self): with And("I enter adhoc name"): with delay(): - panel.enter_value_adhoc_dropdown(label="query0", variable_number=1, variable_value="default.test_grafana.country") + panel.enter_value_adhoc_dropdown(adhoc_label="query0", variable_value="default.test_grafana.country") + + with And("I enter adhoc operator '='"): + with delay(): + panel.enter_value_adhoc_dropdown(adhoc_label="query0", variable_value='=') with And("I enter default adhoc value"): with delay(): - panel.change_adhoc_value(label="query0", variable_number=3, variable_value="US") + panel.enter_value_adhoc_dropdown(adhoc_label="query0", variable_value="US") with And("I get every adhoc value after deleting and adding adhoc"): with delay(): - adhoc_values_after_deleting_and_adding_adhoc = panel.get_dropdown_values_set(label="query0", variable_number=3) + adhoc_values_after_deleting_and_adding_adhoc = panel.get_dropdown_values_set(adhoc_label="query0", adhoc_name="default.test_grafana.country") - with Then("I check adhoc correctly displays values after recreating adhoc"): + with Then("I check adhoc correctly displays values"): assert adhoc_values_after_deleting_and_adding_adhoc == {'US', 'RU', 'EU', 'UK'}, error() diff --git a/tests/testflows/tests/automated/e2e.py b/tests/testflows/tests/automated/e2e.py index d46b2e2ad..a448ac57d 100644 --- a/tests/testflows/tests/automated/e2e.py +++ b/tests/testflows/tests/automated/e2e.py @@ -188,9 +188,13 @@ def annotations_without_time_reformatting(self): with delay(): panel.take_screenshot_for_visualization(screenshot_name="event_tme_panel") - with Finally("I discard changes for panel"): - with delay(): - panel.click_discard_button() + with Finally("I discard changes for panel"): + with delay(after=0.5): + panel.click_discard_button() + + with And("I discard changes for dashboard"): + with delay(after=0.5): + dashboard.discard_changes_for_dashboard() with When("I go to Annotation event_time"): with delay(): @@ -209,14 +213,14 @@ def annotations_without_time_reformatting(self): with delay(): panel.take_screenshot_for_visualization(screenshot_name="toUInt64_panel") - with Finally("I discard changes for panel"): - with delay(): - panel.click_discard_button() + with Finally("I discard changes for panel"): + with delay(after=0.5): + panel.click_discard_button() + + with And("I discard changes for dashboard"): + with delay(after=0.5): + dashboard.discard_changes_for_dashboard() - with And("I discard changes for dashboard"): - with delay(): - dashboard.discard_changes_for_dashboard() - with Then("I compare screenshots"): with delay(): assert actions.compare_screenshots_percent(screenshot_name_1="event_tme_panel", screenshot_name_2="toUInt64_panel") > 0.9, error() @@ -244,11 +248,11 @@ def many_categories(self): assert panel.check_no_labels(labels=["normalized_query_hash", "Too many points"]), error() finally: with Finally("I discard changes for panel"): - with delay(): + with delay(after=0.5): panel.click_discard_button() with And("I discard changes for dashboard"): - with delay(): + with delay(after=0.5): dashboard.discard_changes_for_dashboard() @TestFeature From 8b4099685ff32dce0afa8e7ec5fbc7e555070dcf Mon Sep 17 00:00:00 2001 From: antip00 Date: Mon, 3 Feb 2025 20:07:44 +0300 Subject: [PATCH 10/12] Improving inserting query. --- tests/testflows/steps/panel/view.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/tests/testflows/steps/panel/view.py b/tests/testflows/steps/panel/view.py index 293dd2e2b..22a01d688 100644 --- a/tests/testflows/steps/panel/view.py +++ b/tests/testflows/steps/panel/view.py @@ -135,7 +135,8 @@ def wait_sql_editor_input(self): def select_input_query(self, query_name): """Select input query using triple click on textarea.""" - ActionChains(self.context.driver).double_click(locators.sql_editor_input(query_name=query_name, grafana_version=self.context.grafana_version)).click(locators.sql_editor_input(query_name=query_name, grafana_version=self.context.grafana_version)).perform() + locators.input_in_sql_editor(query_name=query_name, grafana_version=self.context.grafana_version).send_keys(Keys.CONTROL, 'a') + # ActionChains(self.context.driver).double_click(locators.sql_editor_input(query_name=query_name, grafana_version=self.context.grafana_version)).click(locators.sql_editor_input(query_name=query_name, grafana_version=self.context.grafana_version)).perform() @TestStep(When) @@ -172,13 +173,17 @@ def enter_sql_editor_input(self, query, query_name='A'): """Enter SQL request into sql editor input field.""" with By("waiting SQL editor"): - wait_sql_editor_input() + with delay(): + wait_sql_editor_input() with By("selecting input string"): - select_input_query(query_name=query_name) + with delay(): + select_input_query(query_name=query_name) with By("entering request"): - locators.input_in_sql_editor(query_name=query_name, grafana_version=self.context.grafana_version).send_keys(query) + with delay(): + locators.input_in_sql_editor(query_name=query_name, grafana_version=self.context.grafana_version).send_keys(query + ' ') + locators.input_in_sql_editor(query_name=query_name, grafana_version=self.context.grafana_version).send_keys(Keys.ENTER) @TestStep(When) From 3aa784e1dac8c626eec09c4ddf5775f94831b162 Mon Sep 17 00:00:00 2001 From: antip00 Date: Mon, 3 Feb 2025 20:11:12 +0300 Subject: [PATCH 11/12] Deleting comment. --- tests/testflows/steps/panel/view.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/testflows/steps/panel/view.py b/tests/testflows/steps/panel/view.py index 22a01d688..60596a2e8 100644 --- a/tests/testflows/steps/panel/view.py +++ b/tests/testflows/steps/panel/view.py @@ -136,9 +136,8 @@ def select_input_query(self, query_name): """Select input query using triple click on textarea.""" locators.input_in_sql_editor(query_name=query_name, grafana_version=self.context.grafana_version).send_keys(Keys.CONTROL, 'a') - # ActionChains(self.context.driver).double_click(locators.sql_editor_input(query_name=query_name, grafana_version=self.context.grafana_version)).click(locators.sql_editor_input(query_name=query_name, grafana_version=self.context.grafana_version)).perform() - + @TestStep(When) def clear_panel_title(self): """Clear panel title.""" From ebeeb38407154664897ade3e0cd0e714b6c37ea7 Mon Sep 17 00:00:00 2001 From: antip00 Date: Tue, 4 Feb 2025 17:45:19 +0300 Subject: [PATCH 12/12] Adding default user for new ClickHouse version. --- docker/clickhouse/users.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/clickhouse/users.xml b/docker/clickhouse/users.xml index 9832e3774..0fad4ca69 100644 --- a/docker/clickhouse/users.xml +++ b/docker/clickhouse/users.xml @@ -7,5 +7,6 @@ DNS:clickhouse + 0.0.0.0/0