mirror of
https://github.com/laurent22/joplin.git
synced 2024-12-18 09:35:20 +02:00
146 lines
4.7 KiB
JavaScript
146 lines
4.7 KiB
JavaScript
/* eslint-disable no-unused-vars */
|
|
/* eslint prefer-const: 0*/
|
|
|
|
require('app-module-path').addPath(__dirname);
|
|
|
|
const { time } = require('lib/time-utils.js');
|
|
const { fileContentEqual, setupDatabase, setupDatabaseAndSynchronizer, asyncTest, db, synchronizer, fileApi, sleep, createNTestNotes, switchClient, createNTestFolders } = require('test-utils.js');
|
|
const SearchEngine = require('lib/services/searchengine/SearchEngine');
|
|
const Note = require('lib/models/Note');
|
|
const Folder = require('lib/models/Folder');
|
|
const Tag = require('lib/models/Tag');
|
|
const ItemChange = require('lib/models/ItemChange');
|
|
const Setting = require('lib/models/Setting');
|
|
const Resource = require('lib/models/Resource.js');
|
|
const { shim } = require('lib/shim');
|
|
const ResourceService = require('lib/services/ResourceService.js');
|
|
|
|
|
|
process.on('unhandledRejection', (reason, p) => {
|
|
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
|
|
});
|
|
|
|
let engine = null;
|
|
|
|
const ids = (array) => array.map(a => a.id);
|
|
|
|
describe('services_SearchFuzzy', function() {
|
|
beforeEach(async (done) => {
|
|
await setupDatabaseAndSynchronizer(1);
|
|
await switchClient(1);
|
|
|
|
engine = new SearchEngine();
|
|
engine.setDb(db());
|
|
|
|
Setting.setValue('db.fuzzySearchEnabled', 1);
|
|
done();
|
|
});
|
|
|
|
|
|
it('should return note almost matching title', asyncTest(async () => {
|
|
let rows;
|
|
const n1 = await Note.save({ title: 'If It Ain\'t Baroque, Don\'t Fix It' });
|
|
const n2 = await Note.save({ title: 'Important note' });
|
|
|
|
await engine.syncTables();
|
|
rows = await engine.search('Broke', { fuzzy: false });
|
|
expect(rows.length).toBe(0);
|
|
|
|
rows = await engine.search('Broke', { fuzzy: true });
|
|
expect(rows.length).toBe(1);
|
|
expect(rows[0].id).toBe(n1.id);
|
|
|
|
|
|
rows = await engine.search('title:Broke', { fuzzy: true });
|
|
expect(rows.length).toBe(1);
|
|
expect(rows[0].id).toBe(n1.id);
|
|
|
|
rows = await engine.search('title:"Broke"', { fuzzy: true });
|
|
expect(rows.length).toBe(1);
|
|
expect(rows[0].id).toBe(n1.id);
|
|
|
|
rows = await engine.search('Imprtant', { fuzzy: true });
|
|
expect(rows.length).toBe(1);
|
|
expect(rows[0].id).toBe(n2.id);
|
|
}));
|
|
|
|
|
|
it('should order results by min fuzziness', asyncTest(async () => {
|
|
let rows;
|
|
const n1 = await Note.save({ title: 'I demand you take me to him' });
|
|
const n2 = await Note.save({ title: 'He demanded an answer' });
|
|
const n3 = await Note.save({ title: 'Don\'t you make demands of me' });
|
|
const n4 = await Note.save({ title: 'No drama for me' });
|
|
const n5 = await Note.save({ title: 'Just minding my own business' });
|
|
|
|
await engine.syncTables();
|
|
rows = await engine.search('demand', { fuzzy: false });
|
|
expect(rows.length).toBe(1);
|
|
expect(rows[0].id).toBe(n1.id);
|
|
|
|
|
|
rows = await engine.search('demand', { fuzzy: true });
|
|
expect(rows.length).toBe(3);
|
|
expect(rows[0].id).toBe(n1.id);
|
|
expect(rows[1].id).toBe(n3.id);
|
|
expect(rows[2].id).toBe(n2.id);
|
|
}));
|
|
|
|
it('should consider any:1', asyncTest(async () => {
|
|
let rows;
|
|
const n1 = await Note.save({ title: 'cat' });
|
|
const n2 = await Note.save({ title: 'cats' });
|
|
const n3 = await Note.save({ title: 'cot' });
|
|
|
|
const n4 = await Note.save({ title: 'defenestrate' });
|
|
const n5 = await Note.save({ title: 'defenstrate' });
|
|
const n6 = await Note.save({ title: 'defenestrated' });
|
|
|
|
const n7 = await Note.save({ title: 'he defenestrated the cat' });
|
|
|
|
await engine.syncTables();
|
|
|
|
rows = await engine.search('defenestrated cat', { fuzzy: true });
|
|
expect(rows.length).toBe(1);
|
|
|
|
rows = await engine.search('any:1 defenestrated cat', { fuzzy: true });
|
|
expect(rows.length).toBe(7);
|
|
}));
|
|
|
|
it('should leave phrase searches alone', asyncTest(async () => {
|
|
let rows;
|
|
const n1 = await Note.save({ title: 'abc def' });
|
|
const n2 = await Note.save({ title: 'def ghi' });
|
|
const n3 = await Note.save({ title: 'ghi jkl' });
|
|
const n4 = await Note.save({ title: 'def abc' });
|
|
const n5 = await Note.save({ title: 'mno pqr ghi jkl' });
|
|
|
|
await engine.syncTables();
|
|
|
|
rows = await engine.search('abc def', { fuzzy: true });
|
|
expect(rows.length).toBe(2);
|
|
expect(rows.map(r=>r.id)).toContain(n1.id);
|
|
expect(rows.map(r=>r.id)).toContain(n4.id);
|
|
|
|
rows = await engine.search('"abc def"', { fuzzy: true });
|
|
expect(rows.length).toBe(1);
|
|
expect(rows.map(r=>r.id)).toContain(n1.id);
|
|
|
|
rows = await engine.search('"ghi jkl"', { fuzzy: true });
|
|
expect(rows.length).toBe(2);
|
|
expect(rows.map(r=>r.id)).toContain(n3.id);
|
|
expect(rows.map(r=>r.id)).toContain(n5.id);
|
|
|
|
rows = await engine.search('"ghi jkl" mno', { fuzzy: true });
|
|
expect(rows.length).toBe(1);
|
|
expect(rows.map(r=>r.id)).toContain(n5.id);
|
|
|
|
rows = await engine.search('any:1 "ghi jkl" mno', { fuzzy: true });
|
|
expect(rows.length).toBe(2);
|
|
expect(rows.map(r=>r.id)).toContain(n3.id);
|
|
expect(rows.map(r=>r.id)).toContain(n5.id);
|
|
}));
|
|
|
|
|
|
});
|