import test from 'brittle'
import { matrixToKeetText, keetToMatrixText, matrixToEnvelope, envelopeToMatrixText, stripHtml } from '../lib/adapter.js'
import { TYPES, PLATFORMS } from 'bridge-envelope'
test('matrixToKeetText - formats correctly', (t) => {
const result = matrixToKeetText('Alice', 'Hello world!')
t.is(result, '[Matrix] <Alice> Hello world!')
})
test('matrixToKeetText - preserves unicode', (t) => {
const result = matrixToKeetText('Bob', 'Hej hej!')
t.is(result, '[Matrix] <Bob> Hej hej!')
})
test('matrixToKeetText - empty text', (t) => {
const result = matrixToKeetText('user', '')
t.is(result, '[Matrix] <user> ')
})
test('keetToMatrixText - normal message', (t) => {
const msg = {
memberId: 'member-123',
name: 'fleeky',
text: 'Hello from Keet!'
}
const result = keetToMatrixText(msg, 'bridge-id')
t.ok(result)
t.is(result.sender, 'fleeky')
t.is(result.text, 'Hello from Keet!')
})
test('keetToMatrixText - skips bridge identity', (t) => {
const msg = {
memberId: 'bridge-id',
name: 'clode',
text: 'echoed message'
}
const result = keetToMatrixText(msg, 'bridge-id')
t.is(result, null, 'skips bridge identity messages')
})
test('keetToMatrixText - skips already-bridged messages', (t) => {
const msg = {
memberId: 'member-456',
name: 'someone',
text: '[Matrix] <Alice> hello'
}
const result = keetToMatrixText(msg, 'bridge-id')
t.is(result, null, 'skips already-bridged Matrix messages')
})
test('keetToMatrixText - skips system messages', (t) => {
const msg = {
memberId: 'member-789',
name: 'System',
text: 'User joined',
system: { type: 'join' }
}
const result = keetToMatrixText(msg, 'bridge-id')
t.is(result, null, 'skips system messages')
})
test('keetToMatrixText - skips empty text', (t) => {
const msg = {
memberId: 'member-abc',
name: 'User',
text: ' '
}
const result = keetToMatrixText(msg, 'bridge-id')
t.is(result, null)
})
test('keetToMatrixText - null input', (t) => {
const result = keetToMatrixText(null, 'bridge-id')
t.is(result, null)
})
test('keetToMatrixText - anonymous if no name', (t) => {
const msg = {
memberId: 'member-def',
text: 'hello'
}
const result = keetToMatrixText(msg, 'bridge-id')
t.is(result.sender, 'anonymous')
})
test('keetToMatrixText - uses username fallback', (t) => {
const msg = {
memberId: 'member-ghi',
username: 'user42',
text: 'hello'
}
const result = keetToMatrixText(msg, 'bridge-id')
t.is(result.sender, 'user42')
})
test('stripHtml - basic tags', (t) => {
t.is(stripHtml('<p>Hello</p>'), 'Hello')
t.is(stripHtml('<p>Line 1</p><p>Line 2</p>'), 'Line 1\n\nLine 2')
t.is(stripHtml('Hello<br/>World'), 'Hello\nWorld')
t.is(stripHtml('Hello<br>World'), 'Hello\nWorld')
})
test('stripHtml - entities', (t) => {
t.is(stripHtml('& < > " ''), '& < > " \'')
})
test('stripHtml - nested tags', (t) => {
t.is(stripHtml('<p>Hello <a href="https://example.com">link</a></p>'), 'Hello link')
t.is(stripHtml('<p><span class="mention">@user</span> hi</p>'), '@user hi')
})
test('stripHtml - Matrix mention format', (t) => {
const html = '<a href="https://matrix.to/#/@alice:matrix.org">Alice</a> said hi'
t.is(stripHtml(html), 'Alice said hi')
})
test('matrixToEnvelope - creates correct envelope', (t) => {
const env = matrixToEnvelope('Alice', '!room:matrix.org', 'Hello!')
t.is(env.type, TYPES.TEXT)
t.is(env.platform, PLATFORMS.MATRIX)
t.is(env.author, 'Alice')
t.is(env.content, 'Hello!')
t.is(env.channel, '!room:matrix.org')
t.ok(env.id, 'has id')
})
test('envelopeToMatrixText - from Keet', (t) => {
const env = {
platform: PLATFORMS.KEET,
author: 'fleeky',
content: 'Hello world'
}
t.is(envelopeToMatrixText(env), '[Keet] <fleeky> Hello world')
})
test('envelopeToMatrixText - from IRC', (t) => {
const env = {
platform: PLATFORMS.IRC,
author: 'nick',
content: 'IRC message'
}
t.is(envelopeToMatrixText(env), '[IRC] <nick> IRC message')
})
test('envelopeToMatrixText - null envelope', (t) => {
t.is(envelopeToMatrixText(null), '')
})