diff --git a/ts/session/apis/snode_api/expireRequest.ts b/ts/session/apis/snode_api/expireRequest.ts index 0c2faf220..f947a8882 100644 --- a/ts/session/apis/snode_api/expireRequest.ts +++ b/ts/session/apis/snode_api/expireRequest.ts @@ -205,14 +205,14 @@ async function expireOnNodes( } } -type ExpireMessageOnSnodeProps = { +export type ExpireMessageOnSnodeProps = { messageHash: string; expireTimer: number; extend?: boolean; shorten?: boolean; }; -async function buildExpireRequest( +export async function buildExpireRequest( props: ExpireMessageOnSnodeProps ): Promise { const { messageHash, expireTimer, extend, shorten } = props; diff --git a/ts/test/session/unit/disappearing/ExpireRequest_test.ts b/ts/test/session/unit/disappearing/ExpireRequest_test.ts new file mode 100644 index 000000000..827ff2321 --- /dev/null +++ b/ts/test/session/unit/disappearing/ExpireRequest_test.ts @@ -0,0 +1,119 @@ +import chai, { expect } from 'chai'; +import Sinon from 'sinon'; +import chaiAsPromised from 'chai-as-promised'; +import { stubWindowLog } from '../../../test-utils/utils'; +import { + ExpireMessageOnSnodeProps, + buildExpireRequest, +} from '../../../../session/apis/snode_api/expireRequest'; +import { UpdateExpiryOnNodeSubRequest } from '../../../../session/apis/snode_api/SnodeRequestTypes'; +import { UserUtils } from '../../../../session/utils'; +import { isValidUnixTimestamp } from '../../../../session/utils/Timestamps'; +import { GetNetworkTime } from '../../../../session/apis/snode_api/getNetworkTime'; + +chai.use(chaiAsPromised as any); + +describe('Snode /expire request', () => { + stubWindowLog(); + + const getLatestTimestampOffset = 200000; + const ourNumber = '051234567890acbdef'; + const ourUserEd25516Keypair = { + pubKey: '37e1631b002de498caf7c5c1712718bde7f257c6dadeed0c21abf5e939e6c309', + privKey: + 'be1d11154ff9b6de77873f0b6b0bcc460000000000000000000000000000000037e1631b002de498caf7c5c1712718bde7f257c6dadeed0c21abf5e939e6c309', + }; + + beforeEach(() => { + Sinon.stub(GetNetworkTime, 'getLatestTimestampOffset').returns(getLatestTimestampOffset); + Sinon.stub(UserUtils, 'getOurPubKeyStrFromCache').returns(ourNumber); + Sinon.stub(UserUtils, 'getUserED25519KeyPair').resolves(ourUserEd25516Keypair); + }); + + afterEach(() => { + Sinon.restore(); + }); + + describe('buildExpireRequest', () => { + const props: ExpireMessageOnSnodeProps = { + messageHash: 'messageHash', + expireTimer: 60, + }; + + it('builds a request with just the messageHash and expireTimer of 1 minute', async () => { + const request: UpdateExpiryOnNodeSubRequest | null = await buildExpireRequest(props); + + window.log.debug(`WIP: [unit testing] signature ${request?.params.signature} `); + + expect(request, 'should not return null').to.not.be.null; + expect(request, 'should not return undefined').to.not.be.undefined; + expect(request, "method should be 'expire'").to.have.property('method', 'expire'); + expect(request?.params.pubkey, 'should have a matching pubkey').to.equal(ourNumber); + expect(request?.params.messages[0], 'messageHash should be in messages array').to.equal( + props.messageHash + ); + expect( + request?.params.expiry && isValidUnixTimestamp(request?.params.expiry), + 'expiry should be a valid unix timestamp' + ).to.be.true; + expect(request?.params.extend, 'extend should be undefined').to.be.undefined; + expect(request?.params.shorten, 'shorten should be undefined').to.be.undefined; + expect(request?.params.signature, 'signature should not be empty').to.not.be.empty; + }); + it('builds a request with extend enabled', async () => { + const request: UpdateExpiryOnNodeSubRequest | null = await buildExpireRequest({ + ...props, + extend: true, + }); + + window.log.debug(`WIP: [unit testing] signature ${request?.params.signature} `); + + expect(request, 'should not return null').to.not.be.null; + expect(request, 'should not return undefined').to.not.be.undefined; + expect(request, "method should be 'expire'").to.have.property('method', 'expire'); + expect(request?.params.pubkey, 'should have a matching pubkey').to.equal(ourNumber); + expect(request?.params.messages[0], 'messageHash should be in messages array').to.equal( + props.messageHash + ); + expect( + request?.params.expiry && isValidUnixTimestamp(request?.params.expiry), + 'expiry should be a valid unix timestamp' + ).to.be.true; + expect(request?.params.extend, 'extend should be true').to.be.true; + expect(request?.params.shorten, 'shorten should be undefined').to.be.undefined; + expect(request?.params.signature, 'signature should not be empty').to.not.be.empty; + }); + it('builds a request with shorten enabled', async () => { + const request: UpdateExpiryOnNodeSubRequest | null = await buildExpireRequest({ + ...props, + shorten: true, + }); + + window.log.debug(`WIP: [unit testing] signature ${request?.params.signature} `); + + expect(request, 'should not return null').to.not.be.null; + expect(request, 'should not return undefined').to.not.be.undefined; + expect(request, "method should be 'expire'").to.have.property('method', 'expire'); + expect(request?.params.pubkey, 'should have a matching pubkey').to.equal(ourNumber); + expect(request?.params.messages[0], 'messageHash should be in messages array').to.equal( + props.messageHash + ); + expect( + request?.params.expiry && isValidUnixTimestamp(request?.params.expiry), + 'expiry should be a valid unix timestamp' + ).to.be.true; + expect(request?.params.extend, 'extend should be undefined').to.be.undefined; + expect(request?.params.shorten, 'shorten should be true').to.be.true; + expect(request?.params.signature, 'signature should not be empty').to.not.be.empty; + }); + it('fails to build a request if extend and shorten are both enabled', async () => { + const request: UpdateExpiryOnNodeSubRequest | null = await buildExpireRequest({ + ...props, + extend: true, + shorten: true, + }); + + expect(request, 'should return null').to.be.null; + }); + }); +});