mirror of
https://github.com/stackblitz/bolt.new
synced 2024-11-27 22:42:21 +00:00
87 lines
3.4 KiB
TypeScript
87 lines
3.4 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
import { StreamingMessageParser } from './message-parser';
|
|
|
|
describe('StreamingMessageParser', () => {
|
|
it('should pass through normal text', () => {
|
|
const parser = new StreamingMessageParser();
|
|
expect(parser.parse('test_id', 'Hello, world!')).toBe('Hello, world!');
|
|
});
|
|
|
|
it('should allow normal HTML tags', () => {
|
|
const parser = new StreamingMessageParser();
|
|
expect(parser.parse('test_id', 'Hello <strong>world</strong>!')).toBe('Hello <strong>world</strong>!');
|
|
});
|
|
|
|
it.each([
|
|
['Foo bar', 'Foo bar'],
|
|
['Foo bar <', 'Foo bar '],
|
|
['Foo bar <p', 'Foo bar <p'],
|
|
['Foo bar <b', 'Foo bar '],
|
|
['Foo bar <ba', 'Foo bar <ba'],
|
|
['Foo bar <bol', 'Foo bar '],
|
|
['Foo bar <bolt', 'Foo bar '],
|
|
['Foo bar <bolta', 'Foo bar <bolta'],
|
|
['Foo bar <boltA', 'Foo bar '],
|
|
['Some text before <boltArtifact>foo</boltArtifact> Some more text', 'Some text before Some more text'],
|
|
[['Some text before <boltArti', 'fact>foo</boltArtifact> Some more text'], 'Some text before Some more text'],
|
|
[['Some text before <boltArti', 'fac', 't>foo</boltArtifact> Some more text'], 'Some text before Some more text'],
|
|
[['Some text before <boltArti', 'fact>fo', 'o</boltArtifact> Some more text'], 'Some text before Some more text'],
|
|
[
|
|
['Some text before <boltArti', 'fact>fo', 'o', '<', '/boltArtifact> Some more text'],
|
|
'Some text before Some more text',
|
|
],
|
|
[
|
|
['Some text before <boltArti', 'fact>fo', 'o<', '/boltArtifact> Some more text'],
|
|
'Some text before Some more text',
|
|
],
|
|
['Before <oltArtfiact>foo</boltArtifact> After', 'Before <oltArtfiact>foo</boltArtifact> After'],
|
|
['Before <boltArtifactt>foo</boltArtifact> After', 'Before <boltArtifactt>foo</boltArtifact> After'],
|
|
['Before <boltArtifact title="Some title">foo</boltArtifact> After', 'Before After'],
|
|
[
|
|
'Before <boltArtifact title="Some title" id="artifact_1"><boltAction type="shell">npm install</boltAction></boltArtifact> After',
|
|
'Before After',
|
|
[{ type: 'shell', content: 'npm install' }],
|
|
],
|
|
[
|
|
'Before <boltArtifact title="Some title" id="artifact_1"><boltAction type="shell">npm install</boltAction><boltAction type="file" filePath="index.js">some content</boltAction></boltArtifact> After',
|
|
'Before After',
|
|
[
|
|
{ type: 'shell', content: 'npm install' },
|
|
{ type: 'file', filePath: 'index.js', content: 'some content\n' },
|
|
],
|
|
],
|
|
])('should correctly parse chunks and strip out bolt artifacts', (input, expected, expectedActions = []) => {
|
|
let actionCounter = 0;
|
|
|
|
const expectedArtifactId = 'artifact_1';
|
|
const expectedMessageId = 'message_1';
|
|
|
|
const parser = new StreamingMessageParser({
|
|
artifactElement: '',
|
|
callbacks: {
|
|
onAction: ({ artifactId, messageId, action }) => {
|
|
expect(artifactId).toBe(expectedArtifactId);
|
|
expect(messageId).toBe(expectedMessageId);
|
|
expect(action).toEqual(expectedActions[actionCounter]);
|
|
actionCounter++;
|
|
},
|
|
},
|
|
});
|
|
|
|
let message = '';
|
|
|
|
let result = '';
|
|
|
|
const chunks = Array.isArray(input) ? input : input.split('');
|
|
|
|
for (const chunk of chunks) {
|
|
message += chunk;
|
|
|
|
result += parser.parse(expectedMessageId, message);
|
|
}
|
|
|
|
expect(actionCounter).toBe(expectedActions.length);
|
|
expect(result).toEqual(expected);
|
|
});
|
|
});
|