njsparser/js/tests/parser/next_data.test.js
2026-02-15 01:34:37 +01:00

53 lines
1.9 KiB
JavaScript

import { test, expect } from 'bun:test';
import { readFileSync } from 'fs';
import { join } from 'path';
import { DOMParser } from '../setup.js';
import { getNextData, hasNextData } from '../../parser/next_data.js';
function loadTestHTML(filename) {
const path = join(process.cwd(), '..', 'test', 'src', filename);
return readFileSync(path, 'utf-8');
}
test('getNextData extracts data from m.soundcloud.com.html', () => {
const html = loadTestHTML('m.soundcloud.com.html');
const data = getNextData(html, DOMParser);
expect(data).not.toBeNull();
expect(typeof data).toBe('object');
expect('buildId' in data || 'props' in data).toBe(true);
});
test('getNextData returns null for no __NEXT_DATA__', () => {
const html = '<html><body>No next data</body></html>';
const data = getNextData(html, DOMParser);
expect(data).toBeNull();
});
test('getNextData returns null for x.com.html (no NextJS)', () => {
const html = loadTestHTML('x.com.html');
const data = getNextData(html, DOMParser);
expect(data).toBeNull();
});
test('hasNextData returns true for m.soundcloud.com.html', () => {
const html = loadTestHTML('m.soundcloud.com.html');
expect(hasNextData(html, DOMParser)).toBe(true);
});
test('hasNextData returns false for no __NEXT_DATA__', () => {
const html = '<html><body>No next data</body></html>';
expect(hasNextData(html, DOMParser)).toBe(false);
});
test('getNextData handles malformed JSON gracefully', () => {
const html = '<html><body><script id="__NEXT_DATA__">invalid json</script></body></html>';
const data = getNextData(html, DOMParser);
expect(data).toBeNull();
});
test('getNextData parses valid JSON', () => {
const testData = { buildId: 'test123', props: { pageProps: {} } };
const html = `<html><body><script id="__NEXT_DATA__">${JSON.stringify(testData)}</script></body></html>`;
const data = getNextData(html, DOMParser);
expect(data).toEqual(testData);
});