mirror of
https://github.com/moltbot/moltbot.git
synced 2026-03-07 22:44:16 +00:00
132 lines
3.6 KiB
Swift
132 lines
3.6 KiB
Swift
import Testing
|
|
@testable import OpenClawChatUI
|
|
|
|
@Suite("ChatMarkdownPreprocessor")
|
|
struct ChatMarkdownPreprocessorTests {
|
|
@Test func extractsDataURLImages() {
|
|
let base64 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIHWP4////GQAJ+wP/2hN8NwAAAABJRU5ErkJggg=="
|
|
let markdown = """
|
|
Hello
|
|
|
|
)
|
|
"""
|
|
|
|
let result = ChatMarkdownPreprocessor.preprocess(markdown: markdown)
|
|
|
|
#expect(result.cleaned == "Hello")
|
|
#expect(result.images.count == 1)
|
|
#expect(result.images.first?.image != nil)
|
|
}
|
|
|
|
@Test func flattensRemoteMarkdownImagesIntoText() {
|
|
let base64 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQIHWP4////GQAJ+wP/2hN8NwAAAABJRU5ErkJggg=="
|
|
let markdown = """
|
|

|
|
|
|
)
|
|
"""
|
|
|
|
let result = ChatMarkdownPreprocessor.preprocess(markdown: markdown)
|
|
|
|
#expect(result.cleaned == "Leak")
|
|
#expect(result.images.count == 1)
|
|
#expect(result.images.first?.image != nil)
|
|
}
|
|
|
|
@Test func usesFallbackTextForUnlabeledRemoteMarkdownImages() {
|
|
let markdown = ""
|
|
|
|
let result = ChatMarkdownPreprocessor.preprocess(markdown: markdown)
|
|
|
|
#expect(result.cleaned == "image")
|
|
#expect(result.images.isEmpty)
|
|
}
|
|
|
|
@Test func stripsInboundUntrustedContextBlocks() {
|
|
let markdown = """
|
|
Conversation info (untrusted metadata):
|
|
```json
|
|
{
|
|
"message_id": "123",
|
|
"sender": "openclaw-ios"
|
|
}
|
|
```
|
|
|
|
Sender (untrusted metadata):
|
|
```json
|
|
{
|
|
"label": "Razor"
|
|
}
|
|
```
|
|
|
|
Razor?
|
|
"""
|
|
|
|
let result = ChatMarkdownPreprocessor.preprocess(markdown: markdown)
|
|
|
|
#expect(result.cleaned == "Razor?")
|
|
}
|
|
|
|
@Test func stripsSingleConversationInfoBlock() {
|
|
let text = """
|
|
Conversation info (untrusted metadata):
|
|
```json
|
|
{"x": 1}
|
|
```
|
|
|
|
User message
|
|
"""
|
|
|
|
let result = ChatMarkdownPreprocessor.preprocess(markdown: text)
|
|
|
|
#expect(result.cleaned == "User message")
|
|
}
|
|
|
|
@Test func stripsAllKnownInboundMetadataSentinels() {
|
|
let sentinels = [
|
|
"Conversation info (untrusted metadata):",
|
|
"Sender (untrusted metadata):",
|
|
"Thread starter (untrusted, for context):",
|
|
"Replied message (untrusted, for context):",
|
|
"Forwarded message context (untrusted metadata):",
|
|
"Chat history since last reply (untrusted, for context):",
|
|
]
|
|
|
|
for sentinel in sentinels {
|
|
let markdown = """
|
|
\(sentinel)
|
|
```json
|
|
{"x": 1}
|
|
```
|
|
|
|
User content
|
|
"""
|
|
let result = ChatMarkdownPreprocessor.preprocess(markdown: markdown)
|
|
#expect(result.cleaned == "User content")
|
|
}
|
|
}
|
|
|
|
@Test func preservesNonMetadataJsonFence() {
|
|
let markdown = """
|
|
Here is some json:
|
|
```json
|
|
{"x": 1}
|
|
```
|
|
"""
|
|
|
|
let result = ChatMarkdownPreprocessor.preprocess(markdown: markdown)
|
|
|
|
#expect(result.cleaned == markdown.trimmingCharacters(in: .whitespacesAndNewlines))
|
|
}
|
|
|
|
@Test func stripsLeadingTimestampPrefix() {
|
|
let markdown = """
|
|
[Fri 2026-02-20 18:45 GMT+1] How's it going?
|
|
"""
|
|
|
|
let result = ChatMarkdownPreprocessor.preprocess(markdown: markdown)
|
|
|
|
#expect(result.cleaned == "How's it going?")
|
|
}
|
|
}
|