From 5a9c185a48fbc7d7a4ff8245c2d02ae676988ab2 Mon Sep 17 00:00:00 2001 From: Adrian Bonpin Date: Tue, 18 Aug 2026 15:33:07 +0800 Subject: [PATCH] feat: parse offered courses descriptions --- parsers.js | 11 ++++++++++- test/parsers.test.js | 14 ++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/parsers.js b/parsers.js index 00bc265..6e2cdce 100644 --- a/parsers.js +++ b/parsers.js @@ -72,5 +72,14 @@ return result; } - return { parseStudyLoadTable, parseProfilePage }; + function parseOfferedCourses(html) { + return extractRows(html) + .filter((tds) => tds.length >= 2) + .map((tds) => ({ + courseCode: tds[0].split('-')[0].trim(), + description: tds[1] + })); + } + + return { parseStudyLoadTable, parseProfilePage, parseOfferedCourses }; }); diff --git a/test/parsers.test.js b/test/parsers.test.js index 48536d6..2cfa0e3 100644 --- a/test/parsers.test.js +++ b/test/parsers.test.js @@ -4,9 +4,11 @@ const fs = require('node:fs'); const path = require('node:path'); const { parseStudyLoadTable } = require('../parsers.js'); const { parseProfilePage } = require('../parsers.js'); +const { parseOfferedCourses } = require('../parsers.js'); const fixture = fs.readFileSync(path.join(__dirname, 'fixtures', 'study-load-table.html'), 'utf8'); const profileFixture = fs.readFileSync(path.join(__dirname, 'fixtures', 'profile.html'), 'utf8'); +const offeredFixture = fs.readFileSync(path.join(__dirname, 'fixtures', 'offered-courses.html'), 'utf8'); test('parseStudyLoadTable extracts all course rows', () => { const rows = parseStudyLoadTable(fixture); @@ -57,3 +59,15 @@ test('parseProfilePage degrades gracefully on empty input', () => { const p = parseProfilePage(''); assert.deepStrictEqual(p, {}); }); + +test('parseOfferedCourses extracts course code and description', () => { + const courses = parseOfferedCourses(offeredFixture); + const it3206 = courses.find(c => c.courseCode === 'IT 3206'); + assert.ok(it3206, 'should find IT 3206'); + assert.strictEqual(it3206.description, 'INTEGRATIVE PROGRAMMING AND TECHNOLOGY'); +}); + +test('parseOfferedCourses strips group suffix from code', () => { + const courses = parseOfferedCourses(offeredFixture); + assert.ok(courses.every(c => !/Group/.test(c.courseCode))); +});