diff --git a/__tests__/hiscores.test.ts b/__tests__/hiscores.test.ts index a08003a..62c0222 100644 --- a/__tests__/hiscores.test.ts +++ b/__tests__/hiscores.test.ts @@ -11,7 +11,8 @@ import { getPlayerTableURL, getSkillPageURL, getStatsURL, - BOSSES + BOSSES, + INVALID_FORMAT_ERROR } from '../src/index'; const B0ATY_NAME = 'B0ATY'; @@ -232,6 +233,16 @@ test('Parse CSV to json', () => { expect(parseStats(csv)).toStrictEqual(expectedOutput); }); +test('Parse CSV with unknown activity', () => { + const statsWithUnknownActivity = lynxTitanStats + ` + -1,-1`; + expect(() => parseStats(statsWithUnknownActivity)).toThrow(INVALID_FORMAT_ERROR); +}); + +test('Parse invalid CSV', () => { + expect(() => parseStats('invalid')).toThrow(INVALID_FORMAT_ERROR); +}); + describe('Get name format', () => { it('gets a name with a space', async () => { const data = await getRSNFormat(LYNX_TITAN_SPACE_NAME); diff --git a/src/hiscores.ts b/src/hiscores.ts index 2b3ce0d..28501b1 100644 --- a/src/hiscores.ts +++ b/src/hiscores.ts @@ -27,7 +27,8 @@ import { rsnFromElement, getActivityPageURL, httpGet, - BOSSES + BOSSES, + INVALID_FORMAT_ERROR } from './utils'; /** @@ -74,6 +75,10 @@ export function parseStats(csv: string): Stats { .filter((entry) => !!entry) .map((stat) => stat.split(',')); + if (splitCSV.length !== SKILLS.length + BH_MODES.length + CLUES.length + BOSSES.length + 3) { + throw Error(INVALID_FORMAT_ERROR); + } + const skillObjects: Skill[] = splitCSV .filter((stat) => stat.length === 3) .map((stat) => { diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 617a63a..037f437 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -245,3 +245,5 @@ export const FORMATTED_BH_NAMES: FormattedBHNames = { export const FORMATTED_LMS = 'Last Man Standing'; export const FORMATTED_SOUL_WARS = 'Soul Wars Zeal'; export const FORMATTED_LEAGUE_POINTS = 'League Points'; + +export const INVALID_FORMAT_ERROR = 'Invalid hiscores format';