diff --git a/CliClient/tests/services_InteropService.js b/CliClient/tests/services_InteropService.js index e15d54758d..9ced4d46a5 100644 --- a/CliClient/tests/services_InteropService.js +++ b/CliClient/tests/services_InteropService.js @@ -334,6 +334,35 @@ describe('services_InteropService', function() { } })); + it('should export selected notes in md format', asyncTest(async () => { + const service = new InteropService(); + let folder1 = await Folder.save({ title: 'folder1' }); + let note11 = await Note.save({ title: 'title note11', parent_id: folder1.id }); + note11 = await Note.load(note11.id); + let note12 = await Note.save({ title: 'title note12', parent_id: folder1.id }); + note12 = await Note.load(note12.id); + + let folder2 = await Folder.save({ title: 'folder2', parent_id: folder1.id }); + folder2 = await Folder.load(folder2.id); + let note21 = await Note.save({ title: 'title note21', parent_id: folder2.id }); + note21 = await Note.load(note21.id); + + let folder3 = await Folder.save({ title: 'folder3', parent_id: folder1.id }); + folder3 = await Folder.load(folder2.id); + + const outDir = exportDir(); + + await service.export({ path: outDir, format: 'md', sourceNoteIds: [note11.id, note21.id] }); + + // verify that the md files exist + expect(await shim.fsDriver().exists(`${outDir}/folder1`)).toBe(true); + expect(await shim.fsDriver().exists(`${outDir}/folder1/title note11.md`)).toBe(true); + expect(await shim.fsDriver().exists(`${outDir}/folder1/title note12.md`)).toBe(false); + expect(await shim.fsDriver().exists(`${outDir}/folder1/folder2`)).toBe(true); + expect(await shim.fsDriver().exists(`${outDir}/folder1/folder2/title note21.md`)).toBe(true); + expect(await shim.fsDriver().exists(`${outDir}/folder3`)).toBe(false); + })); + it('should export MD with unicode filenames', asyncTest(async () => { const service = new InteropService(); let folder1 = await Folder.save({ title: 'folder1' }); diff --git a/CliClient/tests/services_InteropService_Exporter_Md.js b/CliClient/tests/services_InteropService_Exporter_Md.js index 78a749516d..2ba5e2caf9 100644 --- a/CliClient/tests/services_InteropService_Exporter_Md.js +++ b/CliClient/tests/services_InteropService_Exporter_Md.js @@ -170,6 +170,37 @@ describe('services_InteropService_Exporter_Md', function() { expect(await shim.fsDriver().exists(`${exportDir}/_resources/${Resource.filename(resource2)}`)).toBe(true, 'Resource file should be copied to _resources directory.'); })); + it('should create folders in fs', asyncTest(async () => { + const exporter = new InteropService_Exporter_Md(); + await exporter.init(exportDir); + + const itemsToExport = []; + const queueExportItem = (itemType, itemOrId) => { + itemsToExport.push({ + type: itemType, + itemOrId: itemOrId, + }); + }; + + let folder1 = await Folder.save({ title: 'folder1' }); + + let folder2 = await Folder.save({ title: 'folder2', parent_id: folder1.id }); + let note2 = await Note.save({ title: 'note2', parent_id: folder2.id }); + queueExportItem(BaseModel.TYPE_NOTE, note2); + + let folder3 = await Folder.save({ title: 'folder3', parent_id: folder1.id }); + queueExportItem(BaseModel.TYPE_FOLDER, folder3.id); + + await exporter.processItem(Folder, folder2); + await exporter.processItem(Folder, folder3); + await exporter.prepareForProcessingItemType(BaseModel.TYPE_NOTE, itemsToExport); + await exporter.processItem(Note, note2); + + expect(await shim.fsDriver().exists(`${exportDir}/folder1`)).toBe(true, 'Folder should be created in filesystem.'); + expect(await shim.fsDriver().exists(`${exportDir}/folder1/folder2`)).toBe(true, 'Folder should be created in filesystem.'); + expect(await shim.fsDriver().exists(`${exportDir}/folder1/folder3`)).toBe(true, 'Folder should be created in filesystem.'); + })); + it('should save notes in fs', asyncTest(async () => { const exporter = new InteropService_Exporter_Md(); await exporter.init(exportDir); @@ -197,9 +228,6 @@ describe('services_InteropService_Exporter_Md', function() { queueExportItem(BaseModel.TYPE_FOLDER, folder3.id); queueExportItem(BaseModel.TYPE_NOTE, note3); - await exporter.processItem(Folder, folder1); - await exporter.processItem(Folder, folder2); - await exporter.processItem(Folder, folder3); await exporter.prepareForProcessingItemType(BaseModel.TYPE_NOTE, itemsToExport); await exporter.processItem(Note, note1); await exporter.processItem(Note, note2); diff --git a/ReactNativeClient/lib/services/InteropService_Exporter_Md.js b/ReactNativeClient/lib/services/InteropService_Exporter_Md.js index d0a3d5058d..3c8a9d8a24 100644 --- a/ReactNativeClient/lib/services/InteropService_Exporter_Md.js +++ b/ReactNativeClient/lib/services/InteropService_Exporter_Md.js @@ -1,5 +1,5 @@ const InteropService_Exporter_Base = require('lib/services/InteropService_Exporter_Base'); -const { basename, friendlySafeFilename } = require('lib/path-utils.js'); +const { basename, dirname, friendlySafeFilename } = require('lib/path-utils.js'); const BaseModel = require('lib/BaseModel'); const Folder = require('lib/models/Folder'); const Note = require('lib/models/Note'); @@ -119,6 +119,7 @@ class InteropService_Exporter_Md extends InteropService_Exporter_Base { let noteBody = await this.relaceLinkedItemIdsByRelativePaths_(item); const modNote = Object.assign({}, item, { body: noteBody }); const noteContent = await Note.serializeForEdit(modNote); + await shim.fsDriver().mkdir(dirname(noteFilePath)); await shim.fsDriver().writeFile(noteFilePath, noteContent, 'utf-8'); } }