@@ -2,52 +2,167 @@ import assert from 'node:assert/strict';
22import { describe , it } from 'node:test' ;
33
44describe ( 'generateReleaseData' , ( ) => {
5- it ( 'generates release data with correct status' , async t => {
6- t . mock . timers . enable ( { now : new Date ( '2024-10-18' ) } ) ;
5+ let currentNodevuData = { } ;
6+ const nodevuMock = ( ) => Promise . resolve ( currentNodevuData ) ;
7+
8+ const runWithNodevuData = async ( t , now , data ) => {
9+ currentNodevuData = data ;
10+ t . mock . timers . enable ( { now : new Date ( now ) } ) ;
711
812 t . mock . module ( '@nodevu/core' , {
9- defaultExport : ( ) =>
10- Promise . resolve ( {
11- 14 : {
12- releases : {
13- '14.0.0' : {
14- semver : { major : 14 , raw : '14.0.0' } ,
15- dependencies : { npm : '6.14.10' , v8 : '8.0.276.20' } ,
16- releaseDate : '2021-04-20' ,
17- modules : { version : '83' } ,
18- } ,
13+ defaultExport : nodevuMock ,
14+ } ) ;
15+
16+ const { default : generateReleaseData } =
17+ await import ( '#site/next-data/generators/releaseData.mjs' ) ;
18+
19+ return generateReleaseData ( ) ;
20+ } ;
21+
22+ it ( 'returns EOL when release is on or past EOL date' , async t => {
23+ const result = await runWithNodevuData ( t , '2024-10-18' , {
24+ 14 : {
25+ releases : {
26+ '14.0.0' : {
27+ semver : { major : 14 , raw : '14.0.0' } ,
28+ dependencies : { npm : '6.14.10' , v8 : '8.0.276.20' } ,
29+ releaseDate : '2021-04-20' ,
30+ modules : { version : '83' } ,
31+ } ,
32+ } ,
33+ support : {
34+ phases : {
35+ dates : {
36+ start : '2021-10-26' ,
37+ lts : '2022-10-18' ,
38+ maintenance : '2023-10-18' ,
39+ end : '2024-10-18' ,
1940 } ,
20- support : {
21- phases : {
22- dates : {
23- start : '2021-10-26' ,
24- lts : '2022-10-18' ,
25- maintenance : '2023-10-18' ,
26- end : '2024-10-18' ,
27- } ,
28- } ,
41+ } ,
42+ } ,
43+ } ,
44+ } ) ;
45+
46+ assert . equal ( result [ 0 ] ?. status , 'EOL' ) ;
47+ } ) ;
48+
49+ it ( 'returns Current when release is not EOL and latest is not LTS' , async t => {
50+ const result = await runWithNodevuData ( t , '2026-04-14' , {
51+ 20 : {
52+ releases : {
53+ '20.12.0' : {
54+ semver : { major : 20 , raw : '20.12.0' } ,
55+ dependencies : { npm : '10.8.2' , v8 : '11.3.244.8' } ,
56+ lts : { isLts : false } ,
57+ releaseDate : '2026-03-26' ,
58+ modules : { version : '115' } ,
59+ } ,
60+ } ,
61+ support : {
62+ phases : {
63+ dates : {
64+ start : '2025-10-22' ,
65+ lts : '2026-10-22' ,
66+ maintenance : '2027-10-22' ,
67+ end : '2028-04-30' ,
2968 } ,
3069 } ,
31- } ) ,
70+ } ,
71+ } ,
3272 } ) ;
3373
34- const { default : generateReleaseData } =
35- await import ( '#site/next-data/generators/releaseData.mjs' ) ;
74+ assert . equal ( result [ 0 ] ?. status , 'Current' ) ;
75+ } ) ;
76+
77+ it ( 'returns LTS when release is not EOL and latest is flagged as LTS' , async t => {
78+ const result = await runWithNodevuData ( t , '2026-04-14' , {
79+ 22 : {
80+ releases : {
81+ '22.7.0' : {
82+ semver : { major : 22 , raw : '22.7.0' } ,
83+ dependencies : { npm : '10.9.0' , v8 : '12.4.254.10' } ,
84+ lts : { isLts : true } ,
85+ releaseDate : '2026-02-18' ,
86+ modules : { version : '124' } ,
87+ } ,
88+ } ,
89+ support : {
90+ phases : {
91+ dates : {
92+ start : '2026-04-23' ,
93+ lts : '2026-10-21' ,
94+ maintenance : '2027-10-20' ,
95+ end : '2029-04-30' ,
96+ } ,
97+ } ,
98+ } ,
99+ } ,
100+ } ) ;
101+
102+ assert . equal ( result [ 0 ] ?. status , 'LTS' ) ;
103+ } ) ;
104+
105+ it ( 'returns Current when release is not EOL and LTS date has passed but latest is not LTS' , async t => {
106+ const result = await runWithNodevuData ( t , '2026-04-14' , {
107+ 24 : {
108+ releases : {
109+ '24.1.0' : {
110+ semver : { major : 24 , raw : '24.1.0' } ,
111+ dependencies : { npm : '11.1.0' , v8 : '13.0.12.7' } ,
112+ lts : { isLts : false } ,
113+ releaseDate : '2026-03-10' ,
114+ modules : { version : '130' } ,
115+ } ,
116+ } ,
117+ support : {
118+ phases : {
119+ dates : {
120+ start : '2025-10-10' ,
121+ lts : '2026-01-01' ,
122+ maintenance : '2027-01-01' ,
123+ end : '2028-10-01' ,
124+ } ,
125+ } ,
126+ } ,
127+ } ,
128+ } ) ;
36129
37- const result = await generateReleaseData ( ) ;
38-
39- assert . equal ( result . length , 1 ) ;
40- assert . partialDeepStrictEqual ( result [ 0 ] , {
41- major : 14 ,
42- version : '14.0.0' ,
43- versionWithPrefix : 'v14.0.0' ,
44- codename : '' ,
45- isLts : false ,
46- npm : '6.14.10' ,
47- v8 : '8.0.276.20' ,
48- releaseDate : '2021-04-20' ,
49- modules : '83' ,
50- status : 'End-of-life' ,
130+ assert . equal ( result [ 0 ] ?. status , 'Current' ) ;
131+ } ) ;
132+
133+ it ( 'uses latest and earliest release dates for latestReleaseDate and initialReleaseDate' , async t => {
134+ const result = await runWithNodevuData ( t , '2026-04-14' , {
135+ 26 : {
136+ releases : {
137+ '26.2.0' : {
138+ semver : { major : 26 , raw : '26.2.0' } ,
139+ dependencies : { npm : '11.3.1' , v8 : '13.2.20.1' } ,
140+ lts : { isLts : false } ,
141+ releaseDate : '2026-04-01' ,
142+ modules : { version : '132' } ,
143+ } ,
144+ '26.0.0' : {
145+ semver : { major : 26 , raw : '26.0.0' } ,
146+ dependencies : { npm : '11.0.0' , v8 : '13.1.0.0' } ,
147+ lts : { isLts : false } ,
148+ releaseDate : '2025-10-21' ,
149+ modules : { version : '131' } ,
150+ } ,
151+ } ,
152+ support : {
153+ phases : {
154+ dates : {
155+ start : '2025-10-21' ,
156+ lts : '2026-10-20' ,
157+ maintenance : '2027-10-19' ,
158+ end : '2029-04-30' ,
159+ } ,
160+ } ,
161+ } ,
162+ } ,
51163 } ) ;
164+
165+ assert . equal ( result [ 0 ] ?. latestReleaseDate , '2026-04-01' ) ;
166+ assert . equal ( result [ 0 ] ?. initialReleaseDate , '2025-10-21' ) ;
52167 } ) ;
53168} ) ;
0 commit comments