Improve script execution in the desktop app by introducing timestamped filenames and detailed logging. These changes aim to facilitate easier debugging, auditing and overall better user experience. Key changes: - Add timestamps in filenames for temporary files to aid in troubleshooting and auditing. - Add application logging throughout the script execution process to enhance troubleshooting capabilities. Other supporting changes: - Refactor `TemporaryFileCodeRunner` with subfunctions for improved readability, maintenance, reusability and extensibility. - Refactor unit tests for `TemporaryFileCodeRunner` for improved granularity and simplicity. - Create centralized definition of supported operating systems by privacy.sexy to ensure robust and consistent test case creation. - Simplify the `runCode` method by removing the file extension parameter; now handled internally by `FileNameGenerator`.
50 lines
1.5 KiB
TypeScript
50 lines
1.5 KiB
TypeScript
import { LocationOps } from '@/infrastructure/CodeRunner/SystemOperations/SystemOperations';
|
|
import { StubWithObservableMethodCalls } from './StubWithObservableMethodCalls';
|
|
|
|
export class LocationOpsStub
|
|
extends StubWithObservableMethodCalls<LocationOps>
|
|
implements LocationOps {
|
|
private sequence = new Array<string>();
|
|
|
|
private scenarios = new Map<string, string>();
|
|
|
|
private defaultSeparator = `/[${LocationOpsStub.name}]PATH-SEGMENT-SEPARATOR/`;
|
|
|
|
public withJoinResult(returnValue: string, ...paths: string[]): this {
|
|
this.scenarios.set(LocationOpsStub.getScenarioKey(paths), returnValue);
|
|
return this;
|
|
}
|
|
|
|
public withJoinResultSequence(...valuesToReturn: string[]): this {
|
|
this.sequence.push(...valuesToReturn);
|
|
this.sequence.reverse();
|
|
return this;
|
|
}
|
|
|
|
public withDefaultSeparator(defaultSeparator: string): this {
|
|
this.defaultSeparator = defaultSeparator;
|
|
return this;
|
|
}
|
|
|
|
public combinePaths(...pathSegments: string[]): string {
|
|
this.registerMethodCall({
|
|
methodName: 'combinePaths',
|
|
args: pathSegments,
|
|
});
|
|
const nextInSequence = this.sequence.pop();
|
|
if (nextInSequence) {
|
|
return nextInSequence;
|
|
}
|
|
const key = LocationOpsStub.getScenarioKey(pathSegments);
|
|
const foundScenario = this.scenarios.get(key);
|
|
if (foundScenario) {
|
|
return foundScenario;
|
|
}
|
|
return pathSegments.join(this.defaultSeparator);
|
|
}
|
|
|
|
private static getScenarioKey(paths: string[]): string {
|
|
return paths.join('|');
|
|
}
|
|
}
|