51 lines
1.5 KiB
JavaScript
51 lines
1.5 KiB
JavaScript
const express = require('express');
|
|
const request = require('supertest');
|
|
|
|
// Mock supabase
|
|
jest.mock('../../src/utils/supabase', () => ({
|
|
getSupabaseServiceClient: () => ({
|
|
from: jest.fn().mockReturnValue({
|
|
upsert: jest.fn().mockResolvedValue({ data: null, error: null }),
|
|
}),
|
|
}),
|
|
}));
|
|
|
|
const waitlistRoutes = require('../../src/routes/waitlist');
|
|
|
|
const app = express();
|
|
app.use(express.json());
|
|
app.use('/api/waitlist', waitlistRoutes);
|
|
|
|
describe('Honeypot spam protection', () => {
|
|
test('accepts valid submission without honeypot', async () => {
|
|
const res = await request(app)
|
|
.post('/api/waitlist')
|
|
.send({ email: 'test@example.com', list: 'merch' });
|
|
expect(res.status).toBe(200);
|
|
expect(res.body.success).toBe(true);
|
|
});
|
|
|
|
test('silently discards submission with honeypot filled', async () => {
|
|
const res = await request(app)
|
|
.post('/api/waitlist')
|
|
.send({ email: 'bot@spam.com', list: 'merch', website: 'http://spam.com' });
|
|
expect(res.status).toBe(200);
|
|
expect(res.body.success).toBe(true);
|
|
// Bot thinks it succeeded, but nothing was stored
|
|
});
|
|
|
|
test('rejects missing email', async () => {
|
|
const res = await request(app)
|
|
.post('/api/waitlist')
|
|
.send({ list: 'merch' });
|
|
expect(res.status).toBe(400);
|
|
});
|
|
|
|
test('rejects missing list', async () => {
|
|
const res = await request(app)
|
|
.post('/api/waitlist')
|
|
.send({ email: 'test@example.com' });
|
|
expect(res.status).toBe(400);
|
|
});
|
|
});
|