You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat: migrate scholiq from Vue 2 to Vue 3 (@conduction/nextcloud-vue 2.1.0-vue3.13) (#249)
* test(e2e): make the target instance explicit — never fall back to the shared :8080 container
The suite resolved its target three different ways, all defaulting to
`http://localhost:8080` — the SHARED developer container, which bind-mounts
real host checkouts:
* playwright.config.ts baseURL
* tests/e2e/global-setup.ts login + OR_BASE_URL for the seed
* tests/e2e/seed-example-data.mjs
and four specs in tests/e2e/spec-coverage/nextcloud-app.spec.ts built ABSOLUTE
`http://localhost:8080/...` request URLs that ignored `baseURL` entirely — two
of them WRITES (POST /api/settings, PUT /api/notification-preferences). Running
`npm run test:e2e` without setting PW_BASE_URL therefore fired admin logins, a
register import, an example-data seed and two config writes into somebody
else's working environment, and reported the results as the branch under test.
Centralise on tests/e2e/base-url.ts: strict (no localhost fallback — an unset
target is a hard error) but accepting PLAYWRIGHT_BASE_URL, the shared CI
quality workflow's BASE_URL, and this repo's historical PW_BASE_URL, so neither
a local run nor a CI run silently retargets.
* wip(scholiq): preserve in-flight Vue 3 migration after host reset
Committed mid-flight so the work survives. NOT verified: the build/deploy/e2e
run was still queued on the shared heavy-lock when the host was reset.
See the branch's PR (if any) for what remains.
* revert(docs): restore the 52 tutorial screenshots the e2e run rewrote
`npm run test:e2e` reshoots and overwrites every PNG under
docs/static/screenshots/tutorials/ as a side effect, because the
`docs-capture` Playwright project was documented as opt-in but was not: a
project listed in `projects[]` runs whenever no `--project` filter is given,
and `test:e2e` gives none.
The config is fixed on this branch (the project is now gated on
SCHOLIQ_DOCS_CAPTURE=1). These 52 binary rewrites were incidental output from
the measurement runs, not an intended docs update, so they are restored to
their `development` content and do not belong in this PR.
Also drops the untracked .scholiq-boot-smoke.mjs probe that was swept into the
preservation commit — it is a local measurement tool, not app code.
* style(php): clear the remaining 23 PHPCS errors so the gate can go green
`PHP Quality (phpcs)` has been failing on `development` for a long time — 26
errors across 11 files. It is not a cosmetic red: the shared quality workflow
gates `phpunit` on `needs.php-quality.result != 'failure'`, so scholiq's PHPUnit
suite has NEVER executed on a pull request.
An earlier commit on this branch fixed 3 of them in GradeFormulaEvaluator.php.
That number came from reading the CI log through `tail -20`, which silently cut
off every earlier file — the truncating filter decided the count. The full
inventory is 26, and this commit clears the other 23:
8 lib/Listener/BsaProgressFlagHandler.php const + assignment alignment,
@PARAM type padding
5 lib/Lifecycle/BsaDecisionGuard.php const + assignment alignment,
doc-comment capital, 152-char line
2 lib/Listener/FraudCaseDecisionHandler.php assignment alignment, 152-char line
2 lib/Lifecycle/FraudCaseBlockGuard.php 163-char line, comment capital
1 lib/StudyProgress/BsaProgressEvaluator.php inline IF -> if/else
1 lib/Lifecycle/FraudCaseInvalidationGuard.php 159-char line
1 lib/Lifecycle/FraudCaseHearingGuard.php blank line before first function
1 lib/Lifecycle/ExemptionDecisionGuard.php blank line before first function
1 lib/Lifecycle/BsaWarningSigningGuard.php blank line before first function
1 lib/Lifecycle/FraudCaseDecisionGuard.php assignment alignment
All behaviour-preserving: whitespace, comment capitalisation, long log strings
split across two concatenated lines, one ternary expanded to if/else, and two
long expressions extracted to a local variable. Every touched file passes
`php -l` (positive-controlled against a deliberately malformed file).
None of these files is touched by the Vue 3 migration; they are cleared here
because the project standard is to fix pre-existing quality issues on contact
rather than leave them.
* style(php): use single-space assignment where alignment exceeds maxPadding
The previous commit aligned `$verdict` with `$contestedGradeEntryId`, which is
the wrong direction: Generic.Formatting.MultipleStatementAlignment falls back to
requiring exactly ONE space once a group's longest variable would push the
padding past maxPadding. phpcs said so plainly — "expected 1 space but found 15
spaces" — and the original code had the same error with 14. Aligning harder made
it 15.
This is the last of the 26 PHPCS errors that were failing on `development`.
* fix(e2e): bound the networkidle wait in the docs-capture helper
`go()` called `waitForLoadState('networkidle')` with no timeout. That inherits
the test budget, so it can never REJECT — the `.catch()` next to it was dead
code, and the helper blocked until the whole test timed out.
That is the entire Vue 2 -> Vue 3 e2e delta. Measured on one instance, same
page, same session, deploying each build in turn:
Vue 2: 90 requests, 0 still in flight after 40 s -> 'UN grading' passes 2/2 (~57 s)
Vue 3: 93 requests, 1 still in flight after 40 s -> 'UN grading' fails 3/3 (90 s),
and still fails when given 300 s, so it HANGS rather than being slow
The straggler is `GET /apps/openregister/api/schemas/grade-entry`, which 404s
(3 of the register's 118 schemas do not import). @conduction/nextcloud-vue's
`useObjectStore.fetchSchema` does:
if (!response.ok) return null
without consuming or cancelling the response body, so the browser keeps the
request open indefinitely and `networkidle` becomes unreachable for the life of
the page. Reported upstream — the real fix belongs in nc-vue, not here.
Bounding the wait restores the helper's stated intent (its own comment says
"idle never fires on some pages") and matches index-pages, detail-pages, shell
and accessibility-axe-scan, which all already pass an explicit timeout. No
assertion is changed, nothing is skipped: the test now PASSES on Vue 3 in 38 s.
---------
Co-authored-by: Conduction Release Bot <release-bot@conduction.nl>
Copy file name to clipboardExpand all lines: docs/Technical/specs.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -10,7 +10,7 @@ All 6 Wave-2 compliance-audit wedge specs have been applied. Specs live in `open
10
10
11
11
**Status:** Applied
12
12
13
-
**Summary:** Foundation spec that ships the standards-compliant Nextcloud app shell before any other capability can land. Delivers: `appinfo/info.xml` with hard dependencies on OpenRegister and OpenConnector; `lib/AppInfo/Application.php` registering all services and listeners; the Vue 2 SPA entry point (`src/main.js`); the admin and user settings panels; `src/manifest.json` adopting CnAppRoot Tier 4 (ADR-024); `l10n/nl.js` and `l10n/en.js` i18n stubs. All downstream specs (`course-management`, `enrolment`, `certification`, `compliance-audit`, `dashboard`) depend on this foundation.
13
+
**Summary:** Foundation spec that ships the standards-compliant Nextcloud app shell before any other capability can land. Delivers: `appinfo/info.xml` with hard dependencies on OpenRegister and OpenConnector; `lib/AppInfo/Application.php` registering all services and listeners; the Vue 3 SPA entry point (`src/main.js`); the admin and user settings panels; `src/manifest.json` adopting CnAppRoot Tier 4 (ADR-024); `l10n/nl.js` and `l10n/en.js` i18n stubs. All downstream specs (`course-management`, `enrolment`, `certification`, `compliance-audit`, `dashboard`) depend on this foundation.
0 commit comments