From 697cb6a179864a96c77f778b6738a58148f1a695 Mon Sep 17 00:00:00 2001 From: James Brunton Date: Wed, 10 Sep 2025 16:53:31 +0100 Subject: [PATCH] Add tests --- .../AdjustPageScaleSettings.test.tsx | 64 ++++++++ .../useAdjustPageScaleParameters.test.ts | 142 ++++++++++++++++++ 2 files changed, 206 insertions(+) create mode 100644 frontend/src/components/tools/adjustPageScale/AdjustPageScaleSettings.test.tsx create mode 100644 frontend/src/hooks/tools/adjustPageScale/useAdjustPageScaleParameters.test.ts diff --git a/frontend/src/components/tools/adjustPageScale/AdjustPageScaleSettings.test.tsx b/frontend/src/components/tools/adjustPageScale/AdjustPageScaleSettings.test.tsx new file mode 100644 index 000000000..d71655cdc --- /dev/null +++ b/frontend/src/components/tools/adjustPageScale/AdjustPageScaleSettings.test.tsx @@ -0,0 +1,64 @@ +import { describe, expect, test, vi, beforeEach } from 'vitest'; +import { render, screen } from '@testing-library/react'; +import { MantineProvider } from '@mantine/core'; +import AdjustPageScaleSettings from './AdjustPageScaleSettings'; +import { AdjustPageScaleParameters, PageSize } from '../../../hooks/tools/adjustPageScale/useAdjustPageScaleParameters'; + +// Mock useTranslation with predictable return values +const mockT = vi.fn((key: string, fallback?: string) => fallback || `mock-${key}`); +vi.mock('react-i18next', () => ({ + useTranslation: () => ({ t: mockT }) +})); + +// Wrapper component to provide Mantine context +const TestWrapper = ({ children }: { children: React.ReactNode }) => ( + {children} +); + +describe('AdjustPageScaleSettings', () => { + const defaultParameters: AdjustPageScaleParameters = { + scaleFactor: 1.0, + pageSize: PageSize.KEEP, + }; + + const mockOnParameterChange = vi.fn(); + + beforeEach(() => { + vi.clearAllMocks(); + }); + + test('should render without crashing', () => { + render( + + + + ); + + // Basic render test - component renders without throwing + expect(screen.getByText('Scale Factor')).toBeInTheDocument(); + expect(screen.getByText('Target Page Size')).toBeInTheDocument(); + }); + + test('should render with custom parameters', () => { + const customParameters: AdjustPageScaleParameters = { + scaleFactor: 2.5, + pageSize: PageSize.A4, + }; + + render( + + + + ); + + // Component renders successfully with custom parameters + expect(screen.getByText('Scale Factor')).toBeInTheDocument(); + expect(screen.getByText('Target Page Size')).toBeInTheDocument(); + }); +}); diff --git a/frontend/src/hooks/tools/adjustPageScale/useAdjustPageScaleParameters.test.ts b/frontend/src/hooks/tools/adjustPageScale/useAdjustPageScaleParameters.test.ts new file mode 100644 index 000000000..d68cdd861 --- /dev/null +++ b/frontend/src/hooks/tools/adjustPageScale/useAdjustPageScaleParameters.test.ts @@ -0,0 +1,142 @@ +import { describe, expect, test } from 'vitest'; +import { renderHook, act } from '@testing-library/react'; +import { useAdjustPageScaleParameters, defaultParameters, PageSize, AdjustPageScaleParametersHook } from './useAdjustPageScaleParameters'; + +describe('useAdjustPageScaleParameters', () => { + test('should initialize with default parameters', () => { + const { result } = renderHook(() => useAdjustPageScaleParameters()); + + expect(result.current.parameters).toStrictEqual(defaultParameters); + expect(result.current.parameters.scaleFactor).toBe(1.0); + expect(result.current.parameters.pageSize).toBe(PageSize.KEEP); + }); + + test.each([ + { paramName: 'scaleFactor' as const, value: 0.5 }, + { paramName: 'scaleFactor' as const, value: 2.0 }, + { paramName: 'scaleFactor' as const, value: 10.0 }, + { paramName: 'pageSize' as const, value: PageSize.A4 }, + { paramName: 'pageSize' as const, value: PageSize.LETTER }, + { paramName: 'pageSize' as const, value: PageSize.LEGAL }, + ])('should update parameter $paramName to $value', ({ paramName, value }) => { + const { result } = renderHook(() => useAdjustPageScaleParameters()); + + act(() => { + result.current.updateParameter(paramName, value); + }); + + expect(result.current.parameters[paramName]).toBe(value); + }); + + test('should reset parameters to defaults', () => { + const { result } = renderHook(() => useAdjustPageScaleParameters()); + + // First, change some parameters + act(() => { + result.current.updateParameter('scaleFactor', 2.5); + result.current.updateParameter('pageSize', PageSize.A3); + }); + + expect(result.current.parameters.scaleFactor).toBe(2.5); + expect(result.current.parameters.pageSize).toBe(PageSize.A3); + + // Then reset + act(() => { + result.current.resetParameters(); + }); + + expect(result.current.parameters).toStrictEqual(defaultParameters); + }); + + test('should return correct endpoint name', () => { + const { result } = renderHook(() => useAdjustPageScaleParameters()); + + expect(result.current.getEndpointName()).toBe('scale-pages'); + }); + + test.each([ + { + description: 'with default parameters', + setup: () => {}, + expected: true + }, + { + description: 'with valid scale factor 0.1', + setup: (hook: AdjustPageScaleParametersHook) => { + hook.updateParameter('scaleFactor', 0.1); + }, + expected: true + }, + { + description: 'with valid scale factor 10.0', + setup: (hook: AdjustPageScaleParametersHook) => { + hook.updateParameter('scaleFactor', 10.0); + }, + expected: true + }, + { + description: 'with A4 page size', + setup: (hook: AdjustPageScaleParametersHook) => { + hook.updateParameter('pageSize', PageSize.A4); + }, + expected: true + }, + { + description: 'with invalid scale factor 0', + setup: (hook: AdjustPageScaleParametersHook) => { + hook.updateParameter('scaleFactor', 0); + }, + expected: false + }, + { + description: 'with negative scale factor', + setup: (hook: AdjustPageScaleParametersHook) => { + hook.updateParameter('scaleFactor', -0.5); + }, + expected: false + } + ])('should validate parameters correctly $description', ({ setup, expected }) => { + const { result } = renderHook(() => useAdjustPageScaleParameters()); + + act(() => { + setup(result.current); + }); + + expect(result.current.validateParameters()).toBe(expected); + }); + + test('should handle all PageSize enum values', () => { + const { result } = renderHook(() => useAdjustPageScaleParameters()); + + Object.values(PageSize).forEach(pageSize => { + act(() => { + result.current.updateParameter('pageSize', pageSize); + }); + + expect(result.current.parameters.pageSize).toBe(pageSize); + expect(result.current.validateParameters()).toBe(true); + }); + }); + + test('should handle scale factor edge cases', () => { + const { result } = renderHook(() => useAdjustPageScaleParameters()); + + // Test very small valid scale factor + act(() => { + result.current.updateParameter('scaleFactor', 0.01); + }); + expect(result.current.validateParameters()).toBe(true); + + // Test scale factor just above zero + act(() => { + result.current.updateParameter('scaleFactor', 0.001); + }); + expect(result.current.validateParameters()).toBe(true); + + // Test exactly zero (invalid) + act(() => { + result.current.updateParameter('scaleFactor', 0); + }); + expect(result.current.validateParameters()).toBe(false); + }); +});