const { test } = require('node:test')
const assert = require('node:assert/strict')

const requireInternalKey = require('../src/middleware/requireInternalKey')
const { startApp } = require('./_helper')

const KEY = 'test-internal-key-1234567890'

async function withApp(run) {
  const prev = process.env.BOT_INTERNAL_KEY
  process.env.BOT_INTERNAL_KEY = KEY
  const app = await startApp((a) => {
    a.get('/internal/thing', requireInternalKey, (req, res) => res.json({ ok: true }))
  })
  try {
    await run(app)
  } finally {
    await app.close()
    if (prev === undefined) delete process.env.BOT_INTERNAL_KEY
    else process.env.BOT_INTERNAL_KEY = prev
  }
}

test('requireInternalKey: 401 when no key header is sent', async () => {
  await withApp(async (app) => {
    const res = await fetch(`${app.url}/internal/thing`)
    assert.equal(res.status, 401)
  })
})

test('requireInternalKey: 401 on a wrong key', async () => {
  await withApp(async (app) => {
    const res = await fetch(`${app.url}/internal/thing`, {
      headers: { 'X-Internal-Key': 'nope' },
    })
    assert.equal(res.status, 401)
  })
})

test('requireInternalKey: 200 with the correct key', async () => {
  await withApp(async (app) => {
    const res = await fetch(`${app.url}/internal/thing`, {
      headers: { 'X-Internal-Key': KEY },
    })
    assert.equal(res.status, 200)
    const body = await res.json()
    assert.deepEqual(body, { ok: true })
  })
})

test('requireInternalKey: 401 when the expected key is empty (never a wildcard)', async () => {
  const prev = process.env.BOT_INTERNAL_KEY
  process.env.BOT_INTERNAL_KEY = ''
  const app = await startApp((a) => {
    a.get('/internal/thing', requireInternalKey, (req, res) => res.json({ ok: true }))
  })
  try {
    // Even sending an empty key must not match an empty expected key.
    const res = await fetch(`${app.url}/internal/thing`, { headers: { 'X-Internal-Key': '' } })
    assert.equal(res.status, 401)
  } finally {
    await app.close()
    if (prev === undefined) delete process.env.BOT_INTERNAL_KEY
    else process.env.BOT_INTERNAL_KEY = prev
  }
})
