From f1244f303113f739809bd9a9a8a7b54ae1c6ed57 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Fri, 22 May 2020 17:50:45 +1000 Subject: [PATCH] add device unlink and receiptMessage class and tests --- .../outgoing/content/ReceiptMessage.ts | 19 --------- .../content/receipt/DeliveryReceiptMessage.ts | 8 ++++ .../content/receipt/ReadReceiptMessage.ts | 9 ++++ .../content/receipt/ReceiptMessage.ts | 31 ++++++++++++++ ts/session/messages/outgoing/index.ts | 6 ++- .../messages/DeviceUnlinkMessage_test.ts | 15 ++----- .../session/messages/ReceiptMessage_test.ts | 42 +++++++++++++++++++ 7 files changed, 99 insertions(+), 31 deletions(-) delete mode 100644 ts/session/messages/outgoing/content/ReceiptMessage.ts create mode 100644 ts/session/messages/outgoing/content/receipt/DeliveryReceiptMessage.ts create mode 100644 ts/session/messages/outgoing/content/receipt/ReadReceiptMessage.ts create mode 100644 ts/session/messages/outgoing/content/receipt/ReceiptMessage.ts create mode 100644 ts/test/session/messages/ReceiptMessage_test.ts diff --git a/ts/session/messages/outgoing/content/ReceiptMessage.ts b/ts/session/messages/outgoing/content/ReceiptMessage.ts deleted file mode 100644 index 9df247583..000000000 --- a/ts/session/messages/outgoing/content/ReceiptMessage.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { ContentMessage } from './ContentMessage'; -import { SignalService } from '../../../../protobuf'; - -export class ReceiptMessage extends ContentMessage { - - public ttl(): number { - return this.getDefaultTTL(); - } - - protected contentProto(): SignalService.Content { - return new SignalService.Content({ - receiptMessage: this.receiptProto(), - }); - } - - protected receiptProto(): SignalService.ReceiptMessage { - throw new Error('Not implemented'); - } -} diff --git a/ts/session/messages/outgoing/content/receipt/DeliveryReceiptMessage.ts b/ts/session/messages/outgoing/content/receipt/DeliveryReceiptMessage.ts new file mode 100644 index 000000000..5dcef5ff0 --- /dev/null +++ b/ts/session/messages/outgoing/content/receipt/DeliveryReceiptMessage.ts @@ -0,0 +1,8 @@ +import { SignalService } from '../../../../../protobuf'; +import { ReceiptMessage } from './ReceiptMessage'; + +export class DeliveryReceiptMessage extends ReceiptMessage { + public getReceiptType(): SignalService.ReceiptMessage.Type { + return SignalService.ReceiptMessage.Type.DELIVERY; + } +} diff --git a/ts/session/messages/outgoing/content/receipt/ReadReceiptMessage.ts b/ts/session/messages/outgoing/content/receipt/ReadReceiptMessage.ts new file mode 100644 index 000000000..f7e1895cf --- /dev/null +++ b/ts/session/messages/outgoing/content/receipt/ReadReceiptMessage.ts @@ -0,0 +1,9 @@ +import { SignalService } from '../../../../../protobuf'; +import { ReceiptMessage } from './ReceiptMessage'; + +export class ReadReceiptMessage extends ReceiptMessage { + + public getReceiptType(): SignalService.ReceiptMessage.Type { + return SignalService.ReceiptMessage.Type.READ; + } +} diff --git a/ts/session/messages/outgoing/content/receipt/ReceiptMessage.ts b/ts/session/messages/outgoing/content/receipt/ReceiptMessage.ts new file mode 100644 index 000000000..85ff70461 --- /dev/null +++ b/ts/session/messages/outgoing/content/receipt/ReceiptMessage.ts @@ -0,0 +1,31 @@ +import { ContentMessage } from '../ContentMessage'; +import { SignalService } from '../../../../../protobuf'; + +export abstract class ReceiptMessage extends ContentMessage { + private readonly timestamps: Array; + + constructor(timestamp: number, identifier: string, timestamps: Array) { + super(timestamp, identifier); + this.timestamps = timestamps; + } + + public ttl(): number { + return this.getDefaultTTL(); + } + + public abstract getReceiptType(): SignalService.ReceiptMessage.Type; + + protected contentProto(): SignalService.Content { + return new SignalService.Content({ + receiptMessage: this.receiptProto(), + }); + } + + protected receiptProto(): SignalService.ReceiptMessage { + return new SignalService.ReceiptMessage({ + type: this.getReceiptType(), + timestamp: this.timestamps, + }); + } +} + diff --git a/ts/session/messages/outgoing/index.ts b/ts/session/messages/outgoing/index.ts index 99f4a33b6..7794de5b4 100644 --- a/ts/session/messages/outgoing/index.ts +++ b/ts/session/messages/outgoing/index.ts @@ -4,7 +4,7 @@ import { DataMessage } from './content/data/DataMessage'; import { OpenGroupMessage } from './OpenGroupMessage'; import { SyncMessage } from './content/sync/SyncMessage'; import { TypingMessage } from './content/TypingMessage'; -import { ReceiptMessage } from './content/ReceiptMessage'; +import { ReceiptMessage } from './content/receipt/ReceiptMessage'; import { ClosedGroupMessage } from './content/data/ClosedGroupMessage'; import { DeviceUnlinkMessage } from './content/data/DeviceUnlinkMessage'; import { GroupInvitationMessage } from './content/data/GroupInvitationMessage'; @@ -13,6 +13,8 @@ import { SessionResetMessage } from './content/SessionResetMessage'; import { SessionEstablishedMessage } from './content/SessionEstablishedMessage'; import { EndSessionMessage } from './content/EndSessionMessage'; import { DeviceLinkMessage } from './content/DeviceLinkMessage'; +import { ReadReceiptMessage } from './content/receipt/ReadReceiptMessage'; +import { DeliveryReceiptMessage } from './content/receipt/DeliveryReceiptMessage'; export { Message, @@ -24,6 +26,8 @@ export { DeviceLinkMessage, EndSessionMessage, ReceiptMessage, + ReadReceiptMessage, + DeliveryReceiptMessage, SessionEstablishedMessage, SessionResetMessage, SyncMessage, diff --git a/ts/test/session/messages/DeviceUnlinkMessage_test.ts b/ts/test/session/messages/DeviceUnlinkMessage_test.ts index ab5fa2435..c96971ba9 100644 --- a/ts/test/session/messages/DeviceUnlinkMessage_test.ts +++ b/ts/test/session/messages/DeviceUnlinkMessage_test.ts @@ -1,5 +1,4 @@ -// tslint:disable: no-implicit-dependencies -import { assert} from 'chai'; +import { expect } from 'chai'; import { beforeEach} from 'mocha'; import { DeviceUnlinkMessage } from '../../../session/messages/outgoing'; @@ -13,18 +12,12 @@ describe('DeviceUnlinkMessage', () => { it('content of just the UNPAIRING_REQUEST flag set', () => { const plainText = message.plainTextBuffer(); - const decoded = SignalService.Content.decode(plainText).toJSON(); + const decoded = SignalService.Content.toObject(SignalService.Content.decode(plainText)); - const expected = { - dataMessage: { - flags: SignalService.DataMessage.Flags.UNPAIRING_REQUEST, - }, - }; - - assert.deepEqual(decoded, expected); + expect(decoded.dataMessage).to.have.property('flags', SignalService.DataMessage.Flags.UNPAIRING_REQUEST); }); it('ttl of 4 days', () => { - assert.equal(message.ttl(), 4 * 24 * 60 * 60 * 1000); + expect(message.ttl()).to.equal(4 * 24 * 60 * 60 * 1000); }); }); diff --git a/ts/test/session/messages/ReceiptMessage_test.ts b/ts/test/session/messages/ReceiptMessage_test.ts new file mode 100644 index 000000000..79d6d660f --- /dev/null +++ b/ts/test/session/messages/ReceiptMessage_test.ts @@ -0,0 +1,42 @@ +import { expect } from 'chai'; +import { beforeEach} from 'mocha'; + +import { DeliveryReceiptMessage, ReadReceiptMessage } from '../../../session/messages/outgoing'; +import { SignalService } from '../../../protobuf'; + +describe('ReceiptMessage', () => { + let readMessage: ReadReceiptMessage; + let deliveryMessage: ReadReceiptMessage; + let timestamps: Array; + + beforeEach(() => { + timestamps = [987654321, 123456789]; + readMessage = new ReadReceiptMessage(Date.now(), '123456', timestamps); + deliveryMessage = new DeliveryReceiptMessage(Date.now(), '123456', timestamps); + }); + + it('content of a read receipt is correct', () => { + const plainText = readMessage.plainTextBuffer(); + const decoded = SignalService.Content.toObject(SignalService.Content.decode(plainText)); + + expect(decoded.receiptMessage).to.have.property('type', 1); + expect(decoded.receiptMessage.timestamp).to.have.lengthOf(2); + expect(decoded.receiptMessage.timestamp[0]).to.have.property('low', timestamps[0]); + expect(decoded.receiptMessage.timestamp[1]).to.have.property('low', timestamps[1]); + }); + + it('content of a delivery receipt is correct', () => { + const plainText = deliveryMessage.plainTextBuffer(); + const decoded = SignalService.Content.toObject(SignalService.Content.decode(plainText)); + + expect(decoded.receiptMessage).to.have.property('type', 0); + expect(decoded.receiptMessage.timestamp).to.have.lengthOf(2); + expect(decoded.receiptMessage.timestamp[0]).to.have.property('low', timestamps[0]); + expect(decoded.receiptMessage.timestamp[1]).to.have.property('low', timestamps[1]); + }); + + it('ttl of 1 day', () => { + expect(readMessage.ttl()).to.equal(24 * 60 * 60 * 1000); + expect(deliveryMessage.ttl()).to.equal(24 * 60 * 60 * 1000); + }); +});