11import { cleanup , render , screen , fireEvent } from '@testing-library/react'
22import { afterEach , describe , expect , test , vi } from 'vitest'
3+ import { MemoryRouter } from 'react-router'
34import SkillSelector , { SKILLS } from './SkillSelector'
45
6+ function renderWithRouter ( ui : React . ReactElement ) {
7+ return render ( < MemoryRouter > { ui } </ MemoryRouter > )
8+ }
9+
510afterEach ( ( ) => {
611 cleanup ( )
712} )
@@ -14,7 +19,7 @@ describe('SkillSelector', () => {
1419 }
1520
1621 test ( 'renders all skill cards' , ( ) => {
17- render ( < SkillSelector { ...defaultProps } /> )
22+ renderWithRouter ( < SkillSelector { ...defaultProps } /> )
1823
1924 for ( const skill of SKILLS ) {
2025 expect ( screen . getByTestId ( `skill-card-${ skill . name } ` ) ) . toBeTruthy ( )
@@ -24,7 +29,7 @@ describe('SkillSelector', () => {
2429 } )
2530
2631 test ( 'renders repo and PR info in header' , ( ) => {
27- render ( < SkillSelector { ...defaultProps } /> )
32+ renderWithRouter ( < SkillSelector { ...defaultProps } /> )
2833
2934 expect ( screen . getByTestId ( 'skill-selector' ) ) . toBeTruthy ( )
3035 const repoElements = screen . getAllByText ( 'acme/helprs' )
@@ -35,15 +40,15 @@ describe('SkillSelector', () => {
3540
3641 test ( 'calls onSelectSkill when challenge-me card is clicked' , ( ) => {
3742 const onSelectSkill = vi . fn ( )
38- render ( < SkillSelector { ...defaultProps } onSelectSkill = { onSelectSkill } /> )
43+ renderWithRouter ( < SkillSelector { ...defaultProps } onSelectSkill = { onSelectSkill } /> )
3944
4045 fireEvent . click ( screen . getByTestId ( 'skill-card-challenge-me' ) )
4146 expect ( onSelectSkill ) . toHaveBeenCalledWith ( 'challenge-me' )
4247 } )
4348
4449 test ( 'does not call onSelectSkill for coming-soon skills' , ( ) => {
4550 const onSelectSkill = vi . fn ( )
46- render ( < SkillSelector { ...defaultProps } onSelectSkill = { onSelectSkill } /> )
51+ renderWithRouter ( < SkillSelector { ...defaultProps } onSelectSkill = { onSelectSkill } /> )
4752
4853 fireEvent . click ( screen . getByTestId ( 'skill-card-eli5' ) )
4954 fireEvent . click ( screen . getByTestId ( 'skill-card-pair-debug' ) )
@@ -53,19 +58,19 @@ describe('SkillSelector', () => {
5358 } )
5459
5560 test ( 'shows "soon" badge for unreleased skills' , ( ) => {
56- render ( < SkillSelector { ...defaultProps } /> )
61+ renderWithRouter ( < SkillSelector { ...defaultProps } /> )
5762
5863 const badges = screen . getAllByText ( 'soon' )
5964 expect ( badges . length ) . toBe ( 4 )
6065 } )
6166
6267 test ( 'shows DEFAULT badge for challenge-me' , ( ) => {
63- render ( < SkillSelector { ...defaultProps } /> )
68+ renderWithRouter ( < SkillSelector { ...defaultProps } /> )
6469 expect ( screen . getByText ( 'DEFAULT' ) ) . toBeTruthy ( )
6570 } )
6671
6772 test ( 'disables cards when disabled prop is true' , ( ) => {
68- render ( < SkillSelector { ...defaultProps } disabled = { true } /> )
73+ renderWithRouter ( < SkillSelector { ...defaultProps } disabled = { true } /> )
6974
7075 for ( const skill of SKILLS ) {
7176 const card = screen . getByTestId ( `skill-card-${ skill . name } ` ) as HTMLButtonElement
@@ -75,14 +80,14 @@ describe('SkillSelector', () => {
7580
7681 test ( 'does not call onSelectSkill when disabled' , ( ) => {
7782 const onSelectSkill = vi . fn ( )
78- render ( < SkillSelector { ...defaultProps } onSelectSkill = { onSelectSkill } disabled = { true } /> )
83+ renderWithRouter ( < SkillSelector { ...defaultProps } onSelectSkill = { onSelectSkill } disabled = { true } /> )
7984
8085 fireEvent . click ( screen . getByTestId ( 'skill-card-challenge-me' ) )
8186 expect ( onSelectSkill ) . not . toHaveBeenCalled ( )
8287 } )
8388
8489 test ( 'renders helPRs branding' , ( ) => {
85- render ( < SkillSelector { ...defaultProps } /> )
90+ renderWithRouter ( < SkillSelector { ...defaultProps } /> )
8691 const brandElements = screen . getAllByText ( 'helPRs' )
8792 expect ( brandElements . length ) . toBeGreaterThan ( 0 )
8893 } )
0 commit comments