feat: initial setup with WhatsApp CRM apps and sync services
This commit is contained in:
152
apps/whatsapp-sync/tests/jsonl-parser.test.js
Normal file
152
apps/whatsapp-sync/tests/jsonl-parser.test.js
Normal file
@@ -0,0 +1,152 @@
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var jsonlParser = require('../src/jsonl-parser');
|
||||
|
||||
describe('1.1 JSONL Parser Tests', function() {
|
||||
describe('parseValidMessageLine', function() {
|
||||
test('test_parse_valid_message_line - parses valid JSONL correctly', function() {
|
||||
var validLine = JSON.stringify({
|
||||
id: 'msg_123',
|
||||
from: '5511999999999',
|
||||
body: 'Hello world',
|
||||
timestamp: 1234567890,
|
||||
hasMedia: false,
|
||||
});
|
||||
|
||||
var result = jsonlParser.parseMessageLine(validLine);
|
||||
|
||||
expect(result).toBeDefined();
|
||||
expect(result.id).toBe('msg_123');
|
||||
expect(result.from).toBe('5511999999999');
|
||||
expect(result.body).toBe('Hello world');
|
||||
expect(result.timestamp).toBe(1234567890);
|
||||
expect(result.hasMedia).toBe(false);
|
||||
});
|
||||
|
||||
test('test_parse_message_with_missing_optional_fields - handles missing fields', function() {
|
||||
var lineWithMissingFields = JSON.stringify({
|
||||
id: 'msg_456',
|
||||
from: '5511888888888',
|
||||
body: 'Test',
|
||||
});
|
||||
|
||||
var result = jsonlParser.parseMessageLine(lineWithMissingFields);
|
||||
|
||||
expect(result).toBeDefined();
|
||||
expect(result.id).toBe('msg_456');
|
||||
expect(result.from).toBe('5511888888888');
|
||||
expect(result.body).toBe('Test');
|
||||
expect(result.timestamp).toBeUndefined();
|
||||
expect(result.hasMedia).toBe(false);
|
||||
});
|
||||
|
||||
test('test_parse_invalid_json - throws ParseError for bad JSON', function() {
|
||||
var invalidLine = 'not valid json {';
|
||||
|
||||
expect(function() {
|
||||
jsonlParser.parseMessageLine(invalidLine);
|
||||
}).toThrow();
|
||||
});
|
||||
|
||||
test('test_parse_empty_file - returns empty array for empty file', function() {
|
||||
var result = jsonlParser.parseFile('');
|
||||
|
||||
expect(Array.isArray(result)).toBe(true);
|
||||
expect(result.length).toBe(0);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('1.2 Sync Logic Tests', function() {
|
||||
var mockDb;
|
||||
|
||||
beforeEach(function() {
|
||||
mockDb = {
|
||||
contacts: new Map(),
|
||||
messages: new Map(),
|
||||
};
|
||||
});
|
||||
|
||||
test('test_deduplication_filters_known_ids - skips already-synced messages', function() {
|
||||
mockDb.messages.set('msg_123', true);
|
||||
|
||||
var result = jsonlParser.filterNewMessages(['msg_123', 'msg_456'], mockDb.messages);
|
||||
|
||||
expect(result).toEqual(['msg_456']);
|
||||
});
|
||||
|
||||
test('test_new_phone_creates_new_contact - new phone creates new contact', function() {
|
||||
var newPhone = '5511999999999';
|
||||
|
||||
var result = jsonlParser.getOrCreateContact(newPhone, mockDb.contacts);
|
||||
|
||||
expect(result).toBeDefined();
|
||||
expect(result.phone).toBe(newPhone);
|
||||
expect(mockDb.contacts.size).toBe(1);
|
||||
});
|
||||
|
||||
test('test_known_phone_updates_existing_contact - existing phone updates contact', function() {
|
||||
var existingPhone = '5511999999999';
|
||||
mockDb.contacts.set(existingPhone, { phone: existingPhone, name: 'John' });
|
||||
|
||||
var result = jsonlParser.getOrCreateContact(existingPhone, mockDb.contacts);
|
||||
|
||||
expect(result).toBeDefined();
|
||||
expect(result.phone).toBe(existingPhone);
|
||||
expect(mockDb.contacts.size).toBe(1);
|
||||
});
|
||||
});
|
||||
|
||||
describe('1.3 Database Integration Tests', function() {
|
||||
test('test_insert_contact_unique_by_phone - prevents duplicates', function() {
|
||||
var contactsDb = {
|
||||
insert: function(contact) {
|
||||
if (this.findByPhone(contact.phone)) {
|
||||
throw new Error('Duplicate');
|
||||
}
|
||||
this.contacts.push(contact);
|
||||
},
|
||||
findByPhone: function(phone) {
|
||||
return this.contacts.find(function(c) { return c.phone === phone; });
|
||||
},
|
||||
contacts: [],
|
||||
};
|
||||
|
||||
contactsDb.insert({ phone: '5511999999999', name: 'John' });
|
||||
|
||||
expect(function() {
|
||||
contactsDb.insert({ phone: '5511999999999', name: 'Jane' });
|
||||
}).toThrow('Duplicate');
|
||||
});
|
||||
|
||||
test('test_find_contact_by_phone_returns_contact - retrieves by phone', function() {
|
||||
var contactsDb = {
|
||||
findByPhone: function(phone) {
|
||||
return this.contacts.find(function(c) { return c.phone === phone; });
|
||||
},
|
||||
contacts: [
|
||||
{ id: 1, phone: '5511999999999', name: 'John' },
|
||||
{ id: 2, phone: '5511888888888', name: 'Jane' },
|
||||
],
|
||||
};
|
||||
|
||||
var result = contactsDb.findByPhone('5511999999999');
|
||||
|
||||
expect(result).toBeDefined();
|
||||
expect(result.name).toBe('John');
|
||||
});
|
||||
|
||||
test('test_link_message_to_contact - associates message with contact', function() {
|
||||
var messagesDb = {
|
||||
insert: function(message, contactPhone) {
|
||||
message.contactPhone = contactPhone;
|
||||
this.messages.push(message);
|
||||
},
|
||||
messages: [],
|
||||
};
|
||||
|
||||
messagesDb.insert({ id: 'msg_123', body: 'Hello' }, '5511999999999');
|
||||
|
||||
expect(messagesDb.messages[0].contactPhone).toBe('5511999999999');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user