Commit Graph
71 Commits
Author SHA1 Message Date
kevinveenbirkenbachandClaude Opus 4.8 7608f94e5f test(web-app-nextcloud): fileslibreofficeedit spec asserts its admin settings section renders
Target the app's own settings/admin/fileslibreofficeedit route (not 404) and assert
its LibreOffice editor admin panel and document-editor server URL field render.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 06:03:13 +02:00
kevinveenbirkenbachandClaude Opus 4.8 67398cff8d test(web-app-nextcloud): files_linkeditor spec asserts its New-link menu entries register
Open the Files New menu and assert the 'New link (.URL)' and 'New link (.webloc)'
entries the app injects are present, proving its frontend bundle loaded.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 06:03:13 +02:00
kevinveenbirkenbachandClaude Opus 4.8 9d6ec1ccf9 test(web-app-nextcloud): files_bpm addon spec asserts the BPMN modeler canvas renders
Target the app's own apps/files_bpm/ route (not the generic Files app) and assert
it resolves (not 404) and the #canvas.bpmn-canvas modeler surface renders.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 06:03:13 +02:00
kevinveenbirkenbachandClaude Opus 4.8 a345d7a482 test(web-app-nextcloud): external addon spec asserts the External-sites admin panel renders
Target the app's own settings/admin/external section and assert its description
text and 'New site' action render, proving the external app's section and template
are served by the enabled app (not the generic additional-settings shell).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 06:03:13 +02:00
kevinveenbirkenbachandClaude Opus 4.8 9d787ff03b test(web-app-nextcloud): event_update_notification spec asserts it is an enabled app
The app is backend-only (no user route); assert via the Provisioning OCS registry
that event_update_notification is in the enabled-apps list and not in the disabled
list, so a disabled/absent app fails.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 06:03:12 +02:00
kevinveenbirkenbachandClaude Opus 4.8 1f474d070e test(web-app-nextcloud): epubviewer addon spec asserts the reader panel + persisted config
Drop the DOM-gated skips; assert the settings/user/epubviewer section resolves
(not 404), the #reader-personal panel renders, and the #EpubEnable checkbox
reflects the persisted user config.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 06:03:12 +02:00
kevinveenbirkenbachandClaude Opus 4.8 b33a8ff85e test(web-app-nextcloud): drawio addon spec asserts the drawio editor surface renders
Drop the DOM-gated skips; assert the apps/drawio/ route resolves (not 404) and the
drawio-specific editor surface mounts, so a disabled/broken app fails.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 06:03:12 +02:00
kevinveenbirkenbachandClaude Opus 4.8 5fcfdc7577 test(web-app-nextcloud): bbb addon spec asserts the cloud_bbb app UI renders and is coupled
Navigate to apps/bbb/ and assert the cloud_bbb app shell + its own room-management
surface render, in addition to the admin api.url/api.secret partner coupling.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 06:03:12 +02:00
kevinveenbirkenbachandClaude Opus 4.8 1496174e29 test(web-app-nextcloud): real integration_moodle token round-trip coupling
Drive the real bridge: pin the per-user #moodle-url to the deployed partner
Moodle host (distinct from Nextcloud), persist it, then Connect and assert the
POST /apps/integration_moodle/get-token response is a genuine partner verdict
(200 with user_name minted by the partner webservice, or 401 partner-refused) —
proving the request reached the partner Moodle, not a local stub. bridges:
[moodle] means the deployment gate skips it when the partner is not deployed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 06:03:10 +02:00
kevinveenbirkenbachandClaude Opus 4.8 2a8e11462c test(web-app-nextcloud): real integration_mattermost OAuth coupling
Assert the admin oauth_instance_url points at the partner Mattermost host (not
Nextcloud) and the admin panel exposes the provisioned OAuth client, and the
per-user connect drives an OAuth authorize redirect to that partner host with
the provisioned client_id + response_type=code. Backed by the
integration_mattermost_provision hook; bridges: [mattermost] with the partner in
the deploy set means this runs live and fails if provisioning or the connect is
broken.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 06:03:10 +02:00
kevinveenbirkenbachandClaude Opus 4.8 2c39e18478 test(web-app-nextcloud): real integration_matrix homeserver coupling
Drop the DOM-gated skip; assert the admin Matrix panel renders, the configured
homeserver is the deployed partner (distinct from Nextcloud), and the per-user
connect drives a real session against the partner homeserver (a browser
/_matrix/client/ call to the partner, or the nextcloud integration_matrix
connect round-trip). bridges: [matrix] with the partner in the deploy set means
this runs live and fails on a broken coupling instead of skipping on the DOM.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 06:03:10 +02:00
kevinveenbirkenbachandClaude Opus 4.8 009d0eb15c test(web-app-nextcloud): real integration_mastodon bridge coupling
Hard-assert the full Mastodon bridge when enabled: the admin panel shows the
provisioned oauth_instance_url pointing at the deployed partner host (distinct
from Nextcloud) and the per-user Connect-to-Mastodon drives the OAuth handoff to
the partner /oauth/authorize with client_id + response_type=code. The bridges:
[mastodon] declaration lets the deployment gate skip it cleanly when the partner
role is not deployed (as in the standard set) even though the NC app is enabled.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 06:03:10 +02:00
kevinveenbirkenbachandClaude Opus 4.8 aeb1520174 test(web-app-nextcloud): real integration_jira OAuth connect coupling
Assert the per-user Connect-to-Jira-Cloud control renders (absence now fails)
and clicking it drives to the partner auth.atlassian.com /authorize carrying the
provisioned client_id + response_type=code, host distinct from Nextcloud. Like
google, the addon self-gates on credentials (meta enabled true only when api
jira.client_id/client_secret are set), so it runs only with real Atlassian OAuth
creds and skips cleanly otherwise.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 06:03:09 +02:00
kevinveenbirkenbachandClaude Opus 4.8 276f1d05aa test(web-app-nextcloud): real integration_google OAuth connect coupling
Assert the per-user Sign-in-with-Google control renders (absence now fails) and
clicking it hands off to the partner accounts.google.com /o/oauth2/v2/auth
carrying the provisioned client_id + response_type=code, host distinct from
Nextcloud. The addon self-gates on credentials: meta enabled is true only when
api google.client_id/client_secret are both set, so the spec runs only when real
Google OAuth creds are configured and skips cleanly otherwise.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 06:03:09 +02:00
kevinveenbirkenbachandClaude Opus 4.8 135ebccbc5 test(web-app-nextcloud): real integration_github OAuth connect coupling
Assert the per-user Connect-to-GitHub control renders (absence now fails, not
skips) and clicking it hands the top frame to the partner github.com
/login/oauth/authorize carrying the provisioned client_id, with the partner host
distinct from Nextcloud and redirect_uri pointing back at this instance.
response_type is intentionally not asserted (upstream integration_github does
not emit it for GitHub's OAuth app flow).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 06:03:09 +02:00
kevinveenbirkenbachandClaude Opus 4.8 98918efe75 test(web-app-nextcloud): real integration_discourse User-API-Key coupling
Drive the real cross-app User-API-Key handoff and assert it reaches the partner
Discourse, after confirming the integration_discourse Vue app actually booted —
not just that a config value exists. Verified live: integration_discourse 3.2.0
enabled with the partner url coupled.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 06:03:09 +02:00
kevinveenbirkenbachandClaude Opus 4.8 5c0e731e2d test(web-app-nextcloud): integration_suitecrm clean spec + mark optional
- meta: required true -> false; upstream julien-nc/integration_suitecrm needs
  Nextcloud server major <= 24 and never enables on the deployed newer major, so
  the addon gate skips its spec cleanly instead of asserting a surface that can
  never render
- spec: drop the DOM-gated skips; assert the personal settings panel and the
  #suitecrm-content OAuth section render and the instance URL points at the
  partner host (clean once a compatible app version ships)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 06:03:09 +02:00
kevinveenbirkenbachandClaude Opus 4.8 462c20cbb9 fix(web-app-nextcloud): integration_openproject OAuth provisioning + full e2e
- ensure_nextcloud_storage.rb: resolve the storage creator via
  User.where(admin: true) with a respond_to?(:active) guard, since OpenProject 17
  removed User::STATUSES (the prior .active.first path raised NameError)
- integration_openproject_provision.yml: parse the OAuth payload with
  regex_search('{.*}') instead of trim, so polluted runner stdout still yields
  valid JSON
- spec: assert the provisioned OAuth client is shown in admin (both sides
  coupled) and the per-user connect drives the partner /oauth/authorize with the
  client_id + response_type=code

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 06:03:09 +02:00
kevinveenbirkenbachandClaude Opus 4.8 110ca7d134 feat(web-app-nextcloud): real integration_gitlab two-way OAuth coupling
Provision a GitLab Doorkeeper OAuth application for Nextcloud and wire the
credentials into the integration_gitlab app so the per-user Connect-to-GitLab
flow reaches the partner authorize endpoint.

- provision_oauth_app.rb: create/renew the Doorkeeper app (organization_id set
  to satisfy the newer GitLab oauth_applications check constraint), emit
  CLIENT_ID/CLIENT_SECRET
- integration_gitlab_provision.yml: run it via gitlab-rails, parse the creds,
  store them with occ config:app:set --sensitive (the app stores them encrypted)
- integration_gitlab.yml: probe the partner, read persisted creds, provision
  only when the partner is up and not yet coupled
- spec: drive the real per-user OAuth connect and assert the partner
  /oauth/authorize carries the provisioned client_id + response_type=code

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 06:03:09 +02:00
kevinveenbirkenbachandClaude Opus 4.8 650da2df56 test(playwright): addon specs verify integrations are configured and coupled
Addon specs assert the integration is genuinely wired (admin config holds the partner value, host distinct from the app), not just that a page loads. Robust to the live DOM: strict-mode-safe locators (.first()), enabled-signal from the app's own panel (not the lazy apps list), and test.skip (not fail) when an app is disabled (NC-version-incompatible) or its partner role is absent/unconfigured.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 06:03:07 +02:00
kevinveenbirkenbachandClaude Opus 4.8 8e92f15f6a test(addons): require a Playwright spec for every addon; add 87 per-addon specs
Add tests/lint/ansible/services/test_addons_playwright_spec.py requiring roles/<role>/files/playwright/addons/<id>.spec.js for EVERY addon of EVERY role — no mechanism auto-exempt and no # nocheck escape. Ship the 87 per-addon specs (gated via skipUnlessAddonEnabled so they skip cleanly when the addon is disabled in the current variant), the test-e2e-playwright addon-gating harness (addon-gating.js, playwright.config.js, recursive 02_run_one.yml), the shared odoo helper, and the ADDON_<ID>_ENABLED flags in the six playwright.env.j2 templates. Relax test_env_file_schema to skip Jinja-templated keys in the ADDON loop. Doc updates (suppression.md, requirements/026) follow in a separate commit.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 00:16:54 +02:00