53 lines
1.9 KiB
JavaScript
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);
|
|
});
|