import { describe, expect, it, vi } from 'vitest'; import express from 'express'; import bodyParser from 'body-parser'; import twilio from 'twilio'; import request from 'supertest'; import { twilioSignature } from '../../src/middleware/twilioSignature.ts'; const FAKE_AUTH_TOKEN = process.env.TWILIO_AUTH_TOKEN!; const FAKE_PUBLIC = process.env.WEBEX_PUBLIC_URL!.replace(/\/$/, ''); function makeApp() { const app = express(); app.use(bodyParser.urlencoded({ extended: true })); app.post('/sms', twilioSignature, (_req, res) => { res.status(200).send('ok'); }); return app; } describe('twilioSignature middleware', () => { it('rejects requests with no X-Twilio-Signature', async () => { const app = makeApp(); const res = await request(app).post('/sms').send({ From: '+15551234567', Body: 'hi' }); expect(res.status).toBe(403); }); it('rejects requests with a bad signature', async () => { const app = makeApp(); const res = await request(app) .post('/sms') .set('X-Twilio-Signature', 'definitely-not-real') .send({ From: '+15551234567', Body: 'hi' }); expect(res.status).toBe(403); }); it('accepts a properly signed request', async () => { const app = makeApp(); const params = { From: '+15551234567', To: '+15557654321', Body: 'hi' }; const url = `${FAKE_PUBLIC}/sms`; const signature = twilio.getExpectedTwilioSignature(FAKE_AUTH_TOKEN, url, params); const res = await request(app) .post('/sms') .set('X-Twilio-Signature', signature) .type('form') .send(params); expect(res.status).toBe(200); expect(res.text).toBe('ok'); }); });