PHPackages                             wedevelopnl/silverstripe-e2e - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Testing &amp; Quality](/categories/testing)
4. /
5. wedevelopnl/silverstripe-e2e

ActiveSilverstripe-vendormodule[Testing &amp; Quality](/categories/testing)

wedevelopnl/silverstripe-e2e
============================

Helper module to run E2E tests against a Silverstripe website inside CI.

0.1.2(3d ago)0392↓18.5%BSD-3-ClausePHP ^8.3

Since Jul 7Compare

[ Source](https://github.com/wedevelopnl/silverstripe-e2e)[ Packagist](https://packagist.org/packages/wedevelopnl/silverstripe-e2e)[ RSS](/packages/wedevelopnl-silverstripe-e2e/feed)WikiDiscussions Synced today

READMEChangelog (3)Dependencies (10)Versions (4)Used By (0)

Silverstripe E2E
================

[](#silverstripe-e2e)

Helper module providing Silverstripe-side tooling to support end-to-end (E2E) testing of a functional Silverstripe website inside a CI pipeline.

Note!
-----

[](#note)

This module may be useful across various CI configurations, so feel free to use it where applicable. Note that it is designed specifically to run inside our internal GitLab CI default configuration/setup.

We will **not** provide support or implement features that are not supported by our configuration.

This is the initial Silverstripe 6 foundation of the module; further E2E helpers will be added over time.

Tools
-----

[](#tools)

### Generate TinyMCE configuration

[](#generate-tinymce-configuration)

Silverstripe generates its TinyMCE configuration on the fly when requested. When running a separate webserver container as a service inside the GitLab CI, those files are generated on the php-fpm service, preventing the webserver from accessing them. This build task generates the TinyMCE bundle files up front so they can be baked into the webserver container during the build stage.

Run the task without a database:

`vendor/bin/sake tasks:generate-tinymce-combined --no-database`

It is also available via the browser at `/dev/tasks/generate-tinymce-combined`.

Runtime fixtures for E2E tests
------------------------------

[](#runtime-fixtures-for-e2e-tests)

The module ships a dev-gated HTTP endpoint that lets a Playwright suite seed the database from a named YAML fixture before each test. On request it loads the fixture through SilverStripe's `FixtureFactory`, applies any versioned post-actions declared in the fixture, and returns the created record IDs as JSON so specs can navigate straight to the records they need. State is reset between requests, so every test starts from a known baseline.

The endpoint, the `FixtureLoader`, and the Playwright client are all provided by this module. A consuming project only supplies its own fixtures and a small dev-only configuration block.

### Registering fixtures

[](#registering-fixtures)

Register your fixtures and the page classes the loader is allowed to resolve in a dev-only config fragment (`Only: environment: dev`), so the endpoint is never active outside development/CI:

```
---
Name: app-e2e-fixtures
Only:
  environment: dev
---
WeDevelop\E2e\Fixtures\FixtureLoader:
  fixture_page_classes:
    - Page
  fixtures:
    my-fixture: 'my-vendor/my-module:tests/E2E/Fixture/my-fixture.yml'
```

`fixture_page_classes` is an allowlist: the loader resolves the page to navigate to by walking these classes in the order listed. `fixtures` maps the name used by the Playwright client to a module-relative path of the fixture YAML.

### Config overrides during load

[](#config-overrides-during-load)

The most common write-time customisation is suppressing a side effect whose trigger is a config static — e.g. a container model that auto-scaffolds children in `onAfterWrite()` and would duplicate children the fixture declares itself. For that case declare the statics to force per class; each is applied only while the record is written and reverts immediately afterwards (it never leaks into normal app code):

```
WeDevelop\E2e\Fixtures\FixtureLoader:
  config_overrides:
    My\Module\Model\Section:
      auto_scaffold: false
    My\Module\Model\Row:
      auto_scaffold: false
```

Reach for an `onBeforeLoad` extension (below) only when a static value can't express it — dynamic values or non-config side effects.

### Extension hooks

[](#extension-hooks)

To inject domain behavior around a load — for example computing dynamic values or publishing extra records — add an `Extension` implementing either hook and wire it via `WeDevelop\E2e\Fixtures\FixtureLoader.extensions`:

```
public function onBeforeLoad(string $name, FixtureFactory $factory): void
{
    // Prepare state or the factory before the fixture is loaded.
}

public function onAfterLoad(FixtureResult $result): void
{
    // React to the loaded records (IDs, page id) after the fixture is applied.
}
```

```
WeDevelop\E2e\Fixtures\FixtureLoader:
  extensions:
    - My\Module\E2e\MyFixtureExtension
```

### The endpoint

[](#the-endpoint)

When installed, the module registers the `/dev/e2e-fixtures` endpoint automatically (dev-only, via `SilverStripe\Dev\DevelopmentAdmin`) and relaxes `SilverStripe\Control\Session.strict_user_agent_check` so the Playwright browser context can drive it. Both are scoped to `environment: dev`.

### TypeScript client

[](#typescript-client)

A reusable Playwright client lives at `client/playwright/index.ts`. Expose it to your specs with a `paths` alias in the project's `tsconfig.json` (or `tests/E2E/tsconfig.json`):

```
{
  "compilerOptions": {
    "paths": {
      "@wedevelop/e2e": ["vendor/wedevelopnl/silverstripe-e2e/client/playwright/index.ts"]
    }
  }
}
```

Specs then `import { createFixtureClient, authenticateAdmin } from '@wedevelop/e2e'`. See [`client/playwright/README.md`](client/playwright/README.md) for the full client API and setup examples.

### Running the E2E suite

[](#running-the-e2e-suite)

With the module's Docker services running, run the Playwright suite with:

`task test-e2e`

The task ensures the services are up first, then runs `npx playwright test`against the served app.

###  Health Score

42

—

FairBetter than 88% of packages

Maintenance99

Actively maintained with recent releases

Popularity17

Limited adoption so far

Community2

Small or concentrated contributor base

Maturity40

Maturing project, gaining track record

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

4

Last Release

3d ago

Major Versions

0.1.2 → 6.x-dev2026-07-08

### Community

Maintainers

![](https://www.gravatar.com/avatar/7a41b16aafbe795cfad0b4941b9ac37305e5bba2aefbcf56cc1f0c180928de27?d=identicon)[WeDevelop](/maintainers/WeDevelop)

---

Tags

silverstripedevelopmentgitlabe2e

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Type Coverage Yes

### Embed Badge

![Health badge](/badges/wedevelopnl-silverstripe-e2e/health.svg)

```
[![Health](https://phpackages.com/badges/wedevelopnl-silverstripe-e2e/health.svg)](https://phpackages.com/packages/wedevelopnl-silverstripe-e2e)
```

###  Alternatives

[behat/behat

Scenario-oriented BDD framework for PHP

4.0k101.8M2.2k](/packages/behat-behat)[silverstripe/cms

The SilverStripe Content Management System

5253.6M1.4k](/packages/silverstripe-cms)[micheh/phpcs-gitlab

GitLab Report for PHP\_CodeSniffer (display the violations in the GitLab CI/CD Code Quality Report)

4412.7M32](/packages/micheh-phpcs-gitlab)[silverstripe/admin

SilverStripe admin interface

262.8M385](/packages/silverstripe-admin)[silverleague/ideannotator

Generate PHP DocBlock annotations for DataObject and DataExtension databasefields and relation methods

4773.8k55](/packages/silverleague-ideannotator)[dnadesign/silverstripe-populate

Populate your database through YAML files

25107.6k2](/packages/dnadesign-silverstripe-populate)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
