Skip to content

Commit d90307a

Browse files
committed
Improve test coverage for generateReleaseData logic
1 parent ef55924 commit d90307a

File tree

1 file changed

+153
-26
lines changed

1 file changed

+153
-26
lines changed

apps/site/next-data/generators/__tests__/releaseData.test.mjs

Lines changed: 153 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,39 +2,46 @@ import assert from 'node:assert/strict';
22
import { describe, it } from 'node:test';
33

44
describe('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-
},
19-
},
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-
},
29-
},
30-
},
31-
}),
13+
defaultExport: nodevuMock,
3214
});
3315

3416
const { default: generateReleaseData } =
3517
await import('#site/next-data/generators/releaseData.mjs');
3618

37-
const result = await generateReleaseData();
19+
return generateReleaseData();
20+
};
21+
22+
it('returns End-of-life 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',
40+
},
41+
},
42+
},
43+
},
44+
});
3845

3946
assert.equal(result.length, 1);
4047
assert.partialDeepStrictEqual(result[0], {
@@ -50,4 +57,124 @@ describe('generateReleaseData', () => {
5057
status: 'End-of-life',
5158
});
5259
});
60+
61+
it('returns Current when release is not EOL and latest is not LTS', async t => {
62+
const result = await runWithNodevuData(t, '2026-04-14', {
63+
20: {
64+
releases: {
65+
'20.12.0': {
66+
semver: { major: 20, raw: '20.12.0' },
67+
dependencies: { npm: '10.8.2', v8: '11.3.244.8' },
68+
lts: { isLts: false },
69+
releaseDate: '2026-03-26',
70+
modules: { version: '115' },
71+
},
72+
},
73+
support: {
74+
phases: {
75+
dates: {
76+
start: '2025-10-22',
77+
lts: '2026-10-22',
78+
maintenance: '2027-10-22',
79+
end: '2028-04-30',
80+
},
81+
},
82+
},
83+
},
84+
});
85+
86+
assert.equal(result[0]?.status, 'Current');
87+
});
88+
89+
it('returns LTS when release is not EOL and latest is flagged as LTS', async t => {
90+
const result = await runWithNodevuData(t, '2026-04-14', {
91+
22: {
92+
releases: {
93+
'22.7.0': {
94+
semver: { major: 22, raw: '22.7.0' },
95+
dependencies: { npm: '10.9.0', v8: '12.4.254.10' },
96+
lts: { isLts: true },
97+
releaseDate: '2026-02-18',
98+
modules: { version: '124' },
99+
},
100+
},
101+
support: {
102+
phases: {
103+
dates: {
104+
start: '2026-04-23',
105+
lts: '2026-10-21',
106+
maintenance: '2027-10-20',
107+
end: '2029-04-30',
108+
},
109+
},
110+
},
111+
},
112+
});
113+
114+
assert.equal(result[0]?.status, 'LTS');
115+
});
116+
117+
it('returns Current when release is not EOL and LTS date has passed but latest is not LTS', async t => {
118+
const result = await runWithNodevuData(t, '2026-04-14', {
119+
24: {
120+
releases: {
121+
'24.1.0': {
122+
semver: { major: 24, raw: '24.1.0' },
123+
dependencies: { npm: '11.1.0', v8: '13.0.12.7' },
124+
lts: { isLts: false },
125+
releaseDate: '2026-03-10',
126+
modules: { version: '130' },
127+
},
128+
},
129+
support: {
130+
phases: {
131+
dates: {
132+
start: '2025-10-10',
133+
lts: '2026-01-01',
134+
maintenance: '2027-01-01',
135+
end: '2028-10-01',
136+
},
137+
},
138+
},
139+
},
140+
});
141+
142+
assert.equal(result[0]?.status, 'Current');
143+
});
144+
145+
it('uses latest and earliest release dates for releaseDate and initialDate', async t => {
146+
const result = await runWithNodevuData(t, '2026-04-14', {
147+
26: {
148+
releases: {
149+
'26.2.0': {
150+
semver: { major: 26, raw: '26.2.0' },
151+
dependencies: { npm: '11.3.1', v8: '13.2.20.1' },
152+
lts: { isLts: false },
153+
releaseDate: '2026-04-01',
154+
modules: { version: '132' },
155+
},
156+
'26.0.0': {
157+
semver: { major: 26, raw: '26.0.0' },
158+
dependencies: { npm: '11.0.0', v8: '13.1.0.0' },
159+
lts: { isLts: false },
160+
releaseDate: '2025-10-21',
161+
modules: { version: '131' },
162+
},
163+
},
164+
support: {
165+
phases: {
166+
dates: {
167+
start: '2025-10-21',
168+
lts: '2026-10-20',
169+
maintenance: '2027-10-19',
170+
end: '2029-04-30',
171+
},
172+
},
173+
},
174+
},
175+
});
176+
177+
assert.equal(result[0]?.releaseDate, '2026-04-01');
178+
assert.equal(result[0]?.initialDate, '2025-10-21');
179+
});
53180
});

0 commit comments

Comments
 (0)