blog-smoke-tests
Run Playwright smoke tests for Denser blog application. Executes 15 tests (SMOKE-01 to SMOKE-15) against configurable environment (production, dev, or localhost) with retry support (max 3 attempts per failing test). Supports headed (visible browser) and headless modes. Collects artifacts (screenshots, trace.zip) on failures and generates HTML report. Use when testing blog functionality, verifying deployments, checking UI/API consistency, or when user requests smoke tests, playwright tests, or blog testing.
Best use case
blog-smoke-tests is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Run Playwright smoke tests for Denser blog application. Executes 15 tests (SMOKE-01 to SMOKE-15) against configurable environment (production, dev, or localhost) with retry support (max 3 attempts per failing test). Supports headed (visible browser) and headless modes. Collects artifacts (screenshots, trace.zip) on failures and generates HTML report. Use when testing blog functionality, verifying deployments, checking UI/API consistency, or when user requests smoke tests, playwright tests, or blog testing.
Teams using blog-smoke-tests should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/blog-smoke-tests/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How blog-smoke-tests Compares
| Feature / Agent | blog-smoke-tests | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Run Playwright smoke tests for Denser blog application. Executes 15 tests (SMOKE-01 to SMOKE-15) against configurable environment (production, dev, or localhost) with retry support (max 3 attempts per failing test). Supports headed (visible browser) and headless modes. Collects artifacts (screenshots, trace.zip) on failures and generates HTML report. Use when testing blog functionality, verifying deployments, checking UI/API consistency, or when user requests smoke tests, playwright tests, or blog testing.
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# Blog Smoke Tests Skill
Run Playwright smoke tests against the Denser blog application.
## Features
- **15 smoke tests** organized by priority (P0-P4)
- **Retry logic** - max 3 attempts per failing test
- **Headed/headless modes** - choose visible or background execution
- **Artifact collection** - screenshots and trace.zip on failures
- **HTML report** - comprehensive test results report
- **Tracing** - Playwright traces for debugging failures
## Workflow
### Step 1: Ask User Preferences
Before running tests, ask user:
1. **Target environment**:
- **Production** (default) - https://blog.openhive.network
- **Dev** - https://blog.dev.openhive.network
- **Localhost** - http://localhost:3000
2. **Browser mode**:
- **Headed** (default) - visible browser, good for debugging
- **Headless** - faster, for CI/CD
3. **Test scope**:
- **All** - run all 15 tests
- **P0** - critical tests only (SMOKE-01, 04, 08)
- **P1** - important tests (SMOKE-05, 06, 07)
- **P2** - tooltip tests (SMOKE-02, 03, 09)
- **P3** - navigation tests (SMOKE-10, 11, 12)
- **P4** - additional tests (SMOKE-13, 14, 15)
### Step 2: Prepare Directories
```bash
# Create temp and report directories
mkdir -p /storage1/denser/apps/blog/playwright/temp_ai_script_tests
mkdir -p /storage1/denser/apps/blog/playwright/temp_ai_report_tests
# Copy test scripts
cp /storage1/denser/.claude/skills/blog-smoke-tests/scripts/smoke-*.mjs /storage1/denser/apps/blog/playwright/temp_ai_script_tests/
```
### Step 3: Run Tests with Retry Logic
For each test:
1. Run test script with `REPORT_DIR` set
2. If FAIL, retry up to 2 more times (max 3 attempts total)
3. Wait 2 seconds between retries
4. Collect JSON result from output (line starting with `__RESULT__`)
5. On failure: artifacts saved automatically (screenshot + trace.zip)
**Command to run single test:**
```bash
cd /storage1/denser/apps/blog
BASE_URL=https://blog.openhive.network HEADLESS=false REPORT_DIR=./playwright/temp_ai_report_tests pnpm exec node playwright/temp_ai_script_tests/smoke-XX-name.mjs
```
Replace:
- `BASE_URL=https://blog.openhive.network` with chosen environment URL
- `HEADLESS=false` with `HEADLESS=true` for headless mode
**Parsing JSON result:**
Each test outputs a JSON line prefixed with `__RESULT__`:
```
__RESULT__{"id":"SMOKE-01","name":"Homepage Posts","priority":"P0","passed":true,"error":null,"artifacts":[]}
```
### Step 4: Generate HTML Report
After running all tests, collect results and generate HTML report:
```bash
# Option 1: Using generate-report.mjs script
cd /storage1/denser/apps/blog
pnpm exec node /storage1/denser/.claude/skills/blog-smoke-tests/scripts/generate-report.mjs '[results-json-array]'
```
Alternatively, create report manually based on collected results.
**Report location:** `./playwright/temp_ai_report_tests/report.html`
### Step 5: Cleanup
After all tests complete:
```bash
rm -f /storage1/denser/apps/blog/playwright/temp_ai_script_tests/smoke-*.mjs
```
Keep report directory with:
- `report.html` - HTML test report
- `SMOKE-XX-failure.png` - screenshots of failures
- `SMOKE-XX-trace.zip` - Playwright traces for failures
### Step 6: Summary
Present results:
```
========================================
SMOKE TEST SUMMARY: X/Y PASSED
========================================
✓ [P0] SMOKE-01: Homepage Posts
✓ [P0] SMOKE-04: Post Navigation
✓ [P0] SMOKE-08: User Profile
✓ [P1] SMOKE-05: Votes API
...
✗ [P3] SMOKE-11: Categories (3 attempts)
...
========================================
HTML Report: ./playwright/temp_ai_report_tests/report.html
Artifacts: ./playwright/temp_ai_report_tests/
To view traces: npx playwright show-trace ./playwright/temp_ai_report_tests/SMOKE-XX-trace.zip
```
## Artifacts on Failure
When a test fails, the following artifacts are saved:
| Artifact | Description | Location |
|----------|-------------|----------|
| Screenshot | Full page screenshot at failure | `SMOKE-XX-failure.png` |
| Trace | Playwright trace with snapshots | `SMOKE-XX-trace.zip` |
**Viewing Traces:**
```bash
cd /storage1/denser/apps/blog
npx playwright show-trace ./playwright/temp_ai_report_tests/SMOKE-04-trace.zip
```
## Test Catalog
| Priority | ID | Name | Script |
|----------|-----|------|--------|
| P0 | SMOKE-01 | Homepage Posts | smoke-01-homepage-posts.mjs |
| P0 | SMOKE-04 | Post Navigation | smoke-04-post-navigation.mjs |
| P0 | SMOKE-08 | User Profile | smoke-08-profile.mjs |
| P1 | SMOKE-05 | Votes API | smoke-05-votes-api.mjs |
| P1 | SMOKE-06 | Comments | smoke-06-comments.mjs |
| P1 | SMOKE-07 | Payout | smoke-07-payout.mjs |
| P2 | SMOKE-02 | Votes Tooltip | smoke-02-votes-tooltip.mjs |
| P2 | SMOKE-03 | Payout Tooltip | smoke-03-payout-tooltip.mjs |
| P2 | SMOKE-09 | Followers | smoke-09-followers.mjs |
| P3 | SMOKE-10 | Tags | smoke-10-tags.mjs |
| P3 | SMOKE-11 | Categories | smoke-11-categories.mjs |
| P3 | SMOKE-12 | Communities | smoke-12-communities.mjs |
| P4 | SMOKE-13 | Static Pages | smoke-13-static-pages.mjs |
| P4 | SMOKE-14 | Theme Toggle | smoke-14-theme.mjs |
| P4 | SMOKE-15 | Login Button | smoke-15-login.mjs |
## Retry Logic Pattern
```javascript
const MAX_RETRIES = 3;
const results = [];
for (const test of tests) {
let passed = false;
let attempts = 0;
let lastError = null;
let artifacts = [];
for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
attempts = attempt;
const output = await runTest(test);
// Parse __RESULT__ from output
const resultLine = output.match(/__RESULT__(.+)/);
if (resultLine) {
const result = JSON.parse(resultLine[1]);
passed = result.passed;
lastError = result.error;
artifacts = result.artifacts;
}
if (passed) break;
if (attempt < MAX_RETRIES) {
console.log(`Retry ${attempt + 1}/${MAX_RETRIES} in 2 seconds...`);
await sleep(2000);
}
}
results.push({
id: test.id,
name: test.name,
priority: test.priority,
passed,
attempts,
error: lastError,
artifacts
});
}
```
## Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `BASE_URL` | Target environment URL | `https://blog.openhive.network` |
| `HEADLESS` | Run browser in headless mode | `false` (headed) |
| `REPORT_DIR` | Directory for artifacts and report | `./playwright/temp_ai_report_tests` |
### Available Environments
| Environment | URL |
|-------------|-----|
| Production | `https://blog.openhive.network` |
| Dev | `https://blog.dev.openhive.network` |
| Localhost | `http://localhost:3000` |
## Reference Documentation
- **Test patterns and selectors**: See [references/test-selectors.md](references/test-selectors.md)
- **Full documentation**: `/storage1/denser/docs/playwright-testing-notes.md`
- **Blog architecture**: `/storage1/denser/docs/denser-blog-architecture.md`
## Directories
| Path | Purpose |
|------|---------|
| Production URL | https://blog.openhive.network |
| Dev URL | https://blog.dev.openhive.network |
| Localhost URL | http://localhost:3000 |
| API URL | https://api.hive.blog |
| Working directory | /storage1/denser/apps/blog |
| Temp scripts | playwright/temp_ai_script_tests/ |
| Reports & artifacts | playwright/temp_ai_report_tests/ |
| Skill scripts | /storage1/denser/.claude/skills/blog-smoke-tests/scripts/ |Related Skills
inference-smoke-tests
Run repeatable inference smoke tests using geppetto/pinocchio example binaries (single-pass, streaming, tool-loop, OpenAI Responses thinking) including tmux-driven TUI tests. Use when refactors touch InferenceState/Session/EngineBuilder, tool calling loop, event sinks, provider request formatting, or when you need a quick 'does inference still work?' checklist.
write-blog
Write and publish blog posts in the SvelteKit markdown blog with header images, proper frontmatter, and organized media files.
blog-writing
Write compelling blog posts with proven structure — hook openings, scannable body sections, clear CTAs. Use this skill when drafting blog posts, articles, or content marketing pieces.
blog-voice-analyzer
Run the AI Voice Analyzer on blog content to detect AI-sounding patterns and get actionable rewrite suggestions. Use when reviewing or improving blog articles before publishing.
blog-experiential
Write experiential articles for marvinzhang.dev following 3-stage workflow (Outline → Writing → Refine). Use for personal insights, lessons learned, project retrospectives, and reflective pieces. Produces narrative-driven bilingual content with honest, practical takeaways. Requires blog-common skill.
astro-blog-write
Phase 3 - Writing blog content with human voice and SEO optimization
approve-blog
Approves a blog post draft for publishing by removing the draft flag. Use when the user says "approve", "publish", or "I'm done editing" a blog post.
symfony:api-platform-tests
Use when symfony api platform tests
Bruno Smoke Test Generator
Automatically generates Bruno (API testing tool) test collections from OpenAPI specs for smoke testing APIs. Bruno is a lightweight, open-source API testing alternative to Postman with text-based coll
bgo
Automates the complete Blender build-go workflow, from building and packaging your extension/add-on to removing old versions, installing, enabling, and launching Blender for quick testing and iteration.
code-commenting
Comprehensive code commenting methodology for Python projects. Use when user asks to add comments, annotations, or documentation to Python code files. Provides structured approach with module docstrings, class/function documentation, section separators, and inline comments.
code-cleaner
Refactor code to remove technical debt, eliminate dead code, and enforce SOLID principles without altering runtime behavior.