Improve script error dialogs #304

- Include the script's directory path #304.
- Exclude Windows-specific instructions on non-Windows OS.
- Standardize language across dialogs for consistency.

Other supporting changes:

- Add script diagnostics data collection from main process.
- Document script file storage and execution tamper protection in
  SECURITY.md.
- Remove redundant comment in `NodeReadbackFileWriter`.
- Centralize error display for uniformity and simplicity.
- Simpify `WindowVariablesValidator` to omit checks when not on the
  renderer process.
- Improve and centralize Electron environment detection.
- Use more emphatic language (don't worry) in error messages.
This commit is contained in:
undergroundwires
2024-01-17 23:59:05 +01:00
parent f03fc24098
commit 6ada8d425c
34 changed files with 1182 additions and 450 deletions

View File

@@ -0,0 +1,65 @@
import { describe, it, expect } from 'vitest';
import { ScriptDirectoryProvider } from '@/infrastructure/CodeRunner/Creation/Directory/ScriptDirectoryProvider';
import { RuntimeEnvironment } from '@/infrastructure/RuntimeEnvironment/RuntimeEnvironment';
import { ScriptEnvironmentDiagnosticsCollector } from '@/infrastructure/ScriptDiagnostics/ScriptEnvironmentDiagnosticsCollector';
import { RuntimeEnvironmentStub } from '@tests/unit/shared/Stubs/RuntimeEnvironmentStub';
import { ScriptDirectoryProviderStub } from '@tests/unit/shared/Stubs/ScriptDirectoryProviderStub';
import { OperatingSystem } from '@/domain/OperatingSystem';
describe('ScriptEnvironmentDiagnosticsCollector', () => {
it('collects operating system path correctly', async () => {
// arrange
const expectedOperatingSystem = OperatingSystem.KaiOS;
const environment = new RuntimeEnvironmentStub()
.withOs(expectedOperatingSystem);
const collector = new CollectorBuilder()
.withEnvironment(environment)
.build();
// act
const diagnosticData = await collector.collectDiagnosticInformation();
// assert
const actualOperatingSystem = diagnosticData.currentOperatingSystem;
expect(actualOperatingSystem).to.equal(expectedOperatingSystem);
});
it('collects path correctly', async () => {
// arrange
const expectedScriptsPath = '/expected/scripts/path';
const directoryProvider = new ScriptDirectoryProviderStub()
.withDirectoryPath(expectedScriptsPath);
const collector = new CollectorBuilder()
.withScriptDirectoryProvider(directoryProvider)
.build();
// act
const diagnosticData = await collector.collectDiagnosticInformation();
// assert
const actualScriptsPath = diagnosticData.scriptsDirectoryAbsolutePath;
expect(actualScriptsPath).to.equal(expectedScriptsPath);
});
});
class CollectorBuilder {
private directoryProvider: ScriptDirectoryProvider = new ScriptDirectoryProviderStub();
private environment: RuntimeEnvironment = new RuntimeEnvironmentStub();
public withEnvironment(environment: RuntimeEnvironment): this {
this.environment = environment;
return this;
}
public withScriptDirectoryProvider(directoryProvider: ScriptDirectoryProvider): this {
this.directoryProvider = directoryProvider;
return this;
}
public build() {
return new ScriptEnvironmentDiagnosticsCollector(
this.directoryProvider,
this.environment,
);
}
}