Signal-Desktop/ts/test-mock/storage/message_request_test.ts

116 lines
3.5 KiB
TypeScript

// Copyright 2022 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import { assert } from 'chai';
import * as durations from '../../util/durations';
import type { App, Bootstrap } from './fixtures';
import { initStorage, debug } from './fixtures';
describe('storage service', function needsName() {
this.timeout(durations.MINUTE);
let bootstrap: Bootstrap;
let app: App;
beforeEach(async () => {
({ bootstrap, app } = await initStorage());
});
afterEach(async () => {
await app.close();
await bootstrap.teardown();
});
it('should handle message request state changes', async () => {
const { phone, desktop, server } = bootstrap;
debug('Creating stranger');
const stranger = await server.createPrimaryDevice({
profileName: 'Mysterious Stranger',
});
const ourKey = await desktop.popSingleUseKey();
await stranger.addSingleUseKey(desktop, ourKey);
debug('Sending a message from a stranger');
await stranger.sendText(desktop, 'Hello!', {
withProfileKey: true,
timestamp: bootstrap.getTimestamp(),
});
const window = await app.getWindow();
const leftPane = window.locator('.left-pane-wrapper');
const conversationStack = window.locator('.conversation-stack');
debug('Opening conversation with a stranger');
await leftPane
.locator(
'_react=ConversationListItem' +
`[title = ${JSON.stringify(stranger.profileName)}]`
)
.click();
const initialState = await phone.expectStorageState('initial state');
assert.strictEqual(initialState.version, 1);
assert.isUndefined(initialState.getContact(stranger));
debug('Accept conversation from a stranger');
await conversationStack
.locator('.module-message-request-actions button >> "Accept"')
.click();
debug('Verify that storage state was updated');
{
const nextState = await phone.waitForStorageState({
after: initialState,
});
assert.strictEqual(nextState.version, 2);
assert.isTrue(nextState.getContact(stranger)?.whitelisted);
// ContactRecord
const { added, removed } = nextState.diff(initialState);
assert.strictEqual(added.length, 1, 'only one record must be added');
assert.strictEqual(removed.length, 0, 'no records should be removed');
}
// Stranger should receive our profile key
{
const { body, source, dataMessage } = await stranger.waitForMessage();
assert.strictEqual(body, '', 'profile key message has no body');
assert.strictEqual(
source,
desktop,
'profile key message has valid source'
);
assert.isTrue(
phone.profileKey
.serialize()
.equals(dataMessage.profileKey ?? new Uint8Array(0)),
'profile key message has correct profile key'
);
}
debug('Enter message text');
const composeArea = window.locator(
'.composition-area-wrapper, ' +
'.ConversationView__template .react-wrapper'
);
const input = composeArea.locator('_react=CompositionInput');
await input.type('hello stranger!');
await input.press('Enter');
{
const { body, source } = await stranger.waitForMessage();
assert.strictEqual(body, 'hello stranger!', 'text message has body');
assert.strictEqual(source, desktop, 'text message has valid source');
}
debug('Verifying the final manifest version');
const finalState = await phone.expectStorageState('consistency check');
assert.strictEqual(finalState.version, 2);
});
});