mirror of
https://github.com/oxen-io/session-desktop.git
synced 2023-12-14 02:12:57 +01:00
review-fixes
This commit is contained in:
parent
211d4e1551
commit
2c2ed1b274
3 changed files with 25 additions and 63 deletions
|
@ -78,16 +78,8 @@ export class MessageQueue implements MessageQueueInterface {
|
||||||
}
|
}
|
||||||
|
|
||||||
public async sendToGroup(
|
public async sendToGroup(
|
||||||
message: OpenGroupMessage | ContentMessage
|
message: OpenGroupMessage | ClosedGroupMessage
|
||||||
): Promise<boolean> {
|
): Promise<boolean> {
|
||||||
// Ensure message suits its respective type
|
|
||||||
if (
|
|
||||||
!(message instanceof OpenGroupMessage) &&
|
|
||||||
!(message instanceof ClosedGroupMessage)
|
|
||||||
) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Closed groups
|
// Closed groups
|
||||||
if (message instanceof ClosedGroupMessage) {
|
if (message instanceof ClosedGroupMessage) {
|
||||||
// Get devices in closed group
|
// Get devices in closed group
|
||||||
|
@ -108,17 +100,16 @@ export class MessageQueue implements MessageQueueInterface {
|
||||||
// Open groups
|
// Open groups
|
||||||
if (message instanceof OpenGroupMessage) {
|
if (message instanceof OpenGroupMessage) {
|
||||||
// No queue needed for Open Groups; send directly
|
// No queue needed for Open Groups; send directly
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await MessageSender.sendToOpenGroup(message);
|
await MessageSender.sendToOpenGroup(message);
|
||||||
this.events.emit('success', message);
|
this.events.emit('success', message);
|
||||||
|
|
||||||
|
return true;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
this.events.emit('fail', message, e);
|
this.events.emit('fail', message, e);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -173,7 +164,9 @@ export class MessageQueue implements MessageQueueInterface {
|
||||||
}
|
}
|
||||||
|
|
||||||
private async process(device: PubKey, message?: ContentMessage) {
|
private async process(device: PubKey, message?: ContentMessage) {
|
||||||
if (!message) {
|
// Don't send to ourselves
|
||||||
|
const currentDevice = await UserUtil.getCurrentDevicePubKey();
|
||||||
|
if (!message || (currentDevice && device.isEqual(currentDevice))) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,9 @@ export class PubKey {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public isEqual(comparator: PubKey) {
|
public isEqual(comparator: PubKey | string) {
|
||||||
return this.key === comparator.key;
|
return comparator instanceof PubKey
|
||||||
|
? this.key === comparator.key
|
||||||
|
: this.key === comparator;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,7 +42,7 @@ describe('MessageQueue', () => {
|
||||||
Promise<Array<void>>
|
Promise<Array<void>>
|
||||||
>;
|
>;
|
||||||
let sendToGroupSpy: sinon.SinonSpy<
|
let sendToGroupSpy: sinon.SinonSpy<
|
||||||
[ContentMessage | OpenGroupMessage],
|
[OpenGroupMessage | ClosedGroupMessage],
|
||||||
Promise<boolean>
|
Promise<boolean>
|
||||||
>;
|
>;
|
||||||
|
|
||||||
|
@ -55,16 +55,6 @@ describe('MessageQueue', () => {
|
||||||
let hasSessionStub: sinon.SinonStub<[PubKey]>;
|
let hasSessionStub: sinon.SinonStub<[PubKey]>;
|
||||||
let sendSessionRequestIfNeededStub: sinon.SinonStub<[PubKey], Promise<void>>;
|
let sendSessionRequestIfNeededStub: sinon.SinonStub<[PubKey], Promise<void>>;
|
||||||
|
|
||||||
// Helper function returns a promise that resolves after all other promise mocks,
|
|
||||||
// even if they are chained like Promise.resolve().then(...)
|
|
||||||
// Technically: this is designed to resolve on the next macrotask
|
|
||||||
async function tick() {
|
|
||||||
return new Promise(resolve => {
|
|
||||||
// tslint:disable-next-line: no-string-based-set-timeout
|
|
||||||
setTimeout(resolve, 0);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
// Stub out methods which touch the database
|
// Stub out methods which touch the database
|
||||||
const storageID = 'pendingMessages';
|
const storageID = 'pendingMessages';
|
||||||
|
@ -76,9 +66,7 @@ describe('MessageQueue', () => {
|
||||||
// Pending Message Cache Data Stubs
|
// Pending Message Cache Data Stubs
|
||||||
TestUtils.stubData('getItemById')
|
TestUtils.stubData('getItemById')
|
||||||
.withArgs('pendingMessages')
|
.withArgs('pendingMessages')
|
||||||
.callsFake(async () => {
|
.resolves(data);
|
||||||
return data;
|
|
||||||
});
|
|
||||||
TestUtils.stubData('createOrUpdateItem').callsFake((item: StorageItem) => {
|
TestUtils.stubData('createOrUpdateItem').callsFake((item: StorageItem) => {
|
||||||
if (item.id === storageID) {
|
if (item.id === storageID) {
|
||||||
data = item;
|
data = item;
|
||||||
|
@ -103,7 +91,7 @@ describe('MessageQueue', () => {
|
||||||
sandbox.stub(GroupUtils, 'isMediumGroup').returns(false);
|
sandbox.stub(GroupUtils, 'isMediumGroup').returns(false);
|
||||||
groupMembersStub = sandbox
|
groupMembersStub = sandbox
|
||||||
.stub(GroupUtils, 'getGroupMembers' as any)
|
.stub(GroupUtils, 'getGroupMembers' as any)
|
||||||
.callsFake(async () => TestUtils.generateMemberList(10));
|
.resolves(TestUtils.generateMemberList(10));
|
||||||
|
|
||||||
// Session Protocol Stubs
|
// Session Protocol Stubs
|
||||||
sandbox.stub(SessionProtocol, 'sendSessionRequest').resolves();
|
sandbox.stub(SessionProtocol, 'sendSessionRequest').resolves();
|
||||||
|
@ -169,15 +157,13 @@ describe('MessageQueue', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('processPending', () => {
|
describe('processPending', () => {
|
||||||
it('will send sync message if no session', async () => {
|
it('will send session request message if no session', async () => {
|
||||||
hasSessionStub.resolves(false);
|
hasSessionStub.resolves(false);
|
||||||
|
|
||||||
const device = TestUtils.generateFakePubkey();
|
const device = TestUtils.generateFakePubkey();
|
||||||
const promise = messageQueueStub.processPending(device);
|
const promise = messageQueueStub.processPending(device);
|
||||||
|
|
||||||
expect(promise).to.be.fulfilled;
|
await expect(promise).to.be.fulfilled;
|
||||||
|
|
||||||
await tick();
|
|
||||||
expect(sendSessionRequestIfNeededStub.callCount).to.equal(1);
|
expect(sendSessionRequestIfNeededStub.callCount).to.equal(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -186,9 +172,8 @@ describe('MessageQueue', () => {
|
||||||
const hasSession = await hasSessionStub(device);
|
const hasSession = await hasSessionStub(device);
|
||||||
|
|
||||||
const promise = messageQueueStub.processPending(device);
|
const promise = messageQueueStub.processPending(device);
|
||||||
expect(promise).to.be.fulfilled;
|
await expect(promise).to.be.fulfilled;
|
||||||
|
|
||||||
await tick();
|
|
||||||
expect(hasSession).to.equal(true, 'session does not exist');
|
expect(hasSession).to.equal(true, 'session does not exist');
|
||||||
expect(sendSessionRequestIfNeededStub.callCount).to.equal(0);
|
expect(sendSessionRequestIfNeededStub.callCount).to.equal(0);
|
||||||
});
|
});
|
||||||
|
@ -200,10 +185,9 @@ describe('MessageQueue', () => {
|
||||||
const message = TestUtils.generateChatMessage();
|
const message = TestUtils.generateChatMessage();
|
||||||
|
|
||||||
const promise = messageQueueStub.sendUsingMultiDevice(device, message);
|
const promise = messageQueueStub.sendUsingMultiDevice(device, message);
|
||||||
expect(promise).to.be.fulfilled;
|
await expect(promise).to.be.fulfilled;
|
||||||
|
|
||||||
// Ensure the arguments passed into sendMessageToDevices are correct
|
// Ensure the arguments passed into sendMessageToDevices are correct
|
||||||
await tick();
|
|
||||||
const previousArgs = sendMessageToDevicesSpy.lastCall.args as [
|
const previousArgs = sendMessageToDevicesSpy.lastCall.args as [
|
||||||
Array<PubKey>,
|
Array<PubKey>,
|
||||||
ChatMessage
|
ChatMessage
|
||||||
|
@ -249,10 +233,9 @@ describe('MessageQueue', () => {
|
||||||
const ourDevices = [...pairedDevices, ourNumber].sort();
|
const ourDevices = [...pairedDevices, ourNumber].sort();
|
||||||
|
|
||||||
const promise = messageQueueStub.sendMessageToDevices(devices, message);
|
const promise = messageQueueStub.sendMessageToDevices(devices, message);
|
||||||
expect(promise).to.be.fulfilled;
|
await expect(promise).to.be.fulfilled;
|
||||||
|
|
||||||
// Check sendSyncMessage parameters
|
// Check sendSyncMessage parameters
|
||||||
await tick();
|
|
||||||
const previousArgs = sendSyncMessageSpy.lastCall.args as [
|
const previousArgs = sendSyncMessageSpy.lastCall.args as [
|
||||||
ChatMessage,
|
ChatMessage,
|
||||||
Array<PubKey>
|
Array<PubKey>
|
||||||
|
@ -294,7 +277,6 @@ describe('MessageQueue', () => {
|
||||||
expect(success).to.equal(true, 'sending to group failed');
|
expect(success).to.equal(true, 'sending to group failed');
|
||||||
|
|
||||||
// Check parameters
|
// Check parameters
|
||||||
await tick();
|
|
||||||
const previousArgs = sendMessageToDevicesSpy.lastCall.args as [
|
const previousArgs = sendMessageToDevicesSpy.lastCall.args as [
|
||||||
Array<PubKey>,
|
Array<PubKey>,
|
||||||
ClosedGroupMessage
|
ClosedGroupMessage
|
||||||
|
@ -313,9 +295,11 @@ describe('MessageQueue', () => {
|
||||||
const success = await messageQueueStub.sendToGroup(message);
|
const success = await messageQueueStub.sendToGroup(message);
|
||||||
|
|
||||||
// Ensure message parameter passed into sendToGroup is as expected
|
// Ensure message parameter passed into sendToGroup is as expected
|
||||||
await tick();
|
expect(success).to.equal(
|
||||||
|
false,
|
||||||
|
'an invalid groupId was treated as valid'
|
||||||
|
);
|
||||||
expect(sendToGroupSpy.callCount).to.equal(1);
|
expect(sendToGroupSpy.callCount).to.equal(1);
|
||||||
expect(sendToGroupSpy.lastCall.args).to.have.length(1);
|
|
||||||
|
|
||||||
const argsMessage = sendToGroupSpy.lastCall.args[0];
|
const argsMessage = sendToGroupSpy.lastCall.args[0];
|
||||||
expect(argsMessage instanceof ClosedGroupMessage).to.equal(
|
expect(argsMessage instanceof ClosedGroupMessage).to.equal(
|
||||||
|
@ -329,7 +313,7 @@ describe('MessageQueue', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('wont send message to empty closed group', async () => {
|
it('wont send message to empty closed group', async () => {
|
||||||
groupMembersStub.callsFake(async () => TestUtils.generateMemberList(0));
|
groupMembersStub.resolves(TestUtils.generateMemberList(0));
|
||||||
|
|
||||||
const message = TestUtils.generateClosedGroupMessage();
|
const message = TestUtils.generateClosedGroupMessage();
|
||||||
const response = await messageQueueStub.sendToGroup(message);
|
const response = await messageQueueStub.sendToGroup(message);
|
||||||
|
@ -340,21 +324,6 @@ describe('MessageQueue', () => {
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('wont send invalid message type to closed group', async () => {
|
|
||||||
// Regular chat message should return false
|
|
||||||
const message = TestUtils.generateChatMessage();
|
|
||||||
const response = await messageQueueStub.sendToGroup(message);
|
|
||||||
|
|
||||||
expect(response).to.equal(
|
|
||||||
false,
|
|
||||||
'sendToGroup considered an invalid message type as valid'
|
|
||||||
);
|
|
||||||
|
|
||||||
// These should not be called; early exit
|
|
||||||
expect(sendMessageToDevicesSpy.callCount).to.equal(0);
|
|
||||||
expect(sendToOpenGroupStub.callCount).to.equal(0);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('can send to open group', async () => {
|
it('can send to open group', async () => {
|
||||||
const message = TestUtils.generateOpenGroupMessage();
|
const message = TestUtils.generateOpenGroupMessage();
|
||||||
const success = await messageQueueStub.sendToGroup(message);
|
const success = await messageQueueStub.sendToGroup(message);
|
||||||
|
@ -370,9 +339,8 @@ describe('MessageQueue', () => {
|
||||||
|
|
||||||
const device = TestUtils.generateFakePubkey();
|
const device = TestUtils.generateFakePubkey();
|
||||||
const promise = messageQueueStub.processPending(device);
|
const promise = messageQueueStub.processPending(device);
|
||||||
expect(promise).to.be.fulfilled;
|
|
||||||
|
|
||||||
await tick();
|
await expect(promise).to.be.fulfilled;
|
||||||
expect(successSpy.callCount).to.equal(1);
|
expect(successSpy.callCount).to.equal(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -384,9 +352,8 @@ describe('MessageQueue', () => {
|
||||||
|
|
||||||
const device = TestUtils.generateFakePubkey();
|
const device = TestUtils.generateFakePubkey();
|
||||||
const promise = messageQueueStub.processPending(device);
|
const promise = messageQueueStub.processPending(device);
|
||||||
expect(promise).to.be.fulfilled;
|
|
||||||
|
|
||||||
await tick();
|
await expect(promise).to.be.fulfilled;
|
||||||
expect(failureSpy.callCount).to.equal(1);
|
expect(failureSpy.callCount).to.equal(1);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue