Skip to main content

Testing & Reliability

LusterCMS includes a comprehensive automated testing suite designed to ensure security, data isolation, and reliability—particularly for multi-tenant SaaS deployments.

What We Test​

Our test suite covers all critical areas of the platform:

AreaWhat we verify
Multi-tenant isolationOrganization registration, org context switching, "everything down, nothing up" access rules
AI & BlueBird isolationKnowledge retrieval scoped to org, Q&A context boundaries, billing isolation, cross-org attack prevention
Tenant admin operationsAdmin/Agency wizards, organization CRUD, credit allocation, theme and demo content provisioning
WebSocket & collaborationJWT authentication, room naming with org scope, cross-org isolation, secure error handling
RBAC & sidebar visibilityPermission matrix enforcement, plugin-based sidebar filtering, no upward access
Kubernetes & loggingHealth checks, rolling updates, HPA configuration, structured logs with org_id

Automation & Coverage​

The platform maintains 300+ automated tests spanning multiple testing strategies:

  • E2E tests – simulate full user flows across tenant boundaries
  • Integration tests – verify database routing, API responses, and middleware behavior
  • Unit tests – cover individual services, resolvers, and security functions

Key focus areas include:

  • Multi-tenant registration and provisioning flows
  • AI assistant isolation and billing attribution
  • Admin and Agency wizard workflows
  • WebSocket authentication and room isolation
  • Permission matrix and role-based access control

All tests run automatically in CI before any deployment.

Golden Rules for Changes​

When contributing to LusterCMS, follow these principles to maintain security and reliability:

1. Every change needs tests​

New features and behavior changes must include corresponding tests. Bug fixes should add regression tests to prevent recurrence.

2. Use permission codes, not role names​

Access control logic must check permission codes (e.g., content.edit, media.upload), never role names directly. This ensures consistent enforcement across the permission matrix.

# ✅ Correct
if resolver.has_permission("content.edit"):
...

# ❌ Wrong
if user.role == "admin":
...

3. Always use org-scoped database access​

All tenant data operations must use the tenant adapter to maintain isolation:

# ✅ Correct - uses tenant-aware database
db = get_db_for_tenant_data(info)

# ❌ Wrong - bypasses tenant isolation
db = info.context["db"]

4. Respect "everything down, nothing up"​

Use get_allowed_org_ids() for any query that touches multiple organizations. This ensures:

  • Superadmins can see all organizations (or filter to a selected subtree)
  • Agency admins see only their managed organizations
  • Organization users see only their own organization
  • No user can ever access data from organizations above them in the hierarchy

CI & Observability​

Continuous Integration​

All tests run automatically on every pull request and before deployment:

  • Test failures block merges to protected branches
  • Coverage reports track test completeness
  • Security-focused tests have explicit assertions for isolation rules

Logging & Monitoring​

Production deployments include structured logging with tenant context:

  • Promtail collects logs from all pods
  • Loki indexes logs with org_id as a label
  • Grafana dashboards enable filtering by organization

Example query to see requests for a specific organization:

{service="backend"} | json | org_id="42"

This enables rapid debugging of tenant-specific issues without accessing other organizations' data.