write-tests

द्वारा sentry

परियोजना की परंपराओं का पालन करते हुए परीक्षण लिखें। नए परीक्षण जोड़ते समय या मौजूदा परीक्षणों को संशोधित करते समय उपयोग करें।

npx skills add https://github.com/getsentry/abacus --skill write-tests

Write Tests Skill

Write tests using Vitest. Tests are colocated next to source files.

Structure

src/lib/utils.ts
src/lib/utils.test.ts        # colocated
src/app/api/stats/route.ts
src/app/api/stats/route.test.ts
src/test-utils/
├── setup.ts        # global setup (PGlite, MSW, auth mock)
├── msw-handlers.ts # external API mocks
└── auth.ts         # auth test helpers

Auth Testing

Auth is globally mocked. Use helpers to control auth state:

import { mockAuthenticated, mockUnauthenticated } from '@/test-utils/auth';

it('returns 401 when unauthenticated', async () => {
  await mockUnauthenticated();
  const response = await GET(new Request('http://localhost/api/foo'));
  expect(response.status).toBe(401);
});

it('returns data when authenticated', async () => {
  await mockAuthenticated(); // uses default test user
  // or with overrides:
  await mockAuthenticated({ email: 'custom@example.com' });

  const response = await GET(new Request('http://localhost/api/foo'));
  expect(response.status).toBe(200);
});

Default test user: test@example.com / Test User

Database Testing

Uses PGlite (in-memory PostgreSQL). No Docker required.

  • Schema pushed automatically on boot
  • Each test runs in a transaction that rolls back
  • Use insertUsageRecord from @/lib/queries to seed data
import { insertUsageRecord, getOverallStats } from '@/lib/queries';

beforeEach(async () => {
  await insertUsageRecord({
    date: '2025-01-01',
    email: 'user@example.com',
    tool: 'claude_code',
    model: 'sonnet-4',
    rawModel: 'claude-sonnet-4-20250514',
    inputTokens: 1000,
    outputTokens: 500,
    cacheWriteTokens: 0,
    cacheReadTokens: 0,
    cost: 0.01,
  });
});

Running Tests

pnpm test        # run all
pnpm test:watch  # watch mode

Key Rules

  1. Colocate tests next to source (foo.tsfoo.test.ts)
  2. Use mockAuthenticated()/mockUnauthenticated() for auth
  3. Use insertUsageRecord for seeding database
  4. External APIs mocked via MSW in src/test-utils/msw-handlers.ts

CRITICAL: Auth Tests Required

Every protected route MUST have an auth test. This is non-negotiable.

Session-Authenticated Routes

Routes using getSession() must verify 401 on unauthenticated requests:

it('returns 401 for unauthenticated requests', async () => {
  await mockUnauthenticated();
  const response = await GET(new Request('http://localhost/api/your-route'));
  expect(response.status).toBe(401);
});

Cron Routes

Routes using CRON_SECRET must verify auth:

beforeEach(() => {
  vi.stubEnv('CRON_SECRET', 'test-secret');
});

it('returns 401 without authorization header', async () => {
  const response = await GET(new Request('http://localhost/api/cron/your-route'));
  expect(response.status).toBe(401);
});

it('returns 401 with invalid authorization', async () => {
  const response = await GET(
    new Request('http://localhost/api/cron/your-route', {
      headers: { Authorization: 'Bearer wrong-secret' },
    })
  );
  expect(response.status).toBe(401);
});

Webhook Routes

Routes with signature verification must test invalid signatures:

it('returns 401 without signature', async () => {
  const response = await POST(
    new Request('http://localhost/api/webhooks/github', {
      method: 'POST',
      body: '{}',
    })
  );
  expect(response.status).toBe(401);
});

it('returns 401 with invalid signature', async () => {
  const response = await POST(
    new Request('http://localhost/api/webhooks/github', {
      method: 'POST',
      body: '{}',
      headers: { 'x-hub-signature-256': 'sha256=invalid' },
    })
  );
  expect(response.status).toBe(401);
});

When adding a new route, always ask: "What auth does this route require?" and add the corresponding auth test.

sentry की और Skills

generate-frontend-forms
sentry
Sentry के नए फॉर्म सिस्टम का उपयोग करके फॉर्म बनाने के लिए मार्गदर्शिका। फॉर्म, फॉर्म फ़ील्ड, सत्यापन या ऑटो-सेव कार्यक्षमता लागू करते समय उपयोग करें।
official
sentry-snapshots-cocoa
sentry
Apple/Cocoa प्रोजेक्ट्स के लिए पूर्ण Sentry Snapshots सेटअप। जब "setup SnapshotPreviews", "setup Apple snapshot testing", "upload Apple snapshots to…" के लिए कहा जाए तो उपयोग करें।
official
architecture-review
sentry
स्टाफ-स्तरीय कोडबेस स्वास्थ्य समीक्षा। मोनोलिथिक मॉड्यूल, मूक विफलताएं, प्रकार सुरक्षा अंतराल, परीक्षण कवरेज छिद्र और एलएलएम-मित्रता मुद्दों का पता लगाता है।
official
linear-type-labeler
sentry
लीनियर इश्यूज को वर्गीकृत करता है और प्रत्येक इश्यू के शीर्षक और विवरण की सामग्री के आधार पर सेंट्री वर्कस्पेस की लेबल वर्गीकरण से एक टाइप लेबल लागू करता है।
official
sentry-flutter-sdk
sentry
Flutter और Dart के लिए पूर्ण Sentry SDK सेटअप। जब "Flutter में Sentry जोड़ें", "sentry_flutter इंस्टॉल करें", "Dart में Sentry सेटअप करें" या त्रुटि कॉन्फ़िगर करने के लिए कहा जाए तो इसका उपयोग करें…
official
sentry-svelte-sdk
sentry
Svelte और SvelteKit के लिए पूर्ण Sentry SDK सेटअप। जब "Svelte में Sentry जोड़ें", "SvelteKit में Sentry जोड़ें", "@sentry/sveltekit इंस्टॉल करें" या कॉन्फ़िगर करने के लिए कहा जाए तो उपयोग करें…
official
vercel-react-best-practices
sentry
React और Next.js प्रदर्शन अनुकूलन दिशानिर्देश Vercel Engineering से। इस कौशल का उपयोग React/Next.js को लिखने, समीक्षा करने या रीफैक्टर करते समय किया जाना चाहिए…
official
sentry-tanstack-start-sdk
sentry
TanStack Start React के लिए पूर्ण Sentry SDK सेटअप। जब "TanStack Start में Sentry जोड़ें", "@sentry/tanstackstart-react इंस्टॉल करें", या त्रुटि कॉन्फ़िगर करने के लिए कहा जाए तो उपयोग करें…
official