Aurora Continuum — Architecture

Overview

Aurora Continuum is a multi-framework test result aggregation platform. It collects test results from CI/CD pipelines and testing tools, normalises them into a unified data model, and provides dashboards, trend analysis, DORA metrics tracking, and compliance reporting.


System Architecture

┌──────────────────────────────────────────────────────────────────┐
│                        Aurora Continuum                          │
├──────────────────────────┬───────────────────────────────────────┤
│  Frontend (Vue 3 + Vite) │  Backend (Node.js + Express)         │
│  Port 82 (Docker/nginx)  │  Port 3002                           │
│                          │                                       │
│  Vue Router              │  REST API                            │
│  Pinia state management  │  JWT authentication                  │
│  Tailwind CSS            │  Mongoose ODM                        │
│  Chart.js / vue-chartjs  │  MongoDB                             │
└──────────────────────────┴───────────────────────────────────────┘
         ↑ CI/CD pipelines, webhooks, direct API imports

Data Flow

CI/CD Pipeline                   Aurora Continuum
─────────────                    ────────────────
Playwright run      ──POST──►    /api/imports/results
Cypress run         ──POST──►    /api/imports/results
JUnit run           ──POST──►    /api/imports/results
Selenium run        ──POST──►    /api/imports/results

GitHub webhook      ──POST──►    /api/deployments/webhook/github
GitLab webhook      ──POST──►    /api/deployments/webhook/gitlab
Jenkins webhook     ──POST──►    /api/deployments/webhook/jenkins

Manual import       ──POST──►    /api/dora/incidents
Incident register   ──POST──►    /api/dora/incidents

Aurora Continuum is the aggregator. Individual Aurora instances (or any CI/CD tool) are the source.


Backend Structure

backend/
├── server.js                  # Express app, routes registration
├── models/
│   ├── TestResults.js         # Core test result document
│   ├── Deployment.js          # DORA deployment records
│   ├── Incident.js            # DORA incident records
│   ├── Team.js                # Teams with repo configuration
│   ├── User.js                # Users with role-based access
│   ├── Project.js             # Projects/programmes
│   ├── License.js             # License management
│   └── ...
├── routes/
│   ├── auth.js                # Login, token refresh
│   ├── imports.js             # Test result import endpoint
│   ├── tests.js               # Test query endpoints
│   ├── deployments.js         # Deployment registration + webhooks
│   ├── dora.js                # DORA metrics aggregation
│   ├── reports.js             # Report data aggregation
│   ├── teams.js               # Team management
│   ├── users.js               # User management
│   ├── synthetics.js          # Synthetic monitoring
│   └── ...
├── controllers/
│   ├── testController.js      # Test result queries + aggregations
│   ├── doraController.js      # DORA metric calculations
│   └── ...
├── services/
│   ├── importService.js       # Format detection and routing
│   ├── syntheticMonitoring.js # Scheduled synthetic runner
│   └── parsers/
│       ├── playwrightParser.js
│       ├── cypressParser.js
│       └── junitParser.js
└── middleware/
    ├── auth.js                # JWT verification, role guards
    └── license.js             # License tier enforcement

Frontend Structure

frontend/src/
├── views/
│   ├── TeamView.vue           # Team dashboard
│   ├── ManagerView.vue        # Manager dashboard
│   ├── ExecutiveView.vue      # Executive dashboard
│   ├── FunctionalTestsView.vue
│   ├── ApiTestsView.vue
│   ├── SyntheticsView.vue
│   ├── DoraView.vue
│   ├── ReportsView.vue        # PDF report wizard
│   ├── DashboardView.vue
│   ├── SettingsView.vue
│   └── LoginView.vue
├── components/
│   ├── TestTracker/
│   │   ├── TeamView.vue       # Performance health, flaky tests, timeline
│   │   ├── ManagerView.vue    # Quality overview + DORA
│   │   ├── ExecutiveView.vue  # Strategic KPIs + DORA
│   │   ├── DoraMetrics.vue    # Shared DORA component
│   │   ├── FunctionalTestsView.vue
│   │   └── APITestsView.vue
│   ├── Settings/
│   │   ├── TeamManagment.vue  # Teams + repo configuration
│   │   ├── APIKeysSettings.vue
│   │   ├── LicenseSettings.vue
│   │   └── ...
│   ├── Synthetics/
│   │   ├── TransactionCard.vue
│   │   ├── TrendsChart.vue
│   │   └── ...
│   └── InfoTooltip.vue        # Contextual help tooltips
├── stores/
│   ├── userStore.js           # Auth state
│   ├── themeStore.js          # Dark/light mode
│   └── filtersStore.js        # Global period/team/framework filters
├── router/
│   └── index.js               # Route definitions + role guards
└── style.css                  # Aurora design system (CSS custom properties)

Data Model — TestResult

The core document stored for every test execution:

{
  testCaseId:    String,      // unique identifier for the test case
  testName:      String,      // human-readable test name
  testType:      String,      // 'functional' | 'performance' | 'api'
  suite:         String,      // describe block / file grouping
  status:        String,      // 'passed' | 'failed' | 'skipped' | 'flaky'
  duration:      Number,      // execution time in ms
  errorMessage:  String,
  stackTrace:    String,
  browser:       String,
  environment:   String,      // 'staging' | 'production' | ...
  scriptLocation: String,     // source file path
  retries:       Number,
  commitSha:     String,      // git commit hash
  branch:        String,
  commitTimestamp: Date,
  deployment:    ObjectId,    // ref → Deployment
  perfMetrics: {
    fcp:            Number,   // First Contentful Paint (ms)
    lcp:            Number,   // Largest Contentful Paint (ms)
    tti:            Number,   // Time to Interactive (ms)
    inp:            Number,   // Interaction to Next Paint (ms)
    tbt:            Number,   // Total Blocking Time (ms)
    ttfb:           Number,   // Time to First Byte (ms)
    cls:            Number,   // Cumulative Layout Shift (0–1)
    load:           Number,   // Full page load (ms)
    memory:         Number,   // JS heap used (MB)
    longTasksCount: Number,
    longTasksMax:   Number
  },
  metadata: {
    tool:    String,          // 'playwright' | 'cypress' | 'junit' | 'selenium'
    version: String,
    team:    String,          // CONTINUUM_TEAM env var value
    product: String           // CONTINUUM_PRODUCT env var value
  },
  team:       ObjectId,       // ref → Team
  executedBy: ObjectId,       // ref → User
  executedAt: Date,
  createdAt:  Date
}

All perfMetrics fields are optional. A document that doesn't include them simply has no perfMetrics subdocument, which has zero storage overhead.


Import Pipeline

POST /api/imports/results
         │
         ▼
  importService.js
  detectFormat(content)
         │
    ┌────┴────┬──────────┬──────────┐
    ▼         ▼          ▼          ▼
playwright  cypress   junit     generic
 Parser     Parser    Parser     JSON
    │         │          │          │
    └────┬────┘          │          │
         ▼               ▼          │
   normalised result array          │
         │               │          │
         └───────┬────────┘          │
                 ▼                   │
         TestResult.insertMany ◄─────┘

The parser strips all raw reporter output — only the fields defined in the TestResult schema are persisted. This keeps storage 80–95% smaller than platforms that store raw reporter JSON.


Authentication & Roles

RoleAccess
admin / system_adminAll views, all teams, settings, license
managerManager View, Executive View, DORA, Reports, Tests, Settings (non-admin)
userTeam View only, filtered to own team

JWT tokens are stored in localStorage. Route guards in Vue Router and middleware in Express enforce role requirements.


License Tiers

TierTeamsProjectsImports/monthFeatures
Free355KCore dashboards
Starter102550K+ Webhooks
Professional50100500K+ SSO
EnterpriseUnlimitedUnlimitedUnlimitedAll features

License key format: CONTINUUM-<TIER>-<6_CHARS> (e.g. CONTINUUM-PRO-ABC123)

Validated against aurora.selectred.com on startup and daily at 03:00 UTC.


Running Locally

Docker (recommended)

docker compose up -d

The database is seeded automatically on first startup. Default login: admin@continuum.aurora / admin123

Frontend: http://localhost:82

Backend API: http://localhost:3002

Development

# Backend
cd backend && npm run dev   # port 3002

# Frontend
cd frontend && npm run dev  # port 5173

Environment variables

# Backend (.env)
MONGODB_URI=mongodb://localhost:27017/aurora-continuum
JWT_SECRET=your-secret-key
PORT=3002