End to end
e2e/ drives the whole back end as it runs in development: the real AppHost graph is
built in process with Aspire.Hosting.Testing, and the scenarios talk to it over HTTP.
Real PostgreSQL, real RabbitMQ, the real identity host, the real API behind the real
gateway. Nothing is mocked, and the suite signs in through the real OpenID Connect flow.
There is no browser: the front end is out of scope, which keeps a run to a couple of minutes.
Running it
cd e2e # where global.json selects the test runner
dotnet test --project Blouppy.E2E.Api/Blouppy.E2E.Api.csproj
It needs the .NET 10 SDK, Docker (PostgreSQL, RabbitMQ, Redis, MailPit and a Keycloak for
the SSO scenarios) and the front-end workspace installed — the AppHost's build runs
npm ci when front/node_modules is missing, so run cd front && npm ci once.
The suite uses the development ports with containers of its own: stop the development graph's containers before a run.
What a scenario looks like
Scenario: A workspace created in an organization is listed in it
Given a signed-in user
And an organization I own
When I create a workspace in it
Then the organization's workspaces include it
A Given states what is true before, a When is the one action under test, a Then is
what can be observed afterwards — never how the step observes it.
What it covers
| Feature file | What it proves |
|---|---|
Authentication.feature | An anonymous caller is turned away, a signed-in one served, a session without its anti-forgery header refused |
Workspaces.feature | A write and a read over the same real schema |
AuditLog.feature | A change made through the gateway reaches the audit log through the outbox, RabbitMQ and the audit consumer, with the right actor and address |
SingleSignOn.feature | An organization's people sign in through their own OpenID Connect provider (a real Keycloak) |
ScimProvisioning.feature | An identity provider creates and deactivates members through SCIM |
McpServer.feature | The MCP server answers a personal access token, within its scope and the organization's switch |
McpConnectors.feature | A remote connector gets a token through OAuth, with PKCE and the real consent page |
When to run it
On your machine before a change that reaches across the graph — the gateway, the identity
host, the bus, the authentication. In CI, add the e2e 🧪 label to the pull request: the
suite then runs on it, and on each push while the label stays.
e2e/README.md describes how the suite is put together, and lists the application bugs it
works around.