1
0
mirror of https://github.com/owncloud/ocis.git synced 2026-10-23 23:29:02 +03:00
Files
ocis/web/docs/testing/testing.md
Lukas Hirt 6bad03d364 [full-ci] chore: [OCISDEV-5] merge and relicense ownCloud Web into oCIS (#12491)
* chore: [OCISDEV-5] Merge and relicense ownCloud Web into oCIS

Consolidate the ownCloud Web frontend into this repository as a single
product with one contribution surface and one license. The web/ source
is imported as-is from the final standalone owncloud/web release
(v12.5.0 / last-agpl-release @ b16a34fdf5569d2fd63b1ff3c575c1a4ee569ad3);
the archived owncloud/web repository remains the historical record for
everything at and before that commit.

Relicensing:
- All web/ contributors have signed the ownCloud CLA, granting ownCloud
  GmbH the right to relicense their contributions.
- web/LICENSE (AGPL-3.0) removed; the repository root LICENSE
  (Apache-2.0) now governs web/ as well, matching how the rest of the
  repo is already licensed.
- All 25 web/packages/*/package.json license fields flipped to
  Apache-2.0; root NOTICE added documenting the relicensing provenance.
- Added REUSE.toml + LICENSES/ so the whole repository (including
  vendored Go dependencies) is REUSE 3.3 compliant.

CI/build:
- services/web/Makefile now builds web assets from the in-tree source
  instead of downloading a release tarball from owncloud/web; license
  checking/saving likewise runs against the in-tree source.
- ci.env and tests/acceptance/run-e2e.py no longer clone owncloud/web
  for Playwright e2e tests.
- Added the app-provider and ocm e2e suites to acceptance-tests.yml's
  matrix, closing a coverage gap where they were silently excluded;
  ported the Collabora/OnlyOffice/federated-instance orchestration
  web's old CI used to run them.
- Added web-tests.yml (typecheck/format/lint/unit-test), a
  check-licenses.yml, commit-message.yml, and release-npm-packages.yml
  for the @ownclouders/* packages, replacing web's old standalone CI.
- Removed dead CI tooling inherited from the standalone repo
  (web/tests/drone, web/tests/actions, web/.github, and an orphaned
  ci.env-dependent cache-check script).

Docs:
- Rewrote docs/services/web/releasing.md and web/docs/releasing to
  describe the in-tree build/release process.
- Updated remaining references to github.com/owncloud/web across docs,
  services/web/README.md, and the deployment example to point at the
  in-tree web/ directory.

Signed-off-by: Lukas Hirt <info@hirt.cz>

* ci: sync web/ translations via Transifex

web/ is a pnpm workspace nested inside the repo, so it isn't covered by
the existing translation-sync job (sub_path: ., no package.json at the
repo root). Add a second sync-web job invoking the same reusable
workflow with sub_path: web and package_manager: pnpm, so its l10n-read/
push/pull/write targets actually install web's dependencies instead of
silently running against an empty node_modules. Sequenced after the
existing sync job since both push to the same hardcoded
chore/translations-update branch.

* ci: fix pnpm cache setup order in web-tests and check-licenses

actions/setup-node's cache: pnpm input shells out to pnpm to resolve
the cache directory, so pnpm must already be on PATH when that step
runs. Both workflows ran `corepack enable` *after* setup-node, which
still failed: corepack writes its pnpm shim into the currently active
Node installation's bin dir, and setup-node had already swapped PATH
to the newly-installed Node version by that point, leaving the shim
behind. Use pnpm/action-setup instead, which installs a standalone
pnpm binary independent of the Node version, before setup-node runs.

Also set cache-dependency-path explicitly: the lockfile lives at
web/pnpm-lock.yaml, and cache-dependency-path resolves relative to
GITHUB_WORKSPACE regardless of the job's working-directory default
(that default only applies to run: steps, not to setup-node itself).

* fix(web): resolve 19 HIGH trivy findings in pnpm-lock.yaml

All 19 findings had fixes available upstream, so per this repo's own
.trivyignore policy (reserved for cases with no fix available), these
get fixed rather than suppressed.

vite (7.3.2 -> 7.3.5) is a direct dependency, bumped directly in every
package.json that pins it.

The other 8 (@xmldom/xmldom, flatted, form-data, immutable, js-cookie,
linkify-it, minimatch, ws) are purely transitive. Verified empirically
that `pnpm update <pkg>` silently no-ops on packages not declared in
any workspace manifest, even when a parent's semver range would allow
the fix (e.g. glob@10.5.0's `^9.0.4` covers 9.0.7) -- so pnpm.overrides
is genuinely required here, not just convenient.

minimatch is overridden with a version-range key
(minimatch@>=9.0.0 <9.0.7) rather than a blanket override, since 6
different major versions of minimatch coexist in the tree for
different consumers (3.x/5.x/10.x elsewhere); a blanket override would
have forced all of them to 9.0.7 and likely broken callers expecting a
different major's API.

* fix(web): unify @types/node resolution to stop duplicate vite types

The previous vite 7.3.2 -> 7.3.5 bump caused pnpm to resolve two
different @types/node versions (25.7.0 and 26.1.0) as vite's optional
peer across different workspace packages. vue-tsc then saw two
structurally-different copies of vite's types (e.g. Plugin, HotUpdateOptions)
and failed with TS2769 in design-system, web-client, web-pkg and
web-test-helpers' vite.config.ts files.

Force a single resolution via pnpm.overrides, pinned to 24.13.2 to
match the Node 24 runtime (engines/volta) rather than an arbitrary
newer major.

* fix(tests): fix ocm/app-provider e2e suites' oCIS orchestration

Both suites were newly wired up by the previous merge-web-repo commit
and hadn't run against real CI yet, so their setup had two latent bugs:

e2e-ocm: the federated instance's env only offset *_DEBUG_ADDR ports,
leaving the actual service ports (e.g. gateway's default
127.0.0.1:9142) unset. The federated "ocis server" process then
crashed trying to bind the same ports the primary instance already
held. run-github.py's Behat apiOcm suite already solved this with a
canonical tests/config/local/.env-federation port map (proven working,
since apiOcm passes) -- reuse it instead of the ad-hoc offset. Also
adds OCIS_ADD_RUN_SERVICES=ocm/OCIS_ENABLE_OCM, missing from the
primary instance too.

e2e-app-provider: tests/config/ci/app-registry.yaml maps its one
mimetype to "FakeOffice" (the stub used by apiCollaboration) and has
no docx entry at all, so the real Collabora/OnlyOffice containers this
suite drives never appeared in the web UI's "New file" menu. Add a
dedicated app-registry mapping both odt->Collabora and docx->OnlyOffice
with allow_creation, and use it only when COLLABORATION_NEEDED is set.

Signed-off-by: Lukas Hirt <info@hirt.cz>

* fix(tests): trust federated oCIS cert, register office templates by target_ext

e2e-ocm: the primary and federated instances each generate their own
self-signed proxy cert. Only the primary's was ever added to the
system CA trust store, so Chromium refused the federated instance's
TLS handshake ("tls: unknown certificate") once federation began.
Trust the federated cert too, and thread OCIS_BASE_DATA_PATH through
its `ocis init` call (previously only set for the running server),
since that's where the cert actually gets written.

e2e-app-provider: reproduced the suite locally (real Collabora/
OnlyOffice containers + `ocis collaboration server`) and diffed
`/app/list` before/after. allow_creation and default_app alone don't
make the web UI's "New file" menu show an entry -- it additionally
requires app_providers[].target_ext, which reva's app-provider only
stamps onto a hardcoded set of "-template" mimetypes
(vendor/github.com/owncloud/reva/v2/.../appprovider/templates.go), not
the plain document mimetypes the previous config used. Existing odt/
docx files still open fine without a static entry, since Collabora/
OnlyOffice register their full supported mimetype list dynamically via
WOPI discovery -- it's specifically file *creation* that needs this.

Signed-off-by: Lukas Hirt <info@hirt.cz>

* fix(changelog): shorten title over the 80-char lint limit

changelog/unreleased/bugfix-personal-space-fail-closed.md landed on
master (#12442) with a 97-char title, which changelog-lint rejects.
GitHub tests PRs against a merge with the current master tip, so this
started failing build-and-test on every open PR once master picked up
that commit -- unrelated to this branch's own changes. Fixing it here
since master needed to be merged in anyway.

* fix(tests): load web apps the ocm/app-provider e2e suites depend on

Both suites drive the web UI, and web only loads the web apps listed in
its UI config's "apps" array. run-e2e.py reuses
tests/config/ci/ocis-config.json, which predates the playwright suites
and lists neither app they need, so both failed deterministically while
the API-only Behat suites (apiOcm, apiCollaboration) kept passing:

e2e-ocm: the "open-cloud-mesh" app menu item can never render because
"ocm" was missing, so web-app-ocm was never loaded. Add it for the
federated suite. Behind that sat a second bug: the invite flow embeds
token@<BASE_URL_OCIS host> (127.0.0.1:9200) into invite codes, but the
federated instance authorizes providers against
tests/config/local/providers.json, which only lists localhost:9200.
Address the primary as https://localhost:9200 when federated, mirroring
run-github.py's passing apiOcm setup (the self-signed cert covers both
hosts; other suites keep 127.0.0.1).

e2e-app-provider: web-runtime only builds the per-provider Collabora/
OnlyOffice editor apps -- including their "New file" menu entries --
when web-app-external is loaded (web/packages/web-runtime/src/index.ts
gates on applicationStore.has('web-app-external')), and "external" was
missing. This also falsifies the previous target_ext theory: the
template-mimetype registry was active in the failing run and the menu
still never appeared, because the New-file menu needs only
allow_creation plus a registered provider
(web-app-external/src/index.ts). Revert the app registry to the plain
odt->Collabora / docx->OnlyOffice mimetypes web's own e2e CI proved out
(web/dev/docker/ocis/app-registry.yaml). Create-from-template still
works without static entries: reva stamps target_ext onto the -template
mimetypes the providers register via WOPI discovery.

Signed-off-by: Lukas Hirt <info@hirt.cz>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ci: upload playwright traces and a11y report from e2e suites

Port the two upload-artifact steps the standalone web repo's e2e
workflow had: playwright error contexts/report output on failure, and
the a11y report on any non-cancelled run. Paths are prefixed with web/
since the web repo now lives in that subdirectory, artifact names use
the suite name instead of the job index, and the action pin matches the
one already used in this workflow.

Signed-off-by: Lukas Hirt <info@hirt.cz>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(tests): allow office editor iframes in the e2e proxy CSP

The app-provider suite got past file creation but every office test
then timed out waiting for the editor to render: ocis's default proxy
CSP only allows frame-src 'self' (exact scheme+host+port), so the
browser refused to embed the Collabora/OnlyOffice iframes served on
other ports. The COLLABORA_DOMAIN/ONLYOFFICE_DOMAIN env vars do nothing
on their own -- they are only substituted into a custom CSP file, which
is why the pre-merge web CI always set PROXY_CSP_CONFIG_FILE_LOCATION
(tests/drone/csp.yaml there). The localStorage SecurityError seen in
the logs was a downstream symptom: the CSP-blocked frame ends up with
an opaque origin where storage access throws.

Add the two editor domains to tests/config/ci/csp.yaml's frame-src and
img-src (mirroring web's proven csp.yaml) and point the collaboration
suite at it. The keycloak suite shares this file; for it the new
entries fall back to nonexistent default hosts and are inert.

Signed-off-by: Lukas Hirt <info@hirt.cz>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(licenses): attribute REUSE.toml copyright to ownCloud contributors

The web/ tree carries community contributions dating back to 2016; the
CLA grants a relicensing right, not a copyright transfer, so declaring
sole 2020-2026 ownCloud GmbH authorship was inaccurate.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix(tests): trust the Keycloak cert in e2e TLS setup

The Keycloak cert had no SAN, and NODE_EXTRA_CA_CERTS only ever pointed
at the oCIS cert, so any node-fetch/axios call made directly against
Keycloak (admin token fetch, user provisioning) failed TLS validation
and aborted the keycloak/mfa matrix jobs before a spec could run.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix(web): don't wipe assets/ before a successful build

build-assets ran `git clean -xfd assets` before the pnpm build; a failed
typecheck or vite build left assets/core/ empty, so the next Go embed or
docker deployment served no web UI. Clean only after the build succeeds.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* ci: fail clearly when a release tag matches no known package

If the tag-prefix loop found no match, the workflow silently fell
through to a jq lookup against "packages//package.json", failing with a
confusing path error instead of naming the problem.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* ci: drop duplicate dependency-license-check job

web-tests.yml already enforces the license allow-list via
`pnpm licenses:check` (license-checker-rseidelsohn) on every PR.
check-licenses.yml's dependency-license-check ran a second, differently
configured tool (npx license-checker, GPL/AGPL deny-list only), which
could disagree with the first without adding coverage.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Signed-off-by: Lukas Hirt <info@hirt.cz>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-07 10:37:00 +02:00

8.1 KiB

title, date, weight, geekdocRepo, geekdocEditPath, geekdocFilePath
title date weight geekdocRepo geekdocEditPath geekdocFilePath
Running Tests 2021-07-27T00:00:00+00:00 60 https://github.com/owncloud/web edit/master/docs/testing testing.md

{{< toc >}}

Introduction

In order to allow us to make changes quickly, often and with a high level of confidence, we heavily rely on tests within the web repository.

All the steps below require you to have the web repo cloned locally and dependencies installed. This can be achieved by running

$ git clone https://github.com/owncloud/web.git
$ cd web
$ pnpm install

Unit Tests

We have a steadily growing coverage of unit tests. You can run them locally via

$ pnpm test:unit
$ pnpm -r test:unit

You can also specify which package to run the test on, such as: pnpm --filter @ownclouders/web-pkg test:unit. Alternatively, tests can also be run by navigating to the package name and then running pnpm test:unit.

Unit Test File Structure

Our unit tests spec files follow a simple structure:

  • fixtures and mocks at the top
  • helper functions at the bottom
  • tests in between

We usually organize tests with nested describe blocks. If you would like to get feedback from the core team about the structure, scope and goals of your unit tests before actually writing some, we invite you to make a pull request with only describe blocks and nested it.todo("put your test description here") lines.

E2E Tests (Playwright)

Our end-to-end test suite is built upon the Playwright Framework, which makes it easy to write tests, debug them and have them run cross-browser with minimal overhead.

Preparation

Please make sure you have installed all dependencies and started the server(s) as described in [tooling]({{< ref "tooling.md#development-setup" >}}).

Prepare Web

Bundle the web frontend with the following command:

$ pnpm build

Our compose setup automatically mounts it into an oCIS backend, respectively. Web also gets recompiled on changes.

Start Web

Start the web with the following command:

docker compose up

This will start all the services. The ENV variables specific to each services are defined in the docker-compose.yml file.

Run E2E Tests

The following command will run all available e2e tests:

$ pnpm test:e2e:playwright 'tests/e2e/specs/**/*.spec.ts'

Options

To run a particular test, simply add the spec file and line number to the test command, e.g. pnpm test:e2e:playwright tests/e2e/specs/admin-settings/users.feature:14

Various options are available via ENV variables, e.g.

  • BASIC_AUTH=true use basic authorization for api requests.
  • RETRY=n to retry failures n times
  • SLOW_MO=n to slow the execution time by n milliseconds
  • TIMEOUT=n to set tests to timeout after n milliseconds
  • HEADLESS=bool to open the browser while the tests run (defaults to true => headless mode)
  • BROWSER=name to run tests against a specific browser. Defaults to chromium, available are chromium, firefox, webkit, chromium
  • ADMIN_PASSWORD to set administrator password. By default, the admin password is used in the test

For debugging reasons, you may want to record a video or traces of your test run. Again, you can use the following ENV variables in your command:

  • REPORT_DIR=another/path to set a directory for your recorded files (defaults to "reports")
  • REPORT_VIDEO=true to record a video of the test run
  • REPORT_HAR=true to save request information from the test run
  • REPORT_TRACING=true to record traces from the test run

To then open e.g. the tracing from the REPORT_DIR, run

$ npx playwright show-trace path/to/file.zip

Lint E2E Test Code

Run the following command to find out the lint issues early in the test codes:

$ pnpm lint

And to fix the lint problems run the following command:

$ pnpm lint --fix

If the lint problems are not fixed by --fix option, we have to manually fix the code.

Analyze the Test Report

After running tests, report artifacts are written under REPORT_DIR (defaults to reports/e2e).

  • Accessibility report: reports/e2e/a11y-report.json
  • Traces (when REPORT_TRACING=true): reports/e2e/playwright/tracing/*.zip
  • Optional videos/HAR files (when enabled via REPORT_VIDEO=true or REPORT_HAR=true) are also stored in the report directory.

To inspect a trace file:

npx playwright show-trace reports/e2e/playwright/tracing/<trace-file>.zip

If you want an HTML Playwright report for a run, execute tests with the HTML reporter enabled and then open it:

pnpm test:e2e:playwright -- --reporter=html
npx playwright show-report

E2E Tests on oCIS With Keycloak

We can run some of the e2e tests on oCIS setup with Keycloak as an external idp. To run tests against locally, please follow the steps below:

Run oCIS With Keycloak

There's a documentation to serve oCIS with Keycloak. Please follow each step to run oCIS with Keycloak.

Run E2E Tests

KEYCLOAK=true \
BASE_URL_OCIS=ocis.owncloud.test \
pnpm run test:e2e:playwright tests/e2e/specs/journeys

Following environment variables come in use while running e2e tests on oCIS with Keycloak:

  • BASE_URL_OCIS sets oCIS url (e.g.: ocis.owncloud.test)
  • KEYCLOAK_HOST sets Keycloak url (e.g.: keycloak.owncloud.test)
  • KEYCLOAK=true runs the tests with Keycloak
  • KEYCLOAK_REALM sets oCIS realm name used on Keycloak

E2E Tests With Predefiend Users (@predefined-users)

It is possible to run e2e tests with predefined users. This is useful for running tests in a production-like environment. The following environment variables are used to run the tests with predefined users:

  • PREDEFINED_USERS: true|false
  • PREDEFINED_USERS_FILE: path to a JSON file mapping predefined users

We have to create a JSON file that contains the mapping of the users. JSON file MUST contain the following keys:

{
 "alice": {// map user},
 "brian": {// mapuser},
 "carol": {// mapuser},
}

And the user object MUST have the following properties defined:

{
  "id": "<usernmae>",
  "displayName": "<display-name>",
  "password": "<password>",
  "email": "<email>"
}

A complete example of a JSON file.

{
  "alice": {
    "id": "einstein",
    "displayName": "Albert Einstein",
    "password": "relativity",
    "email": "einstein@example.org"
  },
  "brian": {
    "id": "marie",
    "displayName": "Marie Skłodowska Curie",
    "password": "radioactivity",
    "email": "marie@example.org"
  },
  "carol": {
    "id": "moss",
    "displayName": "Maurice Moss",
    "password": "vista",
    "email": "moss@example.org"
  }
}

The test scenarios that can run with predefined users are marked with the @predefined-users tag and can be run with the following command:

PREDEFINED_USERS=true \
PREDEFINED_USERS_FILE='<path-to>/users.json' \
pnpm test:e2e:playwright tests/e2e/specs/file-action/rename.feature --tags '@predefined-users'

The following tests cannot be run with predefined users:

All tests which are related to:

  • Admin Actions
  • Groups

The tests might show flakiness or fail due to the following reasons:

  • Slower network connection
  • Features enabled/disabled
  • Running latest tests against an older version of oCIS/Web
  • Large file uploads may take longer time

Usage of web-packages.txt In the Test Suite

Test suites may include the web-packages.txt file to denote which web packages changes affect the defined test scenarios. This information is used in CI pipelines to determine which test suites to run based on the changed web packages.

The web-packages.txt file should be included within the test suite directory as shown below:

└── tests/e2e/specs
    └── admin-settings
        ├── users.feature
        └── web-packages.txt

And the web-packages.txt file should list the dependent web packages, one per line, for example:

NOTE: The package name should start with web- in order to be recognized correctly, if not, the line will be ignored.

web-app-files
web-app-admin-settings