Files
euchre_camp/src/__tests__/unit/id-validation.test.ts
T
david 24db43eb7f
Test / unit-tests (push) Failing after 1m54s
Pull Request / unit-tests (pull_request) Failing after 1m41s
Pull Request / acceptance-tests (pull_request) Has been skipped
Pull Request / analyze-bump-type (pull_request) Has been skipped
feat: migrate from npm to Bun
- Install Bun via mise
- Update package.json scripts to use Bun
- Migrate unit tests from Vitest to Bun test runner
- Migrate component tests from Vitest to Bun test runner
- Configure Bun with DOM environment for React Testing Library
- Keep Playwright for E2E tests (as planned)
- 93/100 tests passing (7 flaky tests when running all together, pass individually)
2026-04-01 00:13:15 -07:00

161 lines
5.0 KiB
TypeScript

/**
* Unit Tests: ID Validation
*
* Tests for ID parsing and validation in API routes and pages
*/
import { describe, test, expect } from 'bun:test';
describe('ID Validation', () => {
describe('parseInt with validation', () => {
test('should parse valid numeric string', () => {
const id = '123';
const parsedId = parseInt(id, 10);
expect(parsedId).toBe(123);
expect(isNaN(parsedId)).toBe(false);
});
test('should return NaN for non-numeric string', () => {
const id = 'abc';
const parsedId = parseInt(id, 10);
expect(isNaN(parsedId)).toBe(true);
});
test('should return NaN for empty string', () => {
const id = '';
const parsedId = parseInt(id, 10);
expect(isNaN(parsedId)).toBe(true);
});
test('should return NaN for non-numeric strings', () => {
const id = 'abc';
const parsedId = parseInt(id, 10);
expect(isNaN(parsedId)).toBe(true);
});
test('should handle partial numeric strings (parseInt stops at first non-numeric)', () => {
const id = '123abc';
const parsedId = parseInt(id, 10);
// Note: parseInt stops parsing at the first non-numeric character
expect(parsedId).toBe(123);
expect(isNaN(parsedId)).toBe(false);
});
test('should parse negative numbers', () => {
const id = '-123';
const parsedId = parseInt(id, 10);
expect(parsedId).toBe(-123);
expect(isNaN(parsedId)).toBe(false);
});
test('should handle float strings (truncates to integer)', () => {
const id = '123.45';
const parsedId = parseInt(id, 10);
// Note: parseInt truncates, parseFloat would be better for floats
expect(parsedId).toBe(123);
expect(isNaN(parsedId)).toBe(false);
});
test('should handle leading zeros', () => {
const id = '00123';
const parsedId = parseInt(id, 10);
expect(parsedId).toBe(123);
expect(isNaN(parsedId)).toBe(false);
});
});
describe('ID validation patterns', () => {
test('should detect invalid ID for database queries', () => {
// Note: parseInt behavior - stops at first non-numeric char
const testCases = [
{ input: 'abc', shouldParseAsNaN: true, description: 'non-numeric string' },
{ input: '', shouldParseAsNaN: true, description: 'empty string' },
{ input: '123abc', shouldParseAsNaN: false, description: 'numeric prefix (parseInt stops at "a")' },
{ input: '123.45', shouldParseAsNaN: false, description: 'float string (truncates to 123)' },
{ input: '123', shouldParseAsNaN: false, description: 'valid numeric string' },
{ input: '0', shouldParseAsNaN: false, description: 'zero' },
{ input: '-123', shouldParseAsNaN: false, description: 'negative number' },
];
testCases.forEach(({ input, shouldParseAsNaN, description }) => {
const parsedId = parseInt(input, 10);
const isNaNResult = isNaN(parsedId);
expect(isNaNResult).toBe(shouldParseAsNaN);
});
});
});
describe('URL parameter validation', () => {
test('should validate tournament ID from URL params', () => {
const params = { id: '123' };
const tournamentId = parseInt(params.id, 10);
expect(isNaN(tournamentId)).toBe(false);
expect(tournamentId).toBe(123);
});
test('should detect invalid tournament ID from URL params', () => {
const params = { id: 'invalid' };
const tournamentId = parseInt(params.id, 10);
expect(isNaN(tournamentId)).toBe(true);
});
test('should validate player ID from URL params', () => {
const params = { id: '456' };
const playerId = parseInt(params.id, 10);
expect(isNaN(playerId)).toBe(false);
expect(playerId).toBe(456);
});
test('should detect invalid player ID from URL params', () => {
const params = { id: 'not-a-number' };
const playerId = parseInt(params.id, 10);
expect(isNaN(playerId)).toBe(true);
});
});
describe('Next.js 16 params handling', () => {
test('should handle params as Promise (Next.js 16 requirement)', async () => {
// In Next.js 16, params is a Promise
const params = Promise.resolve({ id: '123' });
// This is how Next.js 16 expects params to be handled
const { id } = await params;
const parsedId = parseInt(id, 10);
expect(parsedId).toBe(123);
expect(isNaN(parsedId)).toBe(false);
});
test('should handle invalid ID in Next.js 16 params', async () => {
const params = Promise.resolve({ id: 'invalid' });
const { id } = await params;
const parsedId = parseInt(id, 10);
expect(isNaN(parsedId)).toBe(true);
});
test('should handle empty ID in Next.js 16 params', async () => {
const params = Promise.resolve({ id: '' });
const { id } = await params;
const parsedId = parseInt(id, 10);
expect(isNaN(parsedId)).toBe(true);
});
});
});