fix: replace hardcoded localhost:3001 with relative API URL + add canvas mock and integration test
- Fix frontend Network error: API_BASE now defaults to empty string (same-origin) - Fix 3 files: api.ts, AuthContext.tsx, Dashboard.tsx - Add Canvas 2D context mock in tests/setup.ts for jsdom - Fix -0 vs +0 in ZoomPanController.getViewport() - Add IntegrationWorkflow.test.ts (35 tests, full CAD workflow)
This commit is contained in:
@@ -1 +1,93 @@
|
||||
import '@testing-library/jest-dom';
|
||||
|
||||
// Mock Canvas 2D context for jsdom (jsdom doesn't implement CanvasRenderingContext2D)
|
||||
const noop = () => {};
|
||||
const mockCtx = {
|
||||
fillRect: noop,
|
||||
strokeRect: noop,
|
||||
clearRect: noop,
|
||||
beginPath: noop,
|
||||
closePath: noop,
|
||||
moveTo: noop,
|
||||
lineTo: noop,
|
||||
arc: noop,
|
||||
arcTo: noop,
|
||||
rect: noop,
|
||||
ellipse: noop,
|
||||
quadraticCurveTo: noop,
|
||||
bezierCurveTo: noop,
|
||||
fill: noop,
|
||||
stroke: noop,
|
||||
save: noop,
|
||||
restore: noop,
|
||||
scale: noop,
|
||||
translate: noop,
|
||||
rotate: noop,
|
||||
transform: noop,
|
||||
setTransform: noop,
|
||||
resetTransform: noop,
|
||||
setLineDash: noop,
|
||||
getLineDash: () => [] as number[],
|
||||
clip: noop,
|
||||
fillText: noop,
|
||||
strokeText: noop,
|
||||
measureText: () => ({ width: 0 }) as TextMetrics,
|
||||
drawImage: noop,
|
||||
createImageData: () => ({ width: 0, height: 0, data: new Uint8ClampedArray(0) }) as ImageData,
|
||||
getImageData: () => ({ width: 0, height: 0, data: new Uint8ClampedArray(0) }) as ImageData,
|
||||
putImageData: noop,
|
||||
createLinearGradient: () => ({ addColorStop: noop }) as CanvasGradient,
|
||||
createRadialGradient: () => ({ addColorStop: noop }) as CanvasGradient,
|
||||
createPattern: () => null as unknown as CanvasPattern,
|
||||
isPointInPath: () => false,
|
||||
isPointInStroke: () => false,
|
||||
// Properties
|
||||
canvas: null as unknown as HTMLCanvasElement,
|
||||
fillStyle: '',
|
||||
strokeStyle: '',
|
||||
lineWidth: 1,
|
||||
lineCap: 'butt' as CanvasLineCap,
|
||||
lineJoin: 'miter' as CanvasLineJoin,
|
||||
miterLimit: 10,
|
||||
lineDashOffset: 0,
|
||||
font: '10px sans-serif',
|
||||
textAlign: 'start' as CanvasTextAlign,
|
||||
textBaseline: 'alphabetic' as CanvasTextBaseline,
|
||||
direction: 'ltr' as CanvasTextDirection,
|
||||
globalAlpha: 1,
|
||||
globalCompositeOperation: 'source-over' as GlobalCompositeOperation,
|
||||
imageSmoothingEnabled: true,
|
||||
imageSmoothingQuality: 'low' as ImageSmoothingQuality,
|
||||
shadowBlur: 0,
|
||||
shadowColor: 'rgba(0, 0, 0, 0)',
|
||||
shadowOffsetX: 0,
|
||||
shadowOffsetY: 0,
|
||||
filter: 'none',
|
||||
};
|
||||
|
||||
// Override getContext to return our mock for '2d'
|
||||
HTMLCanvasElement.prototype.getContext = function (contextId: string) {
|
||||
if (contextId === '2d') {
|
||||
return mockCtx as unknown as CanvasRenderingContext2D;
|
||||
}
|
||||
return null;
|
||||
} as typeof HTMLCanvasElement.prototype.getContext;
|
||||
|
||||
// Mock getBoundingClientRect for canvas elements
|
||||
const origGetBoundingClientRect = HTMLElement.prototype.getBoundingClientRect;
|
||||
HTMLElement.prototype.getBoundingClientRect = function () {
|
||||
if (this instanceof HTMLCanvasElement) {
|
||||
return {
|
||||
left: 0,
|
||||
top: 0,
|
||||
right: this.width,
|
||||
bottom: this.height,
|
||||
width: this.width,
|
||||
height: this.height,
|
||||
x: 0,
|
||||
y: 0,
|
||||
toJSON: () => ({}),
|
||||
} as DOMRect;
|
||||
}
|
||||
return origGetBoundingClientRect.call(this);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user