move filterDuplicatesFromDbAndIncoming to its own file and test
also add pending tests to do for in memory db and updaterpull/2242/head
parent
0158fd5ebb
commit
062db5caab
@ -0,0 +1,36 @@
|
||||
import _ from 'lodash';
|
||||
import { filterAlreadyFetchedOpengroupMessage } from '../../../../data/data';
|
||||
import { OpenGroupMessageV2 } from './OpenGroupMessageV2';
|
||||
|
||||
export const filterDuplicatesFromDbAndIncoming = async (
|
||||
newMessages: Array<OpenGroupMessageV2>
|
||||
): Promise<Array<OpenGroupMessageV2>> => {
|
||||
const start = Date.now();
|
||||
// open group messages are deduplicated by sender and serverTimestamp only.
|
||||
// first make sure that the incoming messages have no duplicates:
|
||||
const filtered = _.uniqWith(newMessages, (a, b) => {
|
||||
return (
|
||||
Boolean(a.sender) &&
|
||||
Boolean(a.sentTimestamp) &&
|
||||
a.sender === b.sender &&
|
||||
a.sentTimestamp === b.sentTimestamp
|
||||
);
|
||||
// make sure a sender is set, as we cast it just below
|
||||
}).filter(m => Boolean(m.sender));
|
||||
|
||||
// now, check database to make sure those messages are not already fetched
|
||||
const filteredInDb = await filterAlreadyFetchedOpengroupMessage(
|
||||
filtered.map(m => {
|
||||
return { sender: m.sender as string, serverTimestamp: m.sentTimestamp };
|
||||
})
|
||||
);
|
||||
|
||||
window.log.debug(
|
||||
`filterDuplicatesFromDbAndIncoming of ${newMessages.length} messages took ${Date.now() -
|
||||
start}ms.`
|
||||
);
|
||||
const opengroupMessagesFiltered = filteredInDb?.map(f => {
|
||||
return newMessages.find(m => m.sender === f.sender && m.sentTimestamp === f.serverTimestamp);
|
||||
});
|
||||
return _.compact(opengroupMessagesFiltered) || [];
|
||||
};
|
@ -0,0 +1,117 @@
|
||||
// tslint:disable: no-implicit-dependencies max-func-body-length no-unused-expression
|
||||
|
||||
import chai from 'chai';
|
||||
import { describe } from 'mocha';
|
||||
import { filterDuplicatesFromDbAndIncoming } from '../../../../../session/apis/open_group_api/opengroupV2/SogsFilterDuplicate';
|
||||
import { TestUtils } from '../../../../test-utils';
|
||||
|
||||
const { expect } = chai;
|
||||
|
||||
// tslint:disable-next-line: max-func-body-length
|
||||
describe('filterDuplicatesFromDbAndIncoming', () => {
|
||||
describe('filters already duplicated message in the same incoming batch', () => {
|
||||
beforeEach(() => {
|
||||
TestUtils.stubData('filterAlreadyFetchedOpengroupMessage').returnsArg(0);
|
||||
TestUtils.stubWindowLog();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
TestUtils.restoreStubs();
|
||||
});
|
||||
|
||||
it('no duplicates', async () => {
|
||||
const msg1 = TestUtils.generateOpenGroupMessageV2();
|
||||
const msg2 = TestUtils.generateOpenGroupMessageV2();
|
||||
const msg3 = TestUtils.generateOpenGroupMessageV2();
|
||||
const filtered = await filterDuplicatesFromDbAndIncoming([msg1, msg2, msg3]);
|
||||
expect(filtered.length).to.be.eq(3);
|
||||
expect(filtered[0]).to.be.deep.eq(msg1);
|
||||
expect(filtered[1]).to.be.deep.eq(msg2);
|
||||
expect(filtered[2]).to.be.deep.eq(msg3);
|
||||
});
|
||||
|
||||
it('two duplicate sender but not the same timestamp', async () => {
|
||||
const msg1 = TestUtils.generateOpenGroupMessageV2();
|
||||
const msg2 = TestUtils.generateOpenGroupMessageV2();
|
||||
msg2.sender = msg1.sender;
|
||||
msg2.sentTimestamp = Date.now() + 2;
|
||||
const msg3 = TestUtils.generateOpenGroupMessageV2();
|
||||
const filtered = await filterDuplicatesFromDbAndIncoming([msg1, msg2, msg3]);
|
||||
expect(filtered.length).to.be.eq(3);
|
||||
expect(filtered[0]).to.be.deep.eq(msg1);
|
||||
expect(filtered[1]).to.be.deep.eq(msg2);
|
||||
expect(filtered[2]).to.be.deep.eq(msg3);
|
||||
});
|
||||
|
||||
it('two duplicate timestamp but not the same sender', async () => {
|
||||
const msg1 = TestUtils.generateOpenGroupMessageV2();
|
||||
const msg2 = TestUtils.generateOpenGroupMessageV2();
|
||||
msg2.sentTimestamp = msg1.sentTimestamp;
|
||||
const msg3 = TestUtils.generateOpenGroupMessageV2();
|
||||
const filtered = await filterDuplicatesFromDbAndIncoming([msg1, msg2, msg3]);
|
||||
expect(filtered.length).to.be.eq(3);
|
||||
expect(filtered[0]).to.be.deep.eq(msg1);
|
||||
expect(filtered[1]).to.be.deep.eq(msg2);
|
||||
expect(filtered[2]).to.be.deep.eq(msg3);
|
||||
});
|
||||
|
||||
it('two duplicate timestamp but not the same sender', async () => {
|
||||
const msg1 = TestUtils.generateOpenGroupMessageV2();
|
||||
const msg2 = TestUtils.generateOpenGroupMessageV2();
|
||||
msg2.sentTimestamp = msg1.sentTimestamp;
|
||||
const msg3 = TestUtils.generateOpenGroupMessageV2();
|
||||
const filtered = await filterDuplicatesFromDbAndIncoming([msg1, msg2, msg3]);
|
||||
expect(filtered.length).to.be.eq(3);
|
||||
expect(filtered[0]).to.be.deep.eq(msg1);
|
||||
expect(filtered[1]).to.be.deep.eq(msg2);
|
||||
expect(filtered[2]).to.be.deep.eq(msg3);
|
||||
});
|
||||
|
||||
it('two duplicates in the same poll ', async () => {
|
||||
const msg1 = TestUtils.generateOpenGroupMessageV2();
|
||||
const msg2 = TestUtils.generateOpenGroupMessageV2();
|
||||
msg2.sentTimestamp = msg1.sentTimestamp;
|
||||
msg2.sender = msg1.sender;
|
||||
const msg3 = TestUtils.generateOpenGroupMessageV2();
|
||||
const filtered = await filterDuplicatesFromDbAndIncoming([msg1, msg2, msg3]);
|
||||
expect(filtered.length).to.be.eq(2);
|
||||
expect(filtered[0]).to.be.deep.eq(msg1);
|
||||
expect(filtered[1]).to.be.deep.eq(msg3);
|
||||
});
|
||||
|
||||
it('three duplicates in the same poll', async () => {
|
||||
const msg1 = TestUtils.generateOpenGroupMessageV2();
|
||||
const msg2 = TestUtils.generateOpenGroupMessageV2();
|
||||
|
||||
const msg3 = TestUtils.generateOpenGroupMessageV2();
|
||||
msg2.sentTimestamp = msg1.sentTimestamp;
|
||||
msg2.sender = msg1.sender;
|
||||
msg3.sentTimestamp = msg1.sentTimestamp;
|
||||
msg3.sender = msg1.sender;
|
||||
const filtered = await filterDuplicatesFromDbAndIncoming([msg1, msg2, msg3]);
|
||||
expect(filtered.length).to.be.eq(1);
|
||||
expect(filtered[0]).to.be.deep.eq(msg1);
|
||||
});
|
||||
|
||||
it('three duplicates in the same poll', async () => {
|
||||
const msg1 = TestUtils.generateOpenGroupMessageV2();
|
||||
const msg2 = TestUtils.generateOpenGroupMessageV2();
|
||||
|
||||
const msg3 = TestUtils.generateOpenGroupMessageV2();
|
||||
msg2.sentTimestamp = msg1.sentTimestamp;
|
||||
msg2.sender = msg1.sender;
|
||||
msg3.sentTimestamp = msg1.sentTimestamp;
|
||||
msg3.sender = msg1.sender;
|
||||
const filtered = await filterDuplicatesFromDbAndIncoming([msg1, msg2, msg3]);
|
||||
expect(filtered.length).to.be.eq(1);
|
||||
expect(filtered[0]).to.be.deep.eq(msg1);
|
||||
});
|
||||
});
|
||||
|
||||
describe('filters duplicated message from database', () => {
|
||||
//sadly better-sqlite3 does not allow us to easily create an in memory db for now (issues with sqlite binary)
|
||||
// so testing this part is not easy as all the logic is made in sqlite
|
||||
// tslint:disable-next-line: no-empty
|
||||
it.skip('in memory database', () => {});
|
||||
});
|
||||
});
|
@ -0,0 +1,4 @@
|
||||
describe('Updater', () => {
|
||||
// tslint:disable-next-line: no-empty
|
||||
it.skip('updater test', () => {});
|
||||
});
|
Loading…
Reference in New Issue