1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-11-27 08:21:03 +02:00
This commit is contained in:
Laurent Cozic 2017-06-14 20:59:02 +01:00
parent 226353ecb7
commit a0400a5e38
5 changed files with 215 additions and 51 deletions

View File

@ -15,42 +15,54 @@ import { sprintf } from 'sprintf-js';
import { _ } from 'src/locale.js'; import { _ } from 'src/locale.js';
import { NoteFolderService } from 'src/services/note-folder-service.js'; import { NoteFolderService } from 'src/services/note-folder-service.js';
const vorpal = require('vorpal')(); // import { ItemSyncTime } from 'src/models/item-sync-time.js';
let db = new Database(new DatabaseDriverNode()); // const vorpal = require('vorpal')();
db.setDebugEnabled(false);
// let fileDriver = new FileApiDriverLocal(); // let db = new Database(new DatabaseDriverNode());
// let fileApi = new FileApi('/home/laurent/Temp/TestImport', fileDriver); // db.setDebugEnabled(false);
// db.open({ name: '/home/laurent/Temp/test.sqlite3' }).then(() => {
// BaseModel.db_ = db;
// return ItemSyncTime.setTime(123, 789);
// }).then((r) => {
// console.info(r);
// }).catch((error) => {
// console.error(error);
// });
// // let fileDriver = new FileApiDriverLocal();
// // let fileApi = new FileApi('/home/laurent/Temp/TestImport', fileDriver);
// // let synchronizer = new Synchronizer(db, fileApi);
// let fileDriver = new FileApiDriverMemory();
// let fileApi = new FileApi('/root', fileDriver);
// let synchronizer = new Synchronizer(db, fileApi); // let synchronizer = new Synchronizer(db, fileApi);
let fileDriver = new FileApiDriverMemory(); // fileApi.mkdir('test').then(() => {
let fileApi = new FileApi('/root', fileDriver); // return fileApi.mkdir('test2');
let synchronizer = new Synchronizer(db, fileApi); // }).then(() => {
// return fileApi.put('test/un', 'abcd1111').then(fileApi.put('test/deux', 'abcd2222'));
// }).then(() => {
fileApi.mkdir('test').then(() => { // return fileApi.list();
return fileApi.mkdir('test2'); // }).then((items) => {
}).then(() => { // //console.info(items);
return fileApi.put('test/un', 'abcd1111').then(fileApi.put('test/deux', 'abcd2222')); // }).then(() => {
}).then(() => { // return fileApi.delete('test/un');
return fileApi.list(); // }).then(() => {
}).then((items) => { // return fileApi.get('test/deux').then((content) => { console.info(content); });
//console.info(items); // }).then(() => {
}).then(() => { // return fileApi.list('test', true);
return fileApi.delete('test/un'); // }).then((items) => {
}).then(() => { // console.info(items);
return fileApi.get('test/deux').then((content) => { console.info(content); }); // }).catch((error) => {
}).then(() => { // console.error(error);
return fileApi.list('test', true); // }).then(() => {
}).then((items) => { // process.exit();
console.info(items); // });
}).catch((error) => {
console.error(error);
}).then(() => {
process.exit();
});

View File

@ -2,7 +2,8 @@
CLIENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" CLIENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
rm -f "$CLIENT_DIR/tests-build/src" rm -f "$CLIENT_DIR/tests-build/src"
mkdir -p "$CLIENT_DIR/tests-build" mkdir -p "$CLIENT_DIR/tests-build/data"
ln -s "$CLIENT_DIR/build/src" "$CLIENT_DIR/tests-build" ln -s "$CLIENT_DIR/build/src" "$CLIENT_DIR/tests-build"
npm run build && NODE_PATH="$CLIENT_DIR/tests-build/" npm test tests-build/synchronizer.js # npm run build && NODE_PATH="$CLIENT_DIR/tests-build/" npm test tests-build/synchronizer.js
npm run build && NODE_PATH="$CLIENT_DIR/tests-build/" npm test tests-build/services/note-folder-service.js

View File

@ -0,0 +1,89 @@
import { time } from 'src/time-utils.js';
import { Note } from 'src/models/note.js';
import { Folder } from 'src/models/folder.js';
import { promiseChain } from 'src/promise-chain.js';
import { NoteFolderService } from 'src/services/note-folder-service.js';
import { setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi } from 'test-utils.js';
describe('NoteFolderServices', function() {
beforeEach(function(done) {
setupDatabaseAndSynchronizer(done);
});
function createNotes(parentId, id = 1) {
let notes = [];
if (id === 1) {
notes.push({ parent_id: parentId, title: 'note one', body: 'content of note one' });
notes.push({ parent_id: parentId, title: 'note two', body: 'content of note two' });
} else {
throw new Error('Invalid ID: ' + id);
}
let output = [];
let chain = [];
for (let i = 0; i < notes.length; i++) {
chain.push(() => {
return Note.save(notes[i]).then((note) => {
output.push(note);
return output;
});
});
}
return promiseChain(chain, []);
}
function createFolders(id = 1) {
let folders = [];
if (id === 1) {
folders.push({ title: 'myfolder1' });
folders.push({ title: 'myfolder2' });
folders.push({ title: 'myfolder3' });
} else {
throw new Error('Invalid ID: ' + id);
}
let output = [];
let chain = [];
for (let i = 0; i < folders.length; i++) {
chain.push(() => {
return Folder.save(folders[i]).then((folder) => {
output.push(folder);
return output;
});
});
}
return promiseChain(chain, []);
}
it('should retrieve sync items', function(done) {
createFolders().then((folders) => {
return createNotes(folders[0].id);
}).then(() => {
return NoteFolderService.itemsThatNeedSync().then((context) => {
expect(context.items.length).toBe(2);
expect(context.hasMore).toBe(true);
return context;
});
}).then((context) => {
return NoteFolderService.itemsThatNeedSync(context, 2).then((context) => {
expect(context.items.length).toBe(2);
expect(context.hasMore).toBe(true);
return context;
});
}).then((context) => {
return NoteFolderService.itemsThatNeedSync(context, 2).then((context) => {
expect(context.items.length).toBe(1);
expect(context.hasMore).toBe(false);
return context;
});
}).then(() => {
done();
}).catch((error) => {
console.error(error);
});
});
});

View File

@ -1,14 +1,8 @@
import { Synchronizer } from 'src/synchronizer.js';
import { FileApi } from 'src/file-api.js';
import { FileApiDriverMemory } from 'src/file-api-driver-memory.js';
import { time } from 'src/time-utils.js'; import { time } from 'src/time-utils.js';
import { setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi } from 'test-utils.js';
describe('Synchronizer syncActions', function() { describe('Synchronizer syncActions', function() {
let fileDriver = new FileApiDriverMemory();
let fileApi = new FileApi('/root', fileDriver);
let synchronizer = new Synchronizer(null, fileApi);
// Note: set 1 matches set 1 of createRemoteItems() // Note: set 1 matches set 1 of createRemoteItems()
function createLocalItems(id, updatedTime, lastSyncTime) { function createLocalItems(id, updatedTime, lastSyncTime) {
let output = []; let output = [];
@ -25,10 +19,10 @@ describe('Synchronizer syncActions', function() {
if (!updatedTime) updatedTime = time.unix(); if (!updatedTime) updatedTime = time.unix();
if (id === 1) { if (id === 1) {
return fileApi.format() return fileApi().format()
.then(() => fileApi.mkdir('test')) .then(() => fileApi().mkdir('test'))
.then(() => fileApi.put('test/un', 'abcd')) .then(() => fileApi().put('test/un', 'abcd'))
.then(() => fileApi.list('', true)) .then(() => fileApi().list('', true))
.then((items) => { .then((items) => {
for (let i = 0; i < items.length; i++) { for (let i = 0; i < items.length; i++) {
items[i].updatedTime = updatedTime; items[i].updatedTime = updatedTime;
@ -40,11 +34,15 @@ describe('Synchronizer syncActions', function() {
} }
} }
beforeEach(function(done) {
setupDatabaseAndSynchronizer(done);
});
it('should create remote items', function() { it('should create remote items', function() {
let localItems = createLocalItems(1, time.unix(), 0); let localItems = createLocalItems(1, time.unix(), 0);
let remoteItems = []; let remoteItems = [];
let actions = synchronizer.syncActions(localItems, remoteItems, []); let actions = synchronizer().syncActions(localItems, remoteItems, []);
expect(actions.length).toBe(2); expect(actions.length).toBe(2);
for (let i = 0; i < actions.length; i++) { for (let i = 0; i < actions.length; i++) {
@ -57,7 +55,7 @@ describe('Synchronizer syncActions', function() {
createRemoteItems(1).then((remoteItems) => { createRemoteItems(1).then((remoteItems) => {
let lastSyncTime = time.unix() + 1000; let lastSyncTime = time.unix() + 1000;
let localItems = createLocalItems(1, lastSyncTime + 1000, lastSyncTime); let localItems = createLocalItems(1, lastSyncTime + 1000, lastSyncTime);
let actions = synchronizer.syncActions(localItems, remoteItems, []); let actions = synchronizer().syncActions(localItems, remoteItems, []);
expect(actions.length).toBe(2); expect(actions.length).toBe(2);
for (let i = 0; i < actions.length; i++) { for (let i = 0; i < actions.length; i++) {
@ -82,7 +80,7 @@ describe('Synchronizer syncActions', function() {
createRemoteItems(1).then((remoteItems) => { createRemoteItems(1).then((remoteItems) => {
let localItems = createLocalItems(1, time.unix() + 1000, time.unix() - 1000); let localItems = createLocalItems(1, time.unix() + 1000, time.unix() - 1000);
let actions = synchronizer.syncActions(localItems, remoteItems, []); let actions = synchronizer().syncActions(localItems, remoteItems, []);
expect(actions.length).toBe(2); expect(actions.length).toBe(2);
for (let i = 0; i < actions.length; i++) { for (let i = 0; i < actions.length; i++) {
@ -97,7 +95,7 @@ describe('Synchronizer syncActions', function() {
it('should create local file', function(done) { it('should create local file', function(done) {
createRemoteItems(1).then((remoteItems) => { createRemoteItems(1).then((remoteItems) => {
let localItems = []; let localItems = [];
let actions = synchronizer.syncActions(localItems, remoteItems, []); let actions = synchronizer().syncActions(localItems, remoteItems, []);
expect(actions.length).toBe(2); expect(actions.length).toBe(2);
for (let i = 0; i < actions.length; i++) { for (let i = 0; i < actions.length; i++) {
@ -113,7 +111,7 @@ describe('Synchronizer syncActions', function() {
createRemoteItems(1).then((remoteItems) => { createRemoteItems(1).then((remoteItems) => {
let localItems = createLocalItems(1, time.unix(), time.unix()); let localItems = createLocalItems(1, time.unix(), time.unix());
let deletedItemPaths = [localItems[0].path, localItems[1].path]; let deletedItemPaths = [localItems[0].path, localItems[1].path];
let actions = synchronizer.syncActions([], remoteItems, deletedItemPaths); let actions = synchronizer().syncActions([], remoteItems, deletedItemPaths);
expect(actions.length).toBe(2); expect(actions.length).toBe(2);
for (let i = 0; i < actions.length; i++) { for (let i = 0; i < actions.length; i++) {
@ -129,7 +127,7 @@ describe('Synchronizer syncActions', function() {
let lastSyncTime = time.unix(); let lastSyncTime = time.unix();
createRemoteItems(1, lastSyncTime - 1000).then((remoteItems) => { createRemoteItems(1, lastSyncTime - 1000).then((remoteItems) => {
let localItems = createLocalItems(1, lastSyncTime - 1000, lastSyncTime); let localItems = createLocalItems(1, lastSyncTime - 1000, lastSyncTime);
let actions = synchronizer.syncActions(localItems, [], []); let actions = synchronizer().syncActions(localItems, [], []);
expect(actions.length).toBe(2); expect(actions.length).toBe(2);
for (let i = 0; i < actions.length; i++) { for (let i = 0; i < actions.length; i++) {
@ -145,7 +143,7 @@ describe('Synchronizer syncActions', function() {
let lastSyncTime = time.unix(); let lastSyncTime = time.unix();
createRemoteItems(1, lastSyncTime + 1000).then((remoteItems) => { createRemoteItems(1, lastSyncTime + 1000).then((remoteItems) => {
let localItems = createLocalItems(1, lastSyncTime - 1000, lastSyncTime); let localItems = createLocalItems(1, lastSyncTime - 1000, lastSyncTime);
let actions = synchronizer.syncActions(localItems, remoteItems, []); let actions = synchronizer().syncActions(localItems, remoteItems, []);
expect(actions.length).toBe(2); expect(actions.length).toBe(2);
for (let i = 0; i < actions.length; i++) { for (let i = 0; i < actions.length; i++) {

View File

@ -0,0 +1,64 @@
import fs from 'fs-extra';
import { Database } from 'src/database.js';
import { DatabaseDriverNode } from 'src/database-driver-node.js';
import { BaseModel } from 'src/base-model.js';
import { Synchronizer } from 'src/synchronizer.js';
import { FileApi } from 'src/file-api.js';
import { FileApiDriverMemory } from 'src/file-api-driver-memory.js';
let database_ = null;
let synchronizer_ = null;
let fileApi_ = null;
function setupDatabase(done) {
if (database_) {
let queries = [
'DELETE FROM changes',
'DELETE FROM notes',
'DELETE FROM folders',
'DELETE FROM item_sync_times',
];
return database_.transactionExecBatch(queries).then(() => {
if (done) done();
});
}
const filePath = __dirname + '/data/test.sqlite';
return fs.unlink(filePath).catch(() => {
// Don't care if the file doesn't exist
}).then(() => {
//console.info('Opening database ' + filePath);
database_ = new Database(new DatabaseDriverNode());
database_.setDebugEnabled(false);
return database_.open({ name: filePath }).then(() => {
BaseModel.db_ = database_;
return setupDatabase(done);
});
});
}
function setupDatabaseAndSynchronizer(done) {
return setupDatabase().then(() => {
if (!synchronizer_) {
let fileDriver = new FileApiDriverMemory();
fileApi_ = new FileApi('/root', fileDriver);
synchronizer_ = new Synchronizer(db(), fileApi);
}
done();
});
}
function db() {
return database_;
}
function synchronizer() {
return synchronizer_;
}
function fileApi() {
return fileApi_;
}
export { setupDatabase, setupDatabaseAndSynchronizer, db, synchronizer, fileApi };