You've already forked joplin
mirror of
https://github.com/laurent22/joplin.git
synced 2025-07-16 00:14:34 +02:00
All: Use Lerna to manage monorepo
This commit is contained in:
167
packages/app-cli/tests/feature_ShowAllNotes.js
Normal file
167
packages/app-cli/tests/feature_ShowAllNotes.js
Normal file
@ -0,0 +1,167 @@
|
||||
/* eslint-disable no-unused-vars */
|
||||
const { setupDatabaseAndSynchronizer, switchClient, asyncTest, id, ids, sortedIds, at, createNTestFolders, createNTestNotes, createNTestTags, TestApp } = require('./test-utils.js');
|
||||
const Setting = require('@joplinapp/lib/models/Setting').default;
|
||||
const Folder = require('@joplinapp/lib/models/Folder.js');
|
||||
const Note = require('@joplinapp/lib/models/Note.js');
|
||||
const Tag = require('@joplinapp/lib/models/Tag.js');
|
||||
const time = require('@joplinapp/lib/time').default;
|
||||
const { ALL_NOTES_FILTER_ID } = require('@joplinapp/lib/reserved-ids.js');
|
||||
|
||||
//
|
||||
// The integration tests are to test the integration of the core system, comprising the
|
||||
// base application with middleware, reducer and models in response to dispatched events.
|
||||
//
|
||||
// The general strategy for each integration test is:
|
||||
// - create a starting application state,
|
||||
// - inject the event to be tested
|
||||
// - check the resulting application state
|
||||
//
|
||||
// Important: TestApp.wait() must be used after TestApp dispatch to allow the async
|
||||
// processing to complete
|
||||
//
|
||||
|
||||
let testApp = null;
|
||||
|
||||
describe('integration_ShowAllNotes', function() {
|
||||
|
||||
beforeEach(async (done) => {
|
||||
testApp = new TestApp();
|
||||
await testApp.start(['--no-welcome']);
|
||||
done();
|
||||
});
|
||||
|
||||
afterEach(async (done) => {
|
||||
if (testApp !== null) await testApp.destroy();
|
||||
testApp = null;
|
||||
done();
|
||||
});
|
||||
|
||||
it('should show all notes', asyncTest(async () => {
|
||||
// setup
|
||||
const folders = await createNTestFolders(3);
|
||||
Folder.moveToFolder(id(folders[2]), id(folders[1])); // subfolder
|
||||
await testApp.wait();
|
||||
const notes0 = await createNTestNotes(3, folders[0]);
|
||||
const notes1 = await createNTestNotes(3, folders[1]);
|
||||
const notes2 = await createNTestNotes(3, folders[2]);
|
||||
await testApp.wait();
|
||||
|
||||
// TEST ACTION: View all-notes
|
||||
testApp.dispatch({ type: 'SMART_FILTER_SELECT', id: ALL_NOTES_FILTER_ID });
|
||||
await testApp.wait();
|
||||
|
||||
// check: all the notes are shown
|
||||
const state = testApp.store().getState();
|
||||
expect(state.notesParentType).toEqual('SmartFilter');
|
||||
expect(state.selectedSmartFilterId).toEqual(ALL_NOTES_FILTER_ID);
|
||||
expect(sortedIds(state.notes)).toEqual(sortedIds(notes0.concat(notes1).concat(notes2)));
|
||||
}));
|
||||
|
||||
it('should show retain note selection when going from a folder to all-notes', asyncTest(async () => {
|
||||
// setup
|
||||
const folders = await createNTestFolders(2);
|
||||
const notes0 = await createNTestNotes(3, folders[0]);
|
||||
const notes1 = await createNTestNotes(3, folders[1]);
|
||||
await testApp.wait();
|
||||
|
||||
testApp.dispatch({ type: 'FOLDER_SELECT', id: id(folders[1]) });
|
||||
await testApp.wait();
|
||||
testApp.dispatch({ type: 'NOTE_SELECT', id: id(notes1[1]) });
|
||||
await testApp.wait();
|
||||
|
||||
// check the state is set up as expected
|
||||
let state = testApp.store().getState();
|
||||
expect(state.notesParentType).toEqual('Folder');
|
||||
expect(state.selectedFolderId).toEqual(id(folders[1]));
|
||||
expect(sortedIds(state.notes)).toEqual(sortedIds(notes1));
|
||||
expect(state.selectedNoteIds).toEqual(ids([notes1[1]]));
|
||||
|
||||
// TEST ACTION: View all-notes
|
||||
testApp.dispatch({ type: 'SMART_FILTER_SELECT', id: ALL_NOTES_FILTER_ID });
|
||||
await testApp.wait();
|
||||
|
||||
// check: all the notes are shown
|
||||
state = testApp.store().getState();
|
||||
expect(state.notesParentType).toEqual('SmartFilter');
|
||||
expect(state.selectedSmartFilterId).toEqual(ALL_NOTES_FILTER_ID);
|
||||
expect(sortedIds(state.notes)).toEqual(sortedIds(notes0.concat(notes1)));
|
||||
expect(state.selectedNoteIds).toEqual(ids([notes1[1]]));
|
||||
}));
|
||||
|
||||
it('should support note duplication', asyncTest(async () => {
|
||||
// setup
|
||||
const folder1 = await Folder.save({ title: 'folder1' });
|
||||
const folder2 = await Folder.save({ title: 'folder2' });
|
||||
const note1 = await Note.save({ title: 'note1', parent_id: folder1.id });
|
||||
const note2 = await Note.save({ title: 'note2', parent_id: folder2.id });
|
||||
testApp.dispatch({ type: 'FOLDER_SELECT', id: folder1.id }); // active folder
|
||||
await time.msleep(100);
|
||||
testApp.dispatch({ type: 'NOTE_SELECT', id: note1.id });
|
||||
await time.msleep(100);
|
||||
testApp.dispatch({ type: 'SMART_FILTER_SELECT', id: ALL_NOTES_FILTER_ID });
|
||||
await time.msleep(100);
|
||||
|
||||
// check the state is set up as expected
|
||||
let state = testApp.store().getState();
|
||||
expect(state.notesParentType).toEqual('SmartFilter');
|
||||
expect(sortedIds(state.notes)).toEqual(sortedIds([note1, note2]));
|
||||
|
||||
// TEST ACTION: duplicate a note from the active folder
|
||||
const newNote1 = await Note.duplicate(note1.id);
|
||||
await time.msleep(100);
|
||||
|
||||
// check the note is duplicated and the view updated
|
||||
state = testApp.store().getState();
|
||||
expect(state.notes.length).toEqual(3);
|
||||
expect(sortedIds(state.notes)).toEqual(sortedIds([note1, note2, newNote1]));
|
||||
|
||||
// TEST ACTION: duplicate a note from a non-active folder
|
||||
const newNote2 = await Note.duplicate(note2.id);
|
||||
await time.msleep(100);
|
||||
|
||||
// check the note is duplicated and the view updated
|
||||
state = testApp.store().getState();
|
||||
expect(state.notes.length).toEqual(4);
|
||||
expect(sortedIds(state.notes)).toEqual(sortedIds([note1, note2, newNote1, newNote2]));
|
||||
}));
|
||||
|
||||
it('should support changing the note parent', asyncTest(async () => {
|
||||
// setup
|
||||
const folder1 = await Folder.save({ title: 'folder1' });
|
||||
const folder2 = await Folder.save({ title: 'folder2' });
|
||||
const note1 = await Note.save({ title: 'note1', parent_id: folder1.id });
|
||||
const note2 = await Note.save({ title: 'note1', parent_id: folder2.id });
|
||||
testApp.dispatch({ type: 'FOLDER_SELECT', id: folder1.id }); // active folder
|
||||
await time.msleep(100);
|
||||
testApp.dispatch({ type: 'NOTE_SELECT', id: note1.id });
|
||||
await time.msleep(100);
|
||||
testApp.dispatch({ type: 'SMART_FILTER_SELECT', id: ALL_NOTES_FILTER_ID });
|
||||
await time.msleep(100);
|
||||
|
||||
// check the state is set up as expected
|
||||
let state = testApp.store().getState();
|
||||
expect(state.notesParentType).toEqual('SmartFilter');
|
||||
expect(sortedIds(state.notes)).toEqual(sortedIds([note1, note2]));
|
||||
expect(note1.parent_id).toEqual(folder1.id);
|
||||
|
||||
// TEST ACTION: change the notes parent
|
||||
await Note.moveToFolder(note1.id, folder2.id);
|
||||
await time.msleep(100);
|
||||
|
||||
// check the note is duplicated and the view updated
|
||||
state = testApp.store().getState();
|
||||
expect(state.notes.length).toEqual(2);
|
||||
let n1 = await Note.load(note1.id);
|
||||
expect(n1.parent_id).toEqual(folder2.id);
|
||||
|
||||
// TEST ACTION: change the notes parent
|
||||
await Note.moveToFolder(note1.id, folder1.id);
|
||||
await time.msleep(100);
|
||||
|
||||
// check the note is duplicated and the view updated
|
||||
state = testApp.store().getState();
|
||||
expect(state.notes.length).toEqual(2);
|
||||
n1 = await Note.load(note1.id);
|
||||
expect(n1.parent_id).toEqual(folder1.id);
|
||||
}));
|
||||
});
|
Reference in New Issue
Block a user