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 fileWhat it proves
Authentication.featureAn anonymous caller is turned away, a signed-in one served, a session without its anti-forgery header refused
Workspaces.featureA write and a read over the same real schema
AuditLog.featureA change made through the gateway reaches the audit log through the outbox, RabbitMQ and the audit consumer, with the right actor and address
SingleSignOn.featureAn organization's people sign in through their own OpenID Connect provider (a real Keycloak)
ScimProvisioning.featureAn identity provider creates and deactivates members through SCIM
McpServer.featureThe MCP server answers a personal access token, within its scope and the organization's switch
McpConnectors.featureA 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.