11import assert from 'node:assert/strict' ;
22import { beforeEach , describe , it , mock } from 'node:test' ;
33
4- import { render } from '@testing-library/react' ;
4+ import { act , render } from '@testing-library/react' ;
5+ import { useState } from 'react' ;
56
67import {
78 ReleaseContext ,
@@ -58,11 +59,27 @@ const releases = statuses.flatMap(({ status, versions }) =>
5859) ;
5960
6061const renderDropdown = ( release = releases [ 0 ] ) => {
61- render (
62- < ReleasesContext value = { { releases, snippets : [ ] } } >
63- < ReleaseContext value = { { release, setVersion } } >
62+ const Dropdown = ( ) => {
63+ const [ version , updateVersion ] = useState ( release . versionWithPrefix ) ;
64+ setVersion . mock . mockImplementation ( updateVersion ) ;
65+
66+ return (
67+ < ReleaseContext
68+ value = { {
69+ release : releases . find (
70+ candidate => candidate . versionWithPrefix === version
71+ ) ,
72+ setVersion,
73+ } }
74+ >
6475 < VersionDropdown />
6576 </ ReleaseContext >
77+ ) ;
78+ } ;
79+
80+ render (
81+ < ReleasesContext value = { { releases, snippets : [ ] } } >
82+ < Dropdown />
6683 </ ReleasesContext >
6784 ) ;
6885
@@ -90,6 +107,7 @@ describe('VersionDropdown', () => {
90107
91108 assert . equal ( defaultValue , release . versionWithPrefix ) ;
92109 assert . equal ( ariaLabel , 'layouts.download.dropdown.version' ) ;
110+ assert . equal ( redirect . mock . callCount ( ) , 0 ) ;
93111 } ) ;
94112
95113 it ( `provides the ${ status } badge for each version` , ( ) => {
@@ -109,27 +127,54 @@ describe('VersionDropdown', () => {
109127 } ) ;
110128
111129 for ( const target of statuses ) {
130+ it ( `normalizes ${ target . path } on load for ${ status } ` , ( ) => {
131+ pathname = target . path ;
132+
133+ renderDropdown ( release ) ;
134+
135+ if ( target . path !== path ) {
136+ assert . deepEqual (
137+ redirect . mock . calls . map ( call => call . arguments ) ,
138+ [ [ { href : path , locale : 'en' } ] ]
139+ ) ;
140+ } else {
141+ assert . equal ( redirect . mock . callCount ( ) , 0 ) ;
142+ }
143+ assert . equal ( setVersion . mock . callCount ( ) , 0 ) ;
144+ } ) ;
145+
112146 const description =
113147 target . status === status ? `another ${ status } ` : target . status ;
114148
115149 it ( `switches to ${ description } ` , ( ) => {
116150 const { onChange } = renderDropdown ( release ) ;
151+ redirect . mock . resetCalls ( ) ;
152+ setVersion . mock . resetCalls ( ) ;
117153 const version = target . versions . find (
118154 candidate => candidate !== release . versionWithPrefix
119155 ) ;
120156
121- onChange ( version ) ;
157+ act ( ( ) => onChange ( version ) ) ;
122158
123159 if ( target . path !== path ) {
124160 assert . equal ( redirect . mock . callCount ( ) , 1 ) ;
125161 assert . deepEqual ( redirect . mock . calls [ 0 ] . arguments , [
126162 { href : target . path , locale : 'en' } ,
127163 ] ) ;
128164 assert . equal ( setVersion . mock . callCount ( ) , 0 ) ;
165+ assert . equal ( Select . mock . callCount ( ) , 1 ) ;
166+ assert . equal (
167+ Select . mock . calls . at ( - 1 ) . arguments [ 0 ] . defaultValue ,
168+ release . versionWithPrefix
169+ ) ;
129170 } else {
130171 assert . equal ( redirect . mock . callCount ( ) , 0 ) ;
131172 assert . equal ( setVersion . mock . callCount ( ) , 1 ) ;
132173 assert . deepEqual ( setVersion . mock . calls [ 0 ] . arguments , [ version ] ) ;
174+ assert . equal (
175+ Select . mock . calls . at ( - 1 ) . arguments [ 0 ] . defaultValue ,
176+ version
177+ ) ;
133178 }
134179 } ) ;
135180 }
0 commit comments