48 lines
1.6 KiB
TypeScript
48 lines
1.6 KiB
TypeScript
import { test } from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
|
|
// Test the markdown fence stripping logic in isolation —
|
|
// we don't instantiate LLMAnalyst (requires Anthropic SDK + API key).
|
|
// The regex is: raw.replace(/^```(?:json)?\s*/i, '').replace(/```\s*$/i, '').trim()
|
|
|
|
function stripFences(raw: string): string {
|
|
return raw
|
|
.replace(/^```(?:json)?\s*/i, '')
|
|
.replace(/```\s*$/i, '')
|
|
.trim();
|
|
}
|
|
|
|
const VALID_JSON =
|
|
'{"summary":"test","sentiment":"BULLISH","affectedIndustries":[],"relatedTickers":[]}';
|
|
|
|
test('stripFences: passes clean JSON through unchanged', () => {
|
|
assert.equal(stripFences(VALID_JSON), VALID_JSON);
|
|
});
|
|
|
|
test('stripFences: strips ```json ... ``` fences', () => {
|
|
const wrapped = '```json\n' + VALID_JSON + '\n```';
|
|
assert.equal(stripFences(wrapped), VALID_JSON);
|
|
});
|
|
|
|
test('stripFences: strips ``` ... ``` fences (no language tag)', () => {
|
|
const wrapped = '```\n' + VALID_JSON + '\n```';
|
|
assert.equal(stripFences(wrapped), VALID_JSON);
|
|
});
|
|
|
|
test('stripFences: result is valid parseable JSON', () => {
|
|
const wrapped = '```json\n' + VALID_JSON + '\n```';
|
|
const parsed = JSON.parse(stripFences(wrapped));
|
|
assert.equal(parsed.sentiment, 'BULLISH');
|
|
assert.equal(parsed.summary, 'test');
|
|
});
|
|
|
|
test('stripFences: handles no trailing newline before closing fence', () => {
|
|
const wrapped = '```json\n' + VALID_JSON + '```';
|
|
assert.equal(stripFences(wrapped), VALID_JSON);
|
|
});
|
|
|
|
test('stripFences: case-insensitive fence tag', () => {
|
|
const wrapped = '```JSON\n' + VALID_JSON + '\n```';
|
|
assert.equal(stripFences(wrapped), VALID_JSON);
|
|
});
|