0
0
Fork 0
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:
Arne Tarara 2024-10-15 14:51:56 +02:00
parent 1722e9df5c
commit b966eb09c2
No known key found for this signature in database
GPG key ID: 2540198A4079785B
7 changed files with 88 additions and 144 deletions

View 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")

View file

@ -3,14 +3,10 @@ import sys
from time import sleep, time_ns from time import sleep, time_ns
import signal import signal
from playwright.sync_api import Playwright, sync_playwright, TimeoutError from playwright.sync_api import Playwright, sync_playwright
def timeout_handler(signum, frame): from helpers.helper_functions import log_note, get_random_text, login_nextcloud, close_modal, timeout_handler
raise TimeoutError("Page.content() timed out")
def log_note(message: str) -> None:
timestamp = str(time_ns())[:16]
print(f"{timestamp} {message}")
def run(playwright: Playwright, browser_name: str) -> None: def run(playwright: Playwright, browser_name: str) -> None:
log_note(f"Launch browser {browser_name}") log_note(f"Launch browser {browser_name}")
@ -25,11 +21,8 @@ def run(playwright: Playwright, browser_name: str) -> None:
try: try:
log_note("Login") log_note("Login")
page.goto("http://nc/") page.goto("http://nc/")
page.get_by_label("Login with username or email").click() login_nextcloud(page)
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")
log_note("Create new text file") log_note("Create new text file")
page.get_by_role("link", name="Files").click() page.get_by_role("link", name="Files").click()
page.get_by_role("link", name="New file/folder menu").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").fill("colab_meeting.md")
page.locator("#view7-input-file").press("Enter") page.locator("#view7-input-file").press("Enter")
page.get_by_role("button", name="Create a new file with the selected template").click() page.get_by_role("button", name="Create a new file with the selected template").click()
sleep(5)
with contextlib.suppress(TimeoutError): close_modal(page)
page.locator('#firstrunwizard .modal-container__content button[aria-label=Close]').click(timeout=15_000)
page.keyboard.press("Escape") page.keyboard.press("Escape")
log_note("Share file with other user") log_note("Share file with other user")
page.get_by_role("link", name="colab_meeting .md").get_by_role("link", name="Share").click() page.get_by_role("link", name="colab_meeting .md").get_by_role("link", name="Share").click()

View file

@ -3,14 +3,10 @@ import sys
from time import time_ns, sleep from time import time_ns, sleep
import signal 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): from helpers.helper_functions import log_note, get_random_text, login_nextcloud, close_modal, timeout_handler
raise TimeoutError("Page.content() timed out")
def log_note(message: str) -> None:
timestamp = str(time_ns())[:16]
print(f"{timestamp} {message}")
def run(playwright: Playwright, browser_name: str) -> None: def run(playwright: Playwright, browser_name: str) -> None:
log_note(f"Launch browser {browser_name}") log_note(f"Launch browser {browser_name}")
@ -26,24 +22,14 @@ def run(playwright: Playwright, browser_name: str) -> None:
try: try:
page.goto("http://nc/login") page.goto("http://nc/login")
log_note("Login") log_note("Login")
page.get_by_label("Login with username or email").fill("Crash") login_nextcloud(page)
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")
log_note("Wait for welcome popup") log_note("Wait for welcome popup")
# Sleep to make sure the modal has time to appear before continuing navigation close_modal(page)
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)
log_note("Go to calendar") log_note("Go to calendar")
page.get_by_role("link", name="Calendar").click() 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") log_note("Create event")
event_name = "Weekly sync" event_name = "Weekly sync"
page.get_by_role("button", name="New event").click() page.get_by_role("button", name="New event").click()

View file

@ -3,14 +3,9 @@ import contextlib
from time import time_ns, sleep from time import time_ns, sleep
import signal import signal
from playwright.sync_api import Playwright, sync_playwright, TimeoutError from playwright.sync_api import Playwright, sync_playwright
def timeout_handler(signum, frame): from helpers.helper_functions import log_note, get_random_text, login_nextcloud, close_modal, timeout_handler
raise TimeoutError("Page.content() timed out")
def log_note(message: str) -> None:
timestamp = str(time_ns())[:16]
print(f"{timestamp} {message}")
def create_user(playwright: Playwright, browser_name: str, username: str, password: str) -> None: def create_user(playwright: Playwright, browser_name: str, username: str, password: str) -> None:
log_note(f"Launch browser {browser_name}") log_note(f"Launch browser {browser_name}")
@ -24,19 +19,11 @@ def create_user(playwright: Playwright, browser_name: str, username: str, passwo
try: try:
page = context.new_page() page = context.new_page()
log_note("Login") log_note("Login")
page.goto("http://nc/") login_nextcloud(page)
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")
log_note("Wait for welcome popup") log_note("Wait for welcome popup")
# Sleep to make sure the modal has time to appear before continuing navigation close_modal(page)
sleep(5)
with contextlib.suppress(TimeoutError):
page.locator('#firstrunwizard .modal-container__content button[aria-label=Close]').click(timeout=15_000)
log_note("Create user") log_note("Create user")
page.get_by_role("link", name="Open settings menu").click() page.get_by_role("link", name="Open settings menu").click()
page.get_by_role("link", name="Users").first.click() page.get_by_role("link", name="Users").first.click()

View file

@ -1,20 +1,12 @@
import contextlib import contextlib
import random
import string import string
import sys 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: def collaborate(playwright: Playwright, browser_name: str) -> None:
log_note(f"Launch two {browser_name} browsers") 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 # The mode is however ~40% slower: https://github.com/microsoft/playwright/issues/21216
browser = playwright.chromium.launch(headless=False,args=["--headless=new"]) browser = playwright.chromium.launch(headless=False,args=["--headless=new"])
context = browser.new_context() context = browser.new_context()
admin_user = context.new_page() admin_user_page = context.new_page()
if browser_name == "firefox": 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 # The mode is however ~40% slower: https://github.com/microsoft/playwright/issues/21216
browser_two = playwright.chromium.launch(headless=False,args=["--headless=new"]) browser_two = playwright.chromium.launch(headless=False,args=["--headless=new"])
context_two = browser_two.new_context() context_two = browser_two.new_context()
docs_user = context_two.new_page() docs_user_page = context_two.new_page()
try: try:
# Login and open the file for both users # Login and open the file for both users
log_note("Logging in with users") log_note("Logging in with users")
login(admin_user, "Crash", "Override") login_nextcloud(admin_user_page, "Crash", "Override")
login(docs_user, "docs_dude", "docsrule!12") login_nextcloud(docs_user_page, "docs_dude", "docsrule!12")
log_note("Opening document with both users") log_note("Opening document with both users")
with contextlib.suppress(TimeoutError): close_modal(docs_user_page)
sleep(5)
docs_user.locator('#firstrunwizard .modal-container__content button[aria-label=Close]').click(timeout=15_000) admin_user_page.get_by_role("link", name="Files", exact=True).click()
admin_user.get_by_role("link", name="Files", exact=True).click() docs_user_page.get_by_role("link", name="Files", exact=True).click()
docs_user.get_by_role("link", name="Files", exact=True).click() admin_user_page.get_by_role("link", name="Shares", exact=True).click()
admin_user.get_by_role("link", name="Shares", exact=True).click() docs_user_page.get_by_role("link", name="Shares", exact=True).click()
docs_user.get_by_role("link", name="Shares", exact=True).click() admin_user_page.get_by_role("link", name="colab_meeting .md").click()
admin_user.get_by_role("link", name="colab_meeting .md").click() docs_user_page.get_by_role("link", name="colab_meeting .md").click()
docs_user.get_by_role("link", name="colab_meeting .md").click()
# Write the first message and assert it's visible for the other user # Write the first message and assert it's visible for the other user
log_note("Sending first validation message") log_note("Sending first validation message")
first_message = "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) admin_user_page.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() expect(docs_user_page.get_by_text(first_message)).to_be_visible()
log_note("GMT_SCI_R=1") log_note("GMT_SCI_R=1")
for x in range(1, 7): 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 # Admin sends on even, docs_dude on odd
if x % 2 == 0: if x % 2 == 0:
log_note("Admin adding text") 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) admin_user_page.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) expect(docs_user_page.get_by_text(random_message)).to_be_visible(timeout=15_000)
else: else:
log_note("User adding text") 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) docs_user_page.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) expect(admin_user_page.get_by_text(random_message)).to_be_visible(timeout=15_000)
log_note("GMT_SCI_R=1") log_note("GMT_SCI_R=1")
log_note("Sleeping for 5 seconds") log_note("Sleeping for 5 seconds")
@ -78,8 +69,8 @@ def collaborate(playwright: Playwright, browser_name: str) -> None:
log_note("Closing browsers") log_note("Closing browsers")
# --------------------- # ---------------------
admin_user.close() admin_user_page.close()
docs_user.close() docs_user_page.close()
context.close() context.close()
context_two.close() context_two.close()
browser.close() browser.close()
@ -88,17 +79,10 @@ def collaborate(playwright: Playwright, browser_name: str) -> None:
except Exception as e: except Exception as e:
if hasattr(e, 'message'): # only Playwright error class has this member if hasattr(e, 'message'): # only Playwright error class has this member
log_note(f"Exception occurred: {e.message}") log_note(f"Exception occurred: {e.message}")
log_note(f"Page content was: {docs_user.content()}") log_note(f"Page content was: {docs_user_page.content()}")
log_note(f"Page content was: {admin_user.content()}") log_note(f"Page content was: {admin_user_page.content()}")
raise e 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: with sync_playwright() as playwright:

View file

@ -1,14 +1,9 @@
import sys import sys
import signal import signal
from time import time_ns 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): from helpers.helper_functions import log_note, get_random_text, login_nextcloud, close_modal, timeout_handler
raise TimeoutError("Page.content() timed out")
def log_note(message: str) -> None:
timestamp = str(time_ns())[:16]
print(f"{timestamp} {message}")
def main(browser_name: str = "chromium"): def main(browser_name: str = "chromium"):
with sync_playwright() as playwright: with sync_playwright() as playwright:
@ -25,23 +20,21 @@ def main(browser_name: str = "chromium"):
page = context.new_page() page = context.new_page()
signal.alarm(0) # remove timeout signal signal.alarm(0) # remove timeout signal
try: try:
page.set_default_timeout(240_000) # 240 seconds (timeout is in milliseconds)
page.goto('http://nc/') page.goto('http://nc/')
# 1. Create User # 1. Create User
log_note("Create admin user") log_note("Create admin user")
page.type('#adminlogin', 'Crash') page.locator('#adminlogin').fill('Crash')
page.type('#adminpass', 'Override') page.locator('#adminpass').fill('Override')
page.click('.primary') page.locator('.primary').click()
# 2. Install all Apps # 2. Install all Apps
log_note("Install recommended apps") log_note("Install recommended apps")
install_selector = '.button-vue--vue-primary' install_selector = '.button-vue--vue-primary'
page.wait_for_selector(install_selector) page.locator(install_selector).click()
page.click(install_selector)
# 3. Dashboard # 3. Dashboard
page.wait_for_selector('.app-dashboard') page.locator('.app-dashboard', timeout=240_000)
log_note("Installation complete") log_note("Installation complete")
browser.close() browser.close()
@ -50,13 +43,10 @@ def main(browser_name: str = "chromium"):
log_note(f"Exception occurred: {e.message}") 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 # 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.signal(signal.SIGALRM, timeout_handler)
signal.alarm(20) signal.alarm(20)
log_note(f"Page content was: {page.content()}") log_note(f"Page content was: {page.content()}")
signal.alarm(0) # remove timeout signal signal.alarm(0) # remove timeout signal
except TimeoutError as exc:
raise e from exc
raise e raise e

View file

@ -5,19 +5,9 @@ import sys
import signal import signal
from time import sleep, time_ns 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): from helpers.helper_functions import log_note, get_random_text, login_nextcloud, close_modal, timeout_handler
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))
def send_message(sender, message): def send_message(sender, message):
log_note("Sending message") log_note("Sending message")
@ -38,35 +28,20 @@ def create_conversation(playwright: Playwright, browser_name: str) -> str:
page = context.new_page() page = context.new_page()
try: try:
log_note("Login as admin") log_note("Login as admin")
page.goto("http://nc/") login_nextcloud(page)
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()
# Wait for the modal to load. As it seems you can't close it while it is showing the opening animation. # 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") log_note("Close first-time run popup")
with contextlib.suppress(TimeoutError): close_modal(page)
sleep(5)
page.locator('#firstrunwizard .modal-container__content button[aria-label=Close]').click(timeout=15_000)
log_note("Open Talk app") log_note("Open Talk app")
page.locator('#header').get_by_role("link", name="Talk", exact=True).click() page.locator('#header').get_by_role("link", name="Talk", exact=True).click()
page.wait_for_url("**/apps/spreed/") 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 # Headless browsers trigger a warning in Nextcloud, however they actually work fine
log_note("Close headless warning") log_note("Close headless warning")
with contextlib.suppress(TimeoutError): with contextlib.suppress(TimeoutError):
page.wait_for_selector('.toast-close') page.locator('.toast-close').click()
page.click('.toast-close')
page.wait_for_selector('.toast-close')
page.click('.toast-close')
log_note("Create conversation") log_note("Create conversation")
page.click("span.chat-plus-icon") page.click("span.chat-plus-icon")
@ -94,7 +69,6 @@ def create_conversation(playwright: Playwright, browser_name: str) -> str:
signal.alarm(20) signal.alarm(20)
log_note(f"Page content was: {page.content()}") log_note(f"Page content was: {page.content()}")
signal.alarm(0) # remove timeout signal signal.alarm(0) # remove timeout signal
raise e raise e
def talk(playwright: Playwright, url: str, browser_name: str) -> None: 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") log_note("Close headless warning")
with contextlib.suppress(TimeoutError): with contextlib.suppress(TimeoutError):
for page in pages: for page in pages:
page.wait_for_selector('.toast-close').click() page.locator('.toast-close').click()
# Perform actions for all users # Perform actions for all users
log_note("Set guest usernames") log_note("Set guest usernames")