Add migration for unread call history messages and fix json.seenStatus
This commit is contained in:
parent
407b6b0f97
commit
6fd117bde7
4 changed files with 268 additions and 4 deletions
189
ts/test-node/sql/migration_1000_test.ts
Normal file
189
ts/test-node/sql/migration_1000_test.ts
Normal file
|
@ -0,0 +1,189 @@
|
|||
// Copyright 2023 Signal Messenger, LLC
|
||||
// SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
import { assert } from 'chai';
|
||||
import type { Database } from '@signalapp/better-sqlite3';
|
||||
import SQL from '@signalapp/better-sqlite3';
|
||||
import { v4 as generateGuid } from 'uuid';
|
||||
|
||||
import { jsonToObject, sql } from '../../sql/util';
|
||||
import { updateToVersion } from './helpers';
|
||||
import type { MessageType } from '../../sql/Interface';
|
||||
import { ReadStatus } from '../../messages/MessageReadStatus';
|
||||
import { SeenStatus } from '../../MessageSeenStatus';
|
||||
|
||||
describe('SQL/updateToSchemaVersion1000', () => {
|
||||
let db: Database;
|
||||
|
||||
beforeEach(() => {
|
||||
db = new SQL(':memory:');
|
||||
updateToVersion(db, 990);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
db.close();
|
||||
});
|
||||
|
||||
function createCallHistoryMessage(options: {
|
||||
messageId: string;
|
||||
conversationId: string;
|
||||
callId: string;
|
||||
readStatus: ReadStatus;
|
||||
seenStatus: SeenStatus;
|
||||
}): MessageType {
|
||||
const message: MessageType = {
|
||||
id: options.messageId,
|
||||
type: 'call-history',
|
||||
conversationId: options.conversationId,
|
||||
received_at: Date.now(),
|
||||
sent_at: Date.now(),
|
||||
received_at_ms: Date.now(),
|
||||
timestamp: Date.now(),
|
||||
readStatus: options.readStatus,
|
||||
seenStatus: options.seenStatus,
|
||||
callId: options.callId,
|
||||
};
|
||||
|
||||
const json = JSON.stringify(message);
|
||||
|
||||
const [query, params] = sql`
|
||||
INSERT INTO messages
|
||||
(id, conversationId, type, readStatus, seenStatus, json)
|
||||
VALUES
|
||||
(
|
||||
${message.id},
|
||||
${message.conversationId},
|
||||
${message.type},
|
||||
${message.readStatus},
|
||||
${message.seenStatus},
|
||||
${json}
|
||||
)
|
||||
`;
|
||||
|
||||
db.prepare(query).run(params);
|
||||
|
||||
return message;
|
||||
}
|
||||
|
||||
function createConversation(
|
||||
type: 'private' | 'group',
|
||||
discoveredUnregisteredAt?: number
|
||||
) {
|
||||
const id = generateGuid();
|
||||
const groupId = type === 'group' ? generateGuid() : null;
|
||||
|
||||
const json = JSON.stringify({
|
||||
type,
|
||||
id,
|
||||
groupId,
|
||||
discoveredUnregisteredAt,
|
||||
});
|
||||
|
||||
const [query, params] = sql`
|
||||
INSERT INTO conversations
|
||||
(id, type, groupId, json)
|
||||
VALUES
|
||||
(${id}, ${type}, ${groupId}, ${json});
|
||||
`;
|
||||
|
||||
db.prepare(query).run(params);
|
||||
|
||||
return { id, groupId };
|
||||
}
|
||||
|
||||
function getMessages() {
|
||||
const [query] = sql`
|
||||
SELECT json, readStatus, seenStatus FROM messages;
|
||||
`;
|
||||
return db
|
||||
.prepare(query)
|
||||
.all()
|
||||
.map(row => {
|
||||
return {
|
||||
message: jsonToObject<MessageType>(row.json),
|
||||
readStatus: row.readStatus,
|
||||
seenStatus: row.seenStatus,
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
it('marks unread call history messages read and unseen', () => {
|
||||
const conversation1 = createConversation('private');
|
||||
const conversation2 = createConversation('group');
|
||||
|
||||
const callId1 = '1';
|
||||
const callId2 = '2';
|
||||
|
||||
createCallHistoryMessage({
|
||||
messageId: generateGuid(),
|
||||
conversationId: conversation1.id,
|
||||
callId: callId1,
|
||||
readStatus: ReadStatus.Unread,
|
||||
seenStatus: SeenStatus.Unseen,
|
||||
});
|
||||
|
||||
createCallHistoryMessage({
|
||||
messageId: generateGuid(),
|
||||
conversationId: conversation2.id,
|
||||
callId: callId2,
|
||||
readStatus: ReadStatus.Unread,
|
||||
seenStatus: SeenStatus.Unseen,
|
||||
});
|
||||
|
||||
updateToVersion(db, 1000);
|
||||
|
||||
const messages = getMessages();
|
||||
|
||||
assert.strictEqual(messages.length, 2);
|
||||
|
||||
assert.strictEqual(messages[0].message.readStatus, ReadStatus.Read);
|
||||
assert.strictEqual(messages[0].message.seenStatus, SeenStatus.Unseen);
|
||||
assert.strictEqual(messages[0].readStatus, ReadStatus.Read);
|
||||
assert.strictEqual(messages[0].seenStatus, SeenStatus.Unseen);
|
||||
|
||||
assert.strictEqual(messages[1].message.readStatus, ReadStatus.Read);
|
||||
assert.strictEqual(messages[1].message.seenStatus, SeenStatus.Unseen);
|
||||
assert.strictEqual(messages[1].readStatus, ReadStatus.Read);
|
||||
assert.strictEqual(messages[1].seenStatus, SeenStatus.Unseen);
|
||||
});
|
||||
|
||||
it('does not mark read call history messages as unseen', () => {
|
||||
const conversation1 = createConversation('private');
|
||||
const conversation2 = createConversation('group');
|
||||
|
||||
const callId1 = '1';
|
||||
const callId2 = '2';
|
||||
|
||||
createCallHistoryMessage({
|
||||
messageId: generateGuid(),
|
||||
conversationId: conversation1.id,
|
||||
callId: callId1,
|
||||
readStatus: ReadStatus.Read,
|
||||
seenStatus: SeenStatus.Seen,
|
||||
});
|
||||
|
||||
createCallHistoryMessage({
|
||||
messageId: generateGuid(),
|
||||
conversationId: conversation2.id,
|
||||
callId: callId2,
|
||||
readStatus: ReadStatus.Read,
|
||||
seenStatus: SeenStatus.Seen,
|
||||
});
|
||||
|
||||
updateToVersion(db, 1000);
|
||||
|
||||
const messages = getMessages();
|
||||
|
||||
assert.strictEqual(messages.length, 2);
|
||||
|
||||
assert.strictEqual(messages[0].message.readStatus, ReadStatus.Read);
|
||||
assert.strictEqual(messages[0].message.seenStatus, SeenStatus.Seen);
|
||||
assert.strictEqual(messages[0].readStatus, ReadStatus.Read);
|
||||
assert.strictEqual(messages[0].seenStatus, SeenStatus.Seen);
|
||||
|
||||
assert.strictEqual(messages[1].message.readStatus, ReadStatus.Read);
|
||||
assert.strictEqual(messages[1].message.seenStatus, SeenStatus.Seen);
|
||||
assert.strictEqual(messages[1].readStatus, ReadStatus.Read);
|
||||
assert.strictEqual(messages[1].seenStatus, SeenStatus.Seen);
|
||||
});
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue