OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-social / bridge-discord / test / adapter.test.js

213 lines · javascript ref:
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')
})