import test from 'brittle'
import { discordToEnvelope, keetToDiscord, envelopeToDiscordContent, discordReactionToEnvelope } from '../lib/adapter.js'
import { TYPES, PLATFORMS, createEnvelope } from 'bridge-envelope'
// Mock Discord message objects
function mockMessage (overrides = {}) {
return {
author: { tag: 'user#1234', username: 'user', bot: false, id: '123' },
channel: { name: 'general', id: '456' },
channelId: '456',
content: 'Hello from Discord!',
attachments: { first: () => null, [Symbol.iterator]: function * () {} },
reference: null,
...overrides
}
}
test('discordToEnvelope - basic text message', (t) => {
const msg = mockMessage()
const env = discordToEnvelope(msg)
t.is(env.type, TYPES.TEXT)
t.is(env.platform, PLATFORMS.DISCORD)
t.is(env.author, 'user#1234')
t.is(env.content, 'Hello from Discord!')
t.is(env.channel, 'general')
t.ok(env.id)
})
test('discordToEnvelope - skips bot messages', (t) => {
const msg = mockMessage({ author: { tag: 'bot#0000', bot: true, id: '999' } })
const env = discordToEnvelope(msg)
t.is(env, null)
})
test('discordToEnvelope - with attachment', (t) => {
const msg = mockMessage({
attachments: {
first: () => ({ url: 'https://cdn.discord.com/img.png', contentType: 'image/png' }),
[Symbol.iterator]: function * () { yield ['1', { url: 'https://cdn.discord.com/img.png' }] }
}
})
const env = discordToEnvelope(msg)
t.is(env.type, TYPES.MEDIA)
t.is(env.mediaUrl, 'https://cdn.discord.com/img.png')
t.is(env.mediaType, 'image/png')
})
test('discordToEnvelope - reply message', (t) => {
const msg = mockMessage({
reference: { messageId: 'orig-msg-123' }
})
const env = discordToEnvelope(msg)
t.is(env.type, TYPES.REPLY)
t.is(env.replyTo, 'orig-msg-123')
})
test('discordToEnvelope - reply with attachment', (t) => {
const msg = mockMessage({
reference: { messageId: 'orig-456' },
attachments: {
first: () => ({ url: 'https://cdn.discord.com/file.pdf', contentType: 'application/pdf' }),
[Symbol.iterator]: function * () {}
}
})
const env = discordToEnvelope(msg)
t.is(env.type, TYPES.MEDIA)
t.is(env.replyTo, 'orig-456')
t.is(env.mediaUrl, 'https://cdn.discord.com/file.pdf')
})
test('discordToEnvelope - empty content', (t) => {
const msg = mockMessage({ content: '' })
const env = discordToEnvelope(msg)
t.is(env.content, '')
})
test('discordToEnvelope - unicode content', (t) => {
const msg = mockMessage({ content: '🎉 Hello 世界!' })
const env = discordToEnvelope(msg)
t.is(env.content, '🎉 Hello 世界!')
})
test('keetToDiscord - basic message', (t) => {
const msg = {
memberId: 'member-123',
name: 'Alice',
text: 'Hello from Keet!',
timestamp: Date.now()
}
const result = keetToDiscord(msg, 'bridge-identity')
t.ok(result)
t.is(result.name, 'Alice')
t.ok(result.text.includes('Alice'))
t.ok(result.text.includes('Keet'))
t.ok(result.text.includes('Hello from Keet!'))
})
test('keetToDiscord - skips own messages', (t) => {
const msg = { memberId: 'bridge-id', name: 'Bridge', text: 'echo' }
t.is(keetToDiscord(msg, 'bridge-id'), null)
})
test('keetToDiscord - skips system messages', (t) => {
const msg = { memberId: 'other', name: 'Sys', text: 'joined', system: { type: 'join' } }
t.is(keetToDiscord(msg, 'bridge-id'), null)
})
test('keetToDiscord - skips empty text', (t) => {
const msg = { memberId: 'other', name: 'User', text: ' ' }
t.is(keetToDiscord(msg, 'bridge-id'), null)
})
test('keetToDiscord - anonymous fallback', (t) => {
const msg = { memberId: 'other', text: 'hello' }
const result = keetToDiscord(msg, 'bridge-id')
t.is(result.name, 'anonymous')
})
test('envelopeToDiscordContent - keet text', (t) => {
const env = createEnvelope({
type: TYPES.TEXT,
platform: PLATFORMS.KEET,
author: 'Alice',
content: 'Hello!'
})
const text = envelopeToDiscordContent(env)
t.ok(text.includes('[keet]'))
t.ok(text.includes('**Alice**'))
t.ok(text.includes('Hello!'))
})
test('envelopeToDiscordContent - discord message no prefix', (t) => {
const env = createEnvelope({
type: TYPES.TEXT,
platform: PLATFORMS.DISCORD,
author: 'bob#1234',
content: 'native discord'
})
const text = envelopeToDiscordContent(env)
t.absent(text.includes('[discord]'))
t.ok(text.includes('bob#1234'))
})
test('envelopeToDiscordContent - IRC message', (t) => {
const env = createEnvelope({
type: TYPES.TEXT,
platform: PLATFORMS.IRC,
author: 'ircuser',
content: 'from IRC'
})
const text = envelopeToDiscordContent(env)
t.ok(text.includes('[irc]'))
t.ok(text.includes('**ircuser**'))
})
test('envelopeToDiscordContent - media', (t) => {
const env = createEnvelope({
type: TYPES.MEDIA,
platform: PLATFORMS.KEET,
author: 'Alice',
content: 'Check this',
mediaUrl: 'https://example.com/img.png'
})
const text = envelopeToDiscordContent(env)
t.ok(text.includes('https://example.com/img.png'))
})
test('envelopeToDiscordContent - reaction', (t) => {
const env = createEnvelope({
type: TYPES.REACTION,
platform: PLATFORMS.KEET,
author: 'Bob',
content: '👍'
})
const text = envelopeToDiscordContent(env)
t.ok(text.includes('reacted'))
t.ok(text.includes('👍'))
})
test('envelopeToDiscordContent - system', (t) => {
const env = createEnvelope({
type: TYPES.SYSTEM,
platform: PLATFORMS.KEET,
content: 'User joined'
})
const text = envelopeToDiscordContent(env)
t.ok(text.includes('User joined'))
})
test('discordReactionToEnvelope', (t) => {
const reaction = {
emoji: { name: '👍', toString: () => '👍' },
message: {
id: 'msg-789',
channel: { name: 'general' },
channelId: '456'
}
}
const user = { tag: 'alice#1234', username: 'alice' }
const env = discordReactionToEnvelope(reaction, user)
t.is(env.type, TYPES.REACTION)
t.is(env.platform, PLATFORMS.DISCORD)
t.is(env.author, 'alice#1234')
t.is(env.content, '👍')
t.is(env.replyTo, 'msg-789')
})