OverviewFilesCommitsIssuesDocsReleasesPeers

hypercore-kb / hyper-social / bridge-matrix / test / adapter.test.js

157 lines · javascript ref:
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('&amp; &lt; &gt; &quot; &#39;'), '& < > " \'')
})

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), '')
})