mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-20 06:20:11 +00:00
## Summary
Adds a GitHub Actions workflow + TypeScript script that posts to Slack
when a merged PR improves unit or E2E test coverage.
## Changes
- **What**: New `coverage-slack-notify.yaml` workflow triggered on push
to main. Compares current coverage against previous baselines, generates
Slack Block Kit payload with progress bars and milestone celebrations,
posts to `#p-frontend-automated-testing`.
- **Script**: `scripts/coverage-slack-notify.ts` — parses lcov files,
computes deltas, detects milestone crossings (every 5%), builds Slack
payload. Pure functions exported for testability.
- **Tests**: 26 unit tests in `scripts/coverage-slack-notify.test.ts`
covering all pure functions including edge cases (malformed lcov, exact
boundaries, zero coverage).
### Security hardening
- All `${{ }}` expressions moved from `run:` blocks to `env:` variables
- `SLACK_BOT_TOKEN` passed via env var, not inline
- Unique heredoc delimiter (timestamp-based) prevents payload injection
- `parseInt` fallback (`|| 0`) guards against malformed lcov
- PR regex anchored to first line of commit message
### Robustness
- `continue-on-error: true` on Slack post step (outage does not fail the
job)
- Baseline save guarded by `steps.unit-tests.outcome == success`
(prevents corrupt baselines on test failure)
- Channel ID commented for maintainability
- Top-level `text` field added for Slack mobile push notifications
- Author linked to GitHub profile instead of bare `@username`
## Review Focus
- Workflow step ordering and conditional logic
- Security of expression handling and secret management
- Slack payload structure and Block Kit formatting
┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-10977-feat-add-Slack-notification-workflow-for-coverage-improvements-33d6d73d3650819c8950f483c83f297c)
by [Unito](https://www.unito.io)
---------
Co-authored-by: GitHub Action <action@github.com>
90 lines
1.8 KiB
TypeScript
90 lines
1.8 KiB
TypeScript
import type { PlaywrightTestConfig } from '@playwright/test'
|
|
import { defineConfig, devices } from '@playwright/test'
|
|
|
|
const maybeLocalOptions: PlaywrightTestConfig = process.env.PLAYWRIGHT_LOCAL
|
|
? {
|
|
timeout: 30_000,
|
|
retries: 0,
|
|
workers: 1,
|
|
use: {
|
|
trace: 'on',
|
|
video: 'on'
|
|
}
|
|
}
|
|
: {
|
|
retries: process.env.CI ? 3 : 0,
|
|
use: {
|
|
trace: 'on-first-retry'
|
|
}
|
|
}
|
|
|
|
export default defineConfig({
|
|
testDir: './browser_tests',
|
|
fullyParallel: true,
|
|
forbidOnly: !!process.env.CI,
|
|
reporter: 'html',
|
|
...maybeLocalOptions,
|
|
|
|
globalSetup: './browser_tests/globalSetup.ts',
|
|
globalTeardown: './browser_tests/globalTeardown.ts',
|
|
|
|
projects: [
|
|
{
|
|
name: 'chromium',
|
|
use: { ...devices['Desktop Chrome'] },
|
|
timeout: 15000,
|
|
grepInvert: /@mobile|@perf|@audit|@cloud/
|
|
},
|
|
|
|
{
|
|
name: 'performance',
|
|
use: {
|
|
...devices['Desktop Chrome'],
|
|
trace: 'retain-on-failure'
|
|
},
|
|
timeout: 60_000,
|
|
grep: /@perf/,
|
|
fullyParallel: false
|
|
},
|
|
|
|
{
|
|
name: 'audit',
|
|
use: {
|
|
...devices['Desktop Chrome'],
|
|
trace: 'retain-on-failure'
|
|
},
|
|
timeout: 120_000,
|
|
grep: /@audit/,
|
|
fullyParallel: false
|
|
},
|
|
|
|
{
|
|
name: 'chromium-2x',
|
|
use: { ...devices['Desktop Chrome'], deviceScaleFactor: 2 },
|
|
timeout: 15000,
|
|
grep: /@2x/
|
|
},
|
|
|
|
{
|
|
name: 'chromium-0.5x',
|
|
use: { ...devices['Desktop Chrome'], deviceScaleFactor: 0.5 },
|
|
timeout: 15000,
|
|
grep: /@0.5x/
|
|
},
|
|
|
|
{
|
|
name: 'cloud',
|
|
use: { ...devices['Desktop Chrome'] },
|
|
timeout: 15000,
|
|
grep: /@cloud/,
|
|
grepInvert: /@oss/
|
|
},
|
|
|
|
{
|
|
name: 'mobile-chrome',
|
|
use: { ...devices['Pixel 5'], hasTouch: true },
|
|
grep: /@mobile/
|
|
}
|
|
]
|
|
})
|