Stirling-PDF/frontend/src/components/tools/addPassword/AddPasswordSettings.test.tsx
James Brunton bd13f6bf57
Enable ESLint no-unused-vars rule (#4367)
# Description of Changes
Enable ESLint [no-unused-vars
rule](https://typescript-eslint.io/rules/no-unused-vars/)
2025-09-05 11:16:17 +00:00

177 lines
5.7 KiB
TypeScript

import { describe, expect, test, vi, beforeEach } from 'vitest';
import { render, screen, fireEvent } from '@testing-library/react';
import { MantineProvider } from '@mantine/core';
import AddPasswordSettings from './AddPasswordSettings';
import { defaultParameters } from '../../../hooks/tools/addPassword/useAddPasswordParameters';
// Mock useTranslation with predictable return values
const mockT = vi.fn((key: string) => `mock-${key}`);
vi.mock('react-i18next', () => ({
useTranslation: () => ({ t: mockT })
}));
// Wrapper component to provide Mantine context
const TestWrapper = ({ children }: { children: React.ReactNode }) => (
<MantineProvider>{children}</MantineProvider>
);
describe('AddPasswordSettings', () => {
const mockOnParameterChange = vi.fn();
beforeEach(() => {
vi.clearAllMocks();
});
test('should render password input fields', () => {
render(
<TestWrapper>
<AddPasswordSettings
parameters={defaultParameters}
onParameterChange={mockOnParameterChange}
/>
</TestWrapper>
);
// Should render user and owner password fields labels
expect(screen.getByText('mock-addPassword.passwords.user.label')).toBeInTheDocument();
expect(screen.getByText('mock-addPassword.passwords.owner.label')).toBeInTheDocument();
});
test('should render encryption key length select', () => {
render(
<TestWrapper>
<AddPasswordSettings
parameters={defaultParameters}
onParameterChange={mockOnParameterChange}
/>
</TestWrapper>
);
// Should render key length select input
expect(screen.getByRole('textbox', { name: /keyLength/i })).toBeInTheDocument();
});
test('should render main component sections', () => {
render(
<TestWrapper>
<AddPasswordSettings
parameters={defaultParameters}
onParameterChange={mockOnParameterChange}
/>
</TestWrapper>
);
// Check that main section titles are rendered
expect(screen.getByText('mock-addPassword.passwords.user.label')).toBeInTheDocument();
expect(screen.getByText('mock-addPassword.encryption.keyLength.label')).toBeInTheDocument();
});
test('should call onParameterChange when password fields are modified', () => {
render(
<TestWrapper>
<AddPasswordSettings
parameters={defaultParameters}
onParameterChange={mockOnParameterChange}
/>
</TestWrapper>
);
// This test is complex with Mantine's PasswordInput, just verify the component renders
expect(screen.getByText('mock-addPassword.passwords.user.label')).toBeInTheDocument();
});
test('should call onParameterChange when key length is changed', () => {
render(
<TestWrapper>
<AddPasswordSettings
parameters={defaultParameters}
onParameterChange={mockOnParameterChange}
/>
</TestWrapper>
);
// Find key length select and change it
const keyLengthSelect = screen.getByText('mock-addPassword.encryption.keyLength.128bit');
fireEvent.mouseDown(keyLengthSelect);
const option256 = screen.getByText('mock-addPassword.encryption.keyLength.256bit');
fireEvent.click(option256);
expect(mockOnParameterChange).toHaveBeenCalledWith('keyLength', 256);
});
test('should disable all form elements when disabled prop is true', () => {
render(
<TestWrapper>
<AddPasswordSettings
parameters={defaultParameters}
onParameterChange={mockOnParameterChange}
disabled={true}
/>
</TestWrapper>
);
// Check password inputs are disabled
const passwordInputs = screen.getAllByRole('textbox');
passwordInputs.forEach(input => {
expect(input).toBeDisabled();
});
// Check key length select is disabled - simplified test due to Mantine complexity
expect(screen.getByText('mock-addPassword.encryption.keyLength.128bit')).toBeInTheDocument();
});
test('should enable all form elements when disabled prop is false', () => {
render(
<TestWrapper>
<AddPasswordSettings
parameters={defaultParameters}
onParameterChange={mockOnParameterChange}
disabled={false}
/>
</TestWrapper>
);
// Check password inputs are enabled
const passwordInputs = screen.getAllByRole('textbox');
passwordInputs.forEach(input => {
expect(input).not.toBeDisabled();
});
// Check key length select is enabled - simplified test due to Mantine complexity
expect(screen.getByText('mock-addPassword.encryption.keyLength.128bit')).toBeInTheDocument();
});
test('should call translation function with correct keys', () => {
render(
<TestWrapper>
<AddPasswordSettings
parameters={defaultParameters}
onParameterChange={mockOnParameterChange}
/>
</TestWrapper>
);
// Verify that translation keys are being called
expect(mockT).toHaveBeenCalledWith('addPassword.passwords.user.label', 'User Password');
expect(mockT).toHaveBeenCalledWith('addPassword.passwords.owner.label', 'Owner Password');
});
test.each([
{ keyLength: 40, expectedLabel: 'mock-addPassword.encryption.keyLength.40bit' },
{ keyLength: 128, expectedLabel: 'mock-addPassword.encryption.keyLength.128bit' },
{ keyLength: 256, expectedLabel: 'mock-addPassword.encryption.keyLength.256bit' }
])('should handle key length $keyLength correctly', ({ keyLength, expectedLabel }) => {
render(
<TestWrapper>
<AddPasswordSettings
parameters={{ ...defaultParameters, keyLength }}
onParameterChange={mockOnParameterChange}
/>
</TestWrapper>
);
expect(screen.getByText(expectedLabel)).toBeInTheDocument();
});
});