1- import { describe , expect , it } from 'vitest' ;
1+ import { describe , expect , it , vi } from 'vitest' ;
22
33import React from 'react' ;
44import { renderToStaticMarkup } from 'react-dom/server' ;
@@ -10,6 +10,21 @@ const renderHref = (props: Record<string, unknown>) => {
1010 return / h r e f = " ( [ ^ " ] * ) " / . exec ( html ) ?. [ 1 ] ;
1111} ;
1212
13+ const makeClickEvent = ( ) => {
14+ const e = {
15+ defaultPrevented : false ,
16+ preventDefault ( ) {
17+ e . defaultPrevented = true ;
18+ } ,
19+ } ;
20+ return e as unknown as React . MouseEvent < HTMLAnchorElement > ;
21+ } ;
22+
23+ const getAnchorOnClick = ( props : Record < string , unknown > ) =>
24+ ( MockLink as any ) . render ( props , null ) . props . onClick as (
25+ e : React . MouseEvent < HTMLAnchorElement >
26+ ) => void ;
27+
1328describe ( 'next/link mock' , ( ) => {
1429 it ( 'renders the resolved `as` URL instead of the `href` template when `as` is provided' , ( ) => {
1530 expect ( renderHref ( { href : '/users/[id]' , as : '/users/123' } ) ) . toBe ( '/users/123' ) ;
@@ -27,4 +42,30 @@ describe('next/link mock', () => {
2742 '/about?ref=nav'
2843 ) ;
2944 } ) ;
45+
46+ it ( 'calls onClick before preventing default' , ( ) => {
47+ let defaultPreventedWhenHandlerRan : boolean | undefined ;
48+ const onClick = vi . fn ( ( e : React . MouseEvent < HTMLAnchorElement > ) => {
49+ defaultPreventedWhenHandlerRan = e . defaultPrevented ;
50+ } ) ;
51+
52+ getAnchorOnClick ( { href : '/about' , onClick } ) ( makeClickEvent ( ) ) ;
53+
54+ expect ( onClick ) . toHaveBeenCalledTimes ( 1 ) ;
55+ expect ( defaultPreventedWhenHandlerRan ) . toBe ( false ) ;
56+ } ) ;
57+
58+ it ( 'still runs a handler that bails when the event was already default-prevented' , ( ) => {
59+ const userOnClick = vi . fn ( ) ;
60+ const mergedOnClick = ( e : React . MouseEvent < HTMLAnchorElement > ) => {
61+ if ( e . defaultPrevented ) {
62+ return ;
63+ }
64+ userOnClick ( ) ;
65+ } ;
66+
67+ getAnchorOnClick ( { href : '/about' , onClick : mergedOnClick } ) ( makeClickEvent ( ) ) ;
68+
69+ expect ( userOnClick ) . toHaveBeenCalledTimes ( 1 ) ;
70+ } ) ;
3071} ) ;
0 commit comments