mirror of
https://github.com/Stirling-Tools/Stirling-PDF.git
synced 2025-09-23 20:16:15 +00:00

# Description of Changes Adds auto-redact tool to V2, with manual-redact in the UI but explicitly disabled. Also creates a shared component for the large buttons we're using in a couple different tools and uses consistently.
143 lines
4.6 KiB
TypeScript
143 lines
4.6 KiB
TypeScript
import { describe, expect, test, vi, beforeEach } from 'vitest';
|
|
import { renderHook } from '@testing-library/react';
|
|
import { buildRedactFormData, redactOperationConfig, useRedactOperation } from './useRedactOperation';
|
|
import { defaultParameters, RedactParameters } from './useRedactParameters';
|
|
|
|
// Mock the useToolOperation hook
|
|
vi.mock('../shared/useToolOperation', async () => {
|
|
const actual = await vi.importActual('../shared/useToolOperation'); // Need to keep ToolType etc.
|
|
return {
|
|
...actual,
|
|
useToolOperation: vi.fn()
|
|
};
|
|
});
|
|
|
|
// Mock the translation hook
|
|
vi.mock('react-i18next', () => ({
|
|
useTranslation: () => ({ t: vi.fn((_key: string, fallback: string) => fallback) })
|
|
}));
|
|
|
|
// Mock the error handler utility
|
|
vi.mock('../../../utils/toolErrorHandler', () => ({
|
|
createStandardErrorHandler: vi.fn(() => vi.fn())
|
|
}));
|
|
|
|
describe('buildRedactFormData', () => {
|
|
const mockFile = new File(['test content'], 'test.pdf', { type: 'application/pdf' });
|
|
|
|
test('should build form data for automatic mode', () => {
|
|
const parameters: RedactParameters = {
|
|
...defaultParameters,
|
|
mode: 'automatic',
|
|
wordsToRedact: ['Confidential', 'Secret'],
|
|
useRegex: true,
|
|
wholeWordSearch: true,
|
|
redactColor: '#FF0000',
|
|
customPadding: 0.5,
|
|
convertPDFToImage: false,
|
|
};
|
|
|
|
const formData = buildRedactFormData(parameters, mockFile);
|
|
|
|
expect(formData.get('fileInput')).toBe(mockFile);
|
|
expect(formData.get('listOfText')).toBe('Confidential\nSecret');
|
|
expect(formData.get('useRegex')).toBe('true');
|
|
expect(formData.get('wholeWordSearch')).toBe('true');
|
|
expect(formData.get('redactColor')).toBe('FF0000'); // Hash should be removed
|
|
expect(formData.get('customPadding')).toBe('0.5');
|
|
expect(formData.get('convertPDFToImage')).toBe('false');
|
|
});
|
|
|
|
test('should handle empty words array', () => {
|
|
const parameters: RedactParameters = {
|
|
...defaultParameters,
|
|
mode: 'automatic',
|
|
wordsToRedact: [],
|
|
};
|
|
|
|
const formData = buildRedactFormData(parameters, mockFile);
|
|
|
|
expect(formData.get('listOfText')).toBe('');
|
|
});
|
|
|
|
test('should join multiple words with newlines', () => {
|
|
const parameters: RedactParameters = {
|
|
...defaultParameters,
|
|
mode: 'automatic',
|
|
wordsToRedact: ['Word1', 'Word2', 'Word3'],
|
|
};
|
|
|
|
const formData = buildRedactFormData(parameters, mockFile);
|
|
|
|
expect(formData.get('listOfText')).toBe('Word1\nWord2\nWord3');
|
|
});
|
|
|
|
test.each([
|
|
{ description: 'remove hash from redact color', redactColor: '#123456', expected: '123456' },
|
|
{ description: 'handle redact color without hash', redactColor: 'ABCDEF', expected: 'ABCDEF' },
|
|
])('should $description', ({ redactColor, expected }) => {
|
|
const parameters: RedactParameters = {
|
|
...defaultParameters,
|
|
mode: 'automatic',
|
|
redactColor,
|
|
};
|
|
|
|
const formData = buildRedactFormData(parameters, mockFile);
|
|
|
|
expect(formData.get('redactColor')).toBe(expected);
|
|
});
|
|
|
|
test('should convert boolean parameters to strings', () => {
|
|
const parameters: RedactParameters = {
|
|
...defaultParameters,
|
|
mode: 'automatic',
|
|
useRegex: false,
|
|
wholeWordSearch: true,
|
|
convertPDFToImage: false,
|
|
};
|
|
|
|
const formData = buildRedactFormData(parameters, mockFile);
|
|
|
|
expect(formData.get('useRegex')).toBe('false');
|
|
expect(formData.get('wholeWordSearch')).toBe('true');
|
|
expect(formData.get('convertPDFToImage')).toBe('false');
|
|
});
|
|
|
|
test('should throw error for manual mode (not implemented)', () => {
|
|
const parameters: RedactParameters = {
|
|
...defaultParameters,
|
|
mode: 'manual',
|
|
};
|
|
|
|
expect(() => buildRedactFormData(parameters, mockFile)).toThrow('Manual redaction not yet implemented');
|
|
});
|
|
});
|
|
|
|
describe('useRedactOperation', () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
test('should call useToolOperation with correct configuration', async () => {
|
|
const { useToolOperation } = await import('../shared/useToolOperation');
|
|
const mockUseToolOperation = vi.mocked(useToolOperation);
|
|
|
|
renderHook(() => useRedactOperation());
|
|
|
|
expect(mockUseToolOperation).toHaveBeenCalledWith({
|
|
...redactOperationConfig,
|
|
getErrorMessage: expect.any(Function),
|
|
});
|
|
});
|
|
|
|
test('should provide error handler to useToolOperation', async () => {
|
|
const { useToolOperation } = await import('../shared/useToolOperation');
|
|
const mockUseToolOperation = vi.mocked(useToolOperation);
|
|
|
|
renderHook(() => useRedactOperation());
|
|
|
|
const callArgs = mockUseToolOperation.mock.calls[0][0];
|
|
expect(typeof callArgs.getErrorMessage).toBe('function');
|
|
});
|
|
});
|