Files
workspace/apps/whatsapp-sync/tests/jsonl-parser.test.js

153 lines
4.6 KiB
JavaScript

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');
});
});