From ec15cad234634b4fb52f686b8c9a0a6651c1326a Mon Sep 17 00:00:00 2001 From: Chris Coutinho Date: Thu, 18 Jun 2026 01:23:52 +0200 Subject: [PATCH 1/2] ci: drop deprecated NC31 from matrix, enable NC33, stage NC34 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nextcloud 31 reached deprecation (02/2026), so remove it from the integration matrix. Enable NC33 (previously disabled pending upstream app support) and add NC34 as a commented, ready-to-enable entry. - test.yml: nextcloud_version is now [32, 33]; 34 commented. Image pins updated to match (32.0.11, 33.0.5 active; 34.0.0 commented). The Renovate customManager regex already tracks commented entries, so 34 is digest-managed once present. - renovate.json: drop the nextcloud-31 pin rule, add nextcloud-34 (/^34\./). docker-compose.yml already defaults to 32.0.11 (Renovate-pinned to 32.x), so no change there — the NC31 seen in local runs comes from a shell-exported NEXTCLOUD_IMAGE override, not the compose default. Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/test.yml | 16 ++++++++-------- renovate.json | 8 ++++---- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 05677aca..52813e93 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -59,9 +59,9 @@ jobs: fail-fast: false matrix: nextcloud_version: - - "31" - "32" - # - "33" # Disabled until all upstream apps support NC 33 + - "33" + # - "34" # Disabled until all upstream apps support NC 34 mode: - "single-user" - "multi-user-basic" @@ -69,14 +69,14 @@ jobs: - "keycloak" include: # Version-specific image pins — Renovate updates these via customManagers in renovate.json - # Each entry is pinned to its major version (e.g., NC 31 only gets 31.x updates) - - nextcloud_version: "31" - nextcloud_image: "docker.io/library/nextcloud:31.0.14@sha256:07ec73cc816e58d6f45a162cd53ef886462c29271a23fc68d0124cec276e3767" + # Each entry is pinned to its major version (e.g., NC 32 only gets 32.x updates) - nextcloud_version: "32" nextcloud_image: "docker.io/library/nextcloud:32.0.11@sha256:3ae4045d53e890680ec35e3e4349332123d959c72808aceb44930e79f1be9b9b" - # Disabled until all upstream apps support NC 33 - # - nextcloud_version: "33" - # nextcloud_image: "docker.io/library/nextcloud:33.0.5@sha256:56bdc45109067500fd0832fa64832b7c77a167d9394cbf5f0f4b59740b94194d" + - nextcloud_version: "33" + nextcloud_image: "docker.io/library/nextcloud:33.0.5@sha256:56bdc45109067500fd0832fa64832b7c77a167d9394cbf5f0f4b59740b94194d" + # Disabled until all upstream apps support NC 34 + # - nextcloud_version: "34" + # nextcloud_image: "docker.io/library/nextcloud:34.0.0@sha256:851ca6ef9da101ce3c8a32ec7b6fc65a726b380b5f466307a54c17d32fb77c9a" # Mode-specific properties - mode: single-user diff --git a/renovate.json b/renovate.json index 252c5221..2bc84776 100644 --- a/renovate.json +++ b/renovate.json @@ -14,10 +14,6 @@ }, { "description": "Pin each Nextcloud matrix entry to its own major version", - "matchDepNames": ["nextcloud-31"], - "allowedVersions": "/^31\\./" - }, - { "matchDepNames": ["nextcloud-32"], "allowedVersions": "/^32\\./" }, @@ -25,6 +21,10 @@ "matchDepNames": ["nextcloud-33"], "allowedVersions": "/^33\\./" }, + { + "matchDepNames": ["nextcloud-34"], + "allowedVersions": "/^34\\./" + }, { "description": "Pin docker-compose.yml Nextcloud image to 32.x", "matchPackageNames": ["docker.io/library/nextcloud"], From af413587f58659cc31a46966d8332380211e5428 Mon Sep 17 00:00:00 2001 From: Chris Coutinho Date: Thu, 18 Jun 2026 01:52:20 +0200 Subject: [PATCH 2/2] test(login-flow): disambiguate "Log in" button for NC33 connect page Enabling NC33 surfaced that every login-flow test failed with "Login Flow v2 did not complete after 15 attempts". Root cause: NC33's "Connect to your account" page renders BOTH a "Log in" button and an "Alternative log in using app password" button. The Step-1 locator `get_by_role("button", name="Log in")` is a non-exact (substring) match, so it matched both -> Playwright strict-mode error, which the surrounding try/except silently swallowed. The flow stayed on the connect page, never reached "Grant access", and the poll timed out. Fix: add exact=True to the Step-1 "Log in" locator in both login-flow helpers. NC32's connect page has a single match, so exact=True is safe there. Verified on a live NC33 stack: the exact click reaches the grant page cleanly. Co-Authored-By: Claude Opus 4.8 (1M context) --- tests/server/login_flow/conftest.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/tests/server/login_flow/conftest.py b/tests/server/login_flow/conftest.py index 2906e9e9..3f6e0d41 100644 --- a/tests/server/login_flow/conftest.py +++ b/tests/server/login_flow/conftest.py @@ -246,8 +246,14 @@ async def _complete_login_flow_v2(browser, login_url: str) -> None: await page.goto(login_url, wait_until="networkidle", timeout=60000) logger.info("Step 1 - Current URL: %s", page.url) - # Step 1: "Connect to your account" page - click "Log in" - login_btn = page.get_by_role("button", name="Log in") + # Step 1: "Connect to your account" page - click "Log in". + # exact=True is required: NC33's connect page also renders an + # "Alternative log in using app password" button, and a non-exact + # "Log in" name substring-matches both -> Playwright strict-mode error + # that was silently swallowed below, leaving the flow stuck on the + # connect page (every login-flow test then times out "Login Flow v2 did + # not complete"). NC32 has a single match, so exact=True is safe there. + login_btn = page.get_by_role("button", name="Log in", exact=True) try: await login_btn.wait_for(timeout=10000) await login_btn.click() @@ -803,8 +809,14 @@ async def _complete_login_flow_v2_as_user( await page.goto(login_url, wait_until="networkidle", timeout=60000) logger.info("[%s] Step 1 - Current URL: %s", username, page.url) - # Step 1: "Connect to your account" page - click "Log in" - login_btn = page.get_by_role("button", name="Log in") + # Step 1: "Connect to your account" page - click "Log in". + # exact=True is required: NC33's connect page also renders an + # "Alternative log in using app password" button, and a non-exact + # "Log in" name substring-matches both -> Playwright strict-mode error + # that was silently swallowed below, leaving the flow stuck on the + # connect page (every login-flow test then times out "Login Flow v2 did + # not complete"). NC32 has a single match, so exact=True is safe there. + login_btn = page.get_by_role("button", name="Log in", exact=True) try: await login_btn.wait_for(timeout=10000) await login_btn.click()