import { render } from '@testing-library/react'; import { useEffect } from 'react'; import { PaperProvider } from '../paper-provider'; import { usePaper } from '../../../hooks'; import type { dia } from '@joint/core'; import { GraphProvider } from '../../graph-provider/graph-provider'; import { Paper } from '../../paper/paper'; function MockChild() { const paper = usePaper(); useEffect(() => { paper.trigger('TestEvent', { id: 'mock' }); }, [paper]); return
Mock Child
; } describe('PaperProvider', () => { it('should create a paper context and pass paper instance to children', async () => { const onCustomEvent = jest.fn(); // here width will be firstly 100, and then it will change to 99. render( {/* Mock children fire event, so we test that it works */} ); expect(onCustomEvent).toHaveBeenCalled(); }); it('should set clickThreshold and other paper options', () => { let customPaper: dia.Paper | undefined; function ChildCheck() { customPaper = usePaper(); return null; } render( ); expect(customPaper?.options.clickThreshold).toBe(10); }); it('should allow outside component to access paper and its options', () => { let outsidePaper: dia.Paper | undefined; function OutsideComponent() { outsidePaper = usePaper(); return
Outside
; } render( ); expect(outsidePaper).toBeDefined(); expect(outsidePaper?.options.width).toBe(123); expect(outsidePaper?.options.height).toBe(456); expect(outsidePaper?.options.clickThreshold).toBe(42); }); it('should update paper options when PaperProvider props change', () => { let paperInstance: dia.Paper | undefined; function CheckPaper() { paperInstance = usePaper(); return null; } let reRenders = 0; const { rerender } = render( {reRenders++} ); expect(paperInstance?.options.width).toBe(10); expect(paperInstance?.options.height).toBe(20); expect(reRenders).toBe(1); rerender( {reRenders++} ); expect(reRenders).toBe(2); expect(paperInstance?.options.width).toBe(99); expect(paperInstance?.options.height).toBe(77); }); it('should share the same paper instance between outside and inside Paper components', () => { let outsidePaper: dia.Paper | undefined; let insidePaper: dia.Paper | undefined; function OutsideComponent() { outsidePaper = usePaper(); return null; } function InsideComponent() { insidePaper = usePaper(); return null; } render( ); expect(outsidePaper).toBeDefined(); expect(insidePaper).toBeDefined(); expect(outsidePaper).toBe(insidePaper); expect(outsidePaper?.options.width).toBe(55); }); });