Skip to content

Commit 4d55691

Browse files
author
梁朝飞
committed
feat: add unit test
1 parent 3341781 commit 4d55691

File tree

2 files changed

+144
-0
lines changed

2 files changed

+144
-0
lines changed

tests/__snapshots__/index.test.tsx.snap

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -761,3 +761,65 @@ exports[`rc-segmented should render vertical segmented 1`] = `
761761
</div>
762762
</div>
763763
`;
764+
765+
exports[`rc-segmented should render vertical segmented and handle thumb animations correctly 1`] = `
766+
<div
767+
aria-label="segmented control"
768+
class="rc-segmented rc-segmented-vertical"
769+
role="listbox"
770+
>
771+
<div
772+
class="rc-segmented-group"
773+
>
774+
<label
775+
class="rc-segmented-item rc-segmented-item-selected"
776+
>
777+
<input
778+
checked=""
779+
class="rc-segmented-item-input"
780+
type="radio"
781+
/>
782+
<div
783+
aria-selected="true"
784+
class="rc-segmented-item-label"
785+
role="option"
786+
title="iOS"
787+
>
788+
iOS
789+
</div>
790+
</label>
791+
<label
792+
class="rc-segmented-item"
793+
>
794+
<input
795+
class="rc-segmented-item-input"
796+
type="radio"
797+
/>
798+
<div
799+
aria-selected="false"
800+
class="rc-segmented-item-label"
801+
role="option"
802+
title="Android"
803+
>
804+
Android
805+
</div>
806+
</label>
807+
<label
808+
class="rc-segmented-item"
809+
>
810+
<input
811+
class="rc-segmented-item-input"
812+
type="radio"
813+
/>
814+
<div
815+
aria-selected="false"
816+
class="rc-segmented-item-label"
817+
role="option"
818+
title="Web"
819+
>
820+
Web
821+
</div>
822+
</label>
823+
</div>
824+
</div>
825+
`;

tests/index.test.tsx

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,4 +567,86 @@ describe('rc-segmented', () => {
567567
);
568568
expectMatchChecked(container, [true, false, false]);
569569
});
570+
it('should render vertical segmented and handle thumb animations correctly', () => {
571+
const offsetParentSpy = jest
572+
.spyOn(HTMLElement.prototype, 'offsetParent', 'get')
573+
.mockImplementation(() => {
574+
return container;
575+
});
576+
const handleValueChange = jest.fn();
577+
const { container, asFragment } = render(
578+
<Segmented
579+
options={['iOS', 'Android', 'Web']}
580+
vertical
581+
onChange={(value) => handleValueChange(value)}
582+
/>,
583+
);
584+
585+
// Snapshot test
586+
expect(asFragment().firstChild).toMatchSnapshot();
587+
expect(container.querySelector('.rc-segmented')).toHaveClass(
588+
'rc-segmented-vertical',
589+
);
590+
expectMatchChecked(container, [true, false, false]);
591+
592+
// Click: Web
593+
fireEvent.click(container.querySelectorAll('.rc-segmented-item-input')[2]);
594+
expect(handleValueChange).toBeCalledWith('Web');
595+
expectMatchChecked(container, [false, false, true]);
596+
597+
// Thumb should appear at `iOS`
598+
exceptThumbHaveStyle(container, {
599+
'--thumb-start-top': '0px',
600+
'--thumb-start-height': '0px',
601+
});
602+
603+
// Motion => active
604+
act(() => {
605+
jest.runAllTimers();
606+
});
607+
608+
// Motion enter end
609+
fireEvent.animationEnd(container.querySelector('.rc-segmented-thumb')!);
610+
act(() => {
611+
jest.runAllTimers();
612+
});
613+
614+
// Thumb should disappear
615+
expect(container.querySelector('.rc-segmented-thumb')).toBeFalsy();
616+
617+
// Click: Android
618+
fireEvent.click(container.querySelectorAll('.rc-segmented-item-input')[1]);
619+
expect(handleValueChange).toBeCalledWith('Android');
620+
expectMatchChecked(container, [false, true, false]);
621+
622+
// Thumb should move
623+
expect(container.querySelector('.rc-segmented-thumb')).toHaveClass(
624+
'rc-segmented-thumb-motion',
625+
);
626+
627+
// Thumb appeared at `Web`
628+
exceptThumbHaveStyle(container, {
629+
'--thumb-start-top': '0px',
630+
'--thumb-start-height': '0px',
631+
});
632+
633+
// Motion appear end
634+
act(() => {
635+
jest.runAllTimers();
636+
});
637+
exceptThumbHaveStyle(container, {
638+
'--thumb-active-top': '0px',
639+
'--thumb-active-height': '0px',
640+
});
641+
642+
fireEvent.animationEnd(container.querySelector('.rc-segmented-thumb')!);
643+
act(() => {
644+
jest.runAllTimers();
645+
});
646+
647+
// Thumb should disappear
648+
expect(container.querySelector('.rc-segmented-thumb')).toBeFalsy();
649+
650+
offsetParentSpy.mockRestore();
651+
});
570652
});

0 commit comments

Comments
 (0)