From 7c1d39b68398d86a3da993ea55570c4ab8e9a0d1 Mon Sep 17 00:00:00 2001 From: plouc Date: Sat, 1 Jan 2022 17:06:26 +0900 Subject: [PATCH] feat(chord): init unit tests --- packages/chord/src/ChordArc.tsx | 9 +- packages/chord/src/ChordLabels.tsx | 1 + packages/chord/src/ChordRibbon.tsx | 1 + packages/chord/tests/.eslintrc.yml | 2 + packages/chord/tests/Chord.test.tsx | 223 ++++++++++++++++++++++++++++ 5 files changed, 232 insertions(+), 4 deletions(-) create mode 100644 packages/chord/tests/.eslintrc.yml create mode 100644 packages/chord/tests/Chord.test.tsx diff --git a/packages/chord/src/ChordArc.tsx b/packages/chord/src/ChordArc.tsx index 0d6b5092be..b71b7993df 100644 --- a/packages/chord/src/ChordArc.tsx +++ b/packages/chord/src/ChordArc.tsx @@ -40,7 +40,7 @@ export const ChordArc = memo( return (event: MouseEvent) => { setCurrent(arc) showTooltipFromEvent(createElement(tooltip, { arc }), event) - onMouseEnter && onMouseEnter(arc, event) + onMouseEnter?.(arc, event) } }, [isInteractive, showTooltipFromEvent, tooltip, arc, onMouseEnter]) @@ -49,7 +49,7 @@ export const ChordArc = memo( return (event: MouseEvent) => { showTooltipFromEvent(createElement(tooltip, { arc }), event) - onMouseMove && onMouseMove(arc, event) + onMouseMove?.(arc, event) } }, [isInteractive, showTooltipFromEvent, tooltip, arc, onMouseMove]) @@ -59,18 +59,19 @@ export const ChordArc = memo( return (event: MouseEvent) => { setCurrent(null) hideTooltip() - onMouseLeave && onMouseLeave(arc, event) + onMouseLeave?.(arc, event) } }, [isInteractive, hideTooltip, arc, onMouseLeave]) const handleClick = useMemo(() => { if (!isInteractive || !onClick) return undefined - return (event: MouseEvent) => onClick(arc, event) + return (event: MouseEvent) => onClick?.(arc, event) }, [isInteractive, arc, onClick]) return ( ( { + const wrapper = mount() + + sampleData.keys.forEach(key => { + const arc = wrapper.find(`path[data-testid='arc.${key}']`) + expect(arc.exists()).toBeTruthy() + }) + + expect(wrapper.find(`path[data-testid^='ribbon.']`)).toHaveLength(4) +}) + +describe('labels', () => { + it('enabled by default', () => { + const wrapper = mount() + + sampleData.keys.forEach(key => { + const label = wrapper.find(`text[data-testid='label.${key}']`) + expect(label.exists()).toBeTruthy() + expect(label.text()).toEqual(key) + }) + }) + + it('disabled', () => { + const wrapper = mount() + + sampleData.keys.forEach(key => { + const label = wrapper.find(`text[data-testid='label.${key}']`) + expect(label.exists()).toBeFalsy() + }) + }) + + it('customize label', () => { + const wrapper = mount( `custom: ${arc.id}`} />) + + sampleData.keys.forEach(key => { + const label = wrapper.find(`text[data-testid='label.${key}']`) + expect(label.exists()).toBeTruthy() + expect(label.text()).toEqual(`custom: ${key}`) + }) + }) + + it('static text color', () => { + const color = 'rgba(255, 0, 0, 1)' + const wrapper = mount() + + sampleData.keys.forEach(key => { + const label = wrapper.find(`text[data-testid='label.${key}']`) + expect(label.exists()).toBeTruthy() + expect(label.prop('style').fill).toEqual(color) + }) + }) + + it('text color from arcs', () => { + const colors = [ + 'rgba(255, 0, 0, 1)', + 'rgba(0, 255, 0, 1)', + 'rgba(0, 0, 255, 1)', + 'rgba(255, 0, 255, 1)', + ] + const wrapper = mount( + + ) + + sampleData.keys.forEach((key, index) => { + const label = wrapper.find(`text[data-testid='label.${key}']`) + expect(label.exists()).toBeTruthy() + expect(label.prop('style').fill).toEqual(colors[index]) + }) + }) +}) + +describe('interactivity', () => { + describe('arcs', () => { + it('onMouseEnter', () => { + const onMouseEnter = jest.fn() + const wrapper = mount() + + sampleData.keys.forEach(key => { + wrapper.find(`path[data-testid='arc.${key}']`).simulate('mouseenter') + + expect(onMouseEnter).toHaveBeenCalledTimes(1) + const [datum] = onMouseEnter.mock.calls[0] + expect(datum.id).toEqual(key) + + onMouseEnter.mockClear() + }) + }) + + it('onMouseMove', () => { + const onMouseMove = jest.fn() + const wrapper = mount() + + sampleData.keys.forEach(key => { + wrapper.find(`path[data-testid='arc.${key}']`).simulate('mousemove') + + expect(onMouseMove).toHaveBeenCalledTimes(1) + const [datum] = onMouseMove.mock.calls[0] + expect(datum.id).toEqual(key) + + onMouseMove.mockClear() + }) + }) + + it('onMouseLeave', () => { + const onMouseLeave = jest.fn() + const wrapper = mount() + + sampleData.keys.forEach(key => { + wrapper.find(`path[data-testid='arc.${key}']`).simulate('mouseleave') + + expect(onMouseLeave).toHaveBeenCalledTimes(1) + const [datum] = onMouseLeave.mock.calls[0] + expect(datum.id).toEqual(key) + + onMouseLeave.mockClear() + }) + }) + + it('onClick', () => { + const onClick = jest.fn() + const wrapper = mount() + + sampleData.keys.forEach(key => { + wrapper.find(`path[data-testid='arc.${key}']`).simulate('click') + + expect(onClick).toHaveBeenCalledTimes(1) + const [datum] = onClick.mock.calls[0] + expect(datum.id).toEqual(key) + + onClick.mockClear() + }) + }) + }) + + describe('ribbons', () => { + it('onMouseEnter', () => { + const onMouseEnter = jest.fn() + const wrapper = mount() + + wrapper.find(`path[data-testid^='ribbon.']`).forEach(ribbon => { + ribbon.simulate('mouseenter') + + expect(onMouseEnter).toHaveBeenCalledTimes(1) + const [datum] = onMouseEnter.mock.calls[0] + expect(datum.id).toEqual(ribbon.prop('data-testid').slice(7)) + + onMouseEnter.mockClear() + }) + }) + + it('onMouseMove', () => { + const onMouseMove = jest.fn() + const wrapper = mount() + + wrapper.find(`path[data-testid^='ribbon.']`).forEach(ribbon => { + ribbon.simulate('mousemove') + + expect(onMouseMove).toHaveBeenCalledTimes(1) + const [datum] = onMouseMove.mock.calls[0] + expect(datum.id).toEqual(ribbon.prop('data-testid').slice(7)) + + onMouseMove.mockClear() + }) + }) + + it('onMouseLeave', () => { + const onMouseLeave = jest.fn() + const wrapper = mount() + + wrapper.find(`path[data-testid^='ribbon.']`).forEach(ribbon => { + ribbon.simulate('mouseleave') + + expect(onMouseLeave).toHaveBeenCalledTimes(1) + const [datum] = onMouseLeave.mock.calls[0] + expect(datum.id).toEqual(ribbon.prop('data-testid').slice(7)) + + onMouseLeave.mockClear() + }) + }) + + it('onClick', () => { + const onClick = jest.fn() + const wrapper = mount() + + wrapper.find(`path[data-testid^='ribbon.']`).forEach(ribbon => { + ribbon.simulate('click') + + expect(onClick).toHaveBeenCalledTimes(1) + const [datum] = onClick.mock.calls[0] + expect(datum.id).toEqual(ribbon.prop('data-testid').slice(7)) + + onClick.mockClear() + }) + }) + }) +})