mirror of https://github.com/laurent22/joplin.git
159 lines
3.4 KiB
TypeScript
159 lines
3.4 KiB
TypeScript
import NoteListUtils from './NoteListUtils';
|
|
import KeymapService from '@joplin/lib/services/KeymapService';
|
|
import menuCommandNames from '../menuCommandNames';
|
|
import { MenuItem as MenuItemType } from '@joplin/lib/services/commands/MenuUtils';
|
|
import initializeCommandService from '../../utils/initializeCommandService';
|
|
import { createAppDefaultWindowState } from '../../app.reducer';
|
|
|
|
type MenuItemWrapper = {
|
|
value: MenuItemType;
|
|
};
|
|
|
|
jest.mock('../../services/bridge', () => ({
|
|
__esModule: true,
|
|
default: () => ({
|
|
MenuItem: class MenuItem {
|
|
public value: MenuItemType;
|
|
public constructor(value: MenuItemType) {
|
|
this.value = value;
|
|
}
|
|
},
|
|
Menu: class MockMenu {
|
|
public items: string[] = [];
|
|
public append(item: MenuItemWrapper) {
|
|
const identifier = item.value.id ? item.value.id : (
|
|
item.value.label ? item.value.label : item.value.type
|
|
);
|
|
this.items.push(identifier);
|
|
}
|
|
},
|
|
}),
|
|
}));
|
|
|
|
const mockDispatch = jest.fn();
|
|
|
|
describe('NoteListUtils', () => {
|
|
|
|
beforeEach(() => {
|
|
const mockStore = {
|
|
getState: () => {
|
|
return {
|
|
...createAppDefaultWindowState(),
|
|
settings: {},
|
|
};
|
|
},
|
|
};
|
|
|
|
initializeCommandService(mockStore, false);
|
|
const keymapService = KeymapService.instance();
|
|
keymapService.initialize(menuCommandNames());
|
|
});
|
|
|
|
it('should show only trash menu options on deleted note', () => {
|
|
const noteIds = ['noteId1'];
|
|
const deletedNote = {
|
|
id: 'noteId1',
|
|
deleted_time: new Date().getTime(),
|
|
};
|
|
const menu = NoteListUtils.makeContextMenu(noteIds, {
|
|
notes: [
|
|
deletedNote,
|
|
],
|
|
dispatch: mockDispatch,
|
|
watchedNoteFiles: [],
|
|
plugins: {},
|
|
inConflictFolder: false,
|
|
customCss: '',
|
|
});
|
|
|
|
expect(menu.items).toEqual([
|
|
'restoreNote',
|
|
'permanentlyDeleteNote',
|
|
]);
|
|
});
|
|
|
|
it('should show menu options for normal notes', () => {
|
|
const noteIds = ['noteId1'];
|
|
const normalNote = {
|
|
id: 'noteId1',
|
|
};
|
|
const menu = NoteListUtils.makeContextMenu(noteIds, {
|
|
notes: [
|
|
normalNote,
|
|
],
|
|
dispatch: mockDispatch,
|
|
watchedNoteFiles: [],
|
|
plugins: {},
|
|
inConflictFolder: false,
|
|
customCss: '',
|
|
});
|
|
|
|
expect(menu.items).toEqual([
|
|
'openNoteInNewWindow',
|
|
'startExternalEditing',
|
|
'separator',
|
|
'setTags',
|
|
'separator',
|
|
'toggleNoteType',
|
|
'moveToFolder',
|
|
'duplicateNote',
|
|
'deleteNote',
|
|
'separator',
|
|
'Copy Markdown link',
|
|
'Copy external link',
|
|
'separator',
|
|
'Export',
|
|
|
|
]);
|
|
});
|
|
|
|
it('should show options when more than one note is selected', () => {
|
|
const noteIds = ['noteId1', 'noteId2'];
|
|
const menu = NoteListUtils.makeContextMenu(noteIds, {
|
|
notes: [
|
|
{ id: 'noteId1' },
|
|
{ id: 'noteId2' },
|
|
],
|
|
dispatch: mockDispatch,
|
|
watchedNoteFiles: [],
|
|
plugins: {},
|
|
inConflictFolder: false,
|
|
customCss: '',
|
|
});
|
|
|
|
expect(menu.items).toEqual([
|
|
'setTags',
|
|
'separator',
|
|
'Switch to note type',
|
|
'Switch to to-do type',
|
|
'moveToFolder',
|
|
'duplicateNote',
|
|
'deleteNote',
|
|
'separator',
|
|
'Copy Markdown link',
|
|
'separator',
|
|
'Export',
|
|
]);
|
|
});
|
|
|
|
it('should hide all options for encrypted', () => {
|
|
const noteIds = ['noteId1'];
|
|
const encrypted = {
|
|
id: 'noteId1',
|
|
encryption_applied: 1,
|
|
};
|
|
const menu = NoteListUtils.makeContextMenu(noteIds, {
|
|
notes: [
|
|
encrypted,
|
|
],
|
|
dispatch: mockDispatch,
|
|
watchedNoteFiles: [],
|
|
plugins: {},
|
|
inConflictFolder: false,
|
|
customCss: '',
|
|
});
|
|
|
|
expect(menu.items).toEqual([]);
|
|
});
|
|
});
|