153 lines
4.6 KiB
JavaScript
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');
|
|
});
|
|
});
|