test(services): increase code coverage for file.services

This commit is contained in:
Oleg 2022-09-05 17:01:48 +03:00
parent 863e430134
commit 93edeb6f86
6 changed files with 118 additions and 50 deletions

13
main.ts
View File

@ -1,10 +1,4 @@
import { import { App, Plugin, PluginSettingTab, Setting, TFile } from 'obsidian';
App,
Plugin,
PluginSettingTab,
Setting,
TAbstractFile,
} from 'obsidian';
import { FolderSuggest } from './src/suggestions/folderSuggest'; import { FolderSuggest } from './src/suggestions/folderSuggest';
import { renderDonateButton } from './src/components/DonateButton'; import { renderDonateButton } from './src/components/DonateButton';
@ -18,7 +12,7 @@ import { renderPreviewFiles } from './src/components/RenderPreviewFiles';
interface BulkRenamePluginSettings { interface BulkRenamePluginSettings {
folderName: string; folderName: string;
fileNames: TAbstractFile[]; fileNames: TFile[];
existingSymbol: string; existingSymbol: string;
replacePattern: string; replacePattern: string;
tags: string[]; tags: string[];
@ -205,7 +199,6 @@ export class BulkRenameSettingsTab extends PluginSettingTab {
.setName('Existing Characters') .setName('Existing Characters')
.setDesc(desc); .setDesc(desc);
// if (!isViewTypeTags(this.plugin)) {
newSettings.addText((textComponent) => { newSettings.addText((textComponent) => {
textComponent.setValue(settings.existingSymbol); textComponent.setValue(settings.existingSymbol);
textComponent.setPlaceholder('existing symbols'); textComponent.setPlaceholder('existing symbols');
@ -214,7 +207,7 @@ export class BulkRenameSettingsTab extends PluginSettingTab {
this.plugin.saveSettings(); this.plugin.saveSettings();
}); });
}); });
// }
newSettings.addText((textComponent) => { newSettings.addText((textComponent) => {
const previewLabel = createPreviewElement('Replacement symbols'); const previewLabel = createPreviewElement('Replacement symbols');
textComponent.inputEl.insertAdjacentElement('beforebegin', previewLabel); textComponent.inputEl.insertAdjacentElement('beforebegin', previewLabel);

View File

@ -1,10 +1,9 @@
import { import {
getFilesNamesInDirectory, getFilesNamesInDirectory,
getRenderedFileNamesReplaced, getRenderedFileNamesReplaced,
syncScrolls,
} from '../services/file.service'; } from '../services/file.service';
import { createPreviewElement } from './PreviewElement'; import { createPreviewElement } from './PreviewElement';
import BulkRenamePlugin, { BulkRenameSettingsTab } from '../../main'; import BulkRenamePlugin, { BulkRenameSettingsTab, State } from '../../main';
export const renderPreviewFiles = ( export const renderPreviewFiles = (
setting: BulkRenameSettingsTab['filesAndPreview'], setting: BulkRenameSettingsTab['filesAndPreview'],
@ -43,3 +42,24 @@ export const renderPreviewFiles = (
syncScrolls(existingFilesTextArea, replacedPreviewTextArea, state); 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;
}
});
};

View File

@ -1,5 +1,5 @@
import { App, Notice, TFile } from 'obsidian'; import { App, Notice, TFile } from 'obsidian';
import BulkRenamePlugin, { State } from '../../main'; import BulkRenamePlugin from '../../main';
export const getFilesNamesInDirectory = (plugin: BulkRenamePlugin) => { export const getFilesNamesInDirectory = (plugin: BulkRenamePlugin) => {
const { fileNames } = plugin.settings; const { fileNames } = plugin.settings;
@ -26,7 +26,7 @@ export const getRenderedFileNamesReplaced = (plugin: BulkRenamePlugin) => {
return getFilesAsString(newFiles); return getFilesAsString(newFiles);
}; };
const selectFilenamesWithReplacedPath = (plugin: BulkRenamePlugin) => { export const selectFilenamesWithReplacedPath = (plugin: BulkRenamePlugin) => {
const { fileNames } = plugin.settings; const { fileNames } = plugin.settings;
return fileNames.map((file) => { 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 pathWithoutExtension = file.path.split('.').slice(0, -1).join('.');
const newPath = pathWithoutExtension?.replaceAll( const convertedToRegExpString = escapeRegExp(existingSymbol);
existingSymbol,
replacePattern, const regExpSymbol = new RegExp(convertedToRegExpString, 'g');
);
const newPath = pathWithoutExtension?.replace(regExpSymbol, replacePattern);
return `${newPath}.${file.extension}`; return `${newPath}.${file.extension}`;
}; };
@ -61,11 +62,6 @@ export const renameFilesInObsidian = async (
return; return;
} }
// if (replacePattern === existingSymbol) {
// new Notice("Replace Pattern shouldn't much Existing Symbol");
// return;
// }
if (!fileNames.length) { if (!fileNames.length) {
new Notice('Please check your results before rename!'); new Notice('Please check your results before rename!');
return; return;
@ -81,23 +77,9 @@ export const renameFilesInObsidian = async (
new Notice('successfully renamed all files'); new Notice('successfully renamed all files');
}; };
export const syncScrolls = ( let reRegExpChar = /[\\^$.*+?()[\]{}]/g,
existingFilesArea: HTMLTextAreaElement, reHasRegExpChar = RegExp(reRegExpChar.source);
previewArea: HTMLTextAreaElement,
state: State, export function escapeRegExp(s: string) {
) => { return s && reHasRegExpChar.test(s) ? s.replace(reRegExpChar, '\\$&') : s;
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;
}
});
};

View File

@ -1,6 +1,9 @@
import { TFile } from 'obsidian'; import { TFile } from 'obsidian';
import { replaceFilePath } from './file.service'; import {
replaceFilePath,
selectFilenamesWithReplacedPath,
} from './file.service';
import BulkRenamePlugin from '../../main'; import BulkRenamePlugin from '../../main';
describe('File Services', () => { describe('File Services', () => {
@ -79,5 +82,66 @@ describe('File Services', () => {
expect(result).toEqual(expectedResult); 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);
});
});
}); });
}); });

View File

@ -0,0 +1,5 @@
describe('obsidian.service', () => {
describe('getObsidianFilesWithTagName', () => {
it.todo('should find files by tag');
});
});

View File

@ -8,11 +8,11 @@ export const getObsidianFilesByFolderName = (
const { folderName } = plugin.settings; const { folderName } = plugin.settings;
const abstractFiles = app.vault.getAllLoadedFiles(); const abstractFiles = app.vault.getAllLoadedFiles();
const files = abstractFiles.filter((file) => { const files = abstractFiles.filter(
return file instanceof TFile && file.parent.name.includes(folderName); (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; return filesSortedByName;
}; };
@ -43,9 +43,13 @@ export const getObsidianFilesWithTagName = (
} }
return file; return file;
}); }) as TFile[];
const filesSortedByName = files.sort((a, b) => a.name.localeCompare(b.name)); const filesSortedByName = sortFilesByName(files);
return filesSortedByName; return filesSortedByName;
}; };
const sortFilesByName = (files: TFile[]) => {
return files.sort((a, b) => a.name.localeCompare(b.name));
};