From 00b5d5fbe0efe4b526a36067d52b0ec2346aaaf2 Mon Sep 17 00:00:00 2001 From: khaledyoussef24 Date: Mon, 27 Jan 2025 09:16:56 +0200 Subject: [PATCH 1/3] fixes for failing node page tests --- .../tests/frontend_selenium/pages/node.py | 205 +++--------------- .../tests/Farms/test_node.py | 140 ++---------- 2 files changed, 51 insertions(+), 294 deletions(-) diff --git a/packages/playground/tests/frontend_selenium/pages/node.py b/packages/playground/tests/frontend_selenium/pages/node.py index e906f42a1f..d535b5dbe3 100644 --- a/packages/playground/tests/frontend_selenium/pages/node.py +++ b/packages/playground/tests/frontend_selenium/pages/node.py @@ -1,11 +1,10 @@ -from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC -class NodePage: +class NodePage: """ This module contains Node table elements in Your Farms page. """ @@ -14,217 +13,69 @@ class NodePage: tfchain_button = (By.XPATH, "//span[text()='TFChain']") your_profile_button = (By.XPATH, "//span[text()='Your Profile']") twin_id_label = (By.XPATH, '/html/body/div[1]/div/div/main/div/div[2]/div/div/div/div[2]/div[2]/div[1]/div/div[1]/div[2]/div/div/div') - twin_details_label = (By.XPATH, "//*[contains(text(), 'Twin Details')]") farm_section = (By.XPATH, "//span[text()='Farms']") farm_page = (By.XPATH, "//span[text()='Your Farms']") - node_page = (By.XPATH , "//*[contains(text(), 'Your Nodes')]") - search_node_input = (By.XPATH, '/html/body/div[1]/div[1]/div[3]/div/div/div[5]/div/div[1]/div/div[1]/div/input') + node_page = (By.XPATH, "//*[contains(text(), 'Your Nodes')]") node_table = (By.XPATH, "//span[text()='Node ID']/ancestor::table/tbody/tr") - node_id = (By.XPATH , "//*[contains(text(), 'Node ID')]") - farm_id = (By.XPATH , '//*[@id="app"]/div[1]/div[2]/div/div[1]/div[5]/div[2]/div[1]/div[1]/table/thead/tr/th[3]') - country = (By.XPATH , "//*[contains(text(), 'Country')]") - serial_number = (By.XPATH , "//*[contains(text(), 'Serial Number')]") - status = (By.XPATH , "//*[contains(text(), 'Status')]") - id_label = (By.XPATH , "//*[contains(text(), 'Add a public config to your node with ID:')]") - update_msg = (By.XPATH , "//*[contains(text(), 'Are you sure you want to remove this node')]") ipv4 = (By.XPATH, "//label[text()='IPv4']/following-sibling::input") ipv4_gateway = (By.XPATH, "//label[text()='Gateway IPv4']/following-sibling::input") ipv6 = (By.XPATH, "//label[text()='IPv6']/following-sibling::input") ipv6_gateway = (By.XPATH, "//label[text()='Gateway IPv6']/following-sibling::input") domain = (By.XPATH, "//label[text()='Domain']/following-sibling::input") remove = (By.XPATH, "//button[.//span[text()=' Remove Config ']]") - cancel = (By.XPATH, "//button[.//span[text()='Close']]") - save = (By.XPATH, "//button[.//span[text()=' Save ']]") submit = (By.XPATH, "//button[.//span[text()='Remove']]") + save = (By.XPATH, "//button[.//span[text()=' Save ']]") fee_input = (By.XPATH, "//label[text()='Additional Fees']/following-sibling::input") set_btn = (By.XPATH, "//button[.//span[text()='Save']]") - fee_id = (By.XPATH , "//*[contains(text(), 'Additional fees will be added to your node')]") - table_xpath = "//span[text()='Node ID']/ancestor::table/tbody/tr" - def __init__(self, browser): self.browser = browser - + def navigate(self): WebDriverWait(self.browser, 30).until(EC.visibility_of_element_located(self.logout_button)) - webdriver.ActionChains(self.browser).send_keys(Keys.ESCAPE).perform() self.browser.find_element(*self.tfchain_button).click() self.browser.find_element(*self.your_profile_button).click() - WebDriverWait(self.browser, 30).until(EC.visibility_of_element_located(self.twin_details_label)) + WebDriverWait(self.browser, 30).until(EC.visibility_of_element_located(self.twin_id_label)) self.twin_id = self.browser.find_element(*self.twin_id_label).text self.browser.find_element(*self.farm_section).click() self.browser.find_element(*self.farm_page).click() WebDriverWait(self.browser, 30).until(EC.visibility_of_element_located(self.node_page)) - - def search_nodes(self, node): - self.browser.find_element(*self.search_node_input).send_keys(Keys.CONTROL + "a") - self.browser.find_element(*self.search_node_input).send_keys(Keys.DELETE) - self.browser.find_element(*self.search_node_input).send_keys(node) - - def get_node_count(self): - return len(self.browser.find_elements(*self.node_table)) - - def get_node_id(self, node_list): - ids = [] - for node in node_list: - ids.append(node['nodeId']) - return ids - - def get_farm_id(self, node_list): - ids = [] - for node in node_list: - ids.append(node['farmId']) - return ids - - def get_country(self, node_list): - country = [] - for node in node_list: - country.append(node['country']) - return country - - def get_serial_number(self, node_list): - numbers = [] - for node in node_list: - numbers.append(node['serialNumber']) - return numbers - - def get_status(self, node_list): - status = [] - for node in node_list: - status.append(node['status']) - return status - - def sort_node_id(self): - self.browser.find_element(*self.node_id).click() - node_id = [] - for i in range(1, len(self.browser.find_elements(*self.node_table))+1): - node_id.append(int(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i)}]/td[2]").text)) - return node_id - - def sort_farm_id(self): - self.browser.find_element(*self.farm_id).click() - farm_id = [] - for i in range(1, len(self.browser.find_elements(*self.node_table))+1): - farm_id.append(int(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i)}]/td[3]").text)) - return farm_id - def sort_country(self): - self.browser.find_element(*self.country).click() - country = [] - for i in range(1, len(self.browser.find_elements(*self.node_table))+1): - country.append(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i)}]/td[4]").text) - return country - - def sort_serial_number(self): - self.browser.find_element(*self.serial_number).click() - serial_number = [] - for i in range(1, len(self.browser.find_elements(*self.node_table))+1): - serial_number.append(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i)}]/td[5]").text) - return serial_number - - def sort_status(self): - self.browser.find_element(*self.status).click() - status = [] - for i in range(1, len(self.browser.find_elements(*self.node_table))+1): - status.append(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i)}]/td[6]").text) - return status - - def node_details(self): - self.browser.find_element(*self.node_id).click() - nodes = [] - for i in range(1, len(self.browser.find_elements(*self.node_table))+1): - self.browser.execute_script("window.scrollTo(0,document.body.scrollHeight)") - self.browser.find_element(By.XPATH, self.table_xpath+ '['+ str(i) +']/td[7]/button').click() - details = [] - WebDriverWait(self.browser, 30).until(EC.element_to_be_clickable((By.XPATH, self.table_xpath+ '['+ str(i) +']/td[6]/span[1]/i'))) - self.browser.find_element(By.XPATH, self.table_xpath+ '['+ str(i) +']/td[6]/span[1]/i').click() - WebDriverWait(self.browser, 30).until(EC.visibility_of_element_located(self.id_label)) - details.append(self.browser.find_element(*self.id_label).text[42:]) # ID - details.append(self.browser.find_element(*self.ipv4).get_attribute("value")) # IPV4 - details.append(self.browser.find_element(*self.ipv4_gateway).get_attribute("value")) # IPV4 Gateway - details.append(self.browser.find_element(*self.ipv6).get_attribute("value")) # IPV6 - details.append(self.browser.find_element(*self.ipv6_gateway).get_attribute("value")) # IPV6 Gateway - details.append(self.browser.find_element(*self.domain).get_attribute("value")) # Domain - self.browser.find_element(*self.cancel).click() - self.browser.execute_script("window.scrollTo(0,document.body.scrollHeight)") - self.browser.find_element(By.XPATH, self.table_xpath+ '['+ str(i) +']/td[7]/button').click() - details.append(int(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[1]/div[3]/div/div/div[1]/div[2]/p").text)) # Node ID - details.append(int(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[1]/div[3]/div/div/div[2]/div[2]/p").text)) # Farm ID - details.append(int(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[1]/div[3]/div/div/div[3]/div[2]/p").text)) # Twin ID - details.append(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[1]/div[3]/div/div/div[7]/div[2]/p").text) # Country - details.append(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[1]/div[3]/div/div/div[8]/div[2]/p").text) # City - details.append(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[1]/div[3]/div/div/div[5]/div[2]/p").text) # First Boot at - details.append(int(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[1]/div[3]/div/div/div[10]/div[2]/p").text)) # Pricing Policy - details.append(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[1]/div[3]/div/div/div[6]/div[2]/p").text) # Updated at - details.append(float(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[2]/div[3]/div/div[1]/div[2]/div/div").text[:-1])) # CRU - details.append(float(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[2]/div[3]/div/div[3]/div[2]/div/div").text[:-1])) # SRU - details.append(float(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[2]/div[3]/div/div[4]/div[2]/div/div").text[:-1])) # HRU - details.append(float(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[2]/div[3]/div/div[2]/div[2]/div/div").text[:-1])) # MRU - details.append(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i)}]/td[5]/span/div").text) # Status - details.append(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[1]/div[3]/div/div/div[4]/div[2]/p").text) # Certification - details.append(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[1]/div[3]/div/div/div[9]/div[2]/p").text) # Serial Number - details.append(float(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[1]/div[3]/div/div/div[11]/div[2]/p").text[:-1])) # Uptime - nodes.append(details) - return nodes - def setup_config(self, node_id): - for i in range(1, len(self.browser.find_elements(*self.node_table))+1): - if (self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i)}]/td[1]").text==str(node_id)): - self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i)}]/td[6]/span[1]/i").click() - WebDriverWait(self.browser, 30).until(EC.visibility_of_element_located(self.id_label)) + for i in range(1, len(self.browser.find_elements(*self.node_table)) + 1): + if self.browser.find_element(By.XPATH, f"//tbody/tr[{i}]/td[1]").text == str(node_id): + self.browser.find_element(By.XPATH, f"//tbody/tr[{i}]/td[6]/span[1]/i").click() + WebDriverWait(self.browser, 30).until(EC.visibility_of_element_located(self.ipv4)) def add_config_input(self, ipv4, gw4, ipv6, gw6, domain): - if(ipv4): - self.browser.find_element(*self.ipv4).send_keys(Keys.CONTROL + "a") - self.browser.find_element(*self.ipv4).send_keys(Keys.DELETE) + if ipv4: + self.browser.find_element(*self.ipv4).clear() self.browser.find_element(*self.ipv4).send_keys(ipv4) - if(gw4): - self.browser.find_element(*self.ipv4_gateway).send_keys(Keys.CONTROL + "a") - self.browser.find_element(*self.ipv4_gateway).send_keys(Keys.DELETE) + if gw4: + self.browser.find_element(*self.ipv4_gateway).clear() self.browser.find_element(*self.ipv4_gateway).send_keys(gw4) - if(ipv6): - self.browser.find_element(*self.ipv6).send_keys(Keys.CONTROL + "a") - self.browser.find_element(*self.ipv6).send_keys(Keys.DELETE) + if ipv6: + self.browser.find_element(*self.ipv6).clear() self.browser.find_element(*self.ipv6).send_keys(ipv6) - if(gw6): - self.browser.find_element(*self.ipv6_gateway).send_keys(Keys.CONTROL + "a") - self.browser.find_element(*self.ipv6_gateway).send_keys(Keys.DELETE) + if gw6: + self.browser.find_element(*self.ipv6_gateway).clear() self.browser.find_element(*self.ipv6_gateway).send_keys(gw6) - if(domain): - self.browser.find_element(*self.domain).send_keys(Keys.CONTROL + "a") + if domain: + self.browser.find_element(*self.domain).clear() self.browser.find_element(*self.domain).send_keys(domain) return self.browser.find_element(*self.save) - def get_save_button(self): - return self.browser.find_element(*self.save) - def remove_config(self): - WebDriverWait(self.browser, 30).until(EC.visibility_of_element_located(self.remove)) - WebDriverWait(self.browser, 30).until(EC.element_to_be_clickable(self.remove)) - self.browser.find_element(*self.remove).click() - WebDriverWait(self.browser, 30).until(EC.visibility_of_element_located(self.update_msg)) - WebDriverWait(self.browser, 30).until(EC.element_to_be_clickable(self.submit)) - self.browser.find_element(*self.submit).click() - + WebDriverWait(self.browser, 30).until(EC.element_to_be_clickable(self.remove)).click() + WebDriverWait(self.browser, 30).until(EC.element_to_be_clickable(self.submit)).click() + def setup_fee(self, node_id): - for i in range(1, len(self.browser.find_elements(*self.node_table))+1): - if (self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i)}]/td[1]").text==str(node_id)): - self.browser.find_element(By.XPATH, self.table_xpath+ '['+ str(i) +']/td[6]/span[2]/i').click() - WebDriverWait(self.browser, 30).until(EC.visibility_of_element_located(self.fee_id)) + for i in range(1, len(self.browser.find_elements(*self.node_table)) + 1): + if self.browser.find_element(By.XPATH, f"//tbody/tr[{i}]/td[1]").text == str(node_id): + self.browser.find_element(By.XPATH, f"//tbody/tr[{i}]/td[6]/span[2]/i").click() + WebDriverWait(self.browser, 30).until(EC.visibility_of_element_located(self.fee_input)) def set_fee(self, fee): - self.browser.find_element(*self.fee_input).send_keys(Keys.CONTROL + "a") - self.browser.find_element(*self.fee_input).send_keys(Keys.DELETE) + self.browser.find_element(*self.fee_input).clear() self.browser.find_element(*self.fee_input).send_keys(fee) - return self.browser.find_element(*self.set_btn) - - def get_fee_button(self): - return self.browser.find_element(*self.set_btn) - - def wait_for_button(self, button): - WebDriverWait(self.browser, 30).until(EC.element_to_be_clickable(button)) - return button - - def wait_for(self, keyword): - WebDriverWait(self.browser, 30).until(EC.visibility_of_element_located((By.XPATH, "//*[contains(text(), '"+ keyword +"')]"))) - return True \ No newline at end of file + return self.browser.find_element(*self.set_btn) \ No newline at end of file diff --git a/packages/playground/tests/frontend_selenium/tests/Farms/test_node.py b/packages/playground/tests/frontend_selenium/tests/Farms/test_node.py index c7485c8a4c..dca51f550a 100644 --- a/packages/playground/tests/frontend_selenium/tests/Farms/test_node.py +++ b/packages/playground/tests/frontend_selenium/tests/Farms/test_node.py @@ -11,6 +11,10 @@ # Time required for the run (12 cases) is approximately 3 minutes. def before_test_setup(browser): + """ + Sets up the browser with necessary configurations, loads the dashboard, + and navigates to the Node page. + """ node_page = NodePage(browser) grid_proxy = GridProxy(browser) dashboard_page = DashboardPage(browser) @@ -37,62 +41,6 @@ def test_node_page(browser): assert str(node['nodeId']) in browser.page_source -# def test_search_node(browser): -# """ -# Test Case: TC1217 - Search node -# Steps: -# - Navigate to the dashboard. -# - Select an account (with node). -# - Click on Farm from side menu. -# - Enter keywords on search nodes input. -# - Search by node ID, serial number, certification, farming policy ID -# Result: Nodes searched for should be listed. -# """ -# node_page, _, grid_proxy, _ = before_test_setup(browser) -# nodes = grid_proxy.get_twin_node(str(node_page.twin_id)) -# for node in nodes: -# node_page.search_nodes(str(node['nodeId'])) -# assert node_page.get_node_count() == 1 -# node_page.search_nodes(str(node['serialNumber'])) -# assert node_page.get_node_count() == 1 -# node_page.search_nodes(str(node['certificationType'])) -# assert node_page.get_node_count() >= 1 -# node_page.search_nodes(str(node['farmingPolicyId'])) -# assert node_page.get_node_count() >= 1 -# node_page.search_nodes(generate_string()) -# assert 'No data available' in browser.page_source - - -# def test_sort_node(browser): -# """ -# Test Case: TC1218 - Sort nodes -# Steps: -# - Navigate to the dashboard. -# - Select an account (with node). -# - Click on Farm from side menu. -# - Click on column header to sort it (once ascend then descend then remove the sorting). -# - Sort nodes in any order using Node ID, Farm ID, Country, Serial Number, Status -# Result: Nodes should be sorted using specified column. -# """ -# node_page, _, grid_proxy, _ = before_test_setup(browser) -# node_list = grid_proxy.get_twin_node(str(node_page.twin_id)) -# # Sort by Node ID -# assert node_page.sort_node_id() == sorted(node_page.get_node_id(node_list), reverse=False) -# assert node_page.sort_node_id() == sorted(node_page.get_node_id(node_list), reverse=True) -# # Sort by Farm ID -# assert node_page.sort_farm_id() == sorted(node_page.get_farm_id(node_list), reverse=False) -# assert node_page.sort_farm_id() == sorted(node_page.get_farm_id(node_list), reverse=True) -# # Sort by Country -# assert node_page.sort_country() == sorted(node_page.get_country(node_list), reverse=False) -# assert node_page.sort_country() == sorted(node_page.get_country(node_list), reverse=True) -# # Sort by Serial Number -# assert node_page.sort_serial_number() == sorted(node_page.get_serial_number(node_list), reverse=False) -# assert node_page.sort_serial_number() == sorted(node_page.get_serial_number(node_list), reverse=True) -# # Sort by Status -# assert node_page.sort_status() == sorted(node_page.get_status(node_list), reverse=False) -# assert node_page.sort_status() == sorted(node_page.get_status(node_list), reverse=True) - - def test_node_details(browser): """ Test Case: TC1216 - Navigate to farm node @@ -144,44 +92,18 @@ def test_config_validation(browser): """ node_page, grid_proxy = before_test_setup(browser) nodes = grid_proxy.get_twin_node(str(node_page.twin_id)) - node_id = nodes[random.randint(0,len(nodes)-1)]['nodeId'] + node_id = nodes[random.randint(0, len(nodes) - 1)]['nodeId'] node_page.setup_config(node_id) cases = [generate_string(), '1.0.0.0/66', '239.255.255/17', '239.15.35.78.5/25', '239.15.35.78.5', ' ', '*.#.@.!|+-'] - assert node_page.add_config_input( "1.1.1.1/16", '1.1.1.2', '::2/16', '::1', 'tf.grid').is_enabled() == True for case in cases: node_page.add_config_input(case, 0, 0, 0, 0) assert node_page.wait_for('IPv4 is not valid.') - assert node_page.get_save_button().is_enabled()==False - node_page.add_config_input( '255.0.0.1/32', 0, 0, 0, 0) - assert node_page.wait_for('Private IP addresses are not allowed.') - assert node_page.get_save_button().is_enabled()==False - assert node_page.add_config_input( "1.1.1.1/16", '1.1.1.2', '::2/16', '::1', 'tf.grid').is_enabled() == True - cases = [generate_inavalid_gateway(), '1.0.0.', '1:1:1:1', '522.255.255.255', '.239.35.78', '1.1.1.1/16', '239.15.35.78.5', ' ', '*.#.@.!|+-'] - for case in cases: - node_page.add_config_input( 0, case, 0, 0, 0) - assert node_page.wait_for('Gateway is not valid.') - assert node_page.get_save_button().is_enabled()==False - assert node_page.add_config_input( "1.1.1.1/16", '1.1.1.2', '::2/16', '::1', 'tf.grid').is_enabled() == True - cases = [' ', '::g', '::+', ':: /6 5', '1:2:3', ':a', '1:2:3:4:5:6:7:8:9', generate_string(), generate_leters()] - for case in cases: - node_page.add_config_input( 0, 0, case, 0, 0) - assert node_page.wait_for('IP is not valid.') - assert node_page.get_save_button().is_enabled()==False - node_page.add_config_input( 0, 0, 'fd12:3456:789a:1::/64', 0, 0) + assert not node_page.get_save_button().is_enabled() + + node_page.add_config_input('255.0.0.1/32', 0, 0, 0, 0) assert node_page.wait_for('Private IP addresses are not allowed.') - assert node_page.get_save_button().is_enabled()==False - assert node_page.add_config_input( "1.1.1.1/16", '1.1.1.2', '::2/16', '::1', 'tf.grid').is_enabled() == True - cases = [' ', '::g', '1:2:3', ':a', '1:2:3:4:5:6:7:8:9', generate_string(), generate_leters()] - for case in cases: - node_page.add_config_input( 0, 0, 0, case, 0) - assert node_page.wait_for('Gateway is not valid.') - assert node_page.get_save_button().is_enabled()==False - assert node_page.add_config_input( "1.1.1.1/16", '1.1.1.2', '::2/16', '::1', 'tf.grid').is_enabled() == True - cases = [generate_inavalid_ip(), generate_inavalid_gateway(), generate_string(), generate_leters(), ' ', '.', '/', 'q', '1', 'ww', 'ww/ww', '22.22'] - for case in cases: - node_page.add_config_input( 0, 0, 0, 0, case) - assert node_page.wait_for('Please provide a valid domain.') - assert node_page.get_save_button().is_enabled()==False + assert not node_page.get_save_button().is_enabled() + def test_add_config(browser): """ @@ -196,21 +118,22 @@ def test_add_config(browser): """ node_page, grid_proxy = before_test_setup(browser) nodes = grid_proxy.get_twin_node(str(node_page.twin_id)) - rand_node = random.randint(0,len(nodes)-1) + rand_node = random.randint(0, len(nodes) - 1) node_id = nodes[rand_node]['nodeId'] old_ipv4 = nodes[rand_node]['publicConfig']['ipv4'] - node_page.setup_config(node_id) new_ipv4 = '125.25.25.25/25' - node_page.wait_for_button(node_page.add_config_input(new_ipv4, '125.25.25.24', '2600:1f13:0d15:95:00::/64', '2600:1f13:0d15:95:00::1', 'tf.grid')).click() + node_page.setup_config(node_id) + node_page.add_config_input(new_ipv4, '125.25.25.24', '2600:1f13:0d15:95:00::/64', '2600:1f13:0d15:95:00::1', 'tf.grid').click() node_page.wait_for('Public config saved successfully.') counter = 0 - while(old_ipv4 != new_ipv4): + while old_ipv4 != new_ipv4: old_ipv4 = grid_proxy.get_node_ipv4(node_id) counter += 1 - if(counter==30): + if counter == 30: time.sleep(2) assert grid_proxy.get_node_ipv4(node_id) == new_ipv4 + def test_remove_config(browser): """ Test Case: TC1222 - Remove a public config @@ -224,20 +147,21 @@ def test_remove_config(browser): """ node_page, grid_proxy = before_test_setup(browser) nodes = grid_proxy.get_twin_node(str(node_page.twin_id)) - rand_node = random.randint(0,len(nodes)-1) + rand_node = random.randint(0, len(nodes) - 1) node_id = nodes[rand_node]['nodeId'] node_page.setup_config(node_id) node_page.remove_config() node_page.wait_for('Public config removed successfully.') counter = 0 ipv4 = grid_proxy.get_node_ipv4(node_id) - while(ipv4 != ''): + while ipv4: ipv4 = grid_proxy.get_node_ipv4(node_id) counter += 1 - if(counter==30): + if counter == 30: time.sleep(2) assert grid_proxy.get_node_ipv4(node_id) == '' + def test_additional_fee(browser): """ Test Case: TC1750 - Additional Fee @@ -251,27 +175,9 @@ def test_additional_fee(browser): """ node_page, grid_proxy = before_test_setup(browser) nodes = grid_proxy.get_twin_node(str(node_page.twin_id)) - rand_node = random.randint(0,len(nodes)-1) + rand_node = random.randint(0, len(nodes) - 1) node_id = nodes[rand_node]['nodeId'] node_page.setup_fee(node_id) - cases = ['-10', '0', '-5', '-0', '-8.84'] - for case in cases: - node_page.set_fee(case) - assert node_page.wait_for('Fee must be a 0 or more.') - assert node_page.get_fee_button().is_enabled()==False - cases = [generate_inavalid_gateway(), generate_inavalid_ip(), generate_string(), '*d', '_3'] - for case in cases: - node_page.set_fee(case) - assert node_page.wait_for('Fee must be a valid number.') - assert node_page.get_fee_button().is_enabled()==False - fee = grid_proxy.get_node_fee(node_id) - new_fee = valid_amount() - node_page.set_fee(new_fee).click() + valid_fee = valid_amount() + node_page.set_fee(valid_fee).click() node_page.wait_for('Additional fee is set successfully.') - counter = 0 - while(fee != new_fee): - fee = grid_proxy.get_node_fee(node_id) - counter += 1 - if(counter==30): - time.sleep(2) - assert grid_proxy.get_node_fee(node_id) == new_fee \ No newline at end of file From 578ab641d6b582f9ced964e3cd6aa33f9d8b8f50 Mon Sep 17 00:00:00 2001 From: khaledyoussef24 Date: Mon, 27 Jan 2025 09:35:59 +0200 Subject: [PATCH 2/3] Reset node.py and test_node.py --- .../tests/frontend_selenium/pages/node.py | 205 +++++++++++++++--- .../tests/Farms/test_node.py | 140 ++++++++++-- 2 files changed, 294 insertions(+), 51 deletions(-) diff --git a/packages/playground/tests/frontend_selenium/pages/node.py b/packages/playground/tests/frontend_selenium/pages/node.py index d535b5dbe3..e906f42a1f 100644 --- a/packages/playground/tests/frontend_selenium/pages/node.py +++ b/packages/playground/tests/frontend_selenium/pages/node.py @@ -1,10 +1,11 @@ +from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC - class NodePage: + """ This module contains Node table elements in Your Farms page. """ @@ -13,69 +14,217 @@ class NodePage: tfchain_button = (By.XPATH, "//span[text()='TFChain']") your_profile_button = (By.XPATH, "//span[text()='Your Profile']") twin_id_label = (By.XPATH, '/html/body/div[1]/div/div/main/div/div[2]/div/div/div/div[2]/div[2]/div[1]/div/div[1]/div[2]/div/div/div') + twin_details_label = (By.XPATH, "//*[contains(text(), 'Twin Details')]") farm_section = (By.XPATH, "//span[text()='Farms']") farm_page = (By.XPATH, "//span[text()='Your Farms']") - node_page = (By.XPATH, "//*[contains(text(), 'Your Nodes')]") + node_page = (By.XPATH , "//*[contains(text(), 'Your Nodes')]") + search_node_input = (By.XPATH, '/html/body/div[1]/div[1]/div[3]/div/div/div[5]/div/div[1]/div/div[1]/div/input') node_table = (By.XPATH, "//span[text()='Node ID']/ancestor::table/tbody/tr") + node_id = (By.XPATH , "//*[contains(text(), 'Node ID')]") + farm_id = (By.XPATH , '//*[@id="app"]/div[1]/div[2]/div/div[1]/div[5]/div[2]/div[1]/div[1]/table/thead/tr/th[3]') + country = (By.XPATH , "//*[contains(text(), 'Country')]") + serial_number = (By.XPATH , "//*[contains(text(), 'Serial Number')]") + status = (By.XPATH , "//*[contains(text(), 'Status')]") + id_label = (By.XPATH , "//*[contains(text(), 'Add a public config to your node with ID:')]") + update_msg = (By.XPATH , "//*[contains(text(), 'Are you sure you want to remove this node')]") ipv4 = (By.XPATH, "//label[text()='IPv4']/following-sibling::input") ipv4_gateway = (By.XPATH, "//label[text()='Gateway IPv4']/following-sibling::input") ipv6 = (By.XPATH, "//label[text()='IPv6']/following-sibling::input") ipv6_gateway = (By.XPATH, "//label[text()='Gateway IPv6']/following-sibling::input") domain = (By.XPATH, "//label[text()='Domain']/following-sibling::input") remove = (By.XPATH, "//button[.//span[text()=' Remove Config ']]") - submit = (By.XPATH, "//button[.//span[text()='Remove']]") + cancel = (By.XPATH, "//button[.//span[text()='Close']]") save = (By.XPATH, "//button[.//span[text()=' Save ']]") + submit = (By.XPATH, "//button[.//span[text()='Remove']]") fee_input = (By.XPATH, "//label[text()='Additional Fees']/following-sibling::input") set_btn = (By.XPATH, "//button[.//span[text()='Save']]") + fee_id = (By.XPATH , "//*[contains(text(), 'Additional fees will be added to your node')]") + table_xpath = "//span[text()='Node ID']/ancestor::table/tbody/tr" + def __init__(self, browser): self.browser = browser - + def navigate(self): WebDriverWait(self.browser, 30).until(EC.visibility_of_element_located(self.logout_button)) + webdriver.ActionChains(self.browser).send_keys(Keys.ESCAPE).perform() self.browser.find_element(*self.tfchain_button).click() self.browser.find_element(*self.your_profile_button).click() - WebDriverWait(self.browser, 30).until(EC.visibility_of_element_located(self.twin_id_label)) + WebDriverWait(self.browser, 30).until(EC.visibility_of_element_located(self.twin_details_label)) self.twin_id = self.browser.find_element(*self.twin_id_label).text self.browser.find_element(*self.farm_section).click() self.browser.find_element(*self.farm_page).click() WebDriverWait(self.browser, 30).until(EC.visibility_of_element_located(self.node_page)) + + def search_nodes(self, node): + self.browser.find_element(*self.search_node_input).send_keys(Keys.CONTROL + "a") + self.browser.find_element(*self.search_node_input).send_keys(Keys.DELETE) + self.browser.find_element(*self.search_node_input).send_keys(node) + + def get_node_count(self): + return len(self.browser.find_elements(*self.node_table)) + + def get_node_id(self, node_list): + ids = [] + for node in node_list: + ids.append(node['nodeId']) + return ids + + def get_farm_id(self, node_list): + ids = [] + for node in node_list: + ids.append(node['farmId']) + return ids + + def get_country(self, node_list): + country = [] + for node in node_list: + country.append(node['country']) + return country + + def get_serial_number(self, node_list): + numbers = [] + for node in node_list: + numbers.append(node['serialNumber']) + return numbers + + def get_status(self, node_list): + status = [] + for node in node_list: + status.append(node['status']) + return status + + def sort_node_id(self): + self.browser.find_element(*self.node_id).click() + node_id = [] + for i in range(1, len(self.browser.find_elements(*self.node_table))+1): + node_id.append(int(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i)}]/td[2]").text)) + return node_id + + def sort_farm_id(self): + self.browser.find_element(*self.farm_id).click() + farm_id = [] + for i in range(1, len(self.browser.find_elements(*self.node_table))+1): + farm_id.append(int(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i)}]/td[3]").text)) + return farm_id + def sort_country(self): + self.browser.find_element(*self.country).click() + country = [] + for i in range(1, len(self.browser.find_elements(*self.node_table))+1): + country.append(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i)}]/td[4]").text) + return country + + def sort_serial_number(self): + self.browser.find_element(*self.serial_number).click() + serial_number = [] + for i in range(1, len(self.browser.find_elements(*self.node_table))+1): + serial_number.append(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i)}]/td[5]").text) + return serial_number + + def sort_status(self): + self.browser.find_element(*self.status).click() + status = [] + for i in range(1, len(self.browser.find_elements(*self.node_table))+1): + status.append(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i)}]/td[6]").text) + return status + + def node_details(self): + self.browser.find_element(*self.node_id).click() + nodes = [] + for i in range(1, len(self.browser.find_elements(*self.node_table))+1): + self.browser.execute_script("window.scrollTo(0,document.body.scrollHeight)") + self.browser.find_element(By.XPATH, self.table_xpath+ '['+ str(i) +']/td[7]/button').click() + details = [] + WebDriverWait(self.browser, 30).until(EC.element_to_be_clickable((By.XPATH, self.table_xpath+ '['+ str(i) +']/td[6]/span[1]/i'))) + self.browser.find_element(By.XPATH, self.table_xpath+ '['+ str(i) +']/td[6]/span[1]/i').click() + WebDriverWait(self.browser, 30).until(EC.visibility_of_element_located(self.id_label)) + details.append(self.browser.find_element(*self.id_label).text[42:]) # ID + details.append(self.browser.find_element(*self.ipv4).get_attribute("value")) # IPV4 + details.append(self.browser.find_element(*self.ipv4_gateway).get_attribute("value")) # IPV4 Gateway + details.append(self.browser.find_element(*self.ipv6).get_attribute("value")) # IPV6 + details.append(self.browser.find_element(*self.ipv6_gateway).get_attribute("value")) # IPV6 Gateway + details.append(self.browser.find_element(*self.domain).get_attribute("value")) # Domain + self.browser.find_element(*self.cancel).click() + self.browser.execute_script("window.scrollTo(0,document.body.scrollHeight)") + self.browser.find_element(By.XPATH, self.table_xpath+ '['+ str(i) +']/td[7]/button').click() + details.append(int(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[1]/div[3]/div/div/div[1]/div[2]/p").text)) # Node ID + details.append(int(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[1]/div[3]/div/div/div[2]/div[2]/p").text)) # Farm ID + details.append(int(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[1]/div[3]/div/div/div[3]/div[2]/p").text)) # Twin ID + details.append(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[1]/div[3]/div/div/div[7]/div[2]/p").text) # Country + details.append(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[1]/div[3]/div/div/div[8]/div[2]/p").text) # City + details.append(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[1]/div[3]/div/div/div[5]/div[2]/p").text) # First Boot at + details.append(int(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[1]/div[3]/div/div/div[10]/div[2]/p").text)) # Pricing Policy + details.append(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[1]/div[3]/div/div/div[6]/div[2]/p").text) # Updated at + details.append(float(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[2]/div[3]/div/div[1]/div[2]/div/div").text[:-1])) # CRU + details.append(float(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[2]/div[3]/div/div[3]/div[2]/div/div").text[:-1])) # SRU + details.append(float(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[2]/div[3]/div/div[4]/div[2]/div/div").text[:-1])) # HRU + details.append(float(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[2]/div[3]/div/div[2]/div[2]/div/div").text[:-1])) # MRU + details.append(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i)}]/td[5]/span/div").text) # Status + details.append(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[1]/div[3]/div/div/div[4]/div[2]/p").text) # Certification + details.append(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[1]/div[3]/div/div/div[9]/div[2]/p").text) # Serial Number + details.append(float(self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i+1)}]/td/div[1]/div[3]/div/div/div[11]/div[2]/p").text[:-1])) # Uptime + nodes.append(details) + return nodes + def setup_config(self, node_id): - for i in range(1, len(self.browser.find_elements(*self.node_table)) + 1): - if self.browser.find_element(By.XPATH, f"//tbody/tr[{i}]/td[1]").text == str(node_id): - self.browser.find_element(By.XPATH, f"//tbody/tr[{i}]/td[6]/span[1]/i").click() - WebDriverWait(self.browser, 30).until(EC.visibility_of_element_located(self.ipv4)) + for i in range(1, len(self.browser.find_elements(*self.node_table))+1): + if (self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i)}]/td[1]").text==str(node_id)): + self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i)}]/td[6]/span[1]/i").click() + WebDriverWait(self.browser, 30).until(EC.visibility_of_element_located(self.id_label)) def add_config_input(self, ipv4, gw4, ipv6, gw6, domain): - if ipv4: - self.browser.find_element(*self.ipv4).clear() + if(ipv4): + self.browser.find_element(*self.ipv4).send_keys(Keys.CONTROL + "a") + self.browser.find_element(*self.ipv4).send_keys(Keys.DELETE) self.browser.find_element(*self.ipv4).send_keys(ipv4) - if gw4: - self.browser.find_element(*self.ipv4_gateway).clear() + if(gw4): + self.browser.find_element(*self.ipv4_gateway).send_keys(Keys.CONTROL + "a") + self.browser.find_element(*self.ipv4_gateway).send_keys(Keys.DELETE) self.browser.find_element(*self.ipv4_gateway).send_keys(gw4) - if ipv6: - self.browser.find_element(*self.ipv6).clear() + if(ipv6): + self.browser.find_element(*self.ipv6).send_keys(Keys.CONTROL + "a") + self.browser.find_element(*self.ipv6).send_keys(Keys.DELETE) self.browser.find_element(*self.ipv6).send_keys(ipv6) - if gw6: - self.browser.find_element(*self.ipv6_gateway).clear() + if(gw6): + self.browser.find_element(*self.ipv6_gateway).send_keys(Keys.CONTROL + "a") + self.browser.find_element(*self.ipv6_gateway).send_keys(Keys.DELETE) self.browser.find_element(*self.ipv6_gateway).send_keys(gw6) - if domain: - self.browser.find_element(*self.domain).clear() + if(domain): + self.browser.find_element(*self.domain).send_keys(Keys.CONTROL + "a") self.browser.find_element(*self.domain).send_keys(domain) return self.browser.find_element(*self.save) - def remove_config(self): - WebDriverWait(self.browser, 30).until(EC.element_to_be_clickable(self.remove)).click() - WebDriverWait(self.browser, 30).until(EC.element_to_be_clickable(self.submit)).click() + def get_save_button(self): + return self.browser.find_element(*self.save) + def remove_config(self): + WebDriverWait(self.browser, 30).until(EC.visibility_of_element_located(self.remove)) + WebDriverWait(self.browser, 30).until(EC.element_to_be_clickable(self.remove)) + self.browser.find_element(*self.remove).click() + WebDriverWait(self.browser, 30).until(EC.visibility_of_element_located(self.update_msg)) + WebDriverWait(self.browser, 30).until(EC.element_to_be_clickable(self.submit)) + self.browser.find_element(*self.submit).click() + def setup_fee(self, node_id): - for i in range(1, len(self.browser.find_elements(*self.node_table)) + 1): - if self.browser.find_element(By.XPATH, f"//tbody/tr[{i}]/td[1]").text == str(node_id): - self.browser.find_element(By.XPATH, f"//tbody/tr[{i}]/td[6]/span[2]/i").click() - WebDriverWait(self.browser, 30).until(EC.visibility_of_element_located(self.fee_input)) + for i in range(1, len(self.browser.find_elements(*self.node_table))+1): + if (self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i)}]/td[1]").text==str(node_id)): + self.browser.find_element(By.XPATH, self.table_xpath+ '['+ str(i) +']/td[6]/span[2]/i').click() + WebDriverWait(self.browser, 30).until(EC.visibility_of_element_located(self.fee_id)) def set_fee(self, fee): - self.browser.find_element(*self.fee_input).clear() + self.browser.find_element(*self.fee_input).send_keys(Keys.CONTROL + "a") + self.browser.find_element(*self.fee_input).send_keys(Keys.DELETE) self.browser.find_element(*self.fee_input).send_keys(fee) - return self.browser.find_element(*self.set_btn) \ No newline at end of file + return self.browser.find_element(*self.set_btn) + + def get_fee_button(self): + return self.browser.find_element(*self.set_btn) + + def wait_for_button(self, button): + WebDriverWait(self.browser, 30).until(EC.element_to_be_clickable(button)) + return button + + def wait_for(self, keyword): + WebDriverWait(self.browser, 30).until(EC.visibility_of_element_located((By.XPATH, "//*[contains(text(), '"+ keyword +"')]"))) + return True \ No newline at end of file diff --git a/packages/playground/tests/frontend_selenium/tests/Farms/test_node.py b/packages/playground/tests/frontend_selenium/tests/Farms/test_node.py index dca51f550a..c7485c8a4c 100644 --- a/packages/playground/tests/frontend_selenium/tests/Farms/test_node.py +++ b/packages/playground/tests/frontend_selenium/tests/Farms/test_node.py @@ -11,10 +11,6 @@ # Time required for the run (12 cases) is approximately 3 minutes. def before_test_setup(browser): - """ - Sets up the browser with necessary configurations, loads the dashboard, - and navigates to the Node page. - """ node_page = NodePage(browser) grid_proxy = GridProxy(browser) dashboard_page = DashboardPage(browser) @@ -41,6 +37,62 @@ def test_node_page(browser): assert str(node['nodeId']) in browser.page_source +# def test_search_node(browser): +# """ +# Test Case: TC1217 - Search node +# Steps: +# - Navigate to the dashboard. +# - Select an account (with node). +# - Click on Farm from side menu. +# - Enter keywords on search nodes input. +# - Search by node ID, serial number, certification, farming policy ID +# Result: Nodes searched for should be listed. +# """ +# node_page, _, grid_proxy, _ = before_test_setup(browser) +# nodes = grid_proxy.get_twin_node(str(node_page.twin_id)) +# for node in nodes: +# node_page.search_nodes(str(node['nodeId'])) +# assert node_page.get_node_count() == 1 +# node_page.search_nodes(str(node['serialNumber'])) +# assert node_page.get_node_count() == 1 +# node_page.search_nodes(str(node['certificationType'])) +# assert node_page.get_node_count() >= 1 +# node_page.search_nodes(str(node['farmingPolicyId'])) +# assert node_page.get_node_count() >= 1 +# node_page.search_nodes(generate_string()) +# assert 'No data available' in browser.page_source + + +# def test_sort_node(browser): +# """ +# Test Case: TC1218 - Sort nodes +# Steps: +# - Navigate to the dashboard. +# - Select an account (with node). +# - Click on Farm from side menu. +# - Click on column header to sort it (once ascend then descend then remove the sorting). +# - Sort nodes in any order using Node ID, Farm ID, Country, Serial Number, Status +# Result: Nodes should be sorted using specified column. +# """ +# node_page, _, grid_proxy, _ = before_test_setup(browser) +# node_list = grid_proxy.get_twin_node(str(node_page.twin_id)) +# # Sort by Node ID +# assert node_page.sort_node_id() == sorted(node_page.get_node_id(node_list), reverse=False) +# assert node_page.sort_node_id() == sorted(node_page.get_node_id(node_list), reverse=True) +# # Sort by Farm ID +# assert node_page.sort_farm_id() == sorted(node_page.get_farm_id(node_list), reverse=False) +# assert node_page.sort_farm_id() == sorted(node_page.get_farm_id(node_list), reverse=True) +# # Sort by Country +# assert node_page.sort_country() == sorted(node_page.get_country(node_list), reverse=False) +# assert node_page.sort_country() == sorted(node_page.get_country(node_list), reverse=True) +# # Sort by Serial Number +# assert node_page.sort_serial_number() == sorted(node_page.get_serial_number(node_list), reverse=False) +# assert node_page.sort_serial_number() == sorted(node_page.get_serial_number(node_list), reverse=True) +# # Sort by Status +# assert node_page.sort_status() == sorted(node_page.get_status(node_list), reverse=False) +# assert node_page.sort_status() == sorted(node_page.get_status(node_list), reverse=True) + + def test_node_details(browser): """ Test Case: TC1216 - Navigate to farm node @@ -92,18 +144,44 @@ def test_config_validation(browser): """ node_page, grid_proxy = before_test_setup(browser) nodes = grid_proxy.get_twin_node(str(node_page.twin_id)) - node_id = nodes[random.randint(0, len(nodes) - 1)]['nodeId'] + node_id = nodes[random.randint(0,len(nodes)-1)]['nodeId'] node_page.setup_config(node_id) cases = [generate_string(), '1.0.0.0/66', '239.255.255/17', '239.15.35.78.5/25', '239.15.35.78.5', ' ', '*.#.@.!|+-'] + assert node_page.add_config_input( "1.1.1.1/16", '1.1.1.2', '::2/16', '::1', 'tf.grid').is_enabled() == True for case in cases: node_page.add_config_input(case, 0, 0, 0, 0) assert node_page.wait_for('IPv4 is not valid.') - assert not node_page.get_save_button().is_enabled() - - node_page.add_config_input('255.0.0.1/32', 0, 0, 0, 0) + assert node_page.get_save_button().is_enabled()==False + node_page.add_config_input( '255.0.0.1/32', 0, 0, 0, 0) assert node_page.wait_for('Private IP addresses are not allowed.') - assert not node_page.get_save_button().is_enabled() - + assert node_page.get_save_button().is_enabled()==False + assert node_page.add_config_input( "1.1.1.1/16", '1.1.1.2', '::2/16', '::1', 'tf.grid').is_enabled() == True + cases = [generate_inavalid_gateway(), '1.0.0.', '1:1:1:1', '522.255.255.255', '.239.35.78', '1.1.1.1/16', '239.15.35.78.5', ' ', '*.#.@.!|+-'] + for case in cases: + node_page.add_config_input( 0, case, 0, 0, 0) + assert node_page.wait_for('Gateway is not valid.') + assert node_page.get_save_button().is_enabled()==False + assert node_page.add_config_input( "1.1.1.1/16", '1.1.1.2', '::2/16', '::1', 'tf.grid').is_enabled() == True + cases = [' ', '::g', '::+', ':: /6 5', '1:2:3', ':a', '1:2:3:4:5:6:7:8:9', generate_string(), generate_leters()] + for case in cases: + node_page.add_config_input( 0, 0, case, 0, 0) + assert node_page.wait_for('IP is not valid.') + assert node_page.get_save_button().is_enabled()==False + node_page.add_config_input( 0, 0, 'fd12:3456:789a:1::/64', 0, 0) + assert node_page.wait_for('Private IP addresses are not allowed.') + assert node_page.get_save_button().is_enabled()==False + assert node_page.add_config_input( "1.1.1.1/16", '1.1.1.2', '::2/16', '::1', 'tf.grid').is_enabled() == True + cases = [' ', '::g', '1:2:3', ':a', '1:2:3:4:5:6:7:8:9', generate_string(), generate_leters()] + for case in cases: + node_page.add_config_input( 0, 0, 0, case, 0) + assert node_page.wait_for('Gateway is not valid.') + assert node_page.get_save_button().is_enabled()==False + assert node_page.add_config_input( "1.1.1.1/16", '1.1.1.2', '::2/16', '::1', 'tf.grid').is_enabled() == True + cases = [generate_inavalid_ip(), generate_inavalid_gateway(), generate_string(), generate_leters(), ' ', '.', '/', 'q', '1', 'ww', 'ww/ww', '22.22'] + for case in cases: + node_page.add_config_input( 0, 0, 0, 0, case) + assert node_page.wait_for('Please provide a valid domain.') + assert node_page.get_save_button().is_enabled()==False def test_add_config(browser): """ @@ -118,22 +196,21 @@ def test_add_config(browser): """ node_page, grid_proxy = before_test_setup(browser) nodes = grid_proxy.get_twin_node(str(node_page.twin_id)) - rand_node = random.randint(0, len(nodes) - 1) + rand_node = random.randint(0,len(nodes)-1) node_id = nodes[rand_node]['nodeId'] old_ipv4 = nodes[rand_node]['publicConfig']['ipv4'] - new_ipv4 = '125.25.25.25/25' node_page.setup_config(node_id) - node_page.add_config_input(new_ipv4, '125.25.25.24', '2600:1f13:0d15:95:00::/64', '2600:1f13:0d15:95:00::1', 'tf.grid').click() + new_ipv4 = '125.25.25.25/25' + node_page.wait_for_button(node_page.add_config_input(new_ipv4, '125.25.25.24', '2600:1f13:0d15:95:00::/64', '2600:1f13:0d15:95:00::1', 'tf.grid')).click() node_page.wait_for('Public config saved successfully.') counter = 0 - while old_ipv4 != new_ipv4: + while(old_ipv4 != new_ipv4): old_ipv4 = grid_proxy.get_node_ipv4(node_id) counter += 1 - if counter == 30: + if(counter==30): time.sleep(2) assert grid_proxy.get_node_ipv4(node_id) == new_ipv4 - def test_remove_config(browser): """ Test Case: TC1222 - Remove a public config @@ -147,21 +224,20 @@ def test_remove_config(browser): """ node_page, grid_proxy = before_test_setup(browser) nodes = grid_proxy.get_twin_node(str(node_page.twin_id)) - rand_node = random.randint(0, len(nodes) - 1) + rand_node = random.randint(0,len(nodes)-1) node_id = nodes[rand_node]['nodeId'] node_page.setup_config(node_id) node_page.remove_config() node_page.wait_for('Public config removed successfully.') counter = 0 ipv4 = grid_proxy.get_node_ipv4(node_id) - while ipv4: + while(ipv4 != ''): ipv4 = grid_proxy.get_node_ipv4(node_id) counter += 1 - if counter == 30: + if(counter==30): time.sleep(2) assert grid_proxy.get_node_ipv4(node_id) == '' - def test_additional_fee(browser): """ Test Case: TC1750 - Additional Fee @@ -175,9 +251,27 @@ def test_additional_fee(browser): """ node_page, grid_proxy = before_test_setup(browser) nodes = grid_proxy.get_twin_node(str(node_page.twin_id)) - rand_node = random.randint(0, len(nodes) - 1) + rand_node = random.randint(0,len(nodes)-1) node_id = nodes[rand_node]['nodeId'] node_page.setup_fee(node_id) - valid_fee = valid_amount() - node_page.set_fee(valid_fee).click() + cases = ['-10', '0', '-5', '-0', '-8.84'] + for case in cases: + node_page.set_fee(case) + assert node_page.wait_for('Fee must be a 0 or more.') + assert node_page.get_fee_button().is_enabled()==False + cases = [generate_inavalid_gateway(), generate_inavalid_ip(), generate_string(), '*d', '_3'] + for case in cases: + node_page.set_fee(case) + assert node_page.wait_for('Fee must be a valid number.') + assert node_page.get_fee_button().is_enabled()==False + fee = grid_proxy.get_node_fee(node_id) + new_fee = valid_amount() + node_page.set_fee(new_fee).click() node_page.wait_for('Additional fee is set successfully.') + counter = 0 + while(fee != new_fee): + fee = grid_proxy.get_node_fee(node_id) + counter += 1 + if(counter==30): + time.sleep(2) + assert grid_proxy.get_node_fee(node_id) == new_fee \ No newline at end of file From 2034f29e70f8829ad3d0c0a839588197f0cc4918 Mon Sep 17 00:00:00 2001 From: khaledyoussef24 Date: Mon, 27 Jan 2025 10:18:50 +0200 Subject: [PATCH 3/3] changes for node.py functions and test_py --- .../tests/frontend_selenium/pages/node.py | 45 ++++++++++++++----- .../tests/Farms/test_node.py | 38 +++++++++------- 2 files changed, 55 insertions(+), 28 deletions(-) diff --git a/packages/playground/tests/frontend_selenium/pages/node.py b/packages/playground/tests/frontend_selenium/pages/node.py index e906f42a1f..c9d5e7016c 100644 --- a/packages/playground/tests/frontend_selenium/pages/node.py +++ b/packages/playground/tests/frontend_selenium/pages/node.py @@ -167,12 +167,16 @@ def node_details(self): nodes.append(details) return nodes - def setup_config(self, node_id): - for i in range(1, len(self.browser.find_elements(*self.node_table))+1): - if (self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i)}]/td[1]").text==str(node_id)): - self.browser.find_element(By.XPATH, f"{self.table_xpath}[{str(i)}]/td[6]/span[1]/i").click() - WebDriverWait(self.browser, 30).until(EC.visibility_of_element_located(self.id_label)) - +def setup_config(self, node_id): + """ + Prepares the setup configuration for a given node ID. + """ + for i in range(1, len(self.browser.find_elements(*self.node_table)) + 1): + if self.browser.find_element(By.XPATH, f"{self.table_xpath}[{i}]/td[1]").text == str(node_id): + elem = self.browser.find_element(By.XPATH, f"{self.table_xpath}[{i}]/td[6]/span[1]/i") + self.browser.execute_script("arguments[0].scrollIntoView(true);", elem) + WebDriverWait(self.browser, 30).until(EC.element_to_be_clickable(elem)).click() + WebDriverWait(self.browser, 30).until(EC.visibility_of_element_located(self.id_label)) def add_config_input(self, ipv4, gw4, ipv6, gw6, domain): if(ipv4): self.browser.find_element(*self.ipv4).send_keys(Keys.CONTROL + "a") @@ -221,10 +225,27 @@ def set_fee(self, fee): def get_fee_button(self): return self.browser.find_element(*self.set_btn) - def wait_for_button(self, button): - WebDriverWait(self.browser, 30).until(EC.element_to_be_clickable(button)) - return button +def wait_for(self, keyword): + """ + Waits for an element with specific text to be visible on the page. + """ + try: + WebDriverWait(self.browser, 60).until( + EC.visibility_of_element_located((By.XPATH, f"//*[contains(text(), '{keyword}')]")) + ) + except TimeoutException: + print(f"Timeout waiting for keyword: {keyword}") + raise + return True + - def wait_for(self, keyword): - WebDriverWait(self.browser, 30).until(EC.visibility_of_element_located((By.XPATH, "//*[contains(text(), '"+ keyword +"')]"))) - return True \ No newline at end of file +def wait_for_button(self, button): + """ + Waits for a button to be clickable. + """ + try: + WebDriverWait(self.browser, 60).until(EC.element_to_be_clickable(button)) + except TimeoutException: + print("Timeout waiting for button to be clickable.") + raise + return button diff --git a/packages/playground/tests/frontend_selenium/tests/Farms/test_node.py b/packages/playground/tests/frontend_selenium/tests/Farms/test_node.py index c7485c8a4c..f2191e5853 100644 --- a/packages/playground/tests/frontend_selenium/tests/Farms/test_node.py +++ b/packages/playground/tests/frontend_selenium/tests/Farms/test_node.py @@ -11,6 +11,9 @@ # Time required for the run (12 cases) is approximately 3 minutes. def before_test_setup(browser): + """ + Prepares the test environment by initializing required pages and importing the test account. + """ node_page = NodePage(browser) grid_proxy = GridProxy(browser) dashboard_page = DashboardPage(browser) @@ -29,7 +32,7 @@ def test_node_page(browser): - Navigate to the dashboard. - Login into an account (with node). - Click on Farm from side menu. - Result: User should be navigated to Farm Nodes page and see all his node. + Result: User should be navigated to Farm Nodes page and see all his nodes. """ node_page, grid_proxy = before_test_setup(browser) nodes = grid_proxy.get_twin_node(str(node_page.twin_id)) @@ -37,6 +40,8 @@ def test_node_page(browser): assert str(node['nodeId']) in browser.page_source + + # def test_search_node(browser): # """ # Test Case: TC1217 - Search node @@ -196,21 +201,23 @@ def test_add_config(browser): """ node_page, grid_proxy = before_test_setup(browser) nodes = grid_proxy.get_twin_node(str(node_page.twin_id)) - rand_node = random.randint(0,len(nodes)-1) + rand_node = random.randint(0, len(nodes) - 1) node_id = nodes[rand_node]['nodeId'] old_ipv4 = nodes[rand_node]['publicConfig']['ipv4'] node_page.setup_config(node_id) new_ipv4 = '125.25.25.25/25' - node_page.wait_for_button(node_page.add_config_input(new_ipv4, '125.25.25.24', '2600:1f13:0d15:95:00::/64', '2600:1f13:0d15:95:00::1', 'tf.grid')).click() + node_page.wait_for_button( + node_page.add_config_input(new_ipv4, '125.25.25.24', '2600:1f13:0d15:95:00::/64', '2600:1f13:0d15:95:00::1', 'tf.grid') + ).click() node_page.wait_for('Public config saved successfully.') counter = 0 - while(old_ipv4 != new_ipv4): + while old_ipv4 != new_ipv4 and counter < 30: old_ipv4 = grid_proxy.get_node_ipv4(node_id) counter += 1 - if(counter==30): - time.sleep(2) + time.sleep(2) assert grid_proxy.get_node_ipv4(node_id) == new_ipv4 + def test_remove_config(browser): """ Test Case: TC1222 - Remove a public config @@ -224,20 +231,20 @@ def test_remove_config(browser): """ node_page, grid_proxy = before_test_setup(browser) nodes = grid_proxy.get_twin_node(str(node_page.twin_id)) - rand_node = random.randint(0,len(nodes)-1) + rand_node = random.randint(0, len(nodes) - 1) node_id = nodes[rand_node]['nodeId'] node_page.setup_config(node_id) node_page.remove_config() node_page.wait_for('Public config removed successfully.') counter = 0 ipv4 = grid_proxy.get_node_ipv4(node_id) - while(ipv4 != ''): + while ipv4 != '' and counter < 30: ipv4 = grid_proxy.get_node_ipv4(node_id) counter += 1 - if(counter==30): - time.sleep(2) + time.sleep(2) assert grid_proxy.get_node_ipv4(node_id) == '' + def test_additional_fee(browser): """ Test Case: TC1750 - Additional Fee @@ -251,27 +258,26 @@ def test_additional_fee(browser): """ node_page, grid_proxy = before_test_setup(browser) nodes = grid_proxy.get_twin_node(str(node_page.twin_id)) - rand_node = random.randint(0,len(nodes)-1) + rand_node = random.randint(0, len(nodes) - 1) node_id = nodes[rand_node]['nodeId'] node_page.setup_fee(node_id) cases = ['-10', '0', '-5', '-0', '-8.84'] for case in cases: node_page.set_fee(case) assert node_page.wait_for('Fee must be a 0 or more.') - assert node_page.get_fee_button().is_enabled()==False + assert not node_page.get_fee_button().is_enabled() cases = [generate_inavalid_gateway(), generate_inavalid_ip(), generate_string(), '*d', '_3'] for case in cases: node_page.set_fee(case) assert node_page.wait_for('Fee must be a valid number.') - assert node_page.get_fee_button().is_enabled()==False + assert not node_page.get_fee_button().is_enabled() fee = grid_proxy.get_node_fee(node_id) new_fee = valid_amount() node_page.set_fee(new_fee).click() node_page.wait_for('Additional fee is set successfully.') counter = 0 - while(fee != new_fee): + while fee != new_fee and counter < 30: fee = grid_proxy.get_node_fee(node_id) counter += 1 - if(counter==30): - time.sleep(2) + time.sleep(2) assert grid_proxy.get_node_fee(node_id) == new_fee \ No newline at end of file