UNPKG

scriptable-testlab

Version:

A lightweight, efficient tool designed to manage and update scripts for Scriptable.

152 lines (126 loc) 3.49 kB
import {AbsDocumentPicker} from 'scriptable-abstract'; import {MockFileManager} from './filemanager'; interface DocumentPickerState { selectedFiles: string[]; exportedFiles: string[]; lastExportedFile: string | null; } const _DEFAULT_STATE: DocumentPickerState = { selectedFiles: [], exportedFiles: [], lastExportedFile: null, }; /** * Mock implementation of Scriptable's DocumentPicker global variable * @implements DocumentPicker */ export class MockDocumentPicker extends AbsDocumentPicker<DocumentPickerState> { private fileManager = MockFileManager.local(); static get instance(): MockDocumentPicker { return super.instance as MockDocumentPicker; } constructor() { super({ selectedFiles: [], exportedFiles: [], lastExportedFile: null, }); } /** * @inheritdoc */ async open(): Promise<string[]> { return this.state.selectedFiles; } /** * @inheritdoc */ async openFile(): Promise<string> { const files = await this.open(); if (files.length === 0) { throw new Error('No file selected'); } return files[0]; } /** * @inheritdoc */ async export(filePath: string): Promise<string[]> { if (!this.fileManager.fileExists(filePath)) { throw new Error('File does not exist'); } this.setState(state => ({ exportedFiles: [...state.exportedFiles, filePath], lastExportedFile: filePath, })); return [filePath]; } /** * @inheritdoc */ async exportString(content: string, name?: string): Promise<string[]> { const filename = name ?? 'document.txt'; const filePath = this.fileManager.joinPath(this.fileManager.documentsDirectory(), filename); // Create parent directory if it doesn't exist const parentDir = filePath.split('/').slice(0, -1).join('/'); if (!this.fileManager.isDirectory(parentDir)) { this.fileManager.createDirectory(parentDir, true); } this.fileManager.writeString(filePath, content); this.setState(state => ({ exportedFiles: [...state.exportedFiles, filePath], lastExportedFile: filePath, })); return [filePath]; } /** * @inheritdoc */ async exportData(data: Data, name?: string): Promise<string[]> { const filename = name ?? 'document.bin'; const filePath = this.fileManager.joinPath(this.fileManager.documentsDirectory(), filename); // Create parent directory if it doesn't exist const parentDir = filePath.split('/').slice(0, -1).join('/'); if (!this.fileManager.isDirectory(parentDir)) { this.fileManager.createDirectory(parentDir, true); } this.fileManager.write(filePath, data); this.setState(state => ({ exportedFiles: [...state.exportedFiles, filePath], lastExportedFile: filePath, })); return [filePath]; } /** * @additional * Mock file selection for testing */ mockSelectFiles(files: string[]): void { this.setState({selectedFiles: [...files]}); } /** * @additional * Get list of exported files */ getExportedFiles(): string[] { return [...this.state.exportedFiles]; } /** * @additional * Get last exported file */ getLastExportedFile(): string | null { return this.state.lastExportedFile; } /** * @additional * Clear all selected and exported files */ clear(): void { this.setState({ selectedFiles: [], exportedFiles: [], lastExportedFile: null, }); } }