Skip to content

Commit 1cd5b54

Browse files
committed
feat: add test files for next issue recommendation
Signed-off-by: Parv Ninama <ninamaparv@gmail.com>
1 parent 66277cb commit 1cd5b54

1 file changed

Lines changed: 92 additions & 0 deletions

File tree

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
// node --test .github/scripts/tests/recommendation.test.js
2+
3+
const assert = require('node:assert/strict');
4+
const test = require('node:test');
5+
6+
const {
7+
computeLevelStepIndices,
8+
buildFallbackChain,
9+
} = require('../shared/core/recommendation');
10+
11+
const {
12+
adjustEligibilityForCurrentPR,
13+
} = require('../shared/core/eligibility');
14+
15+
const { CONFIG } = require('../shared/config');
16+
17+
// ---------------------------------------------------------------------------
18+
// computeLevelStepIndices
19+
// ---------------------------------------------------------------------------
20+
21+
test('computeLevelStepIndices prefers level up, same, then level down', () => {
22+
const result = computeLevelStepIndices('beginner', 'intermediate');
23+
24+
// beginner=1, intermediate=2
25+
assert.deepEqual(result, [2, 1]);
26+
});
27+
28+
test('computeLevelStepIndices falls back to same and lower level', () => {
29+
const result = computeLevelStepIndices('intermediate', 'intermediate');
30+
31+
// intermediate=2, beginner=1
32+
assert.deepEqual(result, [2, 1]);
33+
});
34+
35+
test('computeLevelStepIndices never recommends gfi as fallback', () => {
36+
const result = computeLevelStepIndices('beginner', 'beginner');
37+
38+
// beginner only (no gfi fallback)
39+
assert.deepEqual(result, [1]);
40+
});
41+
42+
// ---------------------------------------------------------------------------
43+
// buildFallbackChain
44+
// ---------------------------------------------------------------------------
45+
46+
test('buildFallbackChain expands levels across repos in priority order', () => {
47+
const chain = buildFallbackChain('beginner', 'intermediate');
48+
49+
assert.ok(chain.length > 0);
50+
51+
// First recommendation should be intermediate in home repo
52+
assert.equal(chain[0].levelKey, 'intermediate');
53+
54+
// Ensure no gfi recommendations exist
55+
const hasGfi = chain.some(entry => entry.levelKey === 'gfi');
56+
assert.equal(hasGfi, false);
57+
});
58+
59+
// ---------------------------------------------------------------------------
60+
// adjustEligibilityForCurrentPR
61+
// ---------------------------------------------------------------------------
62+
63+
test('adjustEligibilityForCurrentPR bumps eligibility after completing current level', () => {
64+
const adjusted = adjustEligibilityForCurrentPR('gfi', 'gfi');
65+
66+
assert.equal(adjusted, 'beginner');
67+
});
68+
69+
test('adjustEligibilityForCurrentPR does not downgrade higher eligibility', () => {
70+
const adjusted = adjustEligibilityForCurrentPR(
71+
'beginner',
72+
'advanced',
73+
);
74+
75+
assert.equal(adjusted, 'advanced');
76+
});
77+
78+
// ---------------------------------------------------------------------------
79+
// basic integration-style recommendation flow
80+
// ---------------------------------------------------------------------------
81+
82+
test('fallback chain includes repos for eligible levels only', () => {
83+
const chain = buildFallbackChain('intermediate', 'advanced');
84+
85+
const validLevels = new Set(CONFIG.skillHierarchy);
86+
87+
for (const entry of chain) {
88+
assert.ok(validLevels.has(entry.levelKey));
89+
assert.ok(entry.repoConfig.owner);
90+
assert.ok(entry.repoConfig.repo);
91+
}
92+
});

0 commit comments

Comments
 (0)