First Init
Deploy to Production / Build & Verify (push) Failing after 5m56s
Ping Search Engines / Notify Search Engines (push) Successful in 2s
Deploy to Production / Pre-Deploy Tests (push) Has been skipped
Deploy to Production / Deploy to Railway (push) Has been skipped
Deploy to Production / Deploy to Render (push) Has been skipped
Deploy to Production / Deploy to VPS (PM2) (push) Has been skipped
Deploy to Production / Deploy to Fly.io (push) Has been skipped
Deploy to Production / Post-Deploy Verification (push) Has been skipped
Deploy to Production / Notify on Failure (push) Successful in 2s
E2E Test Suite / Critical User Journeys (push) Has been skipped
E2E Test Suite / API Integration Tests (push) Has been skipped
E2E Test Suite / Smoke Tests (P0) (push) Failing after 11m26s
E2E Test Suite / Form Interaction Tests (push) Failing after 11m42s
E2E Test Suite / Destructive & Chaos Tests (push) Failing after 12m2s
E2E Test Suite / Cross-Browser Regression (chromium) (push) Failing after 16m14s
E2E Test Suite / Cross-Browser Regression (webkit) (push) Failing after 17m45s
E2E Test Suite / Cross-Browser Regression (firefox) (push) Failing after 25m23s
E2E Test Suite / Security Header Tests (push) Failing after 7m55s
E2E Test Suite / Test Report Summary (push) Failing after 20s
E2E Test Suite / Mobile Device Tests (push) Failing after 2h49m9s
Uptime Monitor / Health & Response Time (push) Failing after 2s
Uptime Monitor / SSL Certificate (push) Successful in 2s
Uptime Monitor / Send Alerts (push) Failing after 3s
Uptime Monitor / Record Uptime Success (push) Has been skipped
Deploy to Production / Build & Verify (push) Failing after 5m56s
Ping Search Engines / Notify Search Engines (push) Successful in 2s
Deploy to Production / Pre-Deploy Tests (push) Has been skipped
Deploy to Production / Deploy to Railway (push) Has been skipped
Deploy to Production / Deploy to Render (push) Has been skipped
Deploy to Production / Deploy to VPS (PM2) (push) Has been skipped
Deploy to Production / Deploy to Fly.io (push) Has been skipped
Deploy to Production / Post-Deploy Verification (push) Has been skipped
Deploy to Production / Notify on Failure (push) Successful in 2s
E2E Test Suite / Critical User Journeys (push) Has been skipped
E2E Test Suite / API Integration Tests (push) Has been skipped
E2E Test Suite / Smoke Tests (P0) (push) Failing after 11m26s
E2E Test Suite / Form Interaction Tests (push) Failing after 11m42s
E2E Test Suite / Destructive & Chaos Tests (push) Failing after 12m2s
E2E Test Suite / Cross-Browser Regression (chromium) (push) Failing after 16m14s
E2E Test Suite / Cross-Browser Regression (webkit) (push) Failing after 17m45s
E2E Test Suite / Cross-Browser Regression (firefox) (push) Failing after 25m23s
E2E Test Suite / Security Header Tests (push) Failing after 7m55s
E2E Test Suite / Test Report Summary (push) Failing after 20s
E2E Test Suite / Mobile Device Tests (push) Failing after 2h49m9s
Uptime Monitor / Health & Response Time (push) Failing after 2s
Uptime Monitor / SSL Certificate (push) Successful in 2s
Uptime Monitor / Send Alerts (push) Failing after 3s
Uptime Monitor / Record Uptime Success (push) Has been skipped
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
---
|
||||
agent_id: 7a35e757-8b8e-4bf0-a82c-1b09c7e36512
|
||||
role: qa-automation-engineer
|
||||
status: idle
|
||||
health: healthy
|
||||
current_task: none
|
||||
current_task_id: none
|
||||
last_active: 2026-03-21T10:51:12.478698+00:00
|
||||
iterations_completed: 0
|
||||
---
|
||||
|
||||
# Heartbeat — qa-automation-engineer
|
||||
|
||||
**Status**: IDLE
|
||||
**Health**: healthy
|
||||
**Last Active**: 2026-03-21 10:51:12 UTC
|
||||
|
||||
## Current Task
|
||||
_No active task_
|
||||
|
||||
## Activity Log
|
||||
| Time | Event |
|
||||
|------|-------|
|
||||
| 10:51:12 | Heartbeat recorded — idle |
|
||||
|
||||
@@ -0,0 +1,112 @@
|
||||
---
|
||||
agent_id: 7a35e757-8b8e-4bf0-a82c-1b09c7e36512
|
||||
name: qa-automation-engineer
|
||||
role: qa-automation-engineer
|
||||
created: 2026-03-21T10:45:09.288369+00:00
|
||||
---
|
||||
|
||||
# qa-automation-engineer
|
||||
|
||||
## Who I Am
|
||||
Specialist in test automation infrastructure and E2E testing. Focuses on Playwright, Cypress, CI pipelines, and breaking the system. Triggers on e2e, automated test, pipeline, playwright, cypress, regression.
|
||||
|
||||
## My Role
|
||||
# QA Automation Engineer
|
||||
|
||||
You are a cynical, destructive, and thorough Automation Engineer. Your job is to prove that the code is broken.
|
||||
|
||||
## Core Philosophy
|
||||
|
||||
> "If it isn't automated, it doesn't exist. If it works on my machine, it's not finished."
|
||||
|
||||
## Your Role
|
||||
|
||||
1. **Build Safety Nets**: Create robust CI/CD test pipelines.
|
||||
2. **End-to-End (E2E) Testing**: Simulate real user flows (Playwright/Cypress).
|
||||
3. **Destructive Testing**: Test limits, timeouts, race conditions, and bad inputs.
|
||||
4. **Flakiness Hunting**: Identify and fix unstable tests.
|
||||
|
||||
---
|
||||
|
||||
## 🛠 Tech Stack Specializations
|
||||
|
||||
### Browser Automation
|
||||
* **Playwright** (Preferred): Multi-tab, parallel, trace viewer.
|
||||
* **Cypress**: Component testing, reliable waiting.
|
||||
* **Puppeteer**: Headless tasks.
|
||||
|
||||
### CI/CD
|
||||
* GitHub Actions / GitLab CI
|
||||
* Dockerized test environments
|
||||
|
||||
---
|
||||
|
||||
## 🧪 Testing Strategy
|
||||
|
||||
### 1. The Smoke Suite (P0)
|
||||
* **Goal**: rapid verification (< 2 mins).
|
||||
* **Content**: Login, Critical Path, Checkout.
|
||||
* **Trigger**: Every commit.
|
||||
|
||||
### 2. The Regression Suite (P1)
|
||||
* **Goal**: Deep coverage.
|
||||
* **Content**: All user stories, edge cases, cross-browser check.
|
||||
* **Trigger**: Nightly or Pre-merge.
|
||||
|
||||
### 3. Visual Regression
|
||||
* Snapshot testing (Pixelmatch / Percy) to catch UI shifts.
|
||||
|
||||
---
|
||||
|
||||
## 🤖 Automating the "Unhappy Path"
|
||||
|
||||
Developers test the happy path. **You test the chaos.**
|
||||
|
||||
| Scenario | What to Automate |
|
||||
|----------|------------------|
|
||||
| **Slow Network** | Inject latency (slow 3G simulation) |
|
||||
| **Server Crash** | Mock 500 errors mid-flow |
|
||||
| **Double Click** | Rage-clicking submit buttons |
|
||||
| **Auth Expiry** | Token invalidation during form fill |
|
||||
| **Injection** | XSS payloads in input fields |
|
||||
|
||||
---
|
||||
|
||||
## 📜 Coding Standards for Tests
|
||||
|
||||
1. **Page Object Model (POM)**:
|
||||
* Never query selectors (`.btn-primary`) in test files.
|
||||
* Abstract them into Page Classes (`LoginPage.submit()`).
|
||||
2. **Data Isolation**:
|
||||
* Each test creates its own user/data.
|
||||
* NEVER rel
|
||||
|
||||
## Skills
|
||||
- webapp-testing
|
||||
- testing-patterns
|
||||
- web-design-guidelines
|
||||
- clean-code
|
||||
- lint-and-validate
|
||||
|
||||
## Capabilities
|
||||
- Unit and integration testing
|
||||
- E2E test automation
|
||||
- Test coverage analysis
|
||||
- Bug reproduction
|
||||
|
||||
## What I Need
|
||||
- Clear task descriptions with acceptance criteria
|
||||
- Access to the project codebase and knowledge base
|
||||
- Context from other agents' completed work
|
||||
- User preferences and project conventions
|
||||
|
||||
## What I Produce
|
||||
- Source code changes (files created/modified)
|
||||
- Knowledge base entries (discoveries, decisions, patterns)
|
||||
- Status updates in project chat
|
||||
- Task completion summaries
|
||||
|
||||
## Communication
|
||||
I post status updates to the project chat.
|
||||
I read messages from other agents and the user before starting work.
|
||||
My knowledge entries are shared with all agents in the project.
|
||||
@@ -0,0 +1,502 @@
|
||||
# Pre-Launch QA Report — WorkRoot IT Solutions
|
||||
|
||||
**Project:** WorkRoot IT Solutions (workroot.in)
|
||||
**Date:** 2026-03-21
|
||||
**Agent:** qa-automation-engineer
|
||||
**Scope:** Comprehensive pre-launch verification — links, forms, security, DNS, analytics, email, backups
|
||||
**Methodology:** Static code analysis + automated test suite review + prior agent audit aggregation
|
||||
|
||||
---
|
||||
|
||||
## Executive Summary
|
||||
|
||||
| Category | Status | Critical Issues | Warnings |
|
||||
|----------|--------|-----------------|----------|
|
||||
| Functional Pages | ✅ Ready | 0 | 0 |
|
||||
| **Broken Links** | 🔴 **BLOCKER** | **1** | **4** |
|
||||
| API Endpoints | ✅ Ready | 0 | 0 |
|
||||
| Security Headers | ✅ Ready | 0 | 0 |
|
||||
| SSL / HTTPS | ✅ Ready | 0 | 0 |
|
||||
| DNS Configuration | ✅ Ready | 0 | 0 |
|
||||
| Analytics Tracking | ⚠️ Config Required | 0 | 1 |
|
||||
| Email Notifications | ⚠️ Config Required | 0 | 1 |
|
||||
| Backup Systems | ✅ Ready | 0 | 0 |
|
||||
| Test Suite | ✅ Ready | 0 | 0 |
|
||||
| PWA / Service Worker | ✅ Ready | 0 | 0 |
|
||||
| SEO & Indexing | ✅ Ready | 0 | 0 |
|
||||
|
||||
**Overall Launch Readiness: BLOCKED — 1 critical issue must be fixed before launch**
|
||||
|
||||
---
|
||||
|
||||
## 1. Critical Issues (MUST FIX Before Launch)
|
||||
|
||||
### CRIT-001 — Missing Cookie Policy Page (`/cookies` → 404)
|
||||
|
||||
**Severity:** CRITICAL — BLOCKER
|
||||
**Location:** `src/components/Footer.astro:190`
|
||||
**Impact:** Every page on the site links to `/cookies` in the footer. This will return a 404 to all users who click it. In some jurisdictions (GDPR, UK GDPR), a publicly-accessible Cookie Policy is legally required.
|
||||
|
||||
**Evidence:**
|
||||
```html
|
||||
<!-- src/components/Footer.astro:190 -->
|
||||
<a href="/cookies" class="...">Cookie Policy</a>
|
||||
```
|
||||
|
||||
No file exists at `src/pages/cookies.astro` or `src/pages/cookies.ts`.
|
||||
|
||||
**Fix Required:** Create `src/pages/cookies.astro` with a Cookie Policy page, OR change the footer link to point to `/privacy` which already exists and could include cookie information.
|
||||
|
||||
---
|
||||
|
||||
## 2. Warnings (SHOULD FIX Before Launch)
|
||||
|
||||
### WARN-001 — Social Links Are Placeholder `#` Anchors
|
||||
|
||||
**Severity:** High Warning
|
||||
**Location:** `src/pages/contact.astro:48–73`
|
||||
**Impact:** All 4 social media links (LinkedIn, Twitter/X, GitHub, Instagram) on the Contact page point to `href="#"`. Clicking them navigates to the page top — a broken UX that erodes trust.
|
||||
|
||||
**Evidence:**
|
||||
```javascript
|
||||
const socialLinks = [
|
||||
{ name: 'LinkedIn', href: '#', ... },
|
||||
{ name: 'Twitter / X', href: '#', ... },
|
||||
{ name: 'GitHub', href: '#', ... },
|
||||
{ name: 'Instagram', href: '#', ... },
|
||||
];
|
||||
```
|
||||
|
||||
**Fix:** Replace `#` with actual profile URLs, or remove the social icons entirely until accounts are set up.
|
||||
|
||||
---
|
||||
|
||||
### WARN-002 — Email Domain Inconsistency (workroot.io vs workroot.in)
|
||||
|
||||
**Severity:** Medium Warning
|
||||
**Location:** `src/layouts/BaseLayout.astro:134,141` (JSON-LD schema)
|
||||
**Impact:** The site domain is `workroot.in`. JSON-LD Organization schema uses `hello@workroot.io` and `sales@workroot.io`. This is a discrepancy that could confuse users or impact structured data quality.
|
||||
|
||||
**Evidence (from static-assets audit):**
|
||||
The test-engineer confirmed these `.io` emails are likely intentional (separate business email domain). However, this should be explicitly confirmed before launch.
|
||||
|
||||
**Fix:** Verify intent with stakeholder. If intentional, document it. If not, update to `@workroot.in`.
|
||||
|
||||
---
|
||||
|
||||
### WARN-003 — Analytics Not Yet Configured (env vars unset)
|
||||
|
||||
**Severity:** Medium Warning
|
||||
**Location:** `.env.example` — `GOOGLE_ANALYTICS_ID`, `PLAUSIBLE_DOMAIN`
|
||||
**Impact:** No visitor tracking will occur at launch. The analytics infrastructure is fully implemented (GA4 and Plausible both supported, DNT-aware, event tracking on forms), but requires env vars to be set on the deployment platform.
|
||||
|
||||
**Required Action:**
|
||||
```env
|
||||
# Choose one or both:
|
||||
GOOGLE_ANALYTICS_ID=G-XXXXXXXXXX # Get from Google Analytics → Admin → Data Streams
|
||||
PLAUSIBLE_DOMAIN=workroot.in # Set to your domain at plausible.io
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### WARN-004 — Email Notifications Not Yet Configured (SMTP unset)
|
||||
|
||||
**Severity:** Medium Warning
|
||||
**Location:** `.env.example` — `SMTP_HOST`, `SMTP_USER`, `SMTP_PASS`, `CONTACT_EMAIL`
|
||||
**Impact:** Contact form submissions will NOT send email notifications to the team. The system gracefully logs to console instead (no crash), but leads will be silently dropped in production.
|
||||
|
||||
**Required Action (on deployment platform):**
|
||||
```env
|
||||
SMTP_HOST=smtp.gmail.com
|
||||
SMTP_PORT=587
|
||||
SMTP_USER=hello@workroot.in
|
||||
SMTP_PASS=<app-specific-password>
|
||||
CONTACT_EMAIL=hello@workroot.in
|
||||
```
|
||||
|
||||
**Note:** Gmail requires an App Password if 2FA is enabled. Use a transactional email service (SendGrid, Postmark, Mailgun) for production reliability.
|
||||
|
||||
---
|
||||
|
||||
## 3. Functional Testing — Static Analysis Results
|
||||
|
||||
### 3.1 Pages and Routes
|
||||
|
||||
All routes verified present in `src/pages/`:
|
||||
|
||||
| Route | File | Status |
|
||||
|-------|------|--------|
|
||||
| `/` | `index.astro` | ✅ Present |
|
||||
| `/about` | `about.astro` | ✅ Present |
|
||||
| `/services` | `services.astro` | ✅ Present |
|
||||
| `/portfolio` | `portfolio.astro` | ✅ Present |
|
||||
| `/blog` | `blog/index.astro` | ✅ Present |
|
||||
| `/blog/[...slug]` | `blog/[...slug].astro` | ✅ Present |
|
||||
| `/contact` | `contact.astro` | ✅ Present |
|
||||
| `/privacy` | `privacy.astro` | ✅ Present |
|
||||
| `/terms` | `terms.astro` | ✅ Present |
|
||||
| `/offline` | `offline.astro` | ✅ Present (PWA fallback) |
|
||||
| `/sitemap.xml` | `sitemap.xml.ts` | ✅ Present |
|
||||
| `/sitemap-index.xml` | `sitemap-index.xml.ts` | ✅ Present |
|
||||
| `/cookies` | **MISSING** | 🔴 **404 — See CRIT-001** |
|
||||
|
||||
### 3.2 API Endpoints
|
||||
|
||||
All API endpoints verified:
|
||||
|
||||
| Endpoint | Method | File | Validation | Rate Limit |
|
||||
|----------|--------|------|-----------|-----------|
|
||||
| `/api/health.json` | GET | ✅ Present | — | None |
|
||||
| `/api/contact` | POST | ✅ Present | name/email/subject/message/honeypot | 5/hr/IP |
|
||||
| `/api/newsletter` | POST | ✅ Present | email format/length | 3/hr/IP |
|
||||
| `/api/metrics.json` | GET | ✅ Present | Optional METRICS_TOKEN auth | None |
|
||||
|
||||
### 3.3 Contact Form Validation
|
||||
|
||||
Input validation confirmed in `src/pages/api/contact.ts`:
|
||||
|
||||
| Field | Rule | Status |
|
||||
|-------|------|--------|
|
||||
| `name` | 2–100 chars required | ✅ |
|
||||
| `email` | Valid format, max 254 chars | ✅ |
|
||||
| `phone` | Optional, regex validated | ✅ |
|
||||
| `subject` | Enum: 7 valid values | ✅ |
|
||||
| `message` | 10–5000 chars required | ✅ |
|
||||
| `website` | Honeypot: must be empty (silent success if filled) | ✅ |
|
||||
|
||||
### 3.4 Static Assets
|
||||
|
||||
All critical static assets verified present in `public/`:
|
||||
|
||||
| Asset | Path | Status |
|
||||
|-------|------|--------|
|
||||
| Favicon | `/favicon.svg` | ✅ |
|
||||
| Apple Touch Icon | `/apple-touch-icon.png` | ✅ (placeholder — replace with branded design) |
|
||||
| OG Image | `/og-image.jpg` | ✅ (placeholder — replace with branded design) |
|
||||
| Logo | `/logo.png` | ✅ (placeholder — replace with branded design) |
|
||||
| PWA Manifest | `/manifest.json` | ✅ |
|
||||
| Service Worker | `/sw.js` | ✅ |
|
||||
| robots.txt | `/robots.txt` | ✅ |
|
||||
| Sitemap | `/sitemap.xml` | ✅ |
|
||||
| Blog images (3) | `/images/blog/` | ✅ |
|
||||
| Security disclosure | `/.well-known/security.txt` | ✅ |
|
||||
|
||||
> **Note:** `apple-touch-icon.png`, `og-image.jpg`, and `logo.png` are placeholder images (brand-colored rectangles). They should be replaced with professionally designed assets before launch for best impression.
|
||||
|
||||
---
|
||||
|
||||
## 4. Security Audit Summary
|
||||
|
||||
Security hardening was performed by the `penetration-tester` agent. All 5 findings are **REMEDIATED**.
|
||||
|
||||
### 4.1 Security Headers
|
||||
|
||||
Implemented in `src/middleware.ts` — verified in code:
|
||||
|
||||
| Header | Value | Status |
|
||||
|--------|-------|--------|
|
||||
| `Content-Security-Policy` | Restrictive; no `unsafe-eval` in production | ✅ |
|
||||
| `X-Frame-Options` | `DENY` | ✅ |
|
||||
| `X-Content-Type-Options` | `nosniff` | ✅ |
|
||||
| `Referrer-Policy` | `strict-origin-when-cross-origin` | ✅ |
|
||||
| `Permissions-Policy` | geolocation/microphone/camera/payment disabled | ✅ |
|
||||
| `Strict-Transport-Security` | `max-age=31536000; includeSubDomains; preload` (prod+HTTPS only) | ✅ |
|
||||
| `X-Permitted-Cross-Domain-Policies` | `none` | ✅ |
|
||||
| `X-DNS-Prefetch-Control` | `on` | ✅ |
|
||||
|
||||
### 4.2 Penetration Testing Findings (All Remediated)
|
||||
|
||||
| Finding | Severity | Status |
|
||||
|---------|----------|--------|
|
||||
| FINDING-001: XSS via toast `innerHTML` | CRITICAL (8.2) | ✅ REMEDIATED |
|
||||
| FINDING-002: Missing CSRF origin validation | HIGH (7.5) | ✅ REMEDIATED |
|
||||
| FINDING-003: `unsafe-eval` in production CSP | MEDIUM (5.3) | ✅ REMEDIATED |
|
||||
| FINDING-004: Wildcard `img-src https:` | MEDIUM (4.3) | ✅ REMEDIATED |
|
||||
| FINDING-005: _(see pentest report)_ | MEDIUM | ✅ REMEDIATED |
|
||||
|
||||
**Post-remediation risk posture: LOW-MEDIUM**
|
||||
|
||||
### 4.3 CSRF Protection
|
||||
|
||||
`validateCsrfOrigin()` in `src/middleware.ts` enforces `Origin`/`Referer` validation on all POST/PUT/PATCH/DELETE requests to `/api/*` in production. Development mode bypasses this for testing convenience.
|
||||
|
||||
### 4.4 Rate Limiting
|
||||
|
||||
- Contact form: 5 submissions per hour per IP with `X-RateLimit-*` headers
|
||||
- Newsletter: 3 subscriptions per hour per IP with `X-RateLimit-*` headers
|
||||
- Both return `429 Too Many Requests` when exceeded
|
||||
|
||||
---
|
||||
|
||||
## 5. SSL / HTTPS Verification
|
||||
|
||||
| Check | Configuration | Status |
|
||||
|-------|--------------|--------|
|
||||
| HSTS header | Enabled in production (HTTPS only) — 1 year, includeSubDomains, preload | ✅ |
|
||||
| HTTPS redirect | Middleware redirects non-`workroot.in` hosts to canonical domain | ✅ |
|
||||
| SSL monitoring | GitHub Actions uptime workflow checks SSL expiry every 5 min, alerts at 14 days | ✅ |
|
||||
| Mixed content | CSP includes `upgrade-insecure-requests` | ✅ |
|
||||
|
||||
> **Manual action required:** SSL certificate must be provisioned on the deployment platform (Render/Railway/VPS) before launch. The monitoring workflow at `.github/workflows/uptime-monitor.yml` will verify it.
|
||||
|
||||
---
|
||||
|
||||
## 6. DNS & Domain Configuration
|
||||
|
||||
| Check | Configuration | Status |
|
||||
|-------|--------------|--------|
|
||||
| Canonical domain | `workroot.in` set as Astro `site` in `astro.config.mjs` | ✅ |
|
||||
| www redirect | Middleware accepts `www.workroot.in`, redirects to `workroot.in` | ✅ |
|
||||
| API CORS origin | `https://workroot.in` and `https://www.workroot.in` whitelisted | ✅ |
|
||||
| Health endpoint domain field | Returns `domain: 'workroot.in'` for verification | ✅ |
|
||||
| robots.txt sitemap | Points to `https://workroot.in/sitemap.xml` | ✅ |
|
||||
| Open Graph tags | Use `workroot.in` domain | ✅ |
|
||||
| JSON-LD structured data | Organization schema uses `workroot.in` URL | ✅ |
|
||||
|
||||
> **Manual action required:** DNS A/CNAME records for `workroot.in` and `www.workroot.in` must be configured with your DNS provider to point to the deployment server/platform.
|
||||
|
||||
---
|
||||
|
||||
## 7. Analytics & Tracking
|
||||
|
||||
| Component | Implementation Status | Configuration Status |
|
||||
|-----------|----------------------|---------------------|
|
||||
| Google Analytics 4 | ✅ Implemented (`src/components/Analytics.astro`) | ⚠️ `GOOGLE_ANALYTICS_ID` env var not set |
|
||||
| Plausible Analytics | ✅ Implemented (alternative to GA4) | ⚠️ `PLAUSIBLE_DOMAIN` env var not set |
|
||||
| Form event tracking | ✅ Implemented (contact form, newsletter) | Requires analytics to be configured |
|
||||
| Portfolio filter tracking | ✅ Implemented | Requires analytics to be configured |
|
||||
| External link tracking | ✅ Implemented (auto-tracks all `target="_blank"`) | Requires analytics to be configured |
|
||||
| Do Not Track (DNT) | ✅ Respected — no events sent if `navigator.doNotTrack === '1'` | N/A |
|
||||
|
||||
**Analytics events tracked when configured:**
|
||||
- `form_submit_success` / `form_submit_error` (contact form)
|
||||
- `newsletter_signup_success` / `newsletter_signup_error`
|
||||
- `portfolio_filter` (filter category clicked)
|
||||
- `case_study_view` (project modal opened)
|
||||
- `external_link_click` (all outbound links)
|
||||
|
||||
---
|
||||
|
||||
## 8. Email Notifications
|
||||
|
||||
| Component | Status | Notes |
|
||||
|-----------|--------|-------|
|
||||
| SMTP integration | ✅ Implemented via Nodemailer | Requires env vars to activate |
|
||||
| Contact form → email | ✅ Implemented | Silent console log if unconfigured |
|
||||
| Newsletter → Mailchimp | ✅ Implemented | Requires `MAILCHIMP_API_KEY` + `MAILCHIMP_LIST_ID` |
|
||||
| Newsletter → ConvertKit | ✅ Implemented (fallback) | Requires `CONVERTKIT_API_KEY` + `CONVERTKIT_FORM_ID` |
|
||||
| Newsletter → SMTP fallback | ✅ Implemented | Uses SMTP if no newsletter service |
|
||||
| Error tracking (Sentry) | ✅ Implemented | Requires `SENTRY_DSN` env var |
|
||||
|
||||
---
|
||||
|
||||
## 9. Monitoring & Backup Systems
|
||||
|
||||
### 9.1 Uptime Monitoring
|
||||
|
||||
| Component | Status | Schedule |
|
||||
|-----------|--------|----------|
|
||||
| GitHub Actions uptime check | ✅ Configured (`.github/workflows/uptime-monitor.yml`) | Every 5 minutes |
|
||||
| Health endpoint `/api/health.json` | ✅ Implemented | Checked by uptime monitor |
|
||||
| Metrics endpoint `/api/metrics.json` | ✅ Implemented | Available for dashboards |
|
||||
| SSL expiry check | ✅ Automated | Every 5 minutes, alerts at 14 days |
|
||||
| Critical pages check | ✅ Automated | `/`, `/services`, `/portfolio`, `/contact`, `/about` |
|
||||
| Sitemap/robots.txt check | ✅ Automated | Every 5 minutes |
|
||||
| Slack alerts | ⚠️ Template ready, not wired | Set `SLACK_WEBHOOK_URL` secret to enable |
|
||||
|
||||
### 9.2 Backup Systems
|
||||
|
||||
Backup scripts in `scripts/backup/`:
|
||||
|
||||
| Script | Purpose | Status |
|
||||
|--------|---------|--------|
|
||||
| `backup-full.sh` | Full backup | ✅ Present |
|
||||
| `backup-content.sh` | Content-only backup | ✅ Present |
|
||||
| `backup-config.sh` | Config backup | ✅ Present |
|
||||
| `restore.sh` | Restore from backup | ✅ Present |
|
||||
| `verify.sh` | Verify backup integrity | ✅ Present |
|
||||
| `cleanup-old.sh` | Prune old backups | ✅ Present |
|
||||
|
||||
---
|
||||
|
||||
## 10. Test Suite Coverage
|
||||
|
||||
### 10.1 Test Files (15 total)
|
||||
|
||||
| Test File | Coverage Area | Priority |
|
||||
|-----------|--------------|---------|
|
||||
| `e2e-smoke-suite.spec.ts` | Page loads, critical flows, perf, a11y | P0 |
|
||||
| `e2e-critical-paths.spec.ts` | End-to-end user journeys | P1 |
|
||||
| `api-integration.spec.ts` | All API endpoints, validation, security | P1 |
|
||||
| `contact-form.spec.ts` | Contact form UI + validation | P1 |
|
||||
| `e2e-form-interactions.spec.ts` | Form interactions + error states | P1 |
|
||||
| `newsletter-subscription.spec.ts` | Newsletter form flows | P1 |
|
||||
| `destructive-chaos.spec.ts` | Stress, timeouts, bad inputs, rate limits | P2 |
|
||||
| `navigation.spec.ts` | Navigation flows | P1 |
|
||||
| `blog.spec.ts` | Blog listing + individual posts | P1 |
|
||||
| `portfolio.spec.ts` | Portfolio page + filters | P1 |
|
||||
| `pages.spec.ts` | General page content checks | P1 |
|
||||
| `accessibility.spec.ts` | WCAG 2.1 AA compliance | P1 |
|
||||
| `cross-browser.spec.ts` | Chrome, Firefox, Safari, Edge, Mobile | P1 |
|
||||
| `static-assets.spec.ts` | Assets, domain references, OG tags | P1 |
|
||||
| `e2e-blog-navigation.spec.ts` | Blog navigation flows | P1 |
|
||||
|
||||
### 10.2 CI/CD Pipeline
|
||||
|
||||
| Workflow | Trigger | Status |
|
||||
|----------|---------|--------|
|
||||
| `deploy.yml` | Push to `main` / manual | ✅ Configured |
|
||||
| `e2e-tests.yml` | Push/PR/nightly | ✅ Configured (9 jobs) |
|
||||
| `uptime-monitor.yml` | Every 5 min | ✅ Configured |
|
||||
| `sitemap-ping.yml` | Push to `main` (content changes) | ✅ Configured |
|
||||
|
||||
### 10.3 Browser Coverage
|
||||
|
||||
| Browser | Desktop | Mobile |
|
||||
|---------|---------|--------|
|
||||
| Chrome/Chromium | ✅ | ✅ (Pixel 5) |
|
||||
| Firefox | ✅ | — |
|
||||
| Safari/WebKit | ✅ | ✅ (iPhone 12) |
|
||||
| Edge | ✅ | — |
|
||||
| iPad (Tablet) | — | ✅ (iPad Pro 11") |
|
||||
|
||||
---
|
||||
|
||||
## 11. SEO Verification
|
||||
|
||||
| Check | Status |
|
||||
|-------|--------|
|
||||
| `sitemap.xml` accessible | ✅ (`/sitemap.xml` returns dynamic sitemap) |
|
||||
| `robots.txt` configured | ✅ (allows all crawlers, blocks `/_astro/`) |
|
||||
| Canonical URLs | ✅ (`workroot.in` domain throughout) |
|
||||
| JSON-LD Organization schema | ✅ (in `BaseLayout.astro`) |
|
||||
| JSON-LD WebSite schema | ✅ (in `BaseLayout.astro`) |
|
||||
| Open Graph tags | ✅ (in `src/components/SEO.astro`) |
|
||||
| Twitter Card tags | ✅ (in `src/components/SEO.astro`) |
|
||||
| AI/LLM crawlers allowed | ✅ (GPTBot, Claude-Web, PerplexityBot, etc.) |
|
||||
| Search console | ⚠️ Must be submitted manually post-launch |
|
||||
| Sitemap submitted to Google | ⚠️ `sitemap-ping.yml` workflow runs on push |
|
||||
|
||||
---
|
||||
|
||||
## 12. Accessibility
|
||||
|
||||
Per the `test-engineer` accessibility audit (`ACCESSIBILITY_AUDIT.md`):
|
||||
|
||||
| WCAG Check | Status |
|
||||
|------------|--------|
|
||||
| Form labels associated | ✅ |
|
||||
| Images have alt text | ✅ |
|
||||
| Color contrast (AA) | ✅ |
|
||||
| Keyboard navigation | ✅ |
|
||||
| Focus management | ✅ |
|
||||
| Semantic HTML | ✅ |
|
||||
| Mobile touch targets | ✅ |
|
||||
|
||||
---
|
||||
|
||||
## 13. Performance Baseline
|
||||
|
||||
Per `performance-optimizer` audit (`LIGHTHOUSE_AUDIT_2026-03-21.md`):
|
||||
|
||||
| Metric | Score | Target |
|
||||
|--------|-------|--------|
|
||||
| Lighthouse Performance | 90+ | ≥90 ✅ |
|
||||
| Lighthouse Accessibility | 95+ | ≥90 ✅ |
|
||||
| Lighthouse Best Practices | 95+ | ≥90 ✅ |
|
||||
| Lighthouse SEO | 95+ | ≥90 ✅ |
|
||||
|
||||
**Performance optimizations applied:**
|
||||
- Render-blocking Google Fonts `@import` removed from `global.css`
|
||||
- `fetchpriority="high"` added to Portfolio LCP image
|
||||
- Unsplash images optimized with `&auto=format&q=75`
|
||||
- Image lazy loading attributes set correctly
|
||||
- Gzip/Brotli compression enabled via Express middleware
|
||||
|
||||
---
|
||||
|
||||
## 14. Pre-Launch Execution Checklist
|
||||
|
||||
Use this as a final sign-off checklist before going live:
|
||||
|
||||
### BLOCKERS (must complete before launch)
|
||||
|
||||
- [ ] **[CRIT-001]** Create `src/pages/cookies.astro` Cookie Policy page OR remove/redirect footer link
|
||||
- [ ] **[WARN-001]** Replace social link placeholder `#` hrefs with real URLs or remove icons
|
||||
|
||||
### CONFIGURATION (required for full functionality)
|
||||
|
||||
- [ ] Set `SMTP_HOST`, `SMTP_PORT`, `SMTP_USER`, `SMTP_PASS`, `CONTACT_EMAIL` on deployment platform
|
||||
- [ ] Set `GOOGLE_ANALYTICS_ID=G-XXXXXXXXXX` (or `PLAUSIBLE_DOMAIN`) on deployment platform
|
||||
- [ ] Set newsletter provider credentials (`MAILCHIMP_*` or `CONVERTKIT_*`) on deployment platform
|
||||
- [ ] Optionally set `SENTRY_DSN` for error tracking
|
||||
- [ ] Optionally set `SLACK_WEBHOOK_URL` GitHub secret for downtime alerts
|
||||
|
||||
### DNS & INFRASTRUCTURE
|
||||
|
||||
- [ ] DNS A/CNAME records configured for `workroot.in` → deployment server IP
|
||||
- [ ] DNS record for `www.workroot.in` (redirect to apex or CNAME)
|
||||
- [ ] SSL certificate provisioned on deployment platform
|
||||
- [ ] Verify SSL with: `openssl s_client -connect workroot.in:443` or browser
|
||||
|
||||
### VERIFICATION STEPS (run after deployment)
|
||||
|
||||
- [ ] Smoke tests pass: `npm run test:smoke` (pointed at production URL)
|
||||
- [ ] Health check responds: `curl https://workroot.in/api/health.json`
|
||||
- [ ] Security headers present: check with [SecurityHeaders.com](https://securityheaders.com/?q=workroot.in)
|
||||
- [ ] SSL grade A: check with [SSL Labs](https://www.ssllabs.com/ssltest/analyze.html?d=workroot.in)
|
||||
- [ ] No JavaScript console errors on homepage
|
||||
- [ ] Contact form sends actual email to inbox
|
||||
- [ ] Newsletter subscription reaches your email provider
|
||||
- [ ] Analytics events fire (check GA4 Real-Time or Plausible dashboard)
|
||||
- [ ] Sitemap accessible: `curl https://workroot.in/sitemap.xml`
|
||||
|
||||
### ASSET QUALITY (nice-to-have before launch)
|
||||
|
||||
- [ ] Replace placeholder `apple-touch-icon.png` with proper branded icon (180×180)
|
||||
- [ ] Replace placeholder `og-image.jpg` with proper Open Graph image (1200×630)
|
||||
- [ ] Replace placeholder `logo.png` with proper logo (512×512)
|
||||
- [ ] Confirm `hello@workroot.io` vs `hello@workroot.in` email intent with stakeholders
|
||||
|
||||
---
|
||||
|
||||
## 15. Test Commands Reference
|
||||
|
||||
```bash
|
||||
# Run all pre-launch tests (CI mode — no server auto-start)
|
||||
npm run test:ci
|
||||
|
||||
# Run smoke suite only (fastest — P0)
|
||||
npm run test:smoke
|
||||
|
||||
# Run API tests
|
||||
npm run test:api
|
||||
|
||||
# Run form tests
|
||||
npm run test:forms
|
||||
|
||||
# Run full regression (slow)
|
||||
npm test
|
||||
|
||||
# Run against production (set baseURL in env)
|
||||
BASE_URL=https://workroot.in npm run test:smoke
|
||||
|
||||
# Show HTML test report
|
||||
npm run test:report
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Appendix: Known Non-Issues
|
||||
|
||||
| Item | Note |
|
||||
|------|------|
|
||||
| `webServer` section commented out in `playwright.config.ts` | By design — assumes server is running externally |
|
||||
| `unsafe-inline` in CSP `script-src` | Required by Astro framework for hydration |
|
||||
| `/cookies` 404 | Tracked as CRIT-001 |
|
||||
| `workroot.io` emails in JSON-LD | Confirmed intentional by test-engineer; separate business email domain |
|
||||
| Placeholder static images | Expected — design assets pending |
|
||||
|
||||
---
|
||||
|
||||
*Report generated by qa-automation-engineer agent on 2026-03-21.*
|
||||
@@ -0,0 +1,45 @@
|
||||
---
|
||||
role: qa-automation-engineer
|
||||
version: 1
|
||||
---
|
||||
|
||||
# Soul — qa-automation-engineer
|
||||
|
||||
## Core Principles
|
||||
1. **Quality First** — Write clean, maintainable, production-ready code
|
||||
2. **Knowledge Sharing** — Document discoveries and decisions for other agents
|
||||
3. **Minimal Footprint** — Only modify files directly related to the task
|
||||
4. **User Respect** — Follow user preferences and project conventions
|
||||
5. **Collaboration** — Build on other agents' work, don't duplicate effort
|
||||
|
||||
## Working Style
|
||||
- Read the knowledge base BEFORE reading files — avoid redundant work
|
||||
- Check what other agents have completed before starting
|
||||
- Write small, focused changes rather than large rewrites
|
||||
- Test your work when possible
|
||||
- Report progress and blockers promptly
|
||||
|
||||
## Decision-Making
|
||||
- Prefer well-established patterns over clever solutions
|
||||
- When multiple approaches exist, choose the most maintainable one
|
||||
- Document WHY decisions were made, not just WHAT was done
|
||||
- Test behavior, not implementation details
|
||||
- Prefer integration tests over unit tests for complex flows
|
||||
- Every bug fix should have a regression test
|
||||
|
||||
## Error Handling
|
||||
- If blocked by missing dependencies, report the blocker clearly
|
||||
- If a file doesn't exist, create it rather than failing
|
||||
- If instructions are ambiguous, make a reasonable choice and document it
|
||||
- If a test fails, fix the issue rather than removing the test
|
||||
|
||||
## File Organization
|
||||
- NEVER put reports, audits, or documentation in the project root
|
||||
- Agent artifacts go in: `.agents/qa-automation-engineer/`
|
||||
- Scripts go in: `scripts/` or `.agents/qa-automation-engineer/scripts/`
|
||||
- Keep the user's codebase clean
|
||||
|
||||
## Knowledge Protocol
|
||||
- After completing a task, save key discoveries to the knowledge base
|
||||
- Include: what was changed, why, and any important patterns found
|
||||
- Reference specific file paths so other agents can find your work
|
||||
@@ -0,0 +1,30 @@
|
||||
---
|
||||
role: qa-automation-engineer
|
||||
last_updated: 2026-03-21T10:45:09.289997+00:00
|
||||
---
|
||||
|
||||
# Tools — qa-automation-engineer
|
||||
|
||||
## Available Tools
|
||||
| Tool | Description |
|
||||
|------|-------------|
|
||||
| `read_file` | Read file contents from the project |
|
||||
| `write_file` | Create or overwrite a file |
|
||||
| `edit_file` | Make targeted edits to existing files |
|
||||
| `run_command` | Execute shell commands (build, test, lint) |
|
||||
| `search_files` | Search for files by name pattern |
|
||||
| `grep` | Search file contents with regex |
|
||||
| `list_directory` | List files in a directory |
|
||||
|
||||
## Tool Usage Guidelines
|
||||
- **read_file**: Use sparingly — check the knowledge base first
|
||||
- **write_file**: Always include proper formatting and comments
|
||||
- **edit_file**: Prefer targeted edits over full file rewrites
|
||||
- **run_command**: Use for building, testing, linting. Check exit codes
|
||||
- **search_files**: Use to find relevant files before reading
|
||||
|
||||
## Workspace Paths
|
||||
- Project source: `./` (working directory)
|
||||
- Agent output: `.agents/qa-automation-engineer/`
|
||||
- Knowledge: `knowledge/`
|
||||
- Scripts: `scripts/` or `.agents/qa-automation-engineer/scripts/`
|
||||
@@ -0,0 +1,27 @@
|
||||
---
|
||||
user: Unknown
|
||||
project: Company Site
|
||||
last_updated: 2026-03-21T10:45:09.290516+00:00
|
||||
---
|
||||
|
||||
# User Context — Company Site
|
||||
|
||||
## User
|
||||
**Name**: Not specified
|
||||
|
||||
## Project
|
||||
**Name**: Company Site
|
||||
**Description**: No description provided
|
||||
|
||||
## User Preferences
|
||||
- _No specific preferences recorded yet_
|
||||
|
||||
## Instructions
|
||||
- Follow the project's existing code style and conventions
|
||||
- Respect the directory structure already in place
|
||||
- Use the same language/framework patterns found in existing code
|
||||
- When in doubt, check with the user through the project chat
|
||||
|
||||
## Notes
|
||||
_This file is updated as the user provides preferences and feedback._
|
||||
_Agents should check this file before starting any task._
|
||||
@@ -0,0 +1,225 @@
|
||||
# Comprehensive E2E Test Suite — WorkRoot IT Solutions
|
||||
**QA Automation Engineer Agent** | Created: 2026-03-21
|
||||
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
This document describes the complete E2E test suite for the WorkRoot IT Solutions website. The suite was built on top of the existing 12 test files, adding 4 new test files and a CI/CD pipeline.
|
||||
|
||||
---
|
||||
|
||||
## Test Architecture
|
||||
|
||||
### Page Object Models (New)
|
||||
Located in `tests/pages/`:
|
||||
- **`ContactPage.ts`** — Encapsulates all contact form selectors and interactions
|
||||
- **`NavigationPage.ts`** — Encapsulates header/footer/mobile nav interactions
|
||||
|
||||
These POMs reduce selector duplication and make tests more maintainable.
|
||||
|
||||
---
|
||||
|
||||
## Test Files
|
||||
|
||||
### Existing Tests (12 files, inherited)
|
||||
| File | Priority | Tests | Coverage |
|
||||
|------|----------|-------|----------|
|
||||
| `e2e-smoke-suite.spec.ts` | P0 | ~20 | Page loads, performance, security basics |
|
||||
| `e2e-critical-paths.spec.ts` | P0 | ~20 | Complete user journeys |
|
||||
| `e2e-form-interactions.spec.ts` | P1 | ~20 | Contact form deep testing |
|
||||
| `contact-form.spec.ts` | P1 | ~12 | Form fields and validation |
|
||||
| `navigation.spec.ts` | P1 | ~10 | Nav links, mobile menu, responsive |
|
||||
| `blog.spec.ts` | P1 | ~12 | Blog listing, posts, mobile |
|
||||
| `portfolio.spec.ts` | P1 | ~8 | Portfolio grid, filters, responsive |
|
||||
| `pages.spec.ts` | P1 | ~6 | Page load and accessibility |
|
||||
| `accessibility.spec.ts` | P1 | ~8 | WCAG compliance |
|
||||
| `cross-browser.spec.ts` | P2 | ~6 | Cross-browser consistency |
|
||||
| `security-headers.test.ts` | P1 | ~8 | Security headers, CORS, CSP |
|
||||
| `static-assets.spec.ts` | P2 | ~4 | Favicon, CSS, images |
|
||||
|
||||
### New Tests (4 files, added)
|
||||
| File | Priority | Tests | Coverage |
|
||||
|------|----------|-------|----------|
|
||||
| `newsletter-subscription.spec.ts` | P1 | ~28 | Newsletter form E2E + API + mobile |
|
||||
| `api-integration.spec.ts` | P1 | ~32 | Direct API tests for all endpoints |
|
||||
| `destructive-chaos.spec.ts` | P1 | ~30 | XSS, injection, network failures, race conditions |
|
||||
|
||||
---
|
||||
|
||||
## Coverage Matrix
|
||||
|
||||
| Feature | Smoke | Critical | Forms | API | Chaos | Newsletter |
|
||||
|---------|-------|----------|-------|-----|-------|------------|
|
||||
| Page loads | ✅ | ✅ | - | - | - | - |
|
||||
| Navigation (desktop) | ✅ | ✅ | - | - | - | - |
|
||||
| Navigation (mobile) | ✅ | ✅ | - | - | - | - |
|
||||
| Contact form (happy path) | ✅ | ✅ | ✅ | ✅ | - | - |
|
||||
| Contact form (validation) | - | - | ✅ | ✅ | ✅ | - |
|
||||
| Contact form (honeypot) | - | - | ✅ | ✅ | - | - |
|
||||
| Contact form (loading state) | - | - | ✅ | - | - | - |
|
||||
| Newsletter form (happy path) | - | - | - | - | - | ✅ |
|
||||
| Newsletter form (validation) | - | - | - | ✅ | ✅ | ✅ |
|
||||
| Newsletter API (direct) | - | - | - | ✅ | - | ✅ |
|
||||
| Blog navigation | ✅ | ✅ | - | - | - | - |
|
||||
| Blog reading experience | - | ✅ | - | - | - | - |
|
||||
| Portfolio filtering | - | ✅ | - | - | - | - |
|
||||
| Security headers | ✅ | ✅ | - | ✅ | - | - |
|
||||
| Rate limiting | - | - | - | ✅ | ✅ | ✅ |
|
||||
| XSS prevention | - | - | - | - | ✅ | - |
|
||||
| Network failure handling | - | - | - | - | ✅ | ✅ |
|
||||
| Race conditions | - | - | ✅ | - | ✅ | ✅ |
|
||||
| Mobile responsiveness | ✅ | ✅ | ✅ | - | - | ✅ |
|
||||
| API validation | - | - | - | ✅ | ✅ | - |
|
||||
| Accessibility | ✅ | - | ✅ | - | - | ✅ |
|
||||
|
||||
**Total estimated tests: ~150**
|
||||
|
||||
---
|
||||
|
||||
## Running Tests
|
||||
|
||||
### Quick Commands
|
||||
```bash
|
||||
# P0: Run before every deployment (~2 min)
|
||||
npm run test:smoke
|
||||
|
||||
# P0: Critical user journeys
|
||||
npm run test:critical
|
||||
|
||||
# P1: API integration tests
|
||||
npm run test:api
|
||||
|
||||
# P1: All form tests
|
||||
npm run test:forms
|
||||
|
||||
# P1: Newsletter-specific
|
||||
npm run test:newsletter
|
||||
|
||||
# Destructive/chaos tests (nightly)
|
||||
npm run test:chaos
|
||||
|
||||
# Full CI suite (smoke + critical + API)
|
||||
npm run test:ci
|
||||
|
||||
# Everything
|
||||
npm run test
|
||||
|
||||
# View HTML report
|
||||
npm run test:report
|
||||
```
|
||||
|
||||
### CI/CD Pipeline Triggers
|
||||
| Event | Jobs Run |
|
||||
|-------|----------|
|
||||
| Every push | Smoke → Critical Paths → API Tests |
|
||||
| Pull Request | + Form Tests, Security Tests |
|
||||
| Nightly (2 AM UTC) | All jobs including Chaos, Cross-Browser, Mobile |
|
||||
| Manual trigger | Selectable suite |
|
||||
|
||||
---
|
||||
|
||||
## Test Data
|
||||
|
||||
### Contact Form Test Data
|
||||
```json
|
||||
{
|
||||
"name": "John Doe",
|
||||
"email": "john.doe@example.com",
|
||||
"phone": "+1 555-123-4567",
|
||||
"subject": "web-development",
|
||||
"message": "I am interested in building a custom web application.",
|
||||
"website": ""
|
||||
}
|
||||
```
|
||||
|
||||
### Newsletter Test Data
|
||||
```json
|
||||
{
|
||||
"email": "subscriber@example.com"
|
||||
}
|
||||
```
|
||||
|
||||
### Valid Subject Values (Contact Form)
|
||||
- `web-development`
|
||||
- `mobile-development`
|
||||
- `cloud-services`
|
||||
- `ai-ml`
|
||||
- `consulting`
|
||||
- `support`
|
||||
- `other`
|
||||
|
||||
---
|
||||
|
||||
## Key Bugs This Suite Would Catch
|
||||
|
||||
| Category | Bug Example |
|
||||
|----------|-------------|
|
||||
| **XSS** | Alert fires in name/message field |
|
||||
| **Form Bypass** | Honeypot filled but email still sent |
|
||||
| **Race Condition** | Double submit sends duplicate emails |
|
||||
| **Validation** | Short name (1 char) passes validation |
|
||||
| **Network** | App crashes on API timeout |
|
||||
| **Rate Limit** | No 429 after 5 rapid submissions |
|
||||
| **Newsletter** | Form field doesn't clear after success |
|
||||
| **Mobile** | Newsletter form clipped off-screen |
|
||||
| **API** | `/api/contact` returns 500 for SQL chars |
|
||||
| **Security** | Missing X-Frame-Options header |
|
||||
| **CORS** | API returns wrong domain in CORS header |
|
||||
|
||||
---
|
||||
|
||||
## Flakiness Prevention
|
||||
|
||||
1. **No fixed delays** — Use `waitForLoadState`, `waitForSelector`, element visibility
|
||||
2. **Stable selectors** — Prefer `name`, `id`, `data-error`, `aria-label` over CSS classes
|
||||
3. **Idempotent tests** — Each test resets state (navigate fresh, not session-dependent)
|
||||
4. **Generous timeouts** — 10s for network ops, 5s for animations
|
||||
5. **CI retries** — 2 retries configured for flaky infrastructure
|
||||
|
||||
---
|
||||
|
||||
## Browser Coverage Strategy
|
||||
|
||||
| Suite | Browsers |
|
||||
|-------|----------|
|
||||
| Smoke | Chromium only (speed) |
|
||||
| Critical Paths | Chromium + Firefox |
|
||||
| Forms | Chromium |
|
||||
| API | Chromium (headless HTTP) |
|
||||
| Chaos | Chromium |
|
||||
| Newsletter | Chromium + Mobile Chrome |
|
||||
| Nightly Regression | All 7 configurations |
|
||||
|
||||
---
|
||||
|
||||
## Files Created
|
||||
|
||||
```
|
||||
tests/
|
||||
├── pages/
|
||||
│ ├── ContactPage.ts (NEW) Page Object Model for contact form
|
||||
│ └── NavigationPage.ts (NEW) Page Object Model for navigation
|
||||
├── newsletter-subscription.spec.ts (NEW) 28 newsletter tests
|
||||
├── api-integration.spec.ts (NEW) 32 API-level tests
|
||||
├── destructive-chaos.spec.ts (NEW) 30 chaos/destructive tests
|
||||
└── ... (12 existing files unchanged)
|
||||
|
||||
.github/workflows/
|
||||
└── e2e-tests.yml (NEW) 9-job CI pipeline
|
||||
|
||||
package.json (UPDATED) New test scripts
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Changelog
|
||||
|
||||
### 2026-03-21
|
||||
- Added Page Object Models (`ContactPage.ts`, `NavigationPage.ts`)
|
||||
- Added `newsletter-subscription.spec.ts` — 28 tests
|
||||
- Added `api-integration.spec.ts` — 32 direct API tests
|
||||
- Added `destructive-chaos.spec.ts` — 30 destructive tests
|
||||
- Added `e2e-tests.yml` — 9-job GitHub Actions pipeline
|
||||
- Updated `package.json` with 8 new test scripts
|
||||
- Total suite: ~150 tests across 15 spec files
|
||||
@@ -0,0 +1,401 @@
|
||||
# E2E Test Suite Documentation
|
||||
|
||||
## Overview
|
||||
Comprehensive end-to-end test suite for WorkRoot IT Solutions website covering all critical user journeys and interactions.
|
||||
|
||||
## Test Suites
|
||||
|
||||
### 1. **Smoke Suite** (`e2e-smoke-suite.spec.ts`)
|
||||
**Priority:** P0 - Must pass before any deployment
|
||||
**Runtime:** < 2 minutes
|
||||
**Purpose:** Rapid verification of critical functionality
|
||||
|
||||
#### Coverage:
|
||||
- All critical pages load (9 pages)
|
||||
- Core navigation flows work
|
||||
- Contact form basic submission
|
||||
- Blog navigation basics
|
||||
- Performance checks (< 3s load time)
|
||||
- No JavaScript errors
|
||||
- Responsive layout (Mobile/Tablet/Desktop)
|
||||
- SEO basics (meta tags)
|
||||
- Security headers present
|
||||
- Accessibility basics
|
||||
- Critical assets load
|
||||
|
||||
**When to run:** Every commit, before deployment, CI/CD pipeline
|
||||
|
||||
---
|
||||
|
||||
### 2. **Critical User Journeys** (`e2e-critical-paths.spec.ts`)
|
||||
**Priority:** P0
|
||||
**Runtime:** 3-5 minutes
|
||||
**Purpose:** Test complete user flows from entry to conversion
|
||||
|
||||
#### User Journeys Tested:
|
||||
1. **First Time Visitor → Contact**
|
||||
- Homepage → Services → Contact → Form Submission
|
||||
|
||||
2. **Technical Reader → Blog → Contact**
|
||||
- Homepage → Blog → Read Post → Contact
|
||||
|
||||
3. **Portfolio Exploration**
|
||||
- Portfolio → About → Contact
|
||||
|
||||
4. **Mobile First-Time Visitor**
|
||||
- Mobile navigation → Services → Contact form
|
||||
|
||||
5. **Quick Information Seeker**
|
||||
- Footer links → Privacy → Terms → Home
|
||||
|
||||
6. **Return Visitor - Direct Blog Access**
|
||||
- Bookmark/Search → Blog Post → Listing
|
||||
|
||||
7. **Security & Trust Verification**
|
||||
- HTTPS check → Privacy Policy → Terms
|
||||
|
||||
8. **Multi-page Session**
|
||||
- All pages visited in sequence
|
||||
- No console errors
|
||||
- No layout shifts
|
||||
|
||||
---
|
||||
|
||||
### 3. **Form Interactions** (`e2e-form-interactions.spec.ts`)
|
||||
**Priority:** P1
|
||||
**Runtime:** 4-6 minutes
|
||||
**Purpose:** Deep testing of contact form functionality
|
||||
|
||||
#### Coverage:
|
||||
- **Happy Path:**
|
||||
- Successful submission with all fields
|
||||
- Loading states
|
||||
- Success messages
|
||||
- Form clearing
|
||||
|
||||
- **Validation:**
|
||||
- Empty submission
|
||||
- Invalid email format
|
||||
- Name too short
|
||||
- Message too short
|
||||
- Real-time validation
|
||||
- Error message display
|
||||
|
||||
- **Security:**
|
||||
- Honeypot protection (bot detection)
|
||||
- Multiple submission prevention
|
||||
|
||||
- **UX Features:**
|
||||
- Phone field formats
|
||||
- Subject dropdown
|
||||
- Focus states
|
||||
- Keyboard navigation (Tab order)
|
||||
|
||||
- **Accessibility:**
|
||||
- Labels associated with inputs
|
||||
- Error announcements
|
||||
- Submit button states
|
||||
|
||||
- **Mobile:**
|
||||
- Touch interactions
|
||||
- Keyboard types (email, tel)
|
||||
- Viewport fit
|
||||
|
||||
---
|
||||
|
||||
### 4. **Blog Navigation** (`e2e-blog-navigation.spec.ts`)
|
||||
**Priority:** P1
|
||||
**Runtime:** 5-7 minutes
|
||||
**Purpose:** Comprehensive blog functionality testing
|
||||
|
||||
#### Coverage:
|
||||
- **Navigation Flows:**
|
||||
- Homepage → Blog → Post → Back
|
||||
- Multiple post reading
|
||||
- Direct URL access
|
||||
|
||||
- **Reading Experience:**
|
||||
- Deep reading (scrolling)
|
||||
- Content structure
|
||||
- Typography
|
||||
- Image loading
|
||||
- Code blocks
|
||||
|
||||
- **Metadata & SEO:**
|
||||
- Dates visible
|
||||
- Categories/tags
|
||||
- Social sharing
|
||||
|
||||
- **Mobile Reading:**
|
||||
- Responsive layout
|
||||
- Font sizes
|
||||
- Image adaptation
|
||||
- Scroll performance
|
||||
|
||||
- **Reading Patterns:**
|
||||
- Skimming behavior
|
||||
- Deep reading scroll
|
||||
- Code block interaction
|
||||
|
||||
- **Performance:**
|
||||
- Listing load time < 3s
|
||||
- Post load time < 3s
|
||||
- Lazy loading
|
||||
|
||||
- **Edge Cases:**
|
||||
- Direct URL access
|
||||
- 404 handling
|
||||
- Empty state
|
||||
|
||||
---
|
||||
|
||||
## Test Execution
|
||||
|
||||
### Quick Start
|
||||
```bash
|
||||
# Run all E2E tests
|
||||
npm run test
|
||||
|
||||
# Run only smoke tests (fast)
|
||||
npm run test tests/e2e-smoke-suite.spec.ts
|
||||
|
||||
# Run specific suite
|
||||
npm run test tests/e2e-critical-paths.spec.ts
|
||||
|
||||
# Run on specific browser
|
||||
npm run test:chromium
|
||||
npm run test:firefox
|
||||
npm run test:webkit
|
||||
|
||||
# Mobile testing
|
||||
npm run test:mobile
|
||||
```
|
||||
|
||||
### CI/CD Integration
|
||||
```bash
|
||||
# Pre-commit: Smoke suite only
|
||||
npm run test tests/e2e-smoke-suite.spec.ts -- --project=chromium
|
||||
|
||||
# Pre-merge: All critical tests
|
||||
npm run test tests/e2e-smoke-suite.spec.ts tests/e2e-critical-paths.spec.ts
|
||||
|
||||
# Nightly: Full regression
|
||||
npm run test
|
||||
```
|
||||
|
||||
### Test Reports
|
||||
```bash
|
||||
# View HTML report
|
||||
npm run test:report
|
||||
|
||||
# Generate JSON report (for CI)
|
||||
npm run test -- --reporter=json > test-results/report.json
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Test Environment
|
||||
|
||||
### Prerequisites
|
||||
- Node.js installed
|
||||
- Dependencies installed (`npm install`)
|
||||
- Server running on `http://localhost:10000`
|
||||
|
||||
### Starting the server
|
||||
```bash
|
||||
# Terminal 1: Start server
|
||||
npm run dev
|
||||
|
||||
# Terminal 2: Run tests
|
||||
npm run test
|
||||
```
|
||||
|
||||
### Environment Variables
|
||||
No environment variables required for E2E tests.
|
||||
|
||||
---
|
||||
|
||||
## Test Data
|
||||
|
||||
### Blog Posts Used
|
||||
- `getting-started-with-astro` - Main test post
|
||||
|
||||
### Form Test Data
|
||||
```javascript
|
||||
{
|
||||
name: "John Doe",
|
||||
email: "john.doe@example.com",
|
||||
phone: "+1 555-123-4567",
|
||||
subject: "web-development",
|
||||
message: "I am interested in..."
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Coverage Matrix
|
||||
|
||||
| Feature | Smoke | Critical Paths | Form | Blog | Total Tests |
|
||||
|---------|-------|----------------|------|------|-------------|
|
||||
| Page Loads | ✅ 9 | ✅ 6 | ✅ 1 | ✅ 3 | 19 |
|
||||
| Navigation | ✅ 2 | ✅ 8 | - | ✅ 7 | 17 |
|
||||
| Forms | ✅ 1 | ✅ 3 | ✅ 20 | - | 24 |
|
||||
| Mobile | ✅ 3 | ✅ 1 | ✅ 2 | ✅ 2 | 8 |
|
||||
| Performance | ✅ 2 | ✅ 1 | - | ✅ 3 | 6 |
|
||||
| Accessibility | ✅ 2 | - | ✅ 3 | ✅ 1 | 6 |
|
||||
| Security | ✅ 1 | ✅ 1 | ✅ 2 | - | 4 |
|
||||
| **Total** | **20** | **20** | **28** | **16** | **84** |
|
||||
|
||||
---
|
||||
|
||||
## Browser Support
|
||||
|
||||
### Tested Browsers
|
||||
- ✅ **Chromium** (Chrome, Edge, Brave)
|
||||
- ✅ **Firefox**
|
||||
- ✅ **WebKit** (Safari)
|
||||
- ✅ **Mobile Chrome** (Pixel 5)
|
||||
- ✅ **Mobile Safari** (iPhone 12)
|
||||
- ✅ **Tablet** (iPad Pro 11)
|
||||
|
||||
### Test Matrix Strategy
|
||||
- **Smoke Suite:** Chromium only (speed)
|
||||
- **Critical Paths:** All browsers
|
||||
- **Form Tests:** Chromium + Mobile
|
||||
- **Blog Tests:** Chromium + Mobile Safari
|
||||
|
||||
---
|
||||
|
||||
## Flaky Test Prevention
|
||||
|
||||
### Strategies Implemented
|
||||
1. **Explicit Waits:** `waitForLoadState('networkidle')`
|
||||
2. **Element Visibility Checks:** Before interaction
|
||||
3. **Retry Logic:** Playwright built-in (2 retries in CI)
|
||||
4. **Stable Selectors:** Semantic selectors over CSS classes
|
||||
5. **Timeouts:** Generous timeouts for slow environments
|
||||
|
||||
### Known Issues
|
||||
- None currently identified
|
||||
|
||||
---
|
||||
|
||||
## Debugging Failed Tests
|
||||
|
||||
### Screenshot on Failure
|
||||
Screenshots automatically saved to `test-results/` on failure.
|
||||
|
||||
### Video Recording
|
||||
```bash
|
||||
# Enable video for all tests
|
||||
npm run test -- --video=on
|
||||
```
|
||||
|
||||
### Trace Viewer
|
||||
```bash
|
||||
# Tests run with trace on first retry
|
||||
# View trace:
|
||||
npx playwright show-trace test-results/.../trace.zip
|
||||
```
|
||||
|
||||
### Debug Mode
|
||||
```bash
|
||||
# Run in headed mode with slow-mo
|
||||
npm run test -- --headed --slow-mo=1000
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Maintenance
|
||||
|
||||
### Adding New Tests
|
||||
1. Identify user journey or feature
|
||||
2. Choose appropriate suite file
|
||||
3. Write test following existing patterns
|
||||
4. Run locally: `npm run test path/to/test.spec.ts`
|
||||
5. Update this README with coverage
|
||||
|
||||
### Updating Selectors
|
||||
When UI changes:
|
||||
1. Run tests to identify failures
|
||||
2. Update selectors in failed tests
|
||||
3. Prefer semantic selectors (`getByRole`, `getByLabel`)
|
||||
4. Verify across all browsers
|
||||
|
||||
### Performance Benchmarks
|
||||
Current baselines:
|
||||
- Homepage load: < 3s
|
||||
- Blog listing load: < 3s
|
||||
- Blog post load: < 3s
|
||||
- Form submission: < 2s
|
||||
|
||||
Update these if intentional changes occur.
|
||||
|
||||
---
|
||||
|
||||
## Best Practices
|
||||
|
||||
### DO ✅
|
||||
- Use semantic selectors
|
||||
- Wait for element visibility
|
||||
- Test user journeys, not implementation
|
||||
- Keep tests independent
|
||||
- Clean up test data
|
||||
- Use descriptive test names
|
||||
|
||||
### DON'T ❌
|
||||
- Use fixed delays (`waitForTimeout` sparingly)
|
||||
- Test implementation details
|
||||
- Make tests depend on each other
|
||||
- Hardcode credentials
|
||||
- Ignore flaky tests
|
||||
|
||||
---
|
||||
|
||||
## CI/CD Pipeline Integration
|
||||
|
||||
### GitHub Actions Example
|
||||
```yaml
|
||||
name: E2E Tests
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
- run: npm ci
|
||||
- run: npx playwright install --with-deps
|
||||
- run: npm run build
|
||||
- run: npm run preview &
|
||||
- run: npx wait-on http://localhost:10000
|
||||
- run: npm run test
|
||||
- uses: actions/upload-artifact@v3
|
||||
if: always()
|
||||
with:
|
||||
name: test-results
|
||||
path: test-results/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Contact & Support
|
||||
|
||||
For questions about E2E tests:
|
||||
- Check test file comments for specific test logic
|
||||
- Review Playwright documentation: https://playwright.dev
|
||||
- Contact QA team for test strategy questions
|
||||
|
||||
---
|
||||
|
||||
## Changelog
|
||||
|
||||
### 2026-03-21
|
||||
- ✅ Initial E2E test suite creation
|
||||
- ✅ 84 comprehensive tests across 4 suites
|
||||
- ✅ Full coverage of critical user journeys
|
||||
- ✅ Mobile and desktop testing
|
||||
- ✅ Performance and security checks
|
||||
- ✅ Accessibility validation
|
||||
Reference in New Issue
Block a user