signal-desktop/ts/test-electron/services/MessageCache_test.ts
2025-01-10 08:18:32 +10:00

158 lines
4.3 KiB
TypeScript

// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import { assert } from 'chai';
import { v4 as uuid } from 'uuid';
import { MessageModel } from '../../models/messages';
import { strictAssert } from '../../util/assert';
import { MessageCache } from '../../services/MessageCache';
import { generateAci } from '../../types/ServiceId';
describe('MessageCache', () => {
beforeEach(async () => {
const ourAci = generateAci();
await window.textsecure.storage.put('uuid_id', `${ourAci}.1`);
await window.ConversationController.load();
});
describe('findBySentAt', () => {
it('returns an empty iterable if no messages match', async () => {
const mc = new MessageCache();
assert.isUndefined(await mc.findBySentAt(123, () => true));
});
it('returns all messages that match the timestamp', async () => {
const mc = new MessageCache();
let message1 = new MessageModel({
conversationId: 'xyz',
body: 'message1',
id: uuid(),
received_at: 1,
sent_at: 1234,
timestamp: 9999,
type: 'incoming',
});
let message2 = new MessageModel({
conversationId: 'xyz',
body: 'message2',
id: uuid(),
received_at: 2,
sent_at: 1234,
timestamp: 9999,
type: 'outgoing',
});
const message3 = new MessageModel({
conversationId: 'xyz',
body: 'message3',
id: uuid(),
received_at: 3,
sent_at: 5678,
timestamp: 9999,
type: 'outgoing',
});
message1 = mc.register(message1);
message2 = mc.register(message2);
// We deliberately register this message twice for testing.
message2 = mc.register(message2);
mc.register(message3);
const filteredMessage = await mc.findBySentAt(1234, () => true);
assert.deepEqual(
filteredMessage?.attributes,
message1.attributes,
'first'
);
mc.unregister(message1.id);
const filteredMessage2 = await mc.findBySentAt(1234, () => true);
assert.deepEqual(
filteredMessage2?.attributes,
message2.attributes,
'second'
);
});
});
describe('register: syncing with backbone', () => {
it('backbone to redux', () => {
const message1 = new MessageModel({
conversationId: 'xyz',
id: uuid(),
body: 'test1',
received_at: 1,
sent_at: Date.now(),
timestamp: Date.now(),
type: 'outgoing',
});
const messageFromController = window.MessageCache.register(message1);
assert.strictEqual(
message1,
messageFromController,
'same objects from mc.register'
);
const messageInCache = window.MessageCache.getById(message1.id);
assert.strictEqual(
message1,
messageInCache,
'same objects from mc.getById'
);
assert.deepEqual(
message1.attributes,
messageInCache?.attributes,
'same attributes as in cache'
);
message1.set({ body: 'test2' });
assert.equal(message1.attributes.body, 'test2', 'message model updated');
assert.equal(
messageInCache?.attributes.body,
'test2',
'old reference from messageById was updated'
);
});
it('redux to backbone (working with models)', () => {
const message = new MessageModel({
conversationId: 'xyz',
id: uuid(),
body: 'test1',
received_at: 1,
sent_at: Date.now(),
timestamp: Date.now(),
type: 'outgoing',
});
const messageFromController = window.MessageCache.register(message);
assert.strictEqual(
message,
messageFromController,
'mc.register returns existing but it is not the same reference'
);
assert.deepEqual(
message.attributes,
messageFromController.attributes,
'mc.register returns existing and is the same attributes'
);
message.set({ body: 'test2' });
const messageInCache = window.MessageCache.getById(message.id);
strictAssert(messageInCache, 'no message found');
assert.equal(
messageFromController.get('body'),
messageInCache.get('body'),
'new update is in cache'
);
});
});
});