mirror of
https://github.com/nextcloud/docker.git
synced 2025-04-19 18:36:09 +02:00
Refactoring and changes for Nextcloud 30
This commit is contained in:
parent
1722e9df5c
commit
b966eb09c2
7 changed files with 88 additions and 144 deletions
30
energy-tests/helpers/helper_functions.py
Normal file
30
energy-tests/helpers/helper_functions.py
Normal file
|
@ -0,0 +1,30 @@
|
|||
import random
|
||||
from time import time_ns, sleep
|
||||
from playwright.sync_api import TimeoutError
|
||||
|
||||
|
||||
def login(page, username='Crash', password='Override'):
|
||||
page.goto("http://nc/login")
|
||||
page.locator('#user').fill(username)
|
||||
page.locator('#password').fill(password)
|
||||
page.locator('#password').press("Enter")
|
||||
|
||||
|
||||
def get_random_text() -> str:
|
||||
size_in_bytes = 1024
|
||||
characters = string.ascii_letters + string.digits
|
||||
return ''.join(random.choice(characters) for _ in range(size_in_bytes))
|
||||
|
||||
def log_note(message: str) -> None:
|
||||
timestamp = str(time_ns())[:16]
|
||||
print(f"{timestamp} {message}")
|
||||
|
||||
|
||||
def close_modal(page) -> None:
|
||||
with contextlib.suppress(TimeoutError):
|
||||
sleep(5) # Sleep to make sure the modal has time to appear before continuing navigation
|
||||
page.locator('#firstrunwizard .modal-container__content button[aria-label=Close]', timeout=15_000).click()
|
||||
|
||||
|
||||
def timeout_handler(signum, frame):
|
||||
raise TimeoutError("Page.content() timed out")
|
|
@ -3,14 +3,10 @@ import sys
|
|||
from time import sleep, time_ns
|
||||
import signal
|
||||
|
||||
from playwright.sync_api import Playwright, sync_playwright, TimeoutError
|
||||
from playwright.sync_api import Playwright, sync_playwright
|
||||
|
||||
def timeout_handler(signum, frame):
|
||||
raise TimeoutError("Page.content() timed out")
|
||||
from helpers.helper_functions import log_note, get_random_text, login_nextcloud, close_modal, timeout_handler
|
||||
|
||||
def log_note(message: str) -> None:
|
||||
timestamp = str(time_ns())[:16]
|
||||
print(f"{timestamp} {message}")
|
||||
|
||||
def run(playwright: Playwright, browser_name: str) -> None:
|
||||
log_note(f"Launch browser {browser_name}")
|
||||
|
@ -25,11 +21,8 @@ def run(playwright: Playwright, browser_name: str) -> None:
|
|||
try:
|
||||
log_note("Login")
|
||||
page.goto("http://nc/")
|
||||
page.get_by_label("Login with username or email").click()
|
||||
page.get_by_label("Login with username or email").fill("Crash")
|
||||
page.get_by_label("Login with username or email").press("Tab")
|
||||
page.get_by_label("Password", exact=True).fill("Override")
|
||||
page.get_by_label("Password", exact=True).press("Enter")
|
||||
login_nextcloud(page)
|
||||
|
||||
log_note("Create new text file")
|
||||
page.get_by_role("link", name="Files").click()
|
||||
page.get_by_role("link", name="New file/folder menu").click()
|
||||
|
@ -37,9 +30,9 @@ def run(playwright: Playwright, browser_name: str) -> None:
|
|||
page.locator("#view7-input-file").fill("colab_meeting.md")
|
||||
page.locator("#view7-input-file").press("Enter")
|
||||
page.get_by_role("button", name="Create a new file with the selected template").click()
|
||||
sleep(5)
|
||||
with contextlib.suppress(TimeoutError):
|
||||
page.locator('#firstrunwizard .modal-container__content button[aria-label=Close]').click(timeout=15_000)
|
||||
|
||||
close_modal(page)
|
||||
|
||||
page.keyboard.press("Escape")
|
||||
log_note("Share file with other user")
|
||||
page.get_by_role("link", name="colab_meeting .md").get_by_role("link", name="Share").click()
|
||||
|
|
|
@ -3,14 +3,10 @@ import sys
|
|||
from time import time_ns, sleep
|
||||
import signal
|
||||
|
||||
from playwright.sync_api import Playwright, sync_playwright, expect, TimeoutError
|
||||
from playwright.sync_api import Playwright, sync_playwright, expect
|
||||
|
||||
def timeout_handler(signum, frame):
|
||||
raise TimeoutError("Page.content() timed out")
|
||||
from helpers.helper_functions import log_note, get_random_text, login_nextcloud, close_modal, timeout_handler
|
||||
|
||||
def log_note(message: str) -> None:
|
||||
timestamp = str(time_ns())[:16]
|
||||
print(f"{timestamp} {message}")
|
||||
|
||||
def run(playwright: Playwright, browser_name: str) -> None:
|
||||
log_note(f"Launch browser {browser_name}")
|
||||
|
@ -26,24 +22,14 @@ def run(playwright: Playwright, browser_name: str) -> None:
|
|||
try:
|
||||
page.goto("http://nc/login")
|
||||
log_note("Login")
|
||||
page.get_by_label("Login with username or email").fill("Crash")
|
||||
page.get_by_label("Login with username or email").press("Tab")
|
||||
page.get_by_label("Password", exact=True).fill("Override")
|
||||
page.get_by_label("Password", exact=True).press("Enter")
|
||||
login_nextcloud(page)
|
||||
|
||||
log_note("Wait for welcome popup")
|
||||
# Sleep to make sure the modal has time to appear before continuing navigation
|
||||
sleep(5)
|
||||
log_note("Close welcome popup")
|
||||
with contextlib.suppress(TimeoutError):
|
||||
page.locator('#firstrunwizard .modal-container__content button[aria-label=Close]').click(timeout=15_000)
|
||||
close_modal(page)
|
||||
|
||||
log_note("Go to calendar")
|
||||
page.get_by_role("link", name="Calendar").click()
|
||||
|
||||
# Second welcome screen?
|
||||
with contextlib.suppress(TimeoutError):
|
||||
page.locator('#firstrunwizard .modal-container__content button[aria-label=Close]').click(timeout=15_000)
|
||||
|
||||
log_note("Create event")
|
||||
event_name = "Weekly sync"
|
||||
page.get_by_role("button", name="New event").click()
|
||||
|
|
|
@ -3,14 +3,9 @@ import contextlib
|
|||
from time import time_ns, sleep
|
||||
import signal
|
||||
|
||||
from playwright.sync_api import Playwright, sync_playwright, TimeoutError
|
||||
from playwright.sync_api import Playwright, sync_playwright
|
||||
|
||||
def timeout_handler(signum, frame):
|
||||
raise TimeoutError("Page.content() timed out")
|
||||
|
||||
def log_note(message: str) -> None:
|
||||
timestamp = str(time_ns())[:16]
|
||||
print(f"{timestamp} {message}")
|
||||
from helpers.helper_functions import log_note, get_random_text, login_nextcloud, close_modal, timeout_handler
|
||||
|
||||
def create_user(playwright: Playwright, browser_name: str, username: str, password: str) -> None:
|
||||
log_note(f"Launch browser {browser_name}")
|
||||
|
@ -24,19 +19,11 @@ def create_user(playwright: Playwright, browser_name: str, username: str, passwo
|
|||
try:
|
||||
page = context.new_page()
|
||||
log_note("Login")
|
||||
page.goto("http://nc/")
|
||||
page.get_by_label("Login with username or email").click()
|
||||
page.get_by_label("Login with username or email").fill("Crash")
|
||||
page.get_by_label("Login with username or email").press("Tab")
|
||||
page.get_by_label("Password", exact=True).fill("Override")
|
||||
page.get_by_label("Password", exact=True).press("Enter")
|
||||
login_nextcloud(page)
|
||||
|
||||
log_note("Wait for welcome popup")
|
||||
# Sleep to make sure the modal has time to appear before continuing navigation
|
||||
sleep(5)
|
||||
close_modal(page)
|
||||
|
||||
with contextlib.suppress(TimeoutError):
|
||||
page.locator('#firstrunwizard .modal-container__content button[aria-label=Close]').click(timeout=15_000)
|
||||
log_note("Create user")
|
||||
page.get_by_role("link", name="Open settings menu").click()
|
||||
page.get_by_role("link", name="Users").first.click()
|
||||
|
|
|
@ -1,20 +1,12 @@
|
|||
import contextlib
|
||||
import random
|
||||
import string
|
||||
import sys
|
||||
from time import time_ns, sleep
|
||||
from time import sleep
|
||||
|
||||
from playwright.sync_api import Playwright, sync_playwright, expect, TimeoutError
|
||||
from playwright.sync_api import Playwright, sync_playwright, expect
|
||||
|
||||
from helpers.helper_functions import log_note, get_random_text, login_nextcloud, close_modal, timeout_handler
|
||||
|
||||
def get_random_text() -> str:
|
||||
size_in_bytes = 1024
|
||||
characters = string.ascii_letters + string.digits
|
||||
return ''.join(random.choice(characters) for _ in range(size_in_bytes))
|
||||
|
||||
def log_note(message: str) -> None:
|
||||
timestamp = str(time_ns())[:16]
|
||||
print(f"{timestamp} {message}")
|
||||
|
||||
def collaborate(playwright: Playwright, browser_name: str) -> None:
|
||||
log_note(f"Launch two {browser_name} browsers")
|
||||
|
@ -25,7 +17,7 @@ def collaborate(playwright: Playwright, browser_name: str) -> None:
|
|||
# The mode is however ~40% slower: https://github.com/microsoft/playwright/issues/21216
|
||||
browser = playwright.chromium.launch(headless=False,args=["--headless=new"])
|
||||
context = browser.new_context()
|
||||
admin_user = context.new_page()
|
||||
admin_user_page = context.new_page()
|
||||
|
||||
|
||||
if browser_name == "firefox":
|
||||
|
@ -35,29 +27,28 @@ def collaborate(playwright: Playwright, browser_name: str) -> None:
|
|||
# The mode is however ~40% slower: https://github.com/microsoft/playwright/issues/21216
|
||||
browser_two = playwright.chromium.launch(headless=False,args=["--headless=new"])
|
||||
context_two = browser_two.new_context()
|
||||
docs_user = context_two.new_page()
|
||||
docs_user_page = context_two.new_page()
|
||||
|
||||
try:
|
||||
# Login and open the file for both users
|
||||
log_note("Logging in with users")
|
||||
login(admin_user, "Crash", "Override")
|
||||
login(docs_user, "docs_dude", "docsrule!12")
|
||||
login_nextcloud(admin_user_page, "Crash", "Override")
|
||||
login_nextcloud(docs_user_page, "docs_dude", "docsrule!12")
|
||||
log_note("Opening document with both users")
|
||||
with contextlib.suppress(TimeoutError):
|
||||
sleep(5)
|
||||
docs_user.locator('#firstrunwizard .modal-container__content button[aria-label=Close]').click(timeout=15_000)
|
||||
admin_user.get_by_role("link", name="Files", exact=True).click()
|
||||
docs_user.get_by_role("link", name="Files", exact=True).click()
|
||||
admin_user.get_by_role("link", name="Shares", exact=True).click()
|
||||
docs_user.get_by_role("link", name="Shares", exact=True).click()
|
||||
admin_user.get_by_role("link", name="colab_meeting .md").click()
|
||||
docs_user.get_by_role("link", name="colab_meeting .md").click()
|
||||
close_modal(docs_user_page)
|
||||
|
||||
admin_user_page.get_by_role("link", name="Files", exact=True).click()
|
||||
docs_user_page.get_by_role("link", name="Files", exact=True).click()
|
||||
admin_user_page.get_by_role("link", name="Shares", exact=True).click()
|
||||
docs_user_page.get_by_role("link", name="Shares", exact=True).click()
|
||||
admin_user_page.get_by_role("link", name="colab_meeting .md").click()
|
||||
docs_user_page.get_by_role("link", name="colab_meeting .md").click()
|
||||
|
||||
# Write the first message and assert it's visible for the other user
|
||||
log_note("Sending first validation message")
|
||||
first_message = "FIRST_VALIDATION_MESSAGE"
|
||||
admin_user.get_by_role("dialog", name="colab_meeting.md").get_by_role("document").locator("div").first.type(first_message)
|
||||
expect(docs_user.get_by_text(first_message)).to_be_visible()
|
||||
admin_user_page.get_by_role("dialog", name="colab_meeting.md").get_by_role("document").locator("div").first.type(first_message)
|
||||
expect(docs_user_page.get_by_text(first_message)).to_be_visible()
|
||||
log_note("GMT_SCI_R=1")
|
||||
|
||||
for x in range(1, 7):
|
||||
|
@ -65,12 +56,12 @@ def collaborate(playwright: Playwright, browser_name: str) -> None:
|
|||
# Admin sends on even, docs_dude on odd
|
||||
if x % 2 == 0:
|
||||
log_note("Admin adding text")
|
||||
admin_user.get_by_role("dialog", name="colab_meeting.md").get_by_role("document").locator("div").first.type(random_message)
|
||||
expect(docs_user.get_by_text(random_message)).to_be_visible(timeout=15_000)
|
||||
admin_user_page.get_by_role("dialog", name="colab_meeting.md").get_by_role("document").locator("div").first.type(random_message)
|
||||
expect(docs_user_page.get_by_text(random_message)).to_be_visible(timeout=15_000)
|
||||
else:
|
||||
log_note("User adding text")
|
||||
docs_user.get_by_role("dialog", name="colab_meeting.md").get_by_role("document").locator("div").first.type(random_message)
|
||||
expect(admin_user.get_by_text(random_message)).to_be_visible(timeout=15_000)
|
||||
docs_user_page.get_by_role("dialog", name="colab_meeting.md").get_by_role("document").locator("div").first.type(random_message)
|
||||
expect(admin_user_page.get_by_text(random_message)).to_be_visible(timeout=15_000)
|
||||
|
||||
log_note("GMT_SCI_R=1")
|
||||
log_note("Sleeping for 5 seconds")
|
||||
|
@ -78,8 +69,8 @@ def collaborate(playwright: Playwright, browser_name: str) -> None:
|
|||
|
||||
log_note("Closing browsers")
|
||||
# ---------------------
|
||||
admin_user.close()
|
||||
docs_user.close()
|
||||
admin_user_page.close()
|
||||
docs_user_page.close()
|
||||
context.close()
|
||||
context_two.close()
|
||||
browser.close()
|
||||
|
@ -88,17 +79,10 @@ def collaborate(playwright: Playwright, browser_name: str) -> None:
|
|||
except Exception as e:
|
||||
if hasattr(e, 'message'): # only Playwright error class has this member
|
||||
log_note(f"Exception occurred: {e.message}")
|
||||
log_note(f"Page content was: {docs_user.content()}")
|
||||
log_note(f"Page content was: {admin_user.content()}")
|
||||
log_note(f"Page content was: {docs_user_page.content()}")
|
||||
log_note(f"Page content was: {admin_user_page.content()}")
|
||||
raise e
|
||||
|
||||
def login(page, username, password):
|
||||
page.goto("http://nc/login")
|
||||
page.get_by_label("Login with username or email").click()
|
||||
page.get_by_label("Login with username or email").fill(username)
|
||||
page.get_by_label("Login with username or email").press("Tab")
|
||||
page.get_by_label("Password", exact=True).fill(password)
|
||||
page.get_by_label("Password", exact=True).press("Enter")
|
||||
|
||||
|
||||
with sync_playwright() as playwright:
|
||||
|
|
|
@ -1,14 +1,9 @@
|
|||
import sys
|
||||
import signal
|
||||
from time import time_ns
|
||||
from playwright.sync_api import sync_playwright, TimeoutError
|
||||
from playwright.sync_api import sync_playwright
|
||||
|
||||
def timeout_handler(signum, frame):
|
||||
raise TimeoutError("Page.content() timed out")
|
||||
|
||||
def log_note(message: str) -> None:
|
||||
timestamp = str(time_ns())[:16]
|
||||
print(f"{timestamp} {message}")
|
||||
from helpers.helper_functions import log_note, get_random_text, login_nextcloud, close_modal, timeout_handler
|
||||
|
||||
def main(browser_name: str = "chromium"):
|
||||
with sync_playwright() as playwright:
|
||||
|
@ -25,23 +20,21 @@ def main(browser_name: str = "chromium"):
|
|||
page = context.new_page()
|
||||
signal.alarm(0) # remove timeout signal
|
||||
try:
|
||||
page.set_default_timeout(240_000) # 240 seconds (timeout is in milliseconds)
|
||||
page.goto('http://nc/')
|
||||
|
||||
# 1. Create User
|
||||
log_note("Create admin user")
|
||||
page.type('#adminlogin', 'Crash')
|
||||
page.type('#adminpass', 'Override')
|
||||
page.click('.primary')
|
||||
page.locator('#adminlogin').fill('Crash')
|
||||
page.locator('#adminpass').fill('Override')
|
||||
page.locator('.primary').click()
|
||||
|
||||
# 2. Install all Apps
|
||||
log_note("Install recommended apps")
|
||||
install_selector = '.button-vue--vue-primary'
|
||||
page.wait_for_selector(install_selector)
|
||||
page.click(install_selector)
|
||||
page.locator(install_selector).click()
|
||||
|
||||
# 3. Dashboard
|
||||
page.wait_for_selector('.app-dashboard')
|
||||
page.locator('.app-dashboard', timeout=240_000)
|
||||
log_note("Installation complete")
|
||||
browser.close()
|
||||
|
||||
|
@ -50,13 +43,10 @@ def main(browser_name: str = "chromium"):
|
|||
log_note(f"Exception occurred: {e.message}")
|
||||
|
||||
# set a timeout. Since the call to page.content() is blocking we need to defer it to the OS
|
||||
try:
|
||||
signal.signal(signal.SIGALRM, timeout_handler)
|
||||
signal.alarm(20)
|
||||
log_note(f"Page content was: {page.content()}")
|
||||
signal.alarm(0) # remove timeout signal
|
||||
except TimeoutError as exc:
|
||||
raise e from exc
|
||||
signal.signal(signal.SIGALRM, timeout_handler)
|
||||
signal.alarm(20)
|
||||
log_note(f"Page content was: {page.content()}")
|
||||
signal.alarm(0) # remove timeout signal
|
||||
raise e
|
||||
|
||||
|
||||
|
|
|
@ -5,19 +5,9 @@ import sys
|
|||
import signal
|
||||
from time import sleep, time_ns
|
||||
|
||||
from playwright.sync_api import Playwright, sync_playwright, expect, TimeoutError
|
||||
from playwright.sync_api import Playwright, sync_playwright, expect
|
||||
|
||||
def timeout_handler(signum, frame):
|
||||
raise TimeoutError("Page.content() timed out")
|
||||
|
||||
def log_note(message: str) -> None:
|
||||
timestamp = str(time_ns())[:16]
|
||||
print(f"{timestamp} {message}")
|
||||
|
||||
def get_random_text() -> str:
|
||||
size_in_bytes = 20 * 1024
|
||||
characters = string.ascii_letters + string.digits
|
||||
return ''.join(random.choice(characters) for _ in range(size_in_bytes))
|
||||
from helpers.helper_functions import log_note, get_random_text, login_nextcloud, close_modal, timeout_handler
|
||||
|
||||
def send_message(sender, message):
|
||||
log_note("Sending message")
|
||||
|
@ -38,35 +28,20 @@ def create_conversation(playwright: Playwright, browser_name: str) -> str:
|
|||
page = context.new_page()
|
||||
try:
|
||||
log_note("Login as admin")
|
||||
page.goto("http://nc/")
|
||||
page.get_by_label("Login with username or email").click()
|
||||
page.get_by_label("Login with username or email").fill("Crash")
|
||||
page.get_by_label("Login with username or email").press("Tab")
|
||||
page.get_by_label("Password", exact=True).fill("Override")
|
||||
page.get_by_role("button", name="Log in").click()
|
||||
login_nextcloud(page)
|
||||
|
||||
# Wait for the modal to load. As it seems you can't close it while it is showing the opening animation.
|
||||
log_note("Close first-time run popup")
|
||||
with contextlib.suppress(TimeoutError):
|
||||
sleep(5)
|
||||
page.locator('#firstrunwizard .modal-container__content button[aria-label=Close]').click(timeout=15_000)
|
||||
close_modal(page)
|
||||
|
||||
log_note("Open Talk app")
|
||||
page.locator('#header').get_by_role("link", name="Talk", exact=True).click()
|
||||
page.wait_for_url("**/apps/spreed/")
|
||||
|
||||
# Second welcome screen?
|
||||
with contextlib.suppress(TimeoutError):
|
||||
page.locator('#firstrunwizard .modal-container__content button[aria-label=Close]').click(timeout=15_000)
|
||||
|
||||
# Headless browsers trigger a warning in Nextcloud, however they actually work fine
|
||||
log_note("Close headless warning")
|
||||
with contextlib.suppress(TimeoutError):
|
||||
page.wait_for_selector('.toast-close')
|
||||
page.click('.toast-close')
|
||||
|
||||
page.wait_for_selector('.toast-close')
|
||||
page.click('.toast-close')
|
||||
page.locator('.toast-close').click()
|
||||
|
||||
log_note("Create conversation")
|
||||
page.click("span.chat-plus-icon")
|
||||
|
@ -94,7 +69,6 @@ def create_conversation(playwright: Playwright, browser_name: str) -> str:
|
|||
signal.alarm(20)
|
||||
log_note(f"Page content was: {page.content()}")
|
||||
signal.alarm(0) # remove timeout signal
|
||||
|
||||
raise e
|
||||
|
||||
def talk(playwright: Playwright, url: str, browser_name: str) -> None:
|
||||
|
@ -121,7 +95,7 @@ def talk(playwright: Playwright, url: str, browser_name: str) -> None:
|
|||
log_note("Close headless warning")
|
||||
with contextlib.suppress(TimeoutError):
|
||||
for page in pages:
|
||||
page.wait_for_selector('.toast-close').click()
|
||||
page.locator('.toast-close').click()
|
||||
|
||||
# Perform actions for all users
|
||||
log_note("Set guest usernames")
|
||||
|
|
Loading…
Add table
Reference in a new issue