Files
gridpilot.gg/apps/website/components/auth/AuthForm.test.tsx
Marc Mintel fb1221701d
Some checks failed
Contract Testing / contract-tests (push) Failing after 6m7s
Contract Testing / contract-snapshot (push) Failing after 4m46s
add tests
2026-01-22 11:52:42 +01:00

225 lines
6.4 KiB
TypeScript

import React from 'react';
import { describe, it, expect, vi } from 'vitest';
import { render, screen, fireEvent } from '@testing-library/react';
import { AuthForm } from './AuthForm';
describe('AuthForm', () => {
describe('rendering', () => {
it('should render with single child', () => {
const mockSubmit = vi.fn();
render(
<AuthForm onSubmit={mockSubmit}>
<input type="email" placeholder="Email" />
</AuthForm>
);
expect(screen.getByPlaceholderText('Email')).toBeInTheDocument();
});
it('should render with multiple children', () => {
const mockSubmit = vi.fn();
render(
<AuthForm onSubmit={mockSubmit}>
<input type="email" placeholder="Email" />
<input type="password" placeholder="Password" />
<button type="submit">Submit</button>
</AuthForm>
);
expect(screen.getByPlaceholderText('Email')).toBeInTheDocument();
expect(screen.getByPlaceholderText('Password')).toBeInTheDocument();
expect(screen.getByText('Submit')).toBeInTheDocument();
});
it('should render with form elements', () => {
const mockSubmit = vi.fn();
render(
<AuthForm onSubmit={mockSubmit}>
<label htmlFor="email">Email</label>
<input id="email" type="email" />
<label htmlFor="password">Password</label>
<input id="password" type="password" />
</AuthForm>
);
expect(screen.getByLabelText('Email')).toBeInTheDocument();
expect(screen.getByLabelText('Password')).toBeInTheDocument();
});
});
describe('form submission', () => {
it('should call onSubmit when form is submitted', () => {
const mockSubmit = vi.fn();
render(
<AuthForm onSubmit={mockSubmit}>
<input type="email" placeholder="Email" />
<button type="submit">Submit</button>
</AuthForm>
);
const form = screen.getByRole('form');
fireEvent.submit(form);
expect(mockSubmit).toHaveBeenCalledTimes(1);
});
it('should pass event to onSubmit handler', () => {
const mockSubmit = vi.fn();
render(
<AuthForm onSubmit={mockSubmit}>
<input type="email" placeholder="Email" />
<button type="submit">Submit</button>
</AuthForm>
);
const form = screen.getByRole('form');
fireEvent.submit(form);
expect(mockSubmit).toHaveBeenCalledWith(expect.objectContaining({
type: 'submit',
}));
});
it('should handle form submission with input values', () => {
const mockSubmit = vi.fn();
render(
<AuthForm onSubmit={mockSubmit}>
<input type="email" placeholder="Email" defaultValue="test@example.com" />
<input type="password" placeholder="Password" defaultValue="secret123" />
<button type="submit">Submit</button>
</AuthForm>
);
const form = screen.getByRole('form');
fireEvent.submit(form);
expect(mockSubmit).toHaveBeenCalledTimes(1);
});
it('should prevent default form submission', () => {
const mockSubmit = vi.fn();
render(
<AuthForm onSubmit={mockSubmit}>
<input type="email" placeholder="Email" />
<button type="submit">Submit</button>
</AuthForm>
);
const form = screen.getByRole('form');
const submitEvent = new Event('submit', { bubbles: true, cancelable: true });
const preventDefaultSpy = vi.spyOn(submitEvent, 'preventDefault');
fireEvent(form, submitEvent);
expect(preventDefaultSpy).toHaveBeenCalled();
});
});
describe('accessibility', () => {
it('should have proper form semantics', () => {
const mockSubmit = vi.fn();
render(
<AuthForm onSubmit={mockSubmit}>
<input type="email" placeholder="Email" />
</AuthForm>
);
const form = screen.getByRole('form');
expect(form).toBeInTheDocument();
});
it('should maintain proper input associations', () => {
const mockSubmit = vi.fn();
render(
<AuthForm onSubmit={mockSubmit}>
<label htmlFor="email">Email Address</label>
<input id="email" type="email" />
<label htmlFor="password">Password</label>
<input id="password" type="password" />
</AuthForm>
);
expect(screen.getByLabelText('Email Address')).toBeInTheDocument();
expect(screen.getByLabelText('Password')).toBeInTheDocument();
});
});
describe('edge cases', () => {
it('should handle empty children', () => {
const mockSubmit = vi.fn();
render(<AuthForm onSubmit={mockSubmit}>{null}</AuthForm>);
// Component should render without errors
});
it('should handle undefined children', () => {
const mockSubmit = vi.fn();
render(<AuthForm onSubmit={mockSubmit}>{undefined}</AuthForm>);
// Component should render without errors
});
it('should handle nested form elements', () => {
const mockSubmit = vi.fn();
render(
<AuthForm onSubmit={mockSubmit}>
<div>
<input type="email" placeholder="Email" />
</div>
</AuthForm>
);
expect(screen.getByPlaceholderText('Email')).toBeInTheDocument();
});
it('should handle complex form structure', () => {
const mockSubmit = vi.fn();
render(
<AuthForm onSubmit={mockSubmit}>
<fieldset>
<legend>Credentials</legend>
<input type="email" placeholder="Email" />
<input type="password" placeholder="Password" />
</fieldset>
<button type="submit">Submit</button>
</AuthForm>
);
expect(screen.getByText('Credentials')).toBeInTheDocument();
expect(screen.getByPlaceholderText('Email')).toBeInTheDocument();
expect(screen.getByPlaceholderText('Password')).toBeInTheDocument();
expect(screen.getByText('Submit')).toBeInTheDocument();
});
it('should handle multiple form submissions', () => {
const mockSubmit = vi.fn();
render(
<AuthForm onSubmit={mockSubmit}>
<input type="email" placeholder="Email" />
<button type="submit">Submit</button>
</AuthForm>
);
const form = screen.getByRole('form');
fireEvent.submit(form);
fireEvent.submit(form);
fireEvent.submit(form);
expect(mockSubmit).toHaveBeenCalledTimes(3);
});
});
});