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