mirror of
https://github.com/signalapp/Signal-Desktop.git
synced 2026-04-02 08:13:37 +01:00
145 lines
4.0 KiB
TypeScript
145 lines
4.0 KiB
TypeScript
// Copyright 2026 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
import { assert } from 'chai';
|
|
import { v4 as generateUuid } from 'uuid';
|
|
|
|
import { DataReader, DataWriter } from '../../sql/Client.preload.js';
|
|
import { generateAci } from '../../types/ServiceId.std.js';
|
|
import type { MessageAttributesType } from '../../model-types.d.ts';
|
|
import { postSaveUpdates } from '../../util/cleanup.preload.js';
|
|
import { IMAGE_JPEG } from '../../types/MIME.std.js';
|
|
import { testPlaintextHash } from '../../test-helpers/attachments.node.js';
|
|
|
|
const { getMostRecentAttachmentUploadData } = DataReader;
|
|
const { removeAll, saveMessages } = DataWriter;
|
|
|
|
describe('sql/getMostRecentAttachmentUploadData', () => {
|
|
const ourAci = generateAci();
|
|
const now = Date.now();
|
|
|
|
beforeEach(async () => {
|
|
await removeAll();
|
|
});
|
|
|
|
function composeMessage(
|
|
attachments: MessageAttributesType['attachments']
|
|
): MessageAttributesType {
|
|
return {
|
|
id: generateUuid(),
|
|
type: 'incoming',
|
|
conversationId: generateUuid(),
|
|
sent_at: now,
|
|
received_at: now,
|
|
timestamp: now,
|
|
attachments,
|
|
};
|
|
}
|
|
|
|
it('returns undefined when no attachment matches the plaintextHash', async () => {
|
|
const result = await getMostRecentAttachmentUploadData('nonexistent-hash');
|
|
assert.isUndefined(result);
|
|
});
|
|
|
|
it('returns CDN upload data for a matching attachment', async () => {
|
|
const plaintextHash = testPlaintextHash();
|
|
await saveMessages(
|
|
[
|
|
composeMessage([
|
|
{
|
|
size: 128,
|
|
contentType: IMAGE_JPEG,
|
|
plaintextHash,
|
|
key: 'test-key',
|
|
digest: 'test-digest',
|
|
cdnKey: 'cdn-key-1',
|
|
cdnNumber: 3,
|
|
uploadTimestamp: now,
|
|
incrementalMac: 'test-incremental-mac',
|
|
chunkSize: 256,
|
|
},
|
|
]),
|
|
],
|
|
{ forceSave: true, ourAci, postSaveUpdates }
|
|
);
|
|
|
|
const result = await getMostRecentAttachmentUploadData(plaintextHash);
|
|
assert.deepStrictEqual(result, {
|
|
key: 'test-key',
|
|
digest: 'test-digest',
|
|
cdnKey: 'cdn-key-1',
|
|
cdnNumber: 3,
|
|
uploadTimestamp: now,
|
|
incrementalMac: 'test-incremental-mac',
|
|
chunkSize: 256,
|
|
});
|
|
});
|
|
|
|
it('returns undefined when a matching attachment lacks CDN fields', async () => {
|
|
const plaintextHash = testPlaintextHash();
|
|
await saveMessages(
|
|
[
|
|
composeMessage([
|
|
{
|
|
size: 128,
|
|
contentType: IMAGE_JPEG,
|
|
plaintextHash,
|
|
key: 'test-key',
|
|
digest: 'test-digest',
|
|
// No cdnKey, cdnNumber, or uploadTimestamp
|
|
},
|
|
]),
|
|
],
|
|
{ forceSave: true, ourAci, postSaveUpdates }
|
|
);
|
|
|
|
const result = await getMostRecentAttachmentUploadData(plaintextHash);
|
|
assert.isUndefined(result);
|
|
});
|
|
|
|
it('returns the most recently uploaded entry when multiple attachments share a plaintextHash', async () => {
|
|
const plaintextHash = testPlaintextHash();
|
|
|
|
await saveMessages(
|
|
[
|
|
composeMessage([
|
|
{
|
|
size: 128,
|
|
contentType: IMAGE_JPEG,
|
|
plaintextHash,
|
|
key: 'older-key',
|
|
digest: 'older-digest',
|
|
cdnKey: 'older-cdn-key',
|
|
cdnNumber: 3,
|
|
uploadTimestamp: now - 1000,
|
|
},
|
|
]),
|
|
composeMessage([
|
|
{
|
|
size: 128,
|
|
contentType: IMAGE_JPEG,
|
|
plaintextHash,
|
|
key: 'newer-key',
|
|
digest: 'newer-digest',
|
|
cdnKey: 'newer-cdn-key',
|
|
cdnNumber: 3,
|
|
uploadTimestamp: now,
|
|
},
|
|
]),
|
|
],
|
|
{ forceSave: true, ourAci, postSaveUpdates }
|
|
);
|
|
|
|
const result = await getMostRecentAttachmentUploadData(plaintextHash);
|
|
assert.deepStrictEqual(result, {
|
|
key: 'newer-key',
|
|
digest: 'newer-digest',
|
|
cdnKey: 'newer-cdn-key',
|
|
cdnNumber: 3,
|
|
uploadTimestamp: now,
|
|
incrementalMac: null,
|
|
chunkSize: null,
|
|
});
|
|
});
|
|
});
|