Skip to content

Commit

Permalink
Merge pull request #608 from antip00/master
Browse files Browse the repository at this point in the history
Adding steps and test for #604
  • Loading branch information
Slach authored Aug 9, 2024
2 parents 3ab9508 + c76fccf commit 711c801
Show file tree
Hide file tree
Showing 16 changed files with 878 additions and 35 deletions.
28 changes: 21 additions & 7 deletions tests/testflows/regression.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,39 +31,53 @@ def argparser(parser):
)


xfails = {
"/Grafana Datasource Plugin For Clickhouse/e2e/mixed data sources/*": [
(Fail, "https://github.com/Altinity/clickhouse-grafana/issues/604")
],
}


@TestModule
@Name("Grafana Datasource Plugin For Clickhouse")
@ArgumentParser(argparser)
@Specifications(QA_SRS_Altinity_Grafana_Datasource_Plugin_For_ClickHouse)
@XFails(xfails)
@Requirements(
RQ_SRS_Plugin("1.0"),
RQ_SRS_Plugin_DockerComposeEnvironment("1.0"),
RQ_SRS_Plugin_VersionCompatibility("1.0")
)
def regression(self, before, after):

self.context.browser = "chrome"
self.context.local = False
self.context.global_wait_time = 30
self.context.endpoint = "http://grafana:3000/"
self.context.before = before
self.context.after = after
self.context.server_name = "test.example.com"
project_root_dir = os.path.join(current_dir(),"..","..")

project_root_dir = os.path.join(current_dir(), "..", "..")
self.context.project_root_dir = project_root_dir

with Given("docker compose cluster"):
with Given("docker-compose cluster"):
self.context.cluster = cluster.cluster(frame=inspect.currentframe())

with And("I copy CA Cert"):
self.context.ca_cert = self.context.cluster.command(None, "cat \"" + os.path.join(project_root_dir, "docker", "clickhouse", "ca-cert.pem") + "\"").output
self.context.ca_cert = self.context.cluster.command(None, "cat \"" + os.path.join(project_root_dir, "docker",
"clickhouse",
"ca-cert.pem") + "\"").output

with And("I copy Client Cert"):
self.context.client_cert = self.context.cluster.command(None, "cat \"" + os.path.join(project_root_dir, "docker", "clickhouse", "client-cert.pem") + "\"").output
self.context.client_cert = self.context.cluster.command(None,
"cat \"" + os.path.join(project_root_dir, "docker",
"clickhouse",
"client-cert.pem") + "\"").output

with And("I copy Client Key"):
self.context.client_key = self.context.cluster.command(None, "cat \"" + os.path.join(project_root_dir, "docker", "clickhouse", "client-key.pem") + "\"").output
self.context.client_key = self.context.cluster.command(None, "cat \"" + os.path.join(project_root_dir, "docker",
"clickhouse",
"client-key.pem") + "\"").output

with And("webdriver"):
self.context.driver = ui.create_driver()
Expand Down
42 changes: 38 additions & 4 deletions tests/testflows/steps/actions.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import steps.dashboard.view as dashboard
import steps.dashboards.view as dashboards
import steps.connections.datasources.view as datasources
import steps.panel.query_settings.view as query_settings
import steps.connections.datasources.new.view as datasources_new
import steps.connections.datasources.altinity_edit.view as datasources_altinity_edit

Expand Down Expand Up @@ -169,10 +170,6 @@ def create_new_altinity_datasource(
with And("clicking new altinity grafana plugin"):
datasources_new.click_new_altinity_plugin_datasource()

with delay():
with And("entering datasource name"):
datasources_altinity_edit.enter_name_into_name_field(datasource_name=datasource_name)

with delay():
with By("entering url"):
datasources_altinity_edit.enter_url_into_url_field(url=url)
Expand Down Expand Up @@ -263,6 +260,10 @@ def create_new_altinity_datasource(
with By("enter compression type"):
datasources_altinity_edit.enter_compression_type(compression_type='gzip')

with delay():
with And("entering datasource name"):
datasources_altinity_edit.enter_name_into_name_field(datasource_name=datasource_name)

with delay():
with By("clicking save and test button"):
datasources_altinity_edit.click_save_and_test_button()
Expand All @@ -288,3 +289,36 @@ def create_new_altinity_datasource(
with delay():
with And("clicking delete button in confirmation modal dialog"):
datasources_altinity_edit.click_confirm_delete_datasource()


@TestStep(When)
def setup_query_settings(
self,
query_name="A",
database="default",
table="test_alerts",
column_timestamp_type="DateTime",
timestamp_column="EventTime",
date_column="EventDate"
):
"""Setup all macro in Query Settings."""

with When("I setup database"):
with delay():
query_settings.enter_database(query_name=query_name, database=database)

with When("I setup table"):
with delay():
query_settings.enter_table(query_name=query_name, table=table)

with When("I setup column timestamp type"):
with delay():
query_settings.enter_column_timestamp_type(query_name=query_name, column_timestamp_type=column_timestamp_type)

with When("I setup timestamp column"):
with delay():
query_settings.enter_timestamp_column(query_name=query_name, timestamp_column=timestamp_column)

with When("I setup date column"):
with delay():
query_settings.enter_date_column(query_name=query_name, date_column=date_column)
14 changes: 9 additions & 5 deletions tests/testflows/steps/dashboard/view.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,16 +120,20 @@ def click_save_dashboard_button(self):


@TestStep(When)
def saving_dashboard(self, dashboard_name):
def saving_dashboard(self, dashboard_name=None):
"""Save current dashboard"""
with By("clicking save in dashboard view"):
click_save_button()
with delay():
click_save_button()

with By("entering dashboard name"):
change_title_for_dashboard(dashboard_name=dashboard_name)
if not (dashboard_name is None):
with By("entering dashboard name"):
with delay():
change_title_for_dashboard(dashboard_name=dashboard_name)

with By("clicking save button"):
click_save_dashboard_button()
with delay():
click_save_dashboard_button()


@TestStep(When)
Expand Down
2 changes: 1 addition & 1 deletion tests/testflows/steps/dashboards/view.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ def open_dashboard_view(self, dashboard_name):

@TestStep(When)
def open_dashboards_view(self, wait_dashboard_name="clickhouse dashboard"):
"""Open login view and wait it to be loaded."""
"""Open dashboards view and wait it to be loaded."""
with When("I go to dashboards endpoint"):
open_dashboards_endpoint()

Expand Down
109 changes: 100 additions & 9 deletions tests/testflows/steps/panel/locators.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,20 +30,17 @@ def select_datasource(self, datasource_name):
driver: WebDriver = current().context.driver
return driver.find_element(SelectBy.XPATH, f"//div[@data-testid='data-source-card' and .//text()='{datasource_name}']")

@property
def sql_editor_toggle(self):
def sql_editor_toggle(self, query_name):
driver: WebDriver = current().context.driver
return driver.find_element(SelectBy.CSS_SELECTOR, f"[id*='option-sql']")
return driver.find_element(SelectBy.XPATH, f"//*[contains(@data-rbd-draggable-id, '{query_name}')]//*[contains(@id, 'option-sql')]")

@property
def sql_editor_input(self):
def sql_editor_input(self, query_name):
driver: WebDriver = current().context.driver
return driver.find_element(SelectBy.CSS_SELECTOR, "[class='view-lines monaco-mouse-cursor-text']")
return driver.find_element(SelectBy.XPATH, f"//*[contains(@data-rbd-draggable-id, '{query_name}')]//*[@class='view-lines monaco-mouse-cursor-text']")

@property
def input_in_sql_editor(self):
def input_in_sql_editor(self, query_name='A'):
driver: WebDriver = current().context.driver
return driver.find_element(SelectBy.CSS_SELECTOR, "[class='inputarea monaco-mouse-cursor-text']")
return driver.find_element(SelectBy.XPATH, f"//*[contains(@data-rbd-draggable-id, '{query_name}')]//*[@class='inputarea monaco-mouse-cursor-text']")

@property
def panel_title_textfield(self):
Expand Down Expand Up @@ -78,5 +75,99 @@ def query_inspector_url(self):
"(@class='json-formatter-string json-formatter-url' and "
"contains(text(), 'http'))]")

@property
def add_query_button(self):
driver: WebDriver = current().context.driver
return driver.find_element(SelectBy.CSS_SELECTOR, "[data-testid='data-testid query-tab-add-query']")

@property
def expression_button(self):
driver: WebDriver = current().context.driver
return driver.find_element(SelectBy.CSS_SELECTOR, "[data-testid='query-tab-add-expression']")

def query_name_field(self, query_name):
driver: WebDriver = current().context.driver
return driver.find_element(SelectBy.XPATH, f'//*[contains(@data-rbd-draggable-id, "{query_name}")]//button[@data-testid="query-name-div"]')

def query_name_textfield(self, query_name):
driver: WebDriver = current().context.driver
return driver.find_element(SelectBy.XPATH, f'//*[contains(@data-rbd-draggable-id, "{query_name}")]//button[@data-testid="query-name-div"]//input')

def duplicate_query_button(self, query_name):
driver: WebDriver = current().context.driver
return driver.find_element(SelectBy.XPATH, f'//*[contains(@data-rbd-draggable-id, "{query_name}")]//button[@data-testid="data-testid Duplicate query"]')

def hide_response_query_button(self, query_name):
driver: WebDriver = current().context.driver
return driver.find_element(SelectBy.XPATH, f'//*[contains(@data-rbd-draggable-id, "{query_name}")]//button[@data-testid="data-testid Hide response"]')

def delete_query_button(self, query_name):
driver: WebDriver = current().context.driver
return driver.find_element(SelectBy.XPATH, f'//*[contains(@data-rbd-draggable-id, "{query_name}")]//button[@data-testid="data-testid Remove query"]')

def expression_name_field(self, expression_name):
driver: WebDriver = current().context.driver
return driver.find_element(SelectBy.XPATH, f'//*[contains(@data-rbd-draggable-id, "{expression_name}")]//button[@data-testid="query-name-div"]')

def expression_name_textfield(self, expression_name):
driver: WebDriver = current().context.driver
return driver.find_element(SelectBy.XPATH, f'//*[contains(@data-rbd-draggable-id, "{expression_name}")]//button[@data-testid="query-name-div"]//input')

def expression_query_button(self, expression_name):
driver: WebDriver = current().context.driver
return driver.find_element(SelectBy.XPATH, f'//*[contains(@data-rbd-draggable-id, "{expression_name}")]//button[@data-testid="data-testid Duplicate query"]')

def hide_response_expression_button(self, expression_name):
driver: WebDriver = current().context.driver
return driver.find_element(SelectBy.XPATH, f'//*[contains(@data-rbd-draggable-id, "{expression_name}")]//button[@data-testid="data-testid Hide response"]')

def delete_expression_button(self, expression_name):
driver: WebDriver = current().context.driver
return driver.find_element(SelectBy.XPATH, f'//*[contains(@data-rbd-draggable-id, "{expression_name}")]//button[@data-testid="data-testid Remove query"]')

def expression_operation_dropdown(self, expression_name):
driver: WebDriver = current().context.driver
return driver.find_element(SelectBy.XPATH,
f'//*[contains(@data-rbd-draggable-id, "{expression_name}")]//div[contains(@class, "grafana-select-value-container")]')

def expression_textfield(self, expression_name):
driver: WebDriver = current().context.driver
return driver.find_element(SelectBy.XPATH,
f'//*[contains(@data-rbd-draggable-id, "{expression_name}")]//div[contains(@class, "grafana-select-value-container")]')

@property
def time_picker_button(self):
driver: WebDriver = current().context.driver
return driver.find_element(SelectBy.CSS_SELECTOR, f'[data-testid="data-testid TimePicker Open Button"]')

@property
def time_picker_from_textfield(self):
driver: WebDriver = current().context.driver
return driver.find_element(SelectBy.CSS_SELECTOR, f'[data-testid="data-testid Time Range from field"]')

@property
def time_picker_to_textfield(self):
driver: WebDriver = current().context.driver
return driver.find_element(SelectBy.CSS_SELECTOR, f'[data-testid="data-testid Time Range to field"]')

@property
def time_picker_submit_button(self):
driver: WebDriver = current().context.driver
return driver.find_element(SelectBy.CSS_SELECTOR, f'[data-testid="data-testid TimePicker submit button"]')

def data_source_picker(self, query_name):
driver: WebDriver = current().context.driver
return driver.find_element(SelectBy.XPATH, f'//*[contains(@data-rbd-draggable-id, "{query_name}")]//input[@data-testid="data-testid Select a data source"]')

@property
def apply_button(self):
driver: WebDriver = current().context.driver
return driver.find_element(SelectBy.CSS_SELECTOR, f'[data-testid="data-testid Apply changes and go back to dashboard"]')

@property
def discard_button(self):
driver: WebDriver = current().context.driver
return driver.find_element(SelectBy.CSS_SELECTOR, f'[title="Undo all changes"]')


locators = Locators()
Empty file.
50 changes: 50 additions & 0 deletions tests/testflows/steps/panel/query_options/locators.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
from testflows.core import *
from selenium.webdriver.remote.webdriver import WebDriver
from selenium.webdriver.common.by import By as SelectBy


class Locators:
# Locators for panel page

@property
def query_options_dropdown(self):
driver: WebDriver = current().context.driver
return driver.find_element(SelectBy.XPATH, f'//div[@aria-label="Expand query row" or @aria-label="Collapse query row"]')

@property
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"]/label[@class="gf-form-label width-6""]')

@property
def interval_field(self):
driver: WebDriver = current().context.driver
return driver.find_element(SelectBy.XPATH,
f'//*[@class="gf-form" and .//text()="Interval"]/div[@data-testid="input-wrapper"]')

@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"]/div[@data-testid="input-wrapper"]')

@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"]/div[@data-testid="input-wrapper"]')

@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"]/div[@data-testid="input-wrapper"]')

@property
def hide_time_info_toggle(self):
driver: WebDriver = current().context.driver
return driver.find_element(SelectBy.XPATH,
f'//*[@class="gf-form-inline align-items-center" and .//text()="Hide time info"]/input')


locators = Locators()
Loading

0 comments on commit 711c801

Please sign in to comment.