Add unit and integration test suites

- Shared: link building, feed ordering, input schemas, API client
- API unit: track matching, private-address blocking, token crypto,
  plan expiry, provider response parsing
- API integration against Postgres and Redis: auth, follows and pins,
  now-playing state, webhooks, OAuth return URLs, realtime, rate limits
- Tests use a dedicated *_test database and Redis DB, and refuse to wipe
  anything else; fetch is stubbed so they never hit the network
- Pin Node to 22.13+ (.nvmrc), which Vite's native bindings require

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MzFywujuH9TiuXbr9vjoX8
This commit is contained in:
2026-10-03 11:28:17 -04:00
co-authored by Claude Opus 5.5
parent 95cd740e51
commit fe503307df
29 changed files with 3281 additions and 10 deletions
+14
View File
@@ -0,0 +1,14 @@
import { describe, expect, it } from 'vitest';
import { useTestApp } from './helpers';
const app = useTestApp({ rateLimits: true });
describe('rate limits', () => {
it('throttles login attempts per client', async () => {
const attempt = () => app().inject({ method: 'POST', url: '/auth/login', payload: { email: 'a@b.co', password: 'x' } });
const codes = [];
for (let i = 0; i < 11; i++) codes.push((await attempt()).statusCode);
expect(codes.slice(0, 10).every((c) => c === 401)).toBe(true);
expect(codes[10]).toBe(429);
});
});