|
|
|
|
@ -6,23 +6,9 @@ import { GroupSyncService } from '../../src/services/group-sync';
|
|
|
|
|
import { initializeDatabase, ensureUserExists } from '../../src/db';
|
|
|
|
|
import { TaskService } from '../../src/tasks/service';
|
|
|
|
|
|
|
|
|
|
// Simulated ResponseQueue for testing (in-memory array)
|
|
|
|
|
let simulatedQueue: any[] = [];
|
|
|
|
|
let originalAdd: any;
|
|
|
|
|
|
|
|
|
|
class SimulatedResponseQueue {
|
|
|
|
|
static async add(responses: any[]) {
|
|
|
|
|
simulatedQueue.push(...responses);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static getQueue() {
|
|
|
|
|
return simulatedQueue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static clear() {
|
|
|
|
|
simulatedQueue = [];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
import { SimulatedResponseQueue } from '../helpers/queue';
|
|
|
|
|
|
|
|
|
|
// Test database instance
|
|
|
|
|
let testDb: Database;
|
|
|
|
|
@ -158,7 +144,7 @@ describe('WebhookServer', () => {
|
|
|
|
|
const request = createTestRequest(payload);
|
|
|
|
|
const response = await WebhookServer.handleRequest(request);
|
|
|
|
|
expect(response.status).toBe(200);
|
|
|
|
|
expect(SimulatedResponseQueue.getQueue().length).toBeGreaterThan(0);
|
|
|
|
|
expect(SimulatedResponseQueue.get().length).toBeGreaterThan(0);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('should ignore empty message content', async () => {
|
|
|
|
|
@ -176,7 +162,7 @@ describe('WebhookServer', () => {
|
|
|
|
|
const request = createTestRequest(payload);
|
|
|
|
|
const response = await WebhookServer.handleRequest(request);
|
|
|
|
|
expect(response.status).toBe(200);
|
|
|
|
|
expect(SimulatedResponseQueue.getQueue().length).toBe(0);
|
|
|
|
|
expect(SimulatedResponseQueue.get().length).toBe(0);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('should handle very long messages', async () => {
|
|
|
|
|
@ -195,7 +181,7 @@ describe('WebhookServer', () => {
|
|
|
|
|
const request = createTestRequest(payload);
|
|
|
|
|
const response = await WebhookServer.handleRequest(request);
|
|
|
|
|
expect(response.status).toBe(200);
|
|
|
|
|
expect(SimulatedResponseQueue.getQueue().length).toBeGreaterThan(0);
|
|
|
|
|
expect(SimulatedResponseQueue.get().length).toBeGreaterThan(0);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('should handle messages with special characters and emojis', async () => {
|
|
|
|
|
@ -214,7 +200,7 @@ describe('WebhookServer', () => {
|
|
|
|
|
const request = createTestRequest(payload);
|
|
|
|
|
const response = await WebhookServer.handleRequest(request);
|
|
|
|
|
expect(response.status).toBe(200);
|
|
|
|
|
expect(SimulatedResponseQueue.getQueue().length).toBeGreaterThan(0);
|
|
|
|
|
expect(SimulatedResponseQueue.get().length).toBeGreaterThan(0);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('should ignore non-/tarea commands', async () => {
|
|
|
|
|
@ -232,7 +218,7 @@ describe('WebhookServer', () => {
|
|
|
|
|
const request = createTestRequest(payload);
|
|
|
|
|
const response = await WebhookServer.handleRequest(request);
|
|
|
|
|
expect(response.status).toBe(200);
|
|
|
|
|
expect(SimulatedResponseQueue.getQueue().length).toBe(0);
|
|
|
|
|
expect(SimulatedResponseQueue.get().length).toBe(0);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('should ignore message with mentions but no command', async () => {
|
|
|
|
|
@ -255,7 +241,7 @@ describe('WebhookServer', () => {
|
|
|
|
|
const request = createTestRequest(payload);
|
|
|
|
|
const response = await WebhookServer.handleRequest(request);
|
|
|
|
|
expect(response.status).toBe(200);
|
|
|
|
|
expect(SimulatedResponseQueue.getQueue().length).toBe(0);
|
|
|
|
|
expect(SimulatedResponseQueue.get().length).toBe(0);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('should ignore media attachment messages', async () => {
|
|
|
|
|
@ -275,7 +261,7 @@ describe('WebhookServer', () => {
|
|
|
|
|
const request = createTestRequest(payload);
|
|
|
|
|
const response = await WebhookServer.handleRequest(request);
|
|
|
|
|
expect(response.status).toBe(200);
|
|
|
|
|
expect(SimulatedResponseQueue.getQueue().length).toBe(0);
|
|
|
|
|
expect(SimulatedResponseQueue.get().length).toBe(0);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('should process command from extendedTextMessage', async () => {
|
|
|
|
|
@ -295,7 +281,7 @@ describe('WebhookServer', () => {
|
|
|
|
|
const request = createTestRequest(payload);
|
|
|
|
|
const response = await WebhookServer.handleRequest(request);
|
|
|
|
|
expect(response.status).toBe(200);
|
|
|
|
|
expect(SimulatedResponseQueue.getQueue().length).toBeGreaterThan(0);
|
|
|
|
|
expect(SimulatedResponseQueue.get().length).toBeGreaterThan(0);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('should process command from image caption when caption starts with a command', async () => {
|
|
|
|
|
@ -315,7 +301,7 @@ describe('WebhookServer', () => {
|
|
|
|
|
const request = createTestRequest(payload);
|
|
|
|
|
const response = await WebhookServer.handleRequest(request);
|
|
|
|
|
expect(response.status).toBe(200);
|
|
|
|
|
expect(SimulatedResponseQueue.getQueue().length).toBeGreaterThan(0);
|
|
|
|
|
expect(SimulatedResponseQueue.get().length).toBeGreaterThan(0);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('should handle requests on configured port', async () => {
|
|
|
|
|
@ -373,7 +359,7 @@ describe('WebhookServer', () => {
|
|
|
|
|
await WebhookServer.handleRequest(createTestRequest(payload));
|
|
|
|
|
|
|
|
|
|
// Check that a response was queued (indicating command processing)
|
|
|
|
|
expect(SimulatedResponseQueue.getQueue().length).toBeGreaterThan(0);
|
|
|
|
|
expect(SimulatedResponseQueue.get().length).toBeGreaterThan(0);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('should log command with due date', async () => {
|
|
|
|
|
@ -398,7 +384,7 @@ describe('WebhookServer', () => {
|
|
|
|
|
await WebhookServer.handleRequest(createTestRequest(payload));
|
|
|
|
|
|
|
|
|
|
// Verify command processing by checking queue
|
|
|
|
|
expect(SimulatedResponseQueue.getQueue().length).toBeGreaterThan(0);
|
|
|
|
|
expect(SimulatedResponseQueue.get().length).toBeGreaterThan(0);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
@ -418,7 +404,7 @@ describe('WebhookServer', () => {
|
|
|
|
|
const request = createTestRequest(payload);
|
|
|
|
|
const response = await WebhookServer.handleRequest(request);
|
|
|
|
|
expect(response.status).toBe(200);
|
|
|
|
|
expect(SimulatedResponseQueue.getQueue().length).toBeGreaterThan(0);
|
|
|
|
|
expect(SimulatedResponseQueue.get().length).toBeGreaterThan(0);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('should handle multiple dates in command (use last one as due date)', async () => {
|
|
|
|
|
@ -438,7 +424,7 @@ describe('WebhookServer', () => {
|
|
|
|
|
|
|
|
|
|
await WebhookServer.handleRequest(createTestRequest(payload));
|
|
|
|
|
|
|
|
|
|
expect(SimulatedResponseQueue.getQueue().length).toBeGreaterThan(0);
|
|
|
|
|
expect(SimulatedResponseQueue.get().length).toBeGreaterThan(0);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('should ignore past dates as due dates', async () => {
|
|
|
|
|
@ -598,7 +584,7 @@ describe('WebhookServer', () => {
|
|
|
|
|
const request = createTestRequest(payload);
|
|
|
|
|
const response = await WebhookServer.handleRequest(request);
|
|
|
|
|
expect(response.status).toBe(200);
|
|
|
|
|
expect(SimulatedResponseQueue.getQueue().length).toBeGreaterThan(0);
|
|
|
|
|
expect(SimulatedResponseQueue.get().length).toBeGreaterThan(0);
|
|
|
|
|
|
|
|
|
|
// Verify user was created in real database
|
|
|
|
|
const user = testDb.query("SELECT * FROM users WHERE id = ?").get('1234567890');
|
|
|
|
|
@ -621,7 +607,7 @@ describe('WebhookServer', () => {
|
|
|
|
|
const request = createTestRequest(payload);
|
|
|
|
|
const response = await WebhookServer.handleRequest(request);
|
|
|
|
|
expect(response.status).toBe(200);
|
|
|
|
|
expect(SimulatedResponseQueue.getQueue().length).toBe(0);
|
|
|
|
|
expect(SimulatedResponseQueue.get().length).toBe(0);
|
|
|
|
|
|
|
|
|
|
// Verify no user was created
|
|
|
|
|
const userCount = testDb.query("SELECT COUNT(*) as count FROM users").get();
|
|
|
|
|
@ -646,7 +632,7 @@ describe('WebhookServer', () => {
|
|
|
|
|
const request = createTestRequest(payload);
|
|
|
|
|
const response = await WebhookServer.handleRequest(request);
|
|
|
|
|
expect(response.status).toBe(200);
|
|
|
|
|
expect(SimulatedResponseQueue.getQueue().length).toBe(0);
|
|
|
|
|
expect(SimulatedResponseQueue.get().length).toBe(0);
|
|
|
|
|
|
|
|
|
|
// Reinitialize database for subsequent tests (force full migration)
|
|
|
|
|
testDb.exec('DROP TABLE IF EXISTS schema_migrations');
|
|
|
|
|
@ -668,7 +654,7 @@ describe('WebhookServer', () => {
|
|
|
|
|
const request = createTestRequest(payload);
|
|
|
|
|
const response = await WebhookServer.handleRequest(request);
|
|
|
|
|
expect(response.status).toBe(200);
|
|
|
|
|
expect(SimulatedResponseQueue.getQueue().length).toBeGreaterThan(0);
|
|
|
|
|
expect(SimulatedResponseQueue.get().length).toBeGreaterThan(0);
|
|
|
|
|
|
|
|
|
|
// Verify user was created/updated in database
|
|
|
|
|
const user = testDb.query("SELECT * FROM users WHERE id = ?").get('1234567890');
|
|
|
|
|
@ -695,7 +681,7 @@ describe('WebhookServer', () => {
|
|
|
|
|
await WebhookServer.handleRequest(request);
|
|
|
|
|
|
|
|
|
|
// Verify that a response was queued, indicating command processing
|
|
|
|
|
expect(SimulatedResponseQueue.getQueue().length).toBeGreaterThan(0);
|
|
|
|
|
expect(SimulatedResponseQueue.get().length).toBeGreaterThan(0);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('should handle end-to-end flow with valid user and command processing', async () => {
|
|
|
|
|
@ -720,7 +706,7 @@ describe('WebhookServer', () => {
|
|
|
|
|
expect(user).toBeDefined();
|
|
|
|
|
|
|
|
|
|
// Verify that a response was queued
|
|
|
|
|
expect(SimulatedResponseQueue.getQueue().length).toBeGreaterThan(0);
|
|
|
|
|
expect(SimulatedResponseQueue.get().length).toBeGreaterThan(0);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
@ -800,7 +786,7 @@ describe('WebhookServer', () => {
|
|
|
|
|
const request = createTestRequest(payload);
|
|
|
|
|
await WebhookServer.handleRequest(request);
|
|
|
|
|
|
|
|
|
|
const out = SimulatedResponseQueue.getQueue();
|
|
|
|
|
const out = SimulatedResponseQueue.get();
|
|
|
|
|
expect(out.length).toBeGreaterThan(0);
|
|
|
|
|
for (const r of out) {
|
|
|
|
|
expect(r.recipient.endsWith('@g.us')).toBe(false);
|
|
|
|
|
@ -848,7 +834,7 @@ describe('WebhookServer', () => {
|
|
|
|
|
const response = await WebhookServer.handleRequest(createTestRequest(payload));
|
|
|
|
|
expect(response.status).toBe(200);
|
|
|
|
|
|
|
|
|
|
const out = SimulatedResponseQueue.getQueue();
|
|
|
|
|
const out = SimulatedResponseQueue.get();
|
|
|
|
|
expect(out.length).toBeGreaterThan(0);
|
|
|
|
|
for (const r of out) {
|
|
|
|
|
expect(r.recipient.endsWith('@g.us')).toBe(false);
|
|
|
|
|
|