From 358533ea223202d41144b1b287faa85cb9e8f7eb Mon Sep 17 00:00:00 2001 From: marina Date: Sun, 18 Aug 2024 15:03:32 +0300 Subject: [PATCH 01/13] development_selenium_add_stats_page_tests --- packages/playground/public/config.js | 16 ++-- .../tests/frontend_selenium/Config.ini | 10 +-- .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 202 bytes .../__pycache__/dashboard.cpython-312.pyc | Bin 0 -> 26375 bytes .../pages/__pycache__/farm.cpython-312.pyc | Bin 0 -> 39936 bytes .../__pycache__/statistics.cpython-312.pyc | Bin 0 -> 6564 bytes .../pages/__pycache__/twin.cpython-312.pyc | Bin 0 -> 11021 bytes .../frontend_selenium/pages/statistics.py | 80 ++++++++++++++++++ .../test_farm.cpython-312-pytest-7.4.0.pyc | Bin 0 -> 67633 bytes .../test_twin.cpython-312-pytest-7.4.0.pyc | Bin 0 -> 13470 bytes ...st_statistics.cpython-312-pytest-7.4.0.pyc | Bin 0 -> 11144 bytes .../tests/TFGrid/test_statistics.py | 47 ++++++++++ .../conftest.cpython-312-pytest-7.4.0.pyc | Bin 0 -> 1213 bytes .../conftest.cpython-312-pytest-7.4.4.pyc | Bin 0 -> 1308 bytes .../tests/frontend_selenium/tests/conftest.py | 4 +- .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 202 bytes .../utils/__pycache__/base.cpython-312.pyc | Bin 0 -> 792 bytes .../__pycache__/grid_proxy.cpython-312.pyc | Bin 0 -> 6028 bytes .../utils/__pycache__/utils.cpython-312.pyc | Bin 0 -> 14374 bytes .../frontend_selenium/utils/grid_proxy.py | 45 +++++++++- .../tests/frontend_selenium/utils/utils.py | 23 +++-- yarn.lock | 10 +++ 22 files changed, 212 insertions(+), 23 deletions(-) create mode 100644 packages/playground/tests/frontend_selenium/pages/__pycache__/__init__.cpython-312.pyc create mode 100644 packages/playground/tests/frontend_selenium/pages/__pycache__/dashboard.cpython-312.pyc create mode 100644 packages/playground/tests/frontend_selenium/pages/__pycache__/farm.cpython-312.pyc create mode 100644 packages/playground/tests/frontend_selenium/pages/__pycache__/statistics.cpython-312.pyc create mode 100644 packages/playground/tests/frontend_selenium/pages/__pycache__/twin.cpython-312.pyc create mode 100644 packages/playground/tests/frontend_selenium/pages/statistics.py create mode 100644 packages/playground/tests/frontend_selenium/tests/Farms/__pycache__/test_farm.cpython-312-pytest-7.4.0.pyc create mode 100644 packages/playground/tests/frontend_selenium/tests/TFChain/__pycache__/test_twin.cpython-312-pytest-7.4.0.pyc create mode 100644 packages/playground/tests/frontend_selenium/tests/TFGrid/__pycache__/test_statistics.cpython-312-pytest-7.4.0.pyc create mode 100644 packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py create mode 100644 packages/playground/tests/frontend_selenium/tests/__pycache__/conftest.cpython-312-pytest-7.4.0.pyc create mode 100644 packages/playground/tests/frontend_selenium/tests/__pycache__/conftest.cpython-312-pytest-7.4.4.pyc create mode 100644 packages/playground/tests/frontend_selenium/utils/__pycache__/__init__.cpython-312.pyc create mode 100644 packages/playground/tests/frontend_selenium/utils/__pycache__/base.cpython-312.pyc create mode 100644 packages/playground/tests/frontend_selenium/utils/__pycache__/grid_proxy.cpython-312.pyc create mode 100644 packages/playground/tests/frontend_selenium/utils/__pycache__/utils.cpython-312.pyc diff --git a/packages/playground/public/config.js b/packages/playground/public/config.js index cfc777261b..ee65d923f7 100644 --- a/packages/playground/public/config.js +++ b/packages/playground/public/config.js @@ -1,16 +1,16 @@ window.env = { - NETWORK: "dev", - GRAPHQL_URL: "https://graphql.dev.grid.tf/graphql", - GRIDPROXY_URL: "https://gridproxy.dev.grid.tf", - SUBSTRATE_URL: "wss://tfchain.dev.grid.tf/ws", - ACTIVATION_SERVICE_URL: "https://activation.dev.grid.tf/activation/activate", - RELAY_DOMAIN: "wss://relay.dev.grid.tf", - BRIDGE_TFT_ADDRESS: "GDHJP6TF3UXYXTNEZ2P36J5FH7W4BJJQ4AYYAXC66I2Q2AH5B6O6BCFG", + NETWORK: "test", + GRAPHQL_URL: "https://graphql.test.grid.tf/graphql", + GRIDPROXY_URL: "https://gridproxy.test.grid.tf", + SUBSTRATE_URL: "wss://tfchain.test.grid.tf/ws", + ACTIVATION_SERVICE_URL: "https://activation.test.grid.tf/activation/activate", + RELAY_DOMAIN: "wss://relay.test.grid.tf", + BRIDGE_TFT_ADDRESS: "GA2CWNBUHX7NZ3B5GR4I23FMU7VY5RPA77IUJTIXTTTGKYSKDSV6LUA4", STELLAR_NETWORK: "test", STELLAR_HORIZON_URL: "https://horizon-testnet.stellar.org", TFT_ASSET_ISSUER: "GA47YZA3PKFUZMPLQ3B5F2E3CJIB57TGGU7SPCQT2WAEYKN766PWIMB3", MINTING_URL: "https://alpha.minting.tfchain.grid.tf", - STATS_URL: "https://stats.dev.grid.tf", + STATS_URL: "https://stats.test.grid.tf", TIMEOUT: +"10000", PAGE_SIZE: +"20", MANUAL_URL: "https://www.manual.grid.tf", diff --git a/packages/playground/tests/frontend_selenium/Config.ini b/packages/playground/tests/frontend_selenium/Config.ini index 2222b381f4..59341f9f9d 100644 --- a/packages/playground/tests/frontend_selenium/Config.ini +++ b/packages/playground/tests/frontend_selenium/Config.ini @@ -1,8 +1,8 @@ [Base] port = 5173 -net = dev +net = test [Utils] -seed = -node_seed = -address = -email = \ No newline at end of file +seed = hobby minor mule problem action bomb eye frown coil lunch runway caution +node_seed = thank crowd vintage story arrow fantasy this spray speed cherry snow water +address = GAK2AN6ZC4REV2GXZPTMJG2JKLRJQX746JNG7ACKNC4RSJE7ETAZSE7D +email = marinaemad559@gmail.com \ No newline at end of file diff --git a/packages/playground/tests/frontend_selenium/pages/__pycache__/__init__.cpython-312.pyc b/packages/playground/tests/frontend_selenium/pages/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..741588dc106036d596f359732548747a9898b39e GIT binary patch literal 202 zcmX@j%ge<81kJ&l(?IlN5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!%GA%u&rQ|OO)SdH zOVoEsEzT~6n zOHzx0GHFHmc_pcNDe=WHodsZp@$s2?nI-Y@dIgogIBatBQ%ZAE?TT1|HZuZoF^KVz MnURsPh#ANN0GseQh5!Hn literal 0 HcmV?d00001 diff --git a/packages/playground/tests/frontend_selenium/pages/__pycache__/dashboard.cpython-312.pyc b/packages/playground/tests/frontend_selenium/pages/__pycache__/dashboard.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b4701ceda547f4e2312038d349b5e7ca7cd8fa8 GIT binary patch literal 26375 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 z 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 E4@RNH`~Uy| literal 0 HcmV?d00001 diff --git a/packages/playground/tests/frontend_selenium/pages/__pycache__/statistics.cpython-312.pyc b/packages/playground/tests/frontend_selenium/pages/__pycache__/statistics.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2e443a2b74a9c1a03113a5e48e3b8e659c6ec456 GIT binary patch literal 6564 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 MBM8qkgr(->KM!xC{Qv*} literal 0 HcmV?d00001 diff --git a/packages/playground/tests/frontend_selenium/pages/__pycache__/twin.cpython-312.pyc b/packages/playground/tests/frontend_selenium/pages/__pycache__/twin.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59e0d78a71f5607703d4b0c83b5e5f68e96b125e GIT binary patch literal 11021 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 F{{Z{IqyYc` literal 0 HcmV?d00001 diff --git a/packages/playground/tests/frontend_selenium/pages/statistics.py b/packages/playground/tests/frontend_selenium/pages/statistics.py new file mode 100644 index 0000000000..ff8bee4104 --- /dev/null +++ b/packages/playground/tests/frontend_selenium/pages/statistics.py @@ -0,0 +1,80 @@ +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 +from selenium.common.exceptions import TimeoutException + + + +class StatisticsPage: + + logout_button = (By.XPATH, "//button[.//span[text()=' Logout ']]") + tfgrid_button = (By.XPATH, "//span[text()='TFGrid']") + statistics_button = (By.XPATH, "//span[text()='Node Statistics']") + statistics_label = (By.XPATH, "//*[contains(text(), 'Statistics')]") + map= (By.XPATH, "/html/body/div[1]/div/div/main/div/div[2]/div/div/div/div[3]/div[2]") + map= (By.XPATH,"//button[contains(@class, 'btn-main-container')]") + nodes_online = (By.XPATH, "//span[text()='Nodes Online']/ancestor::div/following-sibling::div[@class='v-card-text card-body']") + dedicated_machines = (By.XPATH, "//span[text()='Dedicated Machines']/ancestor::div/following-sibling::div[@class='v-card-text card-body']") + farms = (By.XPATH, "//span[text()='Farms']/ancestor::div/following-sibling::div[@class='v-card-text card-body']") + countries = (By.XPATH, "//span[text()='Countries']/ancestor::div/following-sibling::div[@class='v-card-text card-body']") + cpus = (By.XPATH, "//span[text()='CPUs']/ancestor::div/following-sibling::div[@class='v-card-text card-body']") + ssd_storage = (By.XPATH, "//span[text()='SSD Storage']/ancestor::div/following-sibling::div[@class='v-card-text card-body']") + hdd_storage = (By.XPATH, "//span[text()='HDD Storage']/ancestor::div/following-sibling::div[@class='v-card-text card-body']") + ram = (By.XPATH, "//span[text()='RAM']/ancestor::div/following-sibling::div[@class='v-card-text card-body']") + gpus = (By.XPATH, "//span[text()='GPUs']/ancestor::div/following-sibling::div[@class='v-card-text card-body']") + access_nodes = (By.XPATH, "//span[text()='Access Nodes']/ancestor::div/following-sibling::div[@class='v-card-text card-body']") + gateways = (By.XPATH, "//span[text()='Gateways']/ancestor::div/following-sibling::div[@class='v-card-text card-body']") + twins = (By.XPATH, "//span[text()='Twins']/ancestor::div/following-sibling::div[@class='v-card-text card-body']") + public_ips = (By.XPATH, "//span[text()='Public IPs']/ancestor::div/following-sibling::div[@class='v-card-text card-body']") + conracts = (By.XPATH, "//span[text()='Contracts']/ancestor::div/following-sibling::div[@class='v-card-text card-body']") + number_of_workloads = (By.XPATH, "//span[text()='Number of workloads']/ancestor::div/following-sibling::div[@class='v-card-text card-body']") + + + 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.tfgrid_button).click() + self.browser.find_element(*self.statistics_button).click() + WebDriverWait(self.browser, 60).until(EC.visibility_of_element_located(self.statistics_label)) + + def statistics_detials(self): + details = [] + wait = WebDriverWait(self.browser, 60) # Increased wait time to 60 seconds + + elements_to_fetch = [ + ("Nodes Online", self.nodes_online), + ("Dedicated Machines", self.dedicated_machines), + ("Farms", self.farms), + ("Countries", self.countries), + ("CPUs", self.cpus), + ("SSD Storage", self.ssd_storage), + ("HDD Storage", self.hdd_storage), + ("RAM", self.ram), + ("GPUs", self.gpus), + ("Access Nodes", self.access_nodes), + ("Gateways", self.gateways), + ("Twins", self.twins), + ("Public IPs", self.public_ips), + ("Contracts", self.conracts), + ("Number of workloads", self.number_of_workloads) + ] + + try: + for name, locator in elements_to_fetch: + try: + element_text = wait.until(EC.visibility_of_element_located(locator)).text + details.append(element_text) + print(f"{name} fetched: {element_text}") + except TimeoutException: + print(f"{name} not found within the specified time.") + details.append(None) # Add None or some default value to maintain list consistency + + except TimeoutException as e: + print(f"TimeoutException: {e}") + + return details \ No newline at end of file diff --git a/packages/playground/tests/frontend_selenium/tests/Farms/__pycache__/test_farm.cpython-312-pytest-7.4.0.pyc b/packages/playground/tests/frontend_selenium/tests/Farms/__pycache__/test_farm.cpython-312-pytest-7.4.0.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0e6c9689957023bcfde788edefedc7c937749e45 GIT binary patch literal 67633 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 f(ibrGDcX9hYCZpd_)mTn literal 0 HcmV?d00001 diff --git a/packages/playground/tests/frontend_selenium/tests/TFChain/__pycache__/test_twin.cpython-312-pytest-7.4.0.pyc b/packages/playground/tests/frontend_selenium/tests/TFChain/__pycache__/test_twin.cpython-312-pytest-7.4.0.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da33b079feccf695fd501b29dbcb5a25d8239cd4 GIT binary patch literal 13470 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 L5-EOxXM_9)Url%+ literal 0 HcmV?d00001 diff --git a/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py b/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py new file mode 100644 index 0000000000..3b35afe907 --- /dev/null +++ b/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py @@ -0,0 +1,47 @@ +import math +from utils.utils import byte_converter,convert_to_scaled_float +from pages.statistics import StatisticsPage +from utils.grid_proxy import GridProxy +from pages.dashboard import DashboardPage +from selenium.webdriver.common.by import By +from selenium.webdriver.common.action_chains import ActionChains + + +def before_test_setup(browser): + statistics_page = StatisticsPage(browser) + dashboard_page = DashboardPage(browser) + dashboard_page.open_and_load() + statistics_page.navigate() + return statistics_page + + +def test_statistics_details(browser): + statistics_page = before_test_setup(browser) + grid_proxy = GridProxy(browser) + + statistics_details = statistics_page.statistics_detials() + print("Statistics Details:", statistics_details) + grid_statistics_details = grid_proxy.get_stats() + + # Convert necessary values from string to integer before comparing + statistics_details_converted = [int(detail.replace(',', '')) if detail is not None and detail.isdigit() else detail for detail in statistics_details] + # Full set of assertions, comparing UI stats with proxy stats + assert grid_statistics_details['nodes'] == statistics_details_converted[0] + assert grid_statistics_details['dedicatedNodes'] == statistics_details_converted[1] + assert grid_statistics_details['farms'] == statistics_details_converted[2] + assert grid_statistics_details['countries'] == statistics_details_converted[3] + assert grid_statistics_details['totalCru'] == statistics_details_converted[4] + assert math.isclose(convert_to_scaled_float(grid_statistics_details['totalSru']), convert_to_scaled_float(byte_converter(statistics_details_converted[5])), abs_tol=0.002) + assert math.isclose(convert_to_scaled_float(grid_statistics_details['totalHru']), convert_to_scaled_float(byte_converter(statistics_details_converted[6])), abs_tol=0.002) + assert math.isclose(convert_to_scaled_float(grid_statistics_details['totalMru']), convert_to_scaled_float(byte_converter(statistics_details_converted[7])), abs_tol=0.002) + assert grid_statistics_details['gpus'] == statistics_details_converted[8] + assert grid_statistics_details['accessNodes'] == statistics_details_converted[9] + assert grid_statistics_details['gateways'] == statistics_details_converted[10] + assert grid_statistics_details['twins'] == statistics_details_converted[11] + assert grid_statistics_details['publicIps'] == statistics_details_converted[12] + assert grid_statistics_details['contracts'] == statistics_details_converted[13] + assert grid_statistics_details['workloads_number'] == statistics_details_converted[14] + + + + \ No newline at end of file diff --git a/packages/playground/tests/frontend_selenium/tests/__pycache__/conftest.cpython-312-pytest-7.4.0.pyc b/packages/playground/tests/frontend_selenium/tests/__pycache__/conftest.cpython-312-pytest-7.4.0.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d57e96fdf84b624775244d2e09c9ac6fd0eed2f4 GIT binary patch literal 1213 zcmZuw%}*0S6o0eb?rsZPP?Vqv4Mx!PU~5nk4#r3zazOOJt(Ru$PGMlboY}V4KvGb{ zf1n<@8t~+w;fY9snS^-IgWNE9P*2Y6c8dWg*_roy^LuaJ$G(rInFXbrO*!t<7A zEk$a50n-MlV!_a72n!smRXueMpbBtZd?(+ z%u1qMNB{7&Gb91m(5|}Ed1GB!Q&uwPId-T5Nfnf%whnMKDY7XjTyGFY79Gr0MxI9%^MjE19;1dJQyJ#bJ!z&>nHH7R z;AUL+Coz+2G30#=hm|JrY``9n&}qN^p>qQtXGGnlQ0eo$J#4)#dhErqouO6*(AUcD8vQeahAMc;)W+Pp;l zx@VU{%*0KN`d)}VyTZDbk-qACHOVLjEv_$8zsWGAgW_#jZ&nlAclgzYp9b^|zO}ZU z{oI}QtVBZxxv{<6*r(jh_Ut!v@W342Gl#dA_RV7Z;b%2_pkCcmufDyzeQ964ajZeQ zr=uC)SMvh*T-baRski1f=3dSJX0o80Q@5waQQ-nN7VE?biN|>FgP>LEqAQi46-8?? z5vOcTk>VyLA?BH`itC9kD~u(*Vo|QeA~%u(#N8X}j!?yoXQo(<=7`E4oL@`W#V)UN zUlakzxuR*w>knEDLc_Y{B+ZohaJ@#Jg>{OfioSyrp#yqZY=4YahWev6bJ*|4;_d#gh~${gFgRh2>v%<1}ah literal 0 HcmV?d00001 diff --git a/packages/playground/tests/frontend_selenium/tests/__pycache__/conftest.cpython-312-pytest-7.4.4.pyc b/packages/playground/tests/frontend_selenium/tests/__pycache__/conftest.cpython-312-pytest-7.4.4.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27de17f6870a07dbe831f39291dcf69a554936f5 GIT binary patch literal 1308 zcmZ8g&2JM&6o0c`@2>5vos^aaB&<{|P#>_Rwn!XMRY3%Yd~o3Ai?#8N!#MlZnQ@G( zL~>}V{0D_&u2tZ~pTQ|=q@a)v4j;Jp&`GA7`BOM>U%gO37eqx3YwLf1eLn(ZRW7^`hb#t7`tX*;Q|5R}4lyPRS( zsDv}^nG_cTH>|d+2ugsheqBG8pT4yV2NSV9J3k7!?v+y^edXlPrv9}IxYm##?3j6 zd|Th5EPh4LQEFM!e17W4BoF<$T(42ikKk2dh#Jl+RY_?Wr(+x7^p4D8!w~i+VPq}9 z!er#9G~;o?NgOe%{*spDc6wL2m8eROC^GI*PE|^Uo0acT<{+$06g7r+|S zZAh=yV;ta!48j)gtyALPV*bW0&RU7r-H=Trf$W)e8V@4B#W9mikH!(lk>6oc&s5)y zqn@&8CL>|5(Rj!(rStM_RY3MsZhyf)W4LgjcKL<39~@P`9Y1_)R`ynQR(2mRppu#4=LeTl%^_SYh777EAx&=g_S|!=#*qtou5uahl`b;9Qyl{akJzoV#J{4+8u>y(vXC zOYFAX&I$;jKLB>&XZHl^CvfKkZlAzcXQqM7GY1T3uf9|N+xQG!Ixm1Rn<9EcdVU0r CP($qi literal 0 HcmV?d00001 diff --git a/packages/playground/tests/frontend_selenium/tests/conftest.py b/packages/playground/tests/frontend_selenium/tests/conftest.py index 50e29c43d8..43db8ccf9c 100644 --- a/packages/playground/tests/frontend_selenium/tests/conftest.py +++ b/packages/playground/tests/frontend_selenium/tests/conftest.py @@ -13,7 +13,7 @@ def browser(): # Virtual display for the browser, allowing it to run in headless mode display = Display(visible=0, size=(1920, 1080)) - display.start() + #display.start() # Initialize the ChromeDriver instance with options options = webdriver.ChromeOptions() @@ -30,4 +30,4 @@ def browser(): # Quit the WebDriver instance for the cleanup driver.quit() # Ending virtual display for the browser - display.stop() \ No newline at end of file + #display.stop() \ No newline at end of file diff --git a/packages/playground/tests/frontend_selenium/utils/__pycache__/__init__.cpython-312.pyc b/packages/playground/tests/frontend_selenium/utils/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e9caa90d5c7ed0f071df87d8483a2b5d46718d20 GIT binary patch literal 202 zcmX@j%ge<81kJ&l(?IlN5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!%GA%u&rQ|OO)SdH zOVoEsEzT~6n zOHzx0GHFHmc_pcNDe=WHouwt2ImP<%@tJvljA6uz^a#BpMUHYpMVqA*0wPy#^f%E8^<?@(Ejk9GHY3o|P&V<@ zf4p4c75Zu|A1k{K#RF|G@SASSaD6vc!ho6MxP16e+j@J$-+nzyluqv{Y zr(48DAqighjX~ZJ!eCAFuvUy!+xDFe${ilxl?Q;BSVK!OyXj? zz|&M^Q!iEsb`Z(%n~*GrSf-4`>Px<{-6LMCFBcH<0$lMLFvDg$=wh?$5Z8CieM~zn z2+cb7us#o7V|EgCbz4}?-7(SdT+S`NUgHiE|a&uZ(8C6er&Z|-3_Hciy zT^n6LHO|)}?bdK_TDtSTKCXOt7L|<4a#XrId_1jeTx^Z$pk sk-~zLRlyRg!r4r{pFa2wS>satL{#K|$`HbDp!{3O!d>_a2u!;E0NrB9=>Px# literal 0 HcmV?d00001 diff --git a/packages/playground/tests/frontend_selenium/utils/__pycache__/grid_proxy.cpython-312.pyc b/packages/playground/tests/frontend_selenium/utils/__pycache__/grid_proxy.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c49c268fd523160963dde6166c1e2a44b514d40f GIT binary patch literal 6028 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 K)&OMC{{A07H0Iy{ literal 0 HcmV?d00001 diff --git a/packages/playground/tests/frontend_selenium/utils/grid_proxy.py b/packages/playground/tests/frontend_selenium/utils/grid_proxy.py index 6ead105842..e9921c2c2f 100644 --- a/packages/playground/tests/frontend_selenium/utils/grid_proxy.py +++ b/packages/playground/tests/frontend_selenium/utils/grid_proxy.py @@ -62,7 +62,46 @@ def get_twin_node(self, twin_id): details = r.json() return details + def get_stats(self): - r = requests.post('https://stats.' + Base.net + '.grid.tf/api/stats-summary') - stats_json = r.json() - return list(stats_json.values()) \ No newline at end of file + up = requests.get(Base.gridproxy_url + 'stats?status=up').json() + standby = requests.get(Base.gridproxy_url + 'stats?status=standby').json() + + # Initialize a dictionary to store the merged data + merged_data = {} + + # Merge simple values, summing if they differ + keys_to_sum = ['nodes', 'accessNodes', 'totalCru', 'totalSru', 'totalMru', 'totalHru', 'gpus', 'dedicatedNodes', 'workloads_number'] + for key in keys_to_sum: + merged_data[key] = up[key] + standby[key] + + # Merge the "farms", "publicIps", "gateways", "twins", and "contracts" fields (they are the same) + keys_to_add_once = ['farms', 'publicIps', 'gateways', 'twins', 'contracts'] + for key in keys_to_add_once: + merged_data[key] = up[key] + + # Merge nodesDistribution and calculate unique and common countries + up_distribution = up['nodesDistribution'] + standby_distribution = standby['nodesDistribution'] + + merged_distribution = {} + common_countries = 0 + + for country, up_count in up_distribution.items(): + standby_count = standby_distribution.get(country, 0) + merged_distribution[country] = up_count + standby_count + if standby_count > 0: + common_countries += 1 + + for country, standby_count in standby_distribution.items(): + if country not in merged_distribution: + merged_distribution[country] = standby_count + + merged_data['nodesDistribution'] = merged_distribution + + # Calculate the total countries: all unique countries minus common countries + total_countries = len(merged_distribution) # Total unique countries + merged_data['countries'] = total_countries + + # Return the dictionary directly + return merged_data \ No newline at end of file diff --git a/packages/playground/tests/frontend_selenium/utils/utils.py b/packages/playground/tests/frontend_selenium/utils/utils.py index ad146ee5c3..950d74f4b4 100644 --- a/packages/playground/tests/frontend_selenium/utils/utils.py +++ b/packages/playground/tests/frontend_selenium/utils/utils.py @@ -175,16 +175,29 @@ def randomize_public_ipv4(): ip_subnet = ip + '/' + random.choice(['26', '27', '28', '29']) return ip_subnet, ip + +def convert_to_scaled_float(number): + str_number = str(number) + if '.' in str_number: + decimal_index = str_number.index('.') + else: + decimal_index = len(str_number) + divisor = 10 ** decimal_index + scaled_number = number / divisor + return scaled_number + + + def byte_converter(value): if value != '0': if value[-2] == 'P': - return float(value[:-3])*(1024*2) + return float(value[:-3]) * (1024 ** 5) elif value[-2] == 'T': - return float(value[:-3])*1024 - else: + return float(value[:-3]) * (1024 ** 4) + elif value[-2] == 'G': return float(value[:-3]) - else: - return float(value) + return float(value) + def get_min(nodes, resource): min = nodes[0][resource] diff --git a/yarn.lock b/yarn.lock index 3030718766..0c3d9cb5d1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3334,6 +3334,11 @@ resolved "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz" integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== +"@types/semver@^7.5.8": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + "@types/sinonjs__fake-timers@8.1.1": version "8.1.1" resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3" @@ -12647,6 +12652,11 @@ semver@^7.5.3, semver@^7.5.4: dependencies: lru-cache "^6.0.0" +semver@^7.6.2: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + semver@~7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz" From 535fbe39033f9c0dc0ec5cd7feb701789650d681 Mon Sep 17 00:00:00 2001 From: marina Date: Sun, 18 Aug 2024 16:36:57 +0300 Subject: [PATCH 02/13] development_selenium_add_stats_page_tests_1 --- .../tests/frontend_selenium/tests/TFGrid/test_statistics.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py b/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py index 3b35afe907..4cca569859 100644 --- a/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py +++ b/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py @@ -3,8 +3,7 @@ from pages.statistics import StatisticsPage from utils.grid_proxy import GridProxy from pages.dashboard import DashboardPage -from selenium.webdriver.common.by import By -from selenium.webdriver.common.action_chains import ActionChains + def before_test_setup(browser): From d97b5393958e1a299c7e2d1a82637617b3adf7ae Mon Sep 17 00:00:00 2001 From: marina Date: Sun, 18 Aug 2024 17:59:14 +0300 Subject: [PATCH 03/13] development_selenium_add_stats_page_tests --- .../__pycache__/statistics.cpython-312.pyc | Bin 6564 -> 8287 bytes .../frontend_selenium/pages/statistics.py | 20 +++++++++++++++++- ...st_statistics.cpython-312-pytest-7.4.0.pyc | Bin 11144 -> 12743 bytes .../tests/TFGrid/test_statistics.py | 2 ++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/playground/tests/frontend_selenium/pages/__pycache__/statistics.cpython-312.pyc b/packages/playground/tests/frontend_selenium/pages/__pycache__/statistics.cpython-312.pyc index 2e443a2b74a9c1a03113a5e48e3b8e659c6ec456..20dd2097a7be6bfaba5e2d528ab1cab17f0c97c2 100644 GIT binary patch delta 1653 zcmcJPO>7%Q6vub`kxU$W9mk0`cKj(fj$N8W2o4ZPnvX`UT8JV72n8xP@oo~kn{_n1 zR%n&TmFOW65+RyHC;~M|L=ajeB$pE$5C??Ri&u?gYlVb>3%Q|GTo4kxS>rS{6+JPM zfAi+edvDkOH?to<_2USC*X43>FurztJ1=x@@xP%vTYud_4tfa*_U3uZOlzr(){(jN z!P3vHJ^`$N*ma$o=@$LKpcnv##BN|%3<4u!2pGK*PDQ9cyY6Z3T;?-!w?qpt+qA%u^td=KPWuf$yb*HIo4^5_!(L6`;E2>0N7Q?1W z@;q@-)$u;+DeKuPN6caf*`C4btAy!3a^pAdZ5 z{&{N&g@1#j(*V^pg;3II_d0ii&j7Q9}1@yXNRzcR=J#| zo^mwPE6xbZ{g0AG(e_YDZWT>)Df{F>7^)nwk_YT13A0iT(!^{R!;xl&pcIzoB$Ce0 zr&qFy2(3wL`ShG*w5TgtEwczKqp7xI@U=O;IID=Vq#CWoOo0$d(b5GX8}^KxSEZE2 zY@J~Rm&%?Sg$BZ8-~~xb%UR{}Re>Fwtg2-*>eTFl)L-9t8N$@}0N1!5aOb$syxpnWyPG zY;AKE4tfbz+92D4>2jz%<&9N1Gx?8bv-&Cm@pBbCs^igpJYIEsH`g}S-Y%ALxKV}wPXwO=-;wmv(RbwWLUc4{m}0~m#CSx| z_~lCv6nTUo!+LzUj89kagpMcn@!5X~GMS3e5#LCNT}bj0!z&Ek3=x1~U7B5{ANt0| zpJA?N8QK_P3}+b3)=o3)Rlpu+3T@sV!oDgdn4#{{7U4uB5WJbZku0AWEBnXGHeWRy zy}5W}v79_#4qYhQ0;N;J6cP^kxLr6rkDBb>!#0aOavuYThrZSIDGJe3{*!@=tTa2= e=9B)w&oAZ0f-DUakuLjt+^-=NIpi44puYhKVW7VN delta 357 zcmccbu*8_}G%qg~0}zD0-kYW*G?DKEW7fp~TNpVfCoqaLvQOT?D82bPVJ zfe1Muaf>-Ov7ks3#MJ^4llf(xwD>_hc@W_QBvvvM34qvqAOaKyU;@M_E}c9@R%P=I zS${_M&wR?P;za_J?c`T5%1nMPuO;OPQVQ4ki^C>2KczG$)vhRDvbKUMzZ)Z?_$LMs H304FEvyxTt diff --git a/packages/playground/tests/frontend_selenium/pages/statistics.py b/packages/playground/tests/frontend_selenium/pages/statistics.py index ff8bee4104..6fc90efea7 100644 --- a/packages/playground/tests/frontend_selenium/pages/statistics.py +++ b/packages/playground/tests/frontend_selenium/pages/statistics.py @@ -11,6 +11,8 @@ class StatisticsPage: logout_button = (By.XPATH, "//button[.//span[text()=' Logout ']]") tfgrid_button = (By.XPATH, "//span[text()='TFGrid']") + grid_status_button = (By.XPATH, "//span[text()='Grid Status']") + node_monitoring_button = (By.XPATH, "//span[text()='Node Monitoring']") statistics_button = (By.XPATH, "//span[text()='Node Statistics']") statistics_label = (By.XPATH, "//*[contains(text(), 'Statistics')]") map= (By.XPATH, "/html/body/div[1]/div/div/main/div/div[2]/div/div/div/div[3]/div[2]") @@ -77,4 +79,20 @@ def statistics_detials(self): except TimeoutException as e: print(f"TimeoutException: {e}") - return details \ No newline at end of file + return details + + def get_link(self): + WebDriverWait(self.browser, 30).until(EC.number_of_windows_to_be(2)) + self.browser.switch_to.window(self.browser.window_handles[1]) + url = self.browser.current_url + self.browser.close() + self.browser.switch_to.window(self.browser.window_handles[0]) + return url + + def grid_status_link(self): + self.browser.find_element(*self.grid_status_button).click() + return self.get_link() + + def node_monitoring_link(self): + self.browser.find_element(*self.node_monitoring_button).click() + return self.get_link() \ No newline at end of file diff --git a/packages/playground/tests/frontend_selenium/tests/TFGrid/__pycache__/test_statistics.cpython-312-pytest-7.4.0.pyc b/packages/playground/tests/frontend_selenium/tests/TFGrid/__pycache__/test_statistics.cpython-312-pytest-7.4.0.pyc index 0d3cd1e4656732233d60bc451cb8d7568754f489..809e5deca99ec7bd756ba2445cfef6c8176aab30 100644 GIT binary patch delta 1155 zcmeAOKc38YnwOW00SFqn52an?+Q=8j#K<{0mnod7LT)lQqv7W7Oe>{WY8bOLCV$`% zQD9=I;aLq*4g|FvDSEYhH5@g3*&0BeXpLy`!ATs7qM~VxDf%GcG^W)o5Tz*wlNa!7 zGKx+P5Rv1lVO-4!5iSA>u*vhn`FV^$g+P(Xx?G%-C1f=w&k&WL%+JjwZa9afiVbLo zSc*}KagA6eBbX;Xc>Pss=MA_sJ>LgVe`E^v368=4Er$YG`uRD%jd8fYg|478mgVBS4d- zNEJvGseuS_5TOYqs`wI%i&KkAz)CHFO0_|PzAzW%rj`_CCL^4bqF)r5l9G}W5T2b@ zSe~X|m0zrDoRME#q6<}NpI?;jnPO|CR+O4nlvneU|9!)J9iWqQ5gSu(~pR zXTVF=v`R3JwHh>ImTHZN2c zc67};fNu`)`37La6&W&|q&02FmCc>n+a diff --git a/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py b/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py index 4cca569859..c15b9b45db 100644 --- a/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py +++ b/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py @@ -40,6 +40,8 @@ def test_statistics_details(browser): assert grid_statistics_details['publicIps'] == statistics_details_converted[12] assert grid_statistics_details['contracts'] == statistics_details_converted[13] assert grid_statistics_details['workloads_number'] == statistics_details_converted[14] + assert statistics_page.grid_status_link() == 'https://status.grid.tf/status/threefold/' + assert statistics_page.node_monitoring_link() == 'https://metrics.grid.tf/d/rYdddlPWkfqwf/zos-host-metrics?orgId=2&refresh=30s/' From 5aa40f00202e621e42327cce48e61444bec1b942 Mon Sep 17 00:00:00 2001 From: marina Date: Mon, 19 Aug 2024 13:12:20 +0300 Subject: [PATCH 04/13] remove all whitespace --- .../playground/tests/frontend_selenium/pages/statistics.py | 3 --- .../tests/frontend_selenium/tests/TFGrid/test_statistics.py | 1 - .../playground/tests/frontend_selenium/utils/grid_proxy.py | 4 ++-- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/playground/tests/frontend_selenium/pages/statistics.py b/packages/playground/tests/frontend_selenium/pages/statistics.py index 6fc90efea7..9f1be50de9 100644 --- a/packages/playground/tests/frontend_selenium/pages/statistics.py +++ b/packages/playground/tests/frontend_selenium/pages/statistics.py @@ -15,7 +15,6 @@ class StatisticsPage: node_monitoring_button = (By.XPATH, "//span[text()='Node Monitoring']") statistics_button = (By.XPATH, "//span[text()='Node Statistics']") statistics_label = (By.XPATH, "//*[contains(text(), 'Statistics')]") - map= (By.XPATH, "/html/body/div[1]/div/div/main/div/div[2]/div/div/div/div[3]/div[2]") map= (By.XPATH,"//button[contains(@class, 'btn-main-container')]") nodes_online = (By.XPATH, "//span[text()='Nodes Online']/ancestor::div/following-sibling::div[@class='v-card-text card-body']") dedicated_machines = (By.XPATH, "//span[text()='Dedicated Machines']/ancestor::div/following-sibling::div[@class='v-card-text card-body']") @@ -38,7 +37,6 @@ 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.tfgrid_button).click() self.browser.find_element(*self.statistics_button).click() @@ -47,7 +45,6 @@ def navigate(self): def statistics_detials(self): details = [] wait = WebDriverWait(self.browser, 60) # Increased wait time to 60 seconds - elements_to_fetch = [ ("Nodes Online", self.nodes_online), ("Dedicated Machines", self.dedicated_machines), diff --git a/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py b/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py index c15b9b45db..a31e67e7a2 100644 --- a/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py +++ b/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py @@ -17,7 +17,6 @@ def before_test_setup(browser): def test_statistics_details(browser): statistics_page = before_test_setup(browser) grid_proxy = GridProxy(browser) - statistics_details = statistics_page.statistics_detials() print("Statistics Details:", statistics_details) grid_statistics_details = grid_proxy.get_stats() diff --git a/packages/playground/tests/frontend_selenium/utils/grid_proxy.py b/packages/playground/tests/frontend_selenium/utils/grid_proxy.py index e9921c2c2f..3884de1997 100644 --- a/packages/playground/tests/frontend_selenium/utils/grid_proxy.py +++ b/packages/playground/tests/frontend_selenium/utils/grid_proxy.py @@ -64,8 +64,8 @@ def get_twin_node(self, twin_id): def get_stats(self): - up = requests.get(Base.gridproxy_url + 'stats?status=up').json() - standby = requests.get(Base.gridproxy_url + 'stats?status=standby').json() + up = requests.get(Base.gridproxy_url + 'stats?status=up', timeout=5).json() + standby = requests.get(Base.gridproxy_url + 'stats?status=standby', timeout=5).json() # Initialize a dictionary to store the merged data merged_data = {} From 08d09eb596bf5f251dee288cbd72d9374c24cb19 Mon Sep 17 00:00:00 2001 From: marina Date: Mon, 19 Aug 2024 13:20:48 +0300 Subject: [PATCH 05/13] remove all whitespace --- .../playground/tests/frontend_selenium/pages/statistics.py | 5 ++--- .../tests/frontend_selenium/tests/TFGrid/test_statistics.py | 1 - 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/playground/tests/frontend_selenium/pages/statistics.py b/packages/playground/tests/frontend_selenium/pages/statistics.py index 9f1be50de9..07e814de14 100644 --- a/packages/playground/tests/frontend_selenium/pages/statistics.py +++ b/packages/playground/tests/frontend_selenium/pages/statistics.py @@ -17,7 +17,7 @@ class StatisticsPage: statistics_label = (By.XPATH, "//*[contains(text(), 'Statistics')]") map= (By.XPATH,"//button[contains(@class, 'btn-main-container')]") nodes_online = (By.XPATH, "//span[text()='Nodes Online']/ancestor::div/following-sibling::div[@class='v-card-text card-body']") - dedicated_machines = (By.XPATH, "//span[text()='Dedicated Machines']/ancestor::div/following-sibling::div[@class='v-card-text card-body']") + dedicated_machines = (By.XPATH, "//span[text()='Dedicated Machines']/ancestor::div/following-sibling::div[@class='v-card-text card-body']") farms = (By.XPATH, "//span[text()='Farms']/ancestor::div/following-sibling::div[@class='v-card-text card-body']") countries = (By.XPATH, "//span[text()='Countries']/ancestor::div/following-sibling::div[@class='v-card-text card-body']") cpus = (By.XPATH, "//span[text()='CPUs']/ancestor::div/following-sibling::div[@class='v-card-text card-body']") @@ -71,8 +71,7 @@ def statistics_detials(self): print(f"{name} fetched: {element_text}") except TimeoutException: print(f"{name} not found within the specified time.") - details.append(None) # Add None or some default value to maintain list consistency - + details.append(None)# Add None or some default value to maintain list consistency except TimeoutException as e: print(f"TimeoutException: {e}") diff --git a/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py b/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py index a31e67e7a2..e25e84f1fc 100644 --- a/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py +++ b/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py @@ -20,7 +20,6 @@ def test_statistics_details(browser): statistics_details = statistics_page.statistics_detials() print("Statistics Details:", statistics_details) grid_statistics_details = grid_proxy.get_stats() - # Convert necessary values from string to integer before comparing statistics_details_converted = [int(detail.replace(',', '')) if detail is not None and detail.isdigit() else detail for detail in statistics_details] # Full set of assertions, comparing UI stats with proxy stats From 3bfacbcebf4fd7e1085ac9cf5bde80ea25259b56 Mon Sep 17 00:00:00 2001 From: marina Date: Mon, 19 Aug 2024 13:26:23 +0300 Subject: [PATCH 06/13] remove all whitespace --- .../tests/frontend_selenium/pages/statistics.py | 2 -- .../frontend_selenium/tests/TFGrid/test_statistics.py | 9 +-------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/packages/playground/tests/frontend_selenium/pages/statistics.py b/packages/playground/tests/frontend_selenium/pages/statistics.py index 07e814de14..f260ffc42f 100644 --- a/packages/playground/tests/frontend_selenium/pages/statistics.py +++ b/packages/playground/tests/frontend_selenium/pages/statistics.py @@ -62,7 +62,6 @@ def statistics_detials(self): ("Contracts", self.conracts), ("Number of workloads", self.number_of_workloads) ] - try: for name, locator in elements_to_fetch: try: @@ -74,7 +73,6 @@ def statistics_detials(self): details.append(None)# Add None or some default value to maintain list consistency except TimeoutException as e: print(f"TimeoutException: {e}") - return details def get_link(self): diff --git a/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py b/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py index e25e84f1fc..867986a2f2 100644 --- a/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py +++ b/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py @@ -4,8 +4,6 @@ from utils.grid_proxy import GridProxy from pages.dashboard import DashboardPage - - def before_test_setup(browser): statistics_page = StatisticsPage(browser) dashboard_page = DashboardPage(browser) @@ -13,7 +11,6 @@ def before_test_setup(browser): statistics_page.navigate() return statistics_page - def test_statistics_details(browser): statistics_page = before_test_setup(browser) grid_proxy = GridProxy(browser) @@ -39,8 +36,4 @@ def test_statistics_details(browser): assert grid_statistics_details['contracts'] == statistics_details_converted[13] assert grid_statistics_details['workloads_number'] == statistics_details_converted[14] assert statistics_page.grid_status_link() == 'https://status.grid.tf/status/threefold/' - assert statistics_page.node_monitoring_link() == 'https://metrics.grid.tf/d/rYdddlPWkfqwf/zos-host-metrics?orgId=2&refresh=30s/' - - - - \ No newline at end of file + assert statistics_page.node_monitoring_link() == 'https://metrics.grid.tf/d/rYdddlPWkfqwf/zos-host-metrics?orgId=2&refresh=30s/' \ No newline at end of file From 1cf27dc0ccdce07a0b7911e73ed5c0c46c1b9daa Mon Sep 17 00:00:00 2001 From: marina Date: Mon, 19 Aug 2024 13:30:40 +0300 Subject: [PATCH 07/13] remove all whitespace --- packages/playground/tests/frontend_selenium/pages/statistics.py | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/playground/tests/frontend_selenium/pages/statistics.py b/packages/playground/tests/frontend_selenium/pages/statistics.py index f260ffc42f..5d688a93d0 100644 --- a/packages/playground/tests/frontend_selenium/pages/statistics.py +++ b/packages/playground/tests/frontend_selenium/pages/statistics.py @@ -74,7 +74,6 @@ def statistics_detials(self): except TimeoutException as e: print(f"TimeoutException: {e}") return details - def get_link(self): WebDriverWait(self.browser, 30).until(EC.number_of_windows_to_be(2)) self.browser.switch_to.window(self.browser.window_handles[1]) From 31a81cec75343ef1bab756b226ddc80d8c4df18e Mon Sep 17 00:00:00 2001 From: marina Date: Mon, 19 Aug 2024 13:36:27 +0300 Subject: [PATCH 08/13] remove all whitespace --- .../playground/tests/frontend_selenium/pages/statistics.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/playground/tests/frontend_selenium/pages/statistics.py b/packages/playground/tests/frontend_selenium/pages/statistics.py index 5d688a93d0..ffd869ebf9 100644 --- a/packages/playground/tests/frontend_selenium/pages/statistics.py +++ b/packages/playground/tests/frontend_selenium/pages/statistics.py @@ -35,13 +35,11 @@ class StatisticsPage: def __init__(self, browser): self.browser = browser - def navigate(self): webdriver.ActionChains(self.browser).send_keys(Keys.ESCAPE).perform() self.browser.find_element(*self.tfgrid_button).click() self.browser.find_element(*self.statistics_button).click() WebDriverWait(self.browser, 60).until(EC.visibility_of_element_located(self.statistics_label)) - def statistics_detials(self): details = [] wait = WebDriverWait(self.browser, 60) # Increased wait time to 60 seconds @@ -81,11 +79,9 @@ def get_link(self): self.browser.close() self.browser.switch_to.window(self.browser.window_handles[0]) return url - def grid_status_link(self): self.browser.find_element(*self.grid_status_button).click() return self.get_link() - def node_monitoring_link(self): self.browser.find_element(*self.node_monitoring_button).click() return self.get_link() \ No newline at end of file From cb682944d5e3786045eb474bf98235873037054f Mon Sep 17 00:00:00 2001 From: marina Date: Mon, 19 Aug 2024 14:15:16 +0300 Subject: [PATCH 09/13] remove unwanted cache files and increase timeout duration --- .../pages/__pycache__/__init__.cpython-312.pyc | Bin 202 -> 0 bytes .../pages/__pycache__/dashboard.cpython-312.pyc | Bin 26375 -> 0 bytes .../pages/__pycache__/farm.cpython-312.pyc | Bin 39936 -> 0 bytes .../__pycache__/statistics.cpython-312.pyc | Bin 8287 -> 0 bytes .../pages/__pycache__/twin.cpython-312.pyc | Bin 11021 -> 0 bytes .../test_farm.cpython-312-pytest-7.4.0.pyc | Bin 67633 -> 0 bytes .../test_twin.cpython-312-pytest-7.4.0.pyc | Bin 13470 -> 0 bytes ...test_statistics.cpython-312-pytest-7.4.0.pyc | Bin 12743 -> 0 bytes .../conftest.cpython-312-pytest-7.4.0.pyc | Bin 1213 -> 0 bytes .../conftest.cpython-312-pytest-7.4.4.pyc | Bin 1308 -> 0 bytes .../utils/__pycache__/__init__.cpython-312.pyc | Bin 202 -> 0 bytes .../utils/__pycache__/base.cpython-312.pyc | Bin 792 -> 0 bytes .../__pycache__/grid_proxy.cpython-312.pyc | Bin 6028 -> 0 bytes .../utils/__pycache__/utils.cpython-312.pyc | Bin 14374 -> 0 bytes .../tests/frontend_selenium/utils/grid_proxy.py | 4 ++-- 15 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 packages/playground/tests/frontend_selenium/pages/__pycache__/__init__.cpython-312.pyc delete mode 100644 packages/playground/tests/frontend_selenium/pages/__pycache__/dashboard.cpython-312.pyc delete mode 100644 packages/playground/tests/frontend_selenium/pages/__pycache__/farm.cpython-312.pyc delete mode 100644 packages/playground/tests/frontend_selenium/pages/__pycache__/statistics.cpython-312.pyc delete mode 100644 packages/playground/tests/frontend_selenium/pages/__pycache__/twin.cpython-312.pyc delete mode 100644 packages/playground/tests/frontend_selenium/tests/Farms/__pycache__/test_farm.cpython-312-pytest-7.4.0.pyc delete mode 100644 packages/playground/tests/frontend_selenium/tests/TFChain/__pycache__/test_twin.cpython-312-pytest-7.4.0.pyc delete mode 100644 packages/playground/tests/frontend_selenium/tests/TFGrid/__pycache__/test_statistics.cpython-312-pytest-7.4.0.pyc delete mode 100644 packages/playground/tests/frontend_selenium/tests/__pycache__/conftest.cpython-312-pytest-7.4.0.pyc delete mode 100644 packages/playground/tests/frontend_selenium/tests/__pycache__/conftest.cpython-312-pytest-7.4.4.pyc delete mode 100644 packages/playground/tests/frontend_selenium/utils/__pycache__/__init__.cpython-312.pyc delete mode 100644 packages/playground/tests/frontend_selenium/utils/__pycache__/base.cpython-312.pyc delete mode 100644 packages/playground/tests/frontend_selenium/utils/__pycache__/grid_proxy.cpython-312.pyc delete mode 100644 packages/playground/tests/frontend_selenium/utils/__pycache__/utils.cpython-312.pyc diff --git a/packages/playground/tests/frontend_selenium/pages/__pycache__/__init__.cpython-312.pyc b/packages/playground/tests/frontend_selenium/pages/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 741588dc106036d596f359732548747a9898b39e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmX@j%ge<81kJ&l(?IlN5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!%GA%u&rQ|OO)SdH zOVoEsEzT~6n zOHzx0GHFHmc_pcNDe=WHodsZp@$s2?nI-Y@dIgogIBatBQ%ZAE?TT1|HZuZoF^KVz MnURsPh#ANN0GseQh5!Hn diff --git a/packages/playground/tests/frontend_selenium/pages/__pycache__/dashboard.cpython-312.pyc b/packages/playground/tests/frontend_selenium/pages/__pycache__/dashboard.cpython-312.pyc deleted file mode 100644 index 6b4701ceda547f4e2312038d349b5e7ca7cd8fa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26375 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 z 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 E4@RNH`~Uy| diff --git a/packages/playground/tests/frontend_selenium/pages/__pycache__/statistics.cpython-312.pyc b/packages/playground/tests/frontend_selenium/pages/__pycache__/statistics.cpython-312.pyc deleted file mode 100644 index 20dd2097a7be6bfaba5e2d528ab1cab17f0c97c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8287 zcmdT}T}&HS7QW-(Ycn=r%>SP$1aK1UHciunk~D;$&?X^lp_>H4y2djGoAFO)h7cTR zdB{pc+uejGK-~)ZuxhLB%Sx5@Wgk}CA643yv7l>flt`6!U-HJ1O1o-b_S~_@CWD+4VTyj0e)@Q*r|R6y5AW+ebye7!t%#Kp62)vxzpZcWO=) zW6=qZ*DJ*R(Fu{gEq1!kcDOFbrr|2MIwmI*)f#MU@FE{#Iwlhh8h|vrh>1A?P?rWB zjxnt3N-P=@V|*w&T}&fCMbK#VdXG-PB^CXlsL+|2+;LaOJ{|XDqR%@cMmX4_sU_-Uc31h4{`Igm#jAcw@PpkUvg+K z_!pY3xd<0*-oJ2Y<7=KKzj= z?oojwWNH==%P3vlv|{)*{RAo~KoOaJjPR>0`g>?yLt+jK@86oN@*)bWY+mgTzn^FO zgw6XJvqdq-g~LjQ@U%v*C)q^J^Le&Tn0{fqVY{XaR6(=sVC!#CxZ+^ze{I2eaIEK9 z5UbTbh1bGRY8Df&RWjojFO1lfuc;+AN8N#NNlPp^Va`0v$QR2zbkWB-leZ30k&H;9y4Bs3_YqXWExx zjj}NSzGhY~&!5yR!kfroMu_quPSy?d$&I%{Kzu@6NL=v6g6eoaE~c;3ehvw>DwDj*Yw+1{Jn&?UEpTs&(D&M(G@;pK^>z9guDsO1Bd~T++EGX zfEWQOaCZSQ0Yc|>)e<0PKnmPWKrkQ$ZYUrYK#1qnJb+jMDRAciDFLKP(*df0(16qw zL~MZ66-4ZS6u4h7S}7m}?ie6tfVc{cHeI@;x1dFRKbm|Sp_}l|mJCZqXwijR59*7= zS1V7rT`lE*7meyIR)53fXltG&(;^ir1d`N@@&Lz&UE&;wqg@Pf->O}Yg2rc?n1?TQa(OoF2tG09Q+81{MEwy~HY;%>#>;e8!>5c) zu>u**m3=Z{!?7>4!0;hICnQ=l4C88ayVDa4@(=?$2M6pnq*>bx5KcpYButl+EgO=Vs$ZqeOQ+ZLxO!~3>eqgBGSyKNZKV8lJ4MPJdQv`W8Km`Jzib~g>%TD@q5M=3&Jp8p;HB>;#^CUu z8Gys2r{)oJ)VNTPWpd7LpF=HZrBEOa7a-4t=U6BtGkU@|pKG^3$XHIIsqBAyUcw^50gJRyd%gCye+`^eX6HA^A9kRKt! z1!8})QMO-Od0Wkzn4wj;Nk(`H1VoI3DTNXk@M|gDo5a04xG!B=aewLF(y!i^aMSVAjkWN6NI%_wJmZ%OE^ChO+VcNblH?Y~z&wf2gY>&V_%A2q5=}C;2(w3_{jN z{BfR;aQ-+Egl_YMNArY0@GlZU&IEsgh?j{tNyIBeoFd{?B2E)=h6v(#`4%GjiBQhw zC@K9M#Air3DvBTBi3?Q(DG0v<_jVV3Us=6&ef7H3JRms-m#?JN>S@V&2C8)po1Gh- zQriWowofutrJG!vGaEBf=bKXFCCN~iuC3p!*{G3P2c()o$xxZDsoTUGm;~$UA<5uO zTj~3q_c|r#4aqXT+^1G61|-WMRGn3XvFsw$+@}NS?AI+{&YFbkk*lP!ZbU~6+e+_W zzjs}#7A1Oac_3Y0u~xHMBh@cTWlPI%q-p#8p?gD86)%+t%l+w!%C*z0r=fFGFBziZ zf^PXz;l>i%{nPhOOO!r zH`A)}9jSB?lZJCv(Hj@eH()z$=g(cvnwR f)FagN2pxNbypPbUkI;FL|H9WPs(B9)sSNTTPNd_^ diff --git a/packages/playground/tests/frontend_selenium/pages/__pycache__/twin.cpython-312.pyc b/packages/playground/tests/frontend_selenium/pages/__pycache__/twin.cpython-312.pyc deleted file mode 100644 index 59e0d78a71f5607703d4b0c83b5e5f68e96b125e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11021 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 F{{Z{IqyYc` diff --git a/packages/playground/tests/frontend_selenium/tests/Farms/__pycache__/test_farm.cpython-312-pytest-7.4.0.pyc b/packages/playground/tests/frontend_selenium/tests/Farms/__pycache__/test_farm.cpython-312-pytest-7.4.0.pyc deleted file mode 100644 index 0e6c9689957023bcfde788edefedc7c937749e45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 67633 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 f(ibrGDcX9hYCZpd_)mTn diff --git a/packages/playground/tests/frontend_selenium/tests/TFChain/__pycache__/test_twin.cpython-312-pytest-7.4.0.pyc b/packages/playground/tests/frontend_selenium/tests/TFChain/__pycache__/test_twin.cpython-312-pytest-7.4.0.pyc deleted file mode 100644 index da33b079feccf695fd501b29dbcb5a25d8239cd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13470 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 diff --git a/packages/playground/tests/frontend_selenium/tests/__pycache__/conftest.cpython-312-pytest-7.4.0.pyc b/packages/playground/tests/frontend_selenium/tests/__pycache__/conftest.cpython-312-pytest-7.4.0.pyc deleted file mode 100644 index d57e96fdf84b624775244d2e09c9ac6fd0eed2f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1213 zcmZuw%}*0S6o0eb?rsZPP?Vqv4Mx!PU~5nk4#r3zazOOJt(Ru$PGMlboY}V4KvGb{ zf1n<@8t~+w;fY9snS^-IgWNE9P*2Y6c8dWg*_roy^LuaJ$G(rInFXbrO*!t<7A zEk$a50n-MlV!_a72n!smRXueMpbBtZd?(+ z%u1qMNB{7&Gb91m(5|}Ed1GB!Q&uwPId-T5Nfnf%whnMKDY7XjTyGFY79Gr0MxI9%^MjE19;1dJQyJ#bJ!z&>nHH7R z;AUL+Coz+2G30#=hm|JrY``9n&}qN^p>qQtXGGnlQ0eo$J#4)#dhErqouO6*(AUcD8vQeahAMc;)W+Pp;l zx@VU{%*0KN`d)}VyTZDbk-qACHOVLjEv_$8zsWGAgW_#jZ&nlAclgzYp9b^|zO}ZU z{oI}QtVBZxxv{<6*r(jh_Ut!v@W342Gl#dA_RV7Z;b%2_pkCcmufDyzeQ964ajZeQ zr=uC)SMvh*T-baRski1f=3dSJX0o80Q@5waQQ-nN7VE?biN|>FgP>LEqAQi46-8?? z5vOcTk>VyLA?BH`itC9kD~u(*Vo|QeA~%u(#N8X}j!?yoXQo(<=7`E4oL@`W#V)UN zUlakzxuR*w>knEDLc_Y{B+ZohaJ@#Jg>{OfioSyrp#yqZY=4YahWev6bJ*|4;_d#gh~${gFgRh2>v%<1}ah diff --git a/packages/playground/tests/frontend_selenium/tests/__pycache__/conftest.cpython-312-pytest-7.4.4.pyc b/packages/playground/tests/frontend_selenium/tests/__pycache__/conftest.cpython-312-pytest-7.4.4.pyc deleted file mode 100644 index 27de17f6870a07dbe831f39291dcf69a554936f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1308 zcmZ8g&2JM&6o0c`@2>5vos^aaB&<{|P#>_Rwn!XMRY3%Yd~o3Ai?#8N!#MlZnQ@G( zL~>}V{0D_&u2tZ~pTQ|=q@a)v4j;Jp&`GA7`BOM>U%gO37eqx3YwLf1eLn(ZRW7^`hb#t7`tX*;Q|5R}4lyPRS( zsDv}^nG_cTH>|d+2ugsheqBG8pT4yV2NSV9J3k7!?v+y^edXlPrv9}IxYm##?3j6 zd|Th5EPh4LQEFM!e17W4BoF<$T(42ikKk2dh#Jl+RY_?Wr(+x7^p4D8!w~i+VPq}9 z!er#9G~;o?NgOe%{*spDc6wL2m8eROC^GI*PE|^Uo0acT<{+$06g7r+|S zZAh=yV;ta!48j)gtyALPV*bW0&RU7r-H=Trf$W)e8V@4B#W9mikH!(lk>6oc&s5)y zqn@&8CL>|5(Rj!(rStM_RY3MsZhyf)W4LgjcKL<39~@P`9Y1_)R`ynQR(2mRppu#4=LeTl%^_SYh777EAx&=g_S|!=#*qtou5uahl`b;9Qyl{akJzoV#J{4+8u>y(vXC zOYFAX&I$;jKLB>&XZHl^CvfKkZlAzcXQqM7GY1T3uf9|N+xQG!Ixm1Rn<9EcdVU0r CP($qi diff --git a/packages/playground/tests/frontend_selenium/utils/__pycache__/__init__.cpython-312.pyc b/packages/playground/tests/frontend_selenium/utils/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index e9caa90d5c7ed0f071df87d8483a2b5d46718d20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmX@j%ge<81kJ&l(?IlN5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!%GA%u&rQ|OO)SdH zOVoEsEzT~6n zOHzx0GHFHmc_pcNDe=WHouwt2ImP<%@tJvljA6uz^a#BpMUHYpMVqA*0wPy#^f%E8^<?@(Ejk9GHY3o|P&V<@ zf4p4c75Zu|A1k{K#RF|G@SASSaD6vc!ho6MxP16e+j@J$-+nzyluqv{Y zr(48DAqighjX~ZJ!eCAFuvUy!+xDFe${ilxl?Q;BSVK!OyXj? zz|&M^Q!iEsb`Z(%n~*GrSf-4`>Px<{-6LMCFBcH<0$lMLFvDg$=wh?$5Z8CieM~zn z2+cb7us#o7V|EgCbz4}?-7(SdT+S`NUgHiE|a&uZ(8C6er&Z|-3_Hciy zT^n6LHO|)}?bdK_TDtSTKCXOt7L|<4a#XrId_1jeTx^Z$pk sk-~zLRlyRg!r4r{pFa2wS>satL{#K|$`HbDp!{3O!d>_a2u!;E0NrB9=>Px# diff --git a/packages/playground/tests/frontend_selenium/utils/__pycache__/grid_proxy.cpython-312.pyc b/packages/playground/tests/frontend_selenium/utils/__pycache__/grid_proxy.cpython-312.pyc deleted file mode 100644 index c49c268fd523160963dde6166c1e2a44b514d40f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6028 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 K)&OMC{{A07H0Iy{ diff --git a/packages/playground/tests/frontend_selenium/utils/grid_proxy.py b/packages/playground/tests/frontend_selenium/utils/grid_proxy.py index 3884de1997..589f380292 100644 --- a/packages/playground/tests/frontend_selenium/utils/grid_proxy.py +++ b/packages/playground/tests/frontend_selenium/utils/grid_proxy.py @@ -64,8 +64,8 @@ def get_twin_node(self, twin_id): def get_stats(self): - up = requests.get(Base.gridproxy_url + 'stats?status=up', timeout=5).json() - standby = requests.get(Base.gridproxy_url + 'stats?status=standby', timeout=5).json() + up = requests.get(Base.gridproxy_url + 'stats?status=up', timeout=10).json() + standby = requests.get(Base.gridproxy_url + 'stats?status=standby', timeout=10).json() # Initialize a dictionary to store the merged data merged_data = {} From d9f80ad3b61f922e46054fdea9619ca66e749ae5 Mon Sep 17 00:00:00 2001 From: marina Date: Tue, 20 Aug 2024 16:38:14 +0300 Subject: [PATCH 10/13] change the network to dev --- packages/playground/public/config.js | 16 ++++++++-------- .../tests/frontend_selenium/Config.ini | 2 +- .../tests/frontend_selenium/tests/conftest.py | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/playground/public/config.js b/packages/playground/public/config.js index ee65d923f7..cfc777261b 100644 --- a/packages/playground/public/config.js +++ b/packages/playground/public/config.js @@ -1,16 +1,16 @@ window.env = { - NETWORK: "test", - GRAPHQL_URL: "https://graphql.test.grid.tf/graphql", - GRIDPROXY_URL: "https://gridproxy.test.grid.tf", - SUBSTRATE_URL: "wss://tfchain.test.grid.tf/ws", - ACTIVATION_SERVICE_URL: "https://activation.test.grid.tf/activation/activate", - RELAY_DOMAIN: "wss://relay.test.grid.tf", - BRIDGE_TFT_ADDRESS: "GA2CWNBUHX7NZ3B5GR4I23FMU7VY5RPA77IUJTIXTTTGKYSKDSV6LUA4", + NETWORK: "dev", + GRAPHQL_URL: "https://graphql.dev.grid.tf/graphql", + GRIDPROXY_URL: "https://gridproxy.dev.grid.tf", + SUBSTRATE_URL: "wss://tfchain.dev.grid.tf/ws", + ACTIVATION_SERVICE_URL: "https://activation.dev.grid.tf/activation/activate", + RELAY_DOMAIN: "wss://relay.dev.grid.tf", + BRIDGE_TFT_ADDRESS: "GDHJP6TF3UXYXTNEZ2P36J5FH7W4BJJQ4AYYAXC66I2Q2AH5B6O6BCFG", STELLAR_NETWORK: "test", STELLAR_HORIZON_URL: "https://horizon-testnet.stellar.org", TFT_ASSET_ISSUER: "GA47YZA3PKFUZMPLQ3B5F2E3CJIB57TGGU7SPCQT2WAEYKN766PWIMB3", MINTING_URL: "https://alpha.minting.tfchain.grid.tf", - STATS_URL: "https://stats.test.grid.tf", + STATS_URL: "https://stats.dev.grid.tf", TIMEOUT: +"10000", PAGE_SIZE: +"20", MANUAL_URL: "https://www.manual.grid.tf", diff --git a/packages/playground/tests/frontend_selenium/Config.ini b/packages/playground/tests/frontend_selenium/Config.ini index 59341f9f9d..c7384cfaa4 100644 --- a/packages/playground/tests/frontend_selenium/Config.ini +++ b/packages/playground/tests/frontend_selenium/Config.ini @@ -1,6 +1,6 @@ [Base] port = 5173 -net = test +net = dev [Utils] seed = hobby minor mule problem action bomb eye frown coil lunch runway caution node_seed = thank crowd vintage story arrow fantasy this spray speed cherry snow water diff --git a/packages/playground/tests/frontend_selenium/tests/conftest.py b/packages/playground/tests/frontend_selenium/tests/conftest.py index 43db8ccf9c..50e29c43d8 100644 --- a/packages/playground/tests/frontend_selenium/tests/conftest.py +++ b/packages/playground/tests/frontend_selenium/tests/conftest.py @@ -13,7 +13,7 @@ def browser(): # Virtual display for the browser, allowing it to run in headless mode display = Display(visible=0, size=(1920, 1080)) - #display.start() + display.start() # Initialize the ChromeDriver instance with options options = webdriver.ChromeOptions() @@ -30,4 +30,4 @@ def browser(): # Quit the WebDriver instance for the cleanup driver.quit() # Ending virtual display for the browser - #display.stop() \ No newline at end of file + display.stop() \ No newline at end of file From 0da4254e5d941e8cefe93743f72759d9a5fc26f1 Mon Sep 17 00:00:00 2001 From: A-Harby Date: Sun, 25 Aug 2024 21:04:56 +0300 Subject: [PATCH 11/13] bring back config --- .../tests/frontend_selenium/Config.ini | 6 ++++- .../frontend_selenium/pages/statistics.py | 24 +++++++++---------- .../tests/TFGrid/test_statistics.py | 1 - .../frontend_selenium/utils/grid_proxy.py | 10 -------- 4 files changed, 17 insertions(+), 24 deletions(-) diff --git a/packages/playground/tests/frontend_selenium/Config.ini b/packages/playground/tests/frontend_selenium/Config.ini index a4aa0a6e9a..2222b381f4 100644 --- a/packages/playground/tests/frontend_selenium/Config.ini +++ b/packages/playground/tests/frontend_selenium/Config.ini @@ -1,4 +1,8 @@ [Base] port = 5173 net = dev -[Utils] \ No newline at end of file +[Utils] +seed = +node_seed = +address = +email = \ No newline at end of file diff --git a/packages/playground/tests/frontend_selenium/pages/statistics.py b/packages/playground/tests/frontend_selenium/pages/statistics.py index ffd869ebf9..999403f2e9 100644 --- a/packages/playground/tests/frontend_selenium/pages/statistics.py +++ b/packages/playground/tests/frontend_selenium/pages/statistics.py @@ -15,7 +15,7 @@ class StatisticsPage: node_monitoring_button = (By.XPATH, "//span[text()='Node Monitoring']") statistics_button = (By.XPATH, "//span[text()='Node Statistics']") statistics_label = (By.XPATH, "//*[contains(text(), 'Statistics')]") - map= (By.XPATH,"//button[contains(@class, 'btn-main-container')]") + map = (By.XPATH,"//button[contains(@class, 'btn-main-container')]") nodes_online = (By.XPATH, "//span[text()='Nodes Online']/ancestor::div/following-sibling::div[@class='v-card-text card-body']") dedicated_machines = (By.XPATH, "//span[text()='Dedicated Machines']/ancestor::div/following-sibling::div[@class='v-card-text card-body']") farms = (By.XPATH, "//span[text()='Farms']/ancestor::div/following-sibling::div[@class='v-card-text card-body']") @@ -35,11 +35,13 @@ class StatisticsPage: def __init__(self, browser): self.browser = browser + def navigate(self): webdriver.ActionChains(self.browser).send_keys(Keys.ESCAPE).perform() self.browser.find_element(*self.tfgrid_button).click() self.browser.find_element(*self.statistics_button).click() WebDriverWait(self.browser, 60).until(EC.visibility_of_element_located(self.statistics_label)) + def statistics_detials(self): details = [] wait = WebDriverWait(self.browser, 60) # Increased wait time to 60 seconds @@ -60,18 +62,14 @@ def statistics_detials(self): ("Contracts", self.conracts), ("Number of workloads", self.number_of_workloads) ] - try: - for name, locator in elements_to_fetch: - try: - element_text = wait.until(EC.visibility_of_element_located(locator)).text - details.append(element_text) - print(f"{name} fetched: {element_text}") - except TimeoutException: - print(f"{name} not found within the specified time.") - details.append(None)# Add None or some default value to maintain list consistency - except TimeoutException as e: - print(f"TimeoutException: {e}") + for name, locator in elements_to_fetch: + try: + element_text = wait.until(EC.visibility_of_element_located(locator)).text + details.append(element_text) + except TimeoutException: + details.append(None) # Add None or some default value to maintain list consistency return details + def get_link(self): WebDriverWait(self.browser, 30).until(EC.number_of_windows_to_be(2)) self.browser.switch_to.window(self.browser.window_handles[1]) @@ -79,9 +77,11 @@ def get_link(self): self.browser.close() self.browser.switch_to.window(self.browser.window_handles[0]) return url + def grid_status_link(self): self.browser.find_element(*self.grid_status_button).click() return self.get_link() + def node_monitoring_link(self): self.browser.find_element(*self.node_monitoring_button).click() return self.get_link() \ No newline at end of file diff --git a/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py b/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py index 867986a2f2..9511c0ecf0 100644 --- a/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py +++ b/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py @@ -15,7 +15,6 @@ def test_statistics_details(browser): statistics_page = before_test_setup(browser) grid_proxy = GridProxy(browser) statistics_details = statistics_page.statistics_detials() - print("Statistics Details:", statistics_details) grid_statistics_details = grid_proxy.get_stats() # Convert necessary values from string to integer before comparing statistics_details_converted = [int(detail.replace(',', '')) if detail is not None and detail.isdigit() else detail for detail in statistics_details] diff --git a/packages/playground/tests/frontend_selenium/utils/grid_proxy.py b/packages/playground/tests/frontend_selenium/utils/grid_proxy.py index 589f380292..55ee69ba7f 100644 --- a/packages/playground/tests/frontend_selenium/utils/grid_proxy.py +++ b/packages/playground/tests/frontend_selenium/utils/grid_proxy.py @@ -66,42 +66,32 @@ def get_twin_node(self, twin_id): def get_stats(self): up = requests.get(Base.gridproxy_url + 'stats?status=up', timeout=10).json() standby = requests.get(Base.gridproxy_url + 'stats?status=standby', timeout=10).json() - # Initialize a dictionary to store the merged data merged_data = {} - # Merge simple values, summing if they differ keys_to_sum = ['nodes', 'accessNodes', 'totalCru', 'totalSru', 'totalMru', 'totalHru', 'gpus', 'dedicatedNodes', 'workloads_number'] for key in keys_to_sum: merged_data[key] = up[key] + standby[key] - # Merge the "farms", "publicIps", "gateways", "twins", and "contracts" fields (they are the same) keys_to_add_once = ['farms', 'publicIps', 'gateways', 'twins', 'contracts'] for key in keys_to_add_once: merged_data[key] = up[key] - # Merge nodesDistribution and calculate unique and common countries up_distribution = up['nodesDistribution'] standby_distribution = standby['nodesDistribution'] - merged_distribution = {} common_countries = 0 - for country, up_count in up_distribution.items(): standby_count = standby_distribution.get(country, 0) merged_distribution[country] = up_count + standby_count if standby_count > 0: common_countries += 1 - for country, standby_count in standby_distribution.items(): if country not in merged_distribution: merged_distribution[country] = standby_count - merged_data['nodesDistribution'] = merged_distribution - # Calculate the total countries: all unique countries minus common countries total_countries = len(merged_distribution) # Total unique countries merged_data['countries'] = total_countries - # Return the dictionary directly return merged_data \ No newline at end of file From 439743e1781696181f9bc993ee3daf25b1db0cbc Mon Sep 17 00:00:00 2001 From: A-Harby Date: Wed, 28 Aug 2024 20:04:47 +0300 Subject: [PATCH 12/13] spilt test into 2 tests --- .../tests/frontend_selenium/tests/TFGrid/test_statistics.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py b/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py index 9511c0ecf0..727fa1880a 100644 --- a/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py +++ b/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py @@ -19,6 +19,9 @@ def test_statistics_details(browser): # Convert necessary values from string to integer before comparing statistics_details_converted = [int(detail.replace(',', '')) if detail is not None and detail.isdigit() else detail for detail in statistics_details] # Full set of assertions, comparing UI stats with proxy stats + print(grid_statistics_details) + print("==========================") + print(statistics_details_converted) assert grid_statistics_details['nodes'] == statistics_details_converted[0] assert grid_statistics_details['dedicatedNodes'] == statistics_details_converted[1] assert grid_statistics_details['farms'] == statistics_details_converted[2] @@ -34,5 +37,8 @@ def test_statistics_details(browser): assert grid_statistics_details['publicIps'] == statistics_details_converted[12] assert grid_statistics_details['contracts'] == statistics_details_converted[13] assert grid_statistics_details['workloads_number'] == statistics_details_converted[14] + +def test_tfgrid_links(browser): + statistics_page = before_test_setup(browser) assert statistics_page.grid_status_link() == 'https://status.grid.tf/status/threefold/' assert statistics_page.node_monitoring_link() == 'https://metrics.grid.tf/d/rYdddlPWkfqwf/zos-host-metrics?orgId=2&refresh=30s/' \ No newline at end of file From 2380fd7be4546969dc6be793c614ff1fda093c9b Mon Sep 17 00:00:00 2001 From: A-Harby Date: Wed, 28 Aug 2024 20:24:21 +0300 Subject: [PATCH 13/13] fix Codacy issues --- .../playground/tests/frontend_selenium/pages/statistics.py | 2 +- .../tests/frontend_selenium/tests/TFGrid/test_statistics.py | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/playground/tests/frontend_selenium/pages/statistics.py b/packages/playground/tests/frontend_selenium/pages/statistics.py index 999403f2e9..786d867257 100644 --- a/packages/playground/tests/frontend_selenium/pages/statistics.py +++ b/packages/playground/tests/frontend_selenium/pages/statistics.py @@ -62,7 +62,7 @@ def statistics_detials(self): ("Contracts", self.conracts), ("Number of workloads", self.number_of_workloads) ] - for name, locator in elements_to_fetch: + for _, locator in elements_to_fetch: try: element_text = wait.until(EC.visibility_of_element_located(locator)).text details.append(element_text) diff --git a/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py b/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py index 727fa1880a..a56fc50cdd 100644 --- a/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py +++ b/packages/playground/tests/frontend_selenium/tests/TFGrid/test_statistics.py @@ -19,9 +19,6 @@ def test_statistics_details(browser): # Convert necessary values from string to integer before comparing statistics_details_converted = [int(detail.replace(',', '')) if detail is not None and detail.isdigit() else detail for detail in statistics_details] # Full set of assertions, comparing UI stats with proxy stats - print(grid_statistics_details) - print("==========================") - print(statistics_details_converted) assert grid_statistics_details['nodes'] == statistics_details_converted[0] assert grid_statistics_details['dedicatedNodes'] == statistics_details_converted[1] assert grid_statistics_details['farms'] == statistics_details_converted[2]