OverviewFilesCommitsIssuesDocsReleasesPeers

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

140 lines · javascript ref:
import test from 'brittle'
import { emailToEnvelope, keetToEmail, emailToKeetText, keetToEmailText, extractEmail, extractName } from '../lib/adapter.js'
import { TYPES, PLATFORMS } from 'bridge-envelope'

test('extractEmail - angle bracket format', (t) => {
  t.is(extractEmail('Alice <alice@example.com>'), 'alice@example.com')
  t.is(extractEmail('"Bob Smith" <bob@test.org>'), 'bob@test.org')
})

test('extractEmail - bare address', (t) => {
  t.is(extractEmail('alice@example.com'), 'alice@example.com')
})

test('extractName - display name', (t) => {
  t.is(extractName('Alice <alice@example.com>'), 'Alice')
  t.is(extractName('"Bob Smith" <bob@test.org>'), 'Bob Smith')
})

test('extractName - bare address falls back', (t) => {
  t.is(extractName('alice@example.com'), 'alice@example.com')
})

test('emailToEnvelope - basic email', (t) => {
  const email = {
    from: 'Alice <alice@example.com>',
    to: 'bridge@example.com',
    subject: 'Hello',
    body: 'This is a test message',
    date: 'Fri, 14 Feb 2026 10:00:00 +0000',
    messageId: '<abc123@example.com>'
  }

  const env = emailToEnvelope(email)
  t.ok(env)
  t.is(env.type, TYPES.TEXT)
  t.is(env.platform, PLATFORMS.EMAIL)
  t.is(env.author, 'Alice')
  t.ok(env.content.includes('Hello'))
  t.ok(env.content.includes('test message'))
  t.is(env._messageId, '<abc123@example.com>')
  t.is(env._subject, 'Hello')
})

test('emailToEnvelope - no subject', (t) => {
  const email = {
    from: 'bob@test.org',
    subject: '',
    body: 'Just a body',
    messageId: ''
  }

  const env = emailToEnvelope(email)
  t.ok(env)
  t.is(env.content, 'Just a body')
})

test('emailToEnvelope - empty body and subject', (t) => {
  const email = { from: 'x@y.z', subject: '', body: '', messageId: '' }
  t.is(emailToEnvelope(email), null)
})

test('emailToEnvelope - skip bridged emails', (t) => {
  const email = {
    from: 'bridge@test.com',
    subject: '[Keet] Message',
    body: '[email] Alice: hello',
    messageId: ''
  }
  t.is(emailToEnvelope(email), null)
})

test('emailToEnvelope - null input', (t) => {
  t.is(emailToEnvelope(null), null)
})

test('keetToEmail - normal message', (t) => {
  const msg = { name: 'fleeky', text: 'Hello!', memberId: 'abc' }
  const result = keetToEmail(msg, 'bridge-id')
  t.ok(result)
  t.is(result.author, 'fleeky')
  t.is(result.text, 'Hello!')
  t.ok(result.subject.includes('fleeky'))
  t.ok(result.body.includes('Hello!'))
})

test('keetToEmail - skip bridge identity', (t) => {
  const msg = { name: 'clode', text: 'Hello', memberId: 'bridge-id' }
  t.is(keetToEmail(msg, 'bridge-id'), null)
})

test('keetToEmail - skip system messages', (t) => {
  const msg = { name: 'system', text: 'joined', type: 'system' }
  t.is(keetToEmail(msg, 'bridge-id'), null)
})

test('keetToEmail - skip already bridged', (t) => {
  const msg = { name: 'x', text: '[email] Alice: hello', memberId: 'y' }
  t.is(keetToEmail(msg, 'bridge-id'), null)
})

test('keetToEmail - skip empty', (t) => {
  t.is(keetToEmail({ name: 'x', text: '', memberId: 'y' }, 'b'), null)
  t.is(keetToEmail(null, 'b'), null)
})

test('emailToKeetText - basic', (t) => {
  const email = {
    from: 'Alice <alice@example.com>',
    subject: 'Hello',
    body: 'Test message',
    messageId: ''
  }
  const env = emailToEnvelope(email)
  const text = emailToKeetText(env)
  t.ok(text.includes('[email]'))
  t.ok(text.includes('Alice'))
  t.ok(text.includes('Hello'))
})

test('emailToKeetText - long email truncated', (t) => {
  const email = {
    from: 'bob@test.org',
    subject: 'Long',
    body: 'x'.repeat(1000),
    messageId: ''
  }
  const env = emailToEnvelope(email)
  const text = emailToKeetText(env)
  t.ok(text.includes('...'))
  t.ok(text.length < 600)
})

test('keetToEmailText - format', (t) => {
  const result = keetToEmailText('fleeky', 'Hello world')
  t.is(result.subject, '[Keet] Message from fleeky')
  t.ok(result.body.includes('fleeky wrote'))
  t.ok(result.body.includes('Hello world'))
  t.ok(result.body.includes('bridge-email'))
})