From a2cab16729a2cfdcece6dde66bd8e44ac34faf0e Mon Sep 17 00:00:00 2001 From: Sandeepgouda Goudar Date: Wed, 29 Jul 2026 20:10:48 +0530 Subject: [PATCH 1/2] chore: remove signature save debug logging Leftover browser-console logs exposed request/payload details each time a signature was saved in production. --- .../src/components/tee/SignatureTool.tsx | 13 --- .../tee/__tests__/SignatureTool.test.tsx | 86 +++++++++++++++++++ 2 files changed, 86 insertions(+), 13 deletions(-) create mode 100644 apps/frontend/src/components/tee/__tests__/SignatureTool.test.tsx diff --git a/apps/frontend/src/components/tee/SignatureTool.tsx b/apps/frontend/src/components/tee/SignatureTool.tsx index f5787299..263a0b74 100644 --- a/apps/frontend/src/components/tee/SignatureTool.tsx +++ b/apps/frontend/src/components/tee/SignatureTool.tsx @@ -130,7 +130,6 @@ export default function SignatureTool({ const [signingFace, setSigningFace] = useState<'front' | 'back'>('back'); const [selectedFile, setSelectedFile] = useState(null); - const [originalSize, setOriginalSize] = useState(0); const [previewUrl, setPreviewUrl] = useState(null); useEffect(() => { @@ -326,9 +325,6 @@ export default function SignatureTool({ const finishDraw = () => { const dataUrl = canvasRef.current!.toDataURL('image/png'); - const base64Str = dataUrl.split(',')[1]; - const originalBytesSize = base64Str ? Math.floor(base64Str.length * 0.75) : 0; - setOriginalSize(originalBytesSize); const defaultX = signingFace === 'front' ? 0.3 : 0.7; setPendingSig({ id: `tmp-${Date.now()}`, dataUrl, face: signingFace, x: defaultX, y: 0.55, scale: 0.6, rotation: 0 }); @@ -352,7 +348,6 @@ export default function SignatureTool({ setError(null); setSelectedFile(file); - setOriginalSize(file.size); return true; }; @@ -381,14 +376,6 @@ export default function SignatureTool({ setPhase('submitting'); try { const signatureBlob = dataURLtoBlob(pendingSig.dataUrl); - const payloadSize = signatureBlob.size; - const contentType = 'multipart/form-data'; - - console.log('Original file size:', originalSize); - console.log('Payload size:', payloadSize); - console.log('Content-Type:', contentType); - console.log('Content-Length:', payloadSize); - const formData = new FormData(); formData.append('signerName', signerName.trim()); formData.append('face', pendingSig.face ?? 'back'); diff --git a/apps/frontend/src/components/tee/__tests__/SignatureTool.test.tsx b/apps/frontend/src/components/tee/__tests__/SignatureTool.test.tsx new file mode 100644 index 00000000..fa69e01d --- /dev/null +++ b/apps/frontend/src/components/tee/__tests__/SignatureTool.test.tsx @@ -0,0 +1,86 @@ +import { describe, it, expect, vi } from 'vitest'; +import { render, screen, fireEvent, waitFor } from '@testing-library/react'; +import React from 'react'; + +vi.mock('framer-motion', () => ({ + AnimatePresence: ({ children }: { children: React.ReactNode }) => children, + motion: { + div: ({ children, ...props }: { children: React.ReactNode }) => ( +
)}>{children}
+ ), + }, +})); + +vi.mock('../../../utils/sigRemover', () => ({ + removeSignatureBackground: vi.fn().mockResolvedValue('data:image/png;base64,c2lnbmF0dXJl'), +})); + +vi.mock('../PremiumTee', () => ({ + default: () =>
, +})); + +vi.mock('../../../utils/api', () => ({ + default: { + post: vi.fn(), + }, +})); + +import api from '../../../utils/api'; +import SignatureTool from '../SignatureTool'; + +const mockApi = api as unknown as { + post: ReturnType; +}; + +describe('SignatureTool', () => { + it('submits an uploaded signature and reports the saved overlay', async () => { + const onSigned = vi.fn(); + mockApi.post.mockResolvedValue({ + data: { + signature: { + id: 'signature-1', + signerDataUrl: 'data:image/png;base64,c2F2ZWQ=', + face: 'back', + x: 0.7, + y: 0.55, + scale: 0.6, + rotation: 0, + }, + }, + }); + + const { container } = render( + , + ); + + fireEvent.click(screen.getByRole('button', { name: /upload/i })); + const fileInput = container.querySelector('input[type="file"]'); + expect(fileInput).not.toBeNull(); + fireEvent.change(fileInput!, { + target: { files: [new File(['signature'], 'signature.png', { type: 'image/png' })] }, + }); + fireEvent.click(screen.getByRole('button', { name: 'Use this signature →' })); + + await screen.findByRole('button', { name: 'Save signature' }); + fireEvent.click(screen.getByRole('button', { name: 'Save signature' })); + + await waitFor(() => expect(mockApi.post).toHaveBeenCalledWith( + '/tee/share/share-1/sign', + expect.any(FormData), + { headers: { 'Content-Type': 'multipart/form-data' } }, + )); + await waitFor(() => expect(onSigned).toHaveBeenCalledWith(expect.objectContaining({ + id: 'signature-1', + dataUrl: 'data:image/png;base64,c2F2ZWQ=', + }))); + }); +}); From e31b62c6e8cbbbc55628be4ef255e3950a14e2bf Mon Sep 17 00:00:00 2001 From: Sandeepgouda Goudar Date: Wed, 29 Jul 2026 20:17:30 +0530 Subject: [PATCH 2/2] test: mock URL preview APIs --- apps/frontend/src/test/setup.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/frontend/src/test/setup.ts b/apps/frontend/src/test/setup.ts index 331666ce..851e0c57 100644 --- a/apps/frontend/src/test/setup.ts +++ b/apps/frontend/src/test/setup.ts @@ -1 +1,5 @@ -import '@testing-library/jest-dom'; \ No newline at end of file +import '@testing-library/jest-dom'; +import { vi } from 'vitest'; + +URL.createObjectURL = vi.fn(() => 'blob:signature-preview'); +URL.revokeObjectURL = vi.fn();