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