diff --git a/src/tests_nextcloud/cleanup_nextcloud.py b/src/tests_nextcloud/cleanup_nextcloud.py new file mode 100644 index 0000000..cc54504 --- /dev/null +++ b/src/tests_nextcloud/cleanup_nextcloud.py @@ -0,0 +1,22 @@ +import pytest + + +@pytest.fixture(scope="session", autouse=True) +def delete_nextcloud_user(browser: Browser): + """Delete Nextcloud Account""" + yield + context = setup_context(browser, f"{STATES}/admin_state.json") + page = context.new_page() + page.goto(CONFIG["domain"]) + with page.expect_popup() as nextcloud_info: + page.get_by_role("link", name="Nextcloud").click() + nextcloud = nextcloud_info.value + nextcloud.get_by_role("link", name="Open settings menu").click() + nextcloud.get_by_role("link", name="Users").click() + nextcloud.locator("#app-content div").filter(has_text=testuser["username"]).get_by_role( + "button", name="Toggle user actions menu" + ).click() + nextcloud.get_by_role("button", name="Delete user").click() + nextcloud.get_by_role("button", name=f"Delete authentik-{testuser['username']}'s account").click() + context.tracing.stop(path=f"{RECORDS}/nextcloud_delete_user.zip") + context.close() diff --git a/src/tests_nextcloud/conftest.py b/src/tests_nextcloud/conftest.py new file mode 100644 index 0000000..df1eac3 --- /dev/null +++ b/src/tests_nextcloud/conftest.py @@ -0,0 +1 @@ +from src.tests_authentik.fixtures_authentik import admin_context, authentik_admin_page, user_context diff --git a/src/tests_nextcloud/runner_nextcloud.py b/src/tests_nextcloud/runner_nextcloud.py new file mode 100644 index 0000000..d360dc8 --- /dev/null +++ b/src/tests_nextcloud/runner_nextcloud.py @@ -0,0 +1,16 @@ +from src.runner import Runner, SubTest +from src.tests_authentik.runner_authentik import RunnerAuthentik + + +def fake_condition(arg): + return False + + +class RunnerNextcloud(Runner): + name: str = "nextcloud" + test_dir_name: str = "tests_nextcloud" + main_setup_name = "setup_nextcloud.py" + main_test_name = "tests_nextcloud.py" + main_cleanup_name = "cleanup_nextcloud.py" + dependencies = [RunnerAuthentik] + sub_tests: list[SubTest] = [SubTest(condition=fake_condition, test_file="tests_nextcloud_onlyoffice.py")] diff --git a/src/tests_nextcloud/setup_nextcloud.py b/src/tests_nextcloud/setup_nextcloud.py new file mode 100644 index 0000000..eb53182 --- /dev/null +++ b/src/tests_nextcloud/setup_nextcloud.py @@ -0,0 +1,35 @@ +import pytest + + +@pytest.fixture(scope="session", autouse=True) +def nc_login(browser: Browser): + """Nextcloud Login""" + context = setup_context(browser, f"{STATES}/user_state.json") + page = context.new_page() + page.goto(CONFIG["domain"]) + with page.expect_popup() as nextcloud_info: + link = page.get_by_role("link", name="Nextcloud") + CONFIG["nc_domain"] = link.get_attribute("href") + link.click() + nextcloud = nextcloud_info.value + check_for(nextcloud.get_by_role("link", name="Name")) + if nextcloud.query_selector(".close-icon"): + close_button = nextcloud.get_by_role("button", name="Close modal") + close_button.click() + expect(close_button).to_be_hidden() + nextcloud.wait_for_timeout(2000) + context.storage_state(path=f"{STATES}/nc_user_state.json") + context.tracing.stop(path=f"{RECORDS}/nextcloud_login_user.zip") + context.close() + + +@pytest.fixture +def nc_session(browser: Browser): + """Reuse Nextcloud User Session""" + context = setup_context(browser, f"{STATES}/nc_user_state.json") + page = context.new_page() + page.goto(CONFIG["nc_domain"]) + if page.query_selector(".close-icon"): + page.get_by_role("button", name="Close modal").click() + yield context, page + context.close() diff --git a/src/tests_nextcloud/tests_nextcloud.py b/src/tests_nextcloud/tests_nextcloud.py new file mode 100644 index 0000000..c9bc5be --- /dev/null +++ b/src/tests_nextcloud/tests_nextcloud.py @@ -0,0 +1,13 @@ +def test_nextcloud(nc_session): + """Test Nextcloud""" + context, page = nc_session + # if page.query_selector('.close-icon'): + # page.get_by_role("button", name="Close modal").click() + if CONFIG.get("default_quota"): + quota = int( + page.get_by_role("listitem", name="Storage informations").get_by_role("link").inner_text().split()[3] + ) + assert quota == CONFIG["default_quota"] + for app in CONFIG["nc_apps"]: + check_for(page.get_by_role("link", name=app)) + context.tracing.stop(path=f"{RECORDS}/nextcloud.zip") diff --git a/src/tests_nextcloud/tests_nextcloud_onlyoffice.py b/src/tests_nextcloud/tests_nextcloud_onlyoffice.py new file mode 100644 index 0000000..0b78e5a --- /dev/null +++ b/src/tests_nextcloud/tests_nextcloud_onlyoffice.py @@ -0,0 +1,19 @@ +def test_onlyoffice(nc_session): + """Test Onlyoffice in Nextcloud""" + context, page = nc_session + # if page.query_selector('.close-icon'): + # page.get_by_role("button", name="Close modal").click() + page.get_by_role("link", name="New file/folder menu").click() + page.get_by_role("link", name="New document").click() + page.locator("#view9-input-file").fill("test.docx") + page.get_by_role("button", name="Submit").click() + outer_frame = page.frame_locator("#onlyofficeFrame") + check_for(outer_frame.locator("body")) + inner_frame = outer_frame.frame_locator("#app > iframe") + check_for(inner_frame.locator("body")) + onlyoffice = page.frame("frameEditor") + check_for(onlyoffice.locator('//*[@id="area_id"]')) + onlyoffice.locator("#btn-goback").click() + page.get_by_role("link", name="Not favorited test .docx Share Actions").get_by_role("link", name="Actions").click() + page.get_by_role("link", name="Delete file").click() + context.tracing.stop(path=f"{RECORDS}/onlyoffice.zip")