From 4971267c699563b433c2211d90bb96160e1150df Mon Sep 17 00:00:00 2001 From: William Grant Date: Mon, 9 Oct 2023 15:34:58 +1100 Subject: [PATCH] test: finished checkForExpireUpdateInContentMessage --- .../disappearing/DisappearingMessage_test.ts | 161 +++++++++++++++++- 1 file changed, 157 insertions(+), 4 deletions(-) diff --git a/ts/test/session/unit/disappearing/DisappearingMessage_test.ts b/ts/test/session/unit/disappearing/DisappearingMessage_test.ts index d8a2f0ac4..89c0c37b8 100644 --- a/ts/test/session/unit/disappearing/DisappearingMessage_test.ts +++ b/ts/test/session/unit/disappearing/DisappearingMessage_test.ts @@ -1,11 +1,17 @@ -import { expect } from 'chai'; +import chai, { expect } from 'chai'; import Sinon from 'sinon'; -import { stubWindowLog } from '../../../test-utils/utils'; +import chaiAsPromised from 'chai-as-promised'; +import { + generateDisappearingMessage, + generateVisibleMessage, + stubWindowLog, +} from '../../../test-utils/utils'; import { DisappearingMessageConversationModeType, DisappearingMessageType, changeToDisappearingConversationMode, changeToDisappearingMessageType, + checkForExpireUpdateInContentMessage, setExpirationStartTimestamp, } from '../../../../util/expiringMessages'; import { isValidUnixTimestamp } from '../../../../session/utils/Timestamps'; @@ -13,6 +19,9 @@ import { GetNetworkTime } from '../../../../session/apis/snode_api/getNetworkTim import { ConversationModel } from '../../../../models/conversation'; import { ConversationTypeEnum } from '../../../../models/conversationAttributes'; import { UserUtils } from '../../../../session/utils'; +import { ReleasedFeatures } from '../../../../util/releaseFeature'; + +chai.use(chaiAsPromised as any); describe('Disappearing Messages', () => { stubWindowLog(); @@ -321,8 +330,152 @@ describe('Disappearing Messages', () => { }); describe('checkForExpireUpdateInContentMessage', () => { - it('TODO', async () => { - expect('TODO').to.be.eq('TODO'); + it('if we receive a regular message then it returns falsy values', async () => { + const visibleMessage = generateVisibleMessage(); + const convoToUpdate = new ConversationModel({ + ...conversationArgs, + } as any); + // TODO legacy messages support will be removed in a future release + Sinon.stub(ReleasedFeatures, 'checkIsDisappearMessageV2FeatureReleased').resolves(true); + + const expireUpdate = await checkForExpireUpdateInContentMessage( + visibleMessage.contentProto(), + convoToUpdate, + true + ); + + expect(expireUpdate?.expirationType, 'expirationType should be unknown').to.equal( + 'unknown' + ); + expect(expireUpdate?.expirationTimer, 'expirationTimer should be 0').to.equal(0); + expect( + expireUpdate?.lastDisappearingMessageChangeTimestamp, + 'lastDisappearingMessageChangeTimestamp should be 0' + ).to.equal(0); + expect( + expireUpdate?.isLegacyConversationSettingMessage, + 'isLegacyConversationSettingMessage should be false' + ).to.be.false; + expect(expireUpdate?.isLegacyDataMessage, 'isLegacyDataMessage should be false').to.be + .false; + expect(expireUpdate?.isOutdated, 'isOutdated should be undefined').to.be.undefined; + }); + it('if we receive a deleteAfterRead message after 1 minute then it returns those values', async () => { + const disappearingMessage = generateDisappearingMessage({ + expirationType: 'deleteAfterRead', + expireTimer: 60, + }); + + const convoToUpdate = new ConversationModel({ + ...conversationArgs, + } as any); + // TODO legacy messages support will be removed in a future release + Sinon.stub(ReleasedFeatures, 'checkIsDisappearMessageV2FeatureReleased').resolves(true); + + const expireUpdate = await checkForExpireUpdateInContentMessage( + disappearingMessage.contentProto(), + convoToUpdate, + true + ); + + expect(expireUpdate?.expirationType, 'expirationType should be deleteAfterRead').to.equal( + 'deleteAfterRead' + ); + expect(expireUpdate?.expirationTimer, 'expirationTimer should be 60').to.equal(60); + expect( + expireUpdate?.lastDisappearingMessageChangeTimestamp, + 'lastDisappearingMessageChangeTimestamp should be 0' + ).to.equal(0); + expect( + expireUpdate?.isLegacyConversationSettingMessage, + 'isLegacyConversationSettingMessage should be false' + ).to.be.false; + expect(expireUpdate?.isLegacyDataMessage, 'isLegacyDataMessage should be false').to.be + .false; + expect(expireUpdate?.isOutdated, 'isOutdated should be undefined').to.be.undefined; + }); + it('if we receive an ExpirationTimerUpdate message for deleteAfterSend after 5 minutes then it returns those values', async () => { + const lastDisappearingMessageChangeTimestamp = GetNetworkTime.getNowWithNetworkOffset(); + const expirationTimerUpdateMessage = generateDisappearingMessage({ + expirationType: 'deleteAfterSend', + expireTimer: 300, + expirationTimerUpdate: { + expirationType: 'deleteAfterSend', + expireTimer: 300, + lastDisappearingMessageChangeTimestamp, + source: '050123456789abcdef050123456789abcdef0123456789abcdef050123456789ab', + }, + }); + + const convoToUpdate = new ConversationModel({ + ...conversationArgs, + } as any); + // TODO legacy messages support will be removed in a future release + Sinon.stub(ReleasedFeatures, 'checkIsDisappearMessageV2FeatureReleased').resolves(true); + + const expireUpdate = await checkForExpireUpdateInContentMessage( + expirationTimerUpdateMessage.contentProto(), + convoToUpdate, + true + ); + + expect(expireUpdate?.expirationType, 'expirationType should be deleteAfterSend').to.equal( + 'deleteAfterSend' + ); + expect(expireUpdate?.expirationTimer, 'expirationTimer should be 300').to.equal(300); + expect( + expireUpdate?.lastDisappearingMessageChangeTimestamp, + 'lastDisappearingMessageChangeTimestamp should match input value' + ).to.equal(lastDisappearingMessageChangeTimestamp); + expect( + expireUpdate?.isLegacyConversationSettingMessage, + 'isLegacyConversationSettingMessage should be false' + ).to.be.false; + expect(expireUpdate?.isLegacyDataMessage, 'isLegacyDataMessage should be false').to.be + .false; + expect(expireUpdate?.isOutdated, 'isOutdated should be undefined').to.be.undefined; + }); + it('if we receive an outdated ExpirationTimerUpdate message then it should be ignored and is outdated', async () => { + const lastDisappearingMessageChangeTimestamp = GetNetworkTime.getNowWithNetworkOffset(); + const expirationTimerUpdateMessage = generateDisappearingMessage({ + expirationType: 'deleteAfterSend', + expireTimer: 300, + expirationTimerUpdate: { + expirationType: 'deleteAfterSend', + expireTimer: 300, + lastDisappearingMessageChangeTimestamp: lastDisappearingMessageChangeTimestamp - 20000, + source: '050123456789abcdef050123456789abcdef0123456789abcdef050123456789ab', + }, + }); + + const convoToUpdate = new ConversationModel({ + ...conversationArgs, + lastDisappearingMessageChangeTimestamp, + } as any); + // TODO legacy messages support will be removed in a future release + Sinon.stub(ReleasedFeatures, 'checkIsDisappearMessageV2FeatureReleased').resolves(true); + + const expireUpdate = await checkForExpireUpdateInContentMessage( + expirationTimerUpdateMessage.contentProto(), + convoToUpdate, + true + ); + + expect(expireUpdate?.expirationType, 'expirationType should be deleteAfterSend').to.equal( + 'deleteAfterSend' + ); + expect(expireUpdate?.expirationTimer, 'expirationTimer should be 300').to.equal(300); + expect( + expireUpdate?.lastDisappearingMessageChangeTimestamp, + 'lastDisappearingMessageChangeTimestamp should be undefined' + ).to.equal(undefined); + expect( + expireUpdate?.isLegacyConversationSettingMessage, + 'isLegacyConversationSettingMessage should be undefined' + ).to.be.undefined; + expect(expireUpdate?.isLegacyDataMessage, 'isLegacyDataMessage should be undefined').to.be + .undefined; + expect(expireUpdate?.isOutdated, 'isOutdated should be true').to.be.true; }); }); });