From 93edeb6f86383d5cbf117b21b9b1edefb97153e6 Mon Sep 17 00:00:00 2001 From: Oleg Date: Mon, 5 Sep 2022 17:01:48 +0300 Subject: [PATCH] test(services): increase code coverage for file.services --- main.ts | 13 ++---- src/components/RenderPreviewFiles.ts | 24 +++++++++- src/services/file.service.ts | 44 ++++++------------ src/services/file.services.test.ts | 66 ++++++++++++++++++++++++++- src/services/obsidian.service.test.ts | 5 ++ src/services/obsidian.service.ts | 16 ++++--- 6 files changed, 118 insertions(+), 50 deletions(-) create mode 100644 src/services/obsidian.service.test.ts diff --git a/main.ts b/main.ts index dde71f6..1698a04 100644 --- a/main.ts +++ b/main.ts @@ -1,10 +1,4 @@ -import { - App, - Plugin, - PluginSettingTab, - Setting, - TAbstractFile, -} from 'obsidian'; +import { App, Plugin, PluginSettingTab, Setting, TFile } from 'obsidian'; import { FolderSuggest } from './src/suggestions/folderSuggest'; import { renderDonateButton } from './src/components/DonateButton'; @@ -18,7 +12,7 @@ import { renderPreviewFiles } from './src/components/RenderPreviewFiles'; interface BulkRenamePluginSettings { folderName: string; - fileNames: TAbstractFile[]; + fileNames: TFile[]; existingSymbol: string; replacePattern: string; tags: string[]; @@ -205,7 +199,6 @@ export class BulkRenameSettingsTab extends PluginSettingTab { .setName('Existing Characters') .setDesc(desc); - // if (!isViewTypeTags(this.plugin)) { newSettings.addText((textComponent) => { textComponent.setValue(settings.existingSymbol); textComponent.setPlaceholder('existing symbols'); @@ -214,7 +207,7 @@ export class BulkRenameSettingsTab extends PluginSettingTab { this.plugin.saveSettings(); }); }); - // } + newSettings.addText((textComponent) => { const previewLabel = createPreviewElement('Replacement symbols'); textComponent.inputEl.insertAdjacentElement('beforebegin', previewLabel); diff --git a/src/components/RenderPreviewFiles.ts b/src/components/RenderPreviewFiles.ts index e017f0f..0d31151 100644 --- a/src/components/RenderPreviewFiles.ts +++ b/src/components/RenderPreviewFiles.ts @@ -1,10 +1,9 @@ import { getFilesNamesInDirectory, getRenderedFileNamesReplaced, - syncScrolls, } from '../services/file.service'; import { createPreviewElement } from './PreviewElement'; -import BulkRenamePlugin, { BulkRenameSettingsTab } from '../../main'; +import BulkRenamePlugin, { BulkRenameSettingsTab, State } from '../../main'; export const renderPreviewFiles = ( setting: BulkRenameSettingsTab['filesAndPreview'], @@ -43,3 +42,24 @@ export const renderPreviewFiles = ( syncScrolls(existingFilesTextArea, replacedPreviewTextArea, state); }); }; + +export const syncScrolls = ( + existingFilesArea: HTMLTextAreaElement, + previewArea: HTMLTextAreaElement, + state: State, +) => { + existingFilesArea.addEventListener('scroll', (event) => { + const target = event.target as HTMLTextAreaElement; + if (target.scrollTop !== state.previewScroll) { + previewArea.scrollTop = target.scrollTop; + state.previewScroll = target.scrollTop; + } + }); + previewArea.addEventListener('scroll', (event) => { + const target = event.target as HTMLTextAreaElement; + if (target.scrollTop !== state.filesScroll) { + existingFilesArea.scrollTop = target.scrollTop; + state.filesScroll = target.scrollTop; + } + }); +}; diff --git a/src/services/file.service.ts b/src/services/file.service.ts index 5c49be3..400e4ec 100644 --- a/src/services/file.service.ts +++ b/src/services/file.service.ts @@ -1,5 +1,5 @@ import { App, Notice, TFile } from 'obsidian'; -import BulkRenamePlugin, { State } from '../../main'; +import BulkRenamePlugin from '../../main'; export const getFilesNamesInDirectory = (plugin: BulkRenamePlugin) => { const { fileNames } = plugin.settings; @@ -26,7 +26,7 @@ export const getRenderedFileNamesReplaced = (plugin: BulkRenamePlugin) => { return getFilesAsString(newFiles); }; -const selectFilenamesWithReplacedPath = (plugin: BulkRenamePlugin) => { +export const selectFilenamesWithReplacedPath = (plugin: BulkRenamePlugin) => { const { fileNames } = plugin.settings; return fileNames.map((file) => { @@ -42,10 +42,11 @@ export const replaceFilePath = (plugin: BulkRenamePlugin, file: TFile) => { const pathWithoutExtension = file.path.split('.').slice(0, -1).join('.'); - const newPath = pathWithoutExtension?.replaceAll( - existingSymbol, - replacePattern, - ); + const convertedToRegExpString = escapeRegExp(existingSymbol); + + const regExpSymbol = new RegExp(convertedToRegExpString, 'g'); + + const newPath = pathWithoutExtension?.replace(regExpSymbol, replacePattern); return `${newPath}.${file.extension}`; }; @@ -61,11 +62,6 @@ export const renameFilesInObsidian = async ( return; } - // if (replacePattern === existingSymbol) { - // new Notice("Replace Pattern shouldn't much Existing Symbol"); - // return; - // } - if (!fileNames.length) { new Notice('Please check your results before rename!'); return; @@ -81,23 +77,9 @@ export const renameFilesInObsidian = async ( new Notice('successfully renamed all files'); }; -export const syncScrolls = ( - existingFilesArea: HTMLTextAreaElement, - previewArea: HTMLTextAreaElement, - state: State, -) => { - existingFilesArea.addEventListener('scroll', (event) => { - const target = event.target as HTMLTextAreaElement; - if (target.scrollTop !== state.previewScroll) { - previewArea.scrollTop = target.scrollTop; - state.previewScroll = target.scrollTop; - } - }); - previewArea.addEventListener('scroll', (event) => { - const target = event.target as HTMLTextAreaElement; - if (target.scrollTop !== state.filesScroll) { - existingFilesArea.scrollTop = target.scrollTop; - state.filesScroll = target.scrollTop; - } - }); -}; +let reRegExpChar = /[\\^$.*+?()[\]{}]/g, + reHasRegExpChar = RegExp(reRegExpChar.source); + +export function escapeRegExp(s: string) { + return s && reHasRegExpChar.test(s) ? s.replace(reRegExpChar, '\\$&') : s; +} diff --git a/src/services/file.services.test.ts b/src/services/file.services.test.ts index fac9ddf..c807d41 100644 --- a/src/services/file.services.test.ts +++ b/src/services/file.services.test.ts @@ -1,6 +1,9 @@ import { TFile } from 'obsidian'; -import { replaceFilePath } from './file.service'; +import { + replaceFilePath, + selectFilenamesWithReplacedPath, +} from './file.service'; import BulkRenamePlugin from '../../main'; describe('File Services', () => { @@ -79,5 +82,66 @@ describe('File Services', () => { expect(result).toEqual(expectedResult); }); + + describe('selectFilenamesWithReplacedPath', () => { + const files = [ + { + path: 'journals/2022_10_13.md', + extension: 'md', + }, + { + path: 'pages/2022_10_13.md', + extension: 'md', + }, + { + path: 'bulkRenameTets/2022_10_13.md', + extension: 'md', + }, + { + path: 'YesWecan/canWe/2022_10_13.md', + extension: 'md', + }, + ] as unknown as TFile[]; + + const mockPluginPlugin = { + settings: { + fileNames: files, + }, + } as unknown as BulkRenamePlugin; + + it('should rename many files with RegExp', () => { + const plugin = { + ...mockPluginPlugin, + settings: { + ...mockPluginPlugin.settings, + existingSymbol: 'journals|pages|bulkRenameTets|canWe', + replacePattern: 'qwe', + }, + } as unknown as BulkRenamePlugin; + + const expectedResults = [ + { + path: 'qwe/2022_10_13.md', + extension: 'md', + }, + { + path: 'qwe/2022_10_13.md', + extension: 'md', + }, + { + path: 'qwe/2022_10_13.md', + extension: 'md', + }, + { + path: 'YesWecan/qwe/2022_10_13.md', + extension: 'md', + }, + ]; + + const updatedFiles = selectFilenamesWithReplacedPath(plugin); + + expect(expectedResults).toEqual(updatedFiles); + }); + }); }); }); diff --git a/src/services/obsidian.service.test.ts b/src/services/obsidian.service.test.ts new file mode 100644 index 0000000..f810b56 --- /dev/null +++ b/src/services/obsidian.service.test.ts @@ -0,0 +1,5 @@ +describe('obsidian.service', () => { + describe('getObsidianFilesWithTagName', () => { + it.todo('should find files by tag'); + }); +}); diff --git a/src/services/obsidian.service.ts b/src/services/obsidian.service.ts index 6f7782c..c383da2 100644 --- a/src/services/obsidian.service.ts +++ b/src/services/obsidian.service.ts @@ -8,11 +8,11 @@ export const getObsidianFilesByFolderName = ( const { folderName } = plugin.settings; const abstractFiles = app.vault.getAllLoadedFiles(); - const files = abstractFiles.filter((file) => { - return file instanceof TFile && file.parent.name.includes(folderName); - }); + const files = abstractFiles.filter( + (file) => file instanceof TFile && file.parent.name.includes(folderName), + ) as TFile[]; - const filesSortedByName = files.sort((a, b) => a.name.localeCompare(b.name)); + const filesSortedByName = sortFilesByName(files); return filesSortedByName; }; @@ -43,9 +43,13 @@ export const getObsidianFilesWithTagName = ( } return file; - }); + }) as TFile[]; - const filesSortedByName = files.sort((a, b) => a.name.localeCompare(b.name)); + const filesSortedByName = sortFilesByName(files); return filesSortedByName; }; + +const sortFilesByName = (files: TFile[]) => { + return files.sort((a, b) => a.name.localeCompare(b.name)); +};