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.ts → foo.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

architecture-review
sentry
स्टाफ-स्तरीय कोडबेस स्वास्थ्य समीक्षा। मोनोलिथिक मॉड्यूल, मूक विफलताएं, प्रकार सुरक्षा अंतराल, परीक्षण कवरेज छिद्र और एलएलएम-मित्रता मुद्दों का पता लगाता है।
pi-agent-integration
sentry
Integrate `@mariozechner/pi-agent-core` as the agent abstraction inside another library or runtime. Use when implementing or refactoring Pi Agent wrappers,…
sentry-debug-issue
sentry
Sentry समस्या को डीबग और ठीक करें — इसे खोजें (लिंक, ID, या खोज द्वारा), पूरा संदर्भ प्राप्त करें (stack trace, breadcrumbs, trace, logs), वैकल्पिक रूप से Seer root-cause चलाएँ /…
sentry-svelte-sdk
sentry
Svelte और SvelteKit के लिए पूर्ण Sentry SDK सेटअप। जब "Svelte में Sentry जोड़ें", "SvelteKit में Sentry जोड़ें", "@sentry/sveltekit इंस्टॉल करें" या कॉन्फ़िगर करने के लिए कहा जाए तो उपयोग करें…
sentry-svelte-sdk
sentry
Svelte और SvelteKit के लिए पूर्ण Sentry SDK सेटअप। जब "Svelte में Sentry जोड़ें", "SvelteKit में Sentry जोड़ें", "@sentry/sveltekit इंस्टॉल करें" या कॉन्फ़िगर करने के लिए कहा जाए तो उपयोग करें…
skill-scanner
sentry
एजेंट कौशल को सुरक्षा समस्याओं के लिए स्कैन करें। जब "कौशल स्कैन करें" कहा जाए तो उपयोग करें।
prompt-optimizer
sentry
एजेंट प्रॉम्प्ट, सिस्टम प्रॉम्प्ट, डेवलपर प्रॉम्प्ट और पुन: प्रयोज्य प्रॉम्प्ट टेम्पलेट बनाता है, अनुकूलित करता है और पुनरावृत्त रूप से परिष्कृत करता है। जब किसी को बेहतर बनाने के लिए कहा जाए तो उपयोग करें...
commit
sentry
कमिट — getsentry/sentry-docs द्वारा प्रकाशित AI एजेंटों के लिए एक इंस्टॉल करने योग्य कौशल।