mirror of
https://github.com/lollipopkit/flutter_server_box.git
synced 2025-12-17 07:14:28 +01:00
fix: macOS ssh term unusable (#838)
This commit is contained in:
186
test/script_builder_test.dart
Normal file
186
test/script_builder_test.dart
Normal file
@@ -0,0 +1,186 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:server_box/data/model/app/scripts/script_builders.dart';
|
||||
import 'package:server_box/data/model/app/scripts/script_consts.dart';
|
||||
import 'package:server_box/data/model/app/scripts/shell_func.dart';
|
||||
import 'package:server_box/data/model/server/system.dart';
|
||||
|
||||
void main() {
|
||||
group('Script Builder Integration Tests', () {
|
||||
test('script generation produces valid output for all platforms', () {
|
||||
for (final builder in ScriptBuilderFactory.getAllBuilders()) {
|
||||
final script = builder.buildScript(null);
|
||||
|
||||
// Basic validation
|
||||
expect(script, isNotEmpty, reason: 'Script should not be empty for ${builder.runtimeType}');
|
||||
|
||||
// Should contain all required functions
|
||||
for (final func in ShellFunc.values) {
|
||||
expect(script, contains(func.name), reason: 'Script should contain function ${func.name}');
|
||||
}
|
||||
|
||||
// Should contain proper headers
|
||||
expect(script, contains(builder.scriptHeader), reason: 'Script should contain proper header');
|
||||
|
||||
// Should be well-formed
|
||||
if (builder is WindowsScriptBuilder) {
|
||||
expect(
|
||||
script,
|
||||
contains('switch (\$args[0])'),
|
||||
reason: 'Windows script should contain switch statement',
|
||||
);
|
||||
expect(
|
||||
script,
|
||||
contains('PowerShell script for ServerBox'),
|
||||
reason: 'Windows script should have PowerShell header',
|
||||
);
|
||||
} else if (builder is UnixScriptBuilder) {
|
||||
expect(script, contains('#!/bin/sh'), reason: 'Unix script should have shebang');
|
||||
expect(script, contains('case \$1 in'), reason: 'Unix script should contain case statement');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
test('script generation with custom commands works correctly', () {
|
||||
final customCmds = {'custom_test': 'echo "Custom test command"', 'another_cmd': 'whoami'};
|
||||
|
||||
for (final builder in ScriptBuilderFactory.getAllBuilders()) {
|
||||
final script = builder.buildScript(customCmds);
|
||||
|
||||
expect(script, isNotEmpty);
|
||||
|
||||
// Custom commands should only be included in status function for both platforms
|
||||
if (builder is UnixScriptBuilder) {
|
||||
expect(script, contains('echo "Custom test command"'));
|
||||
expect(script, contains('whoami'));
|
||||
}
|
||||
|
||||
// Windows builder should include custom commands in SbStatus function
|
||||
if (builder is WindowsScriptBuilder) {
|
||||
expect(script, contains('echo "Custom test command"'));
|
||||
expect(script, contains('whoami'));
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
test('script file names are correct for each platform', () {
|
||||
final windowsBuilder = ScriptBuilderFactory.getBuilder(true);
|
||||
final unixBuilder = ScriptBuilderFactory.getBuilder(false);
|
||||
|
||||
expect(windowsBuilder.scriptFileName, equals(ScriptConstants.scriptFileWindows));
|
||||
expect(windowsBuilder.scriptFileName, endsWith('.ps1'));
|
||||
|
||||
expect(unixBuilder.scriptFileName, equals(ScriptConstants.scriptFile));
|
||||
expect(unixBuilder.scriptFileName, endsWith('.sh'));
|
||||
});
|
||||
|
||||
test('install commands are generated correctly', () {
|
||||
const testDir = '/tmp/test';
|
||||
const testPath = '/tmp/test/script.sh';
|
||||
|
||||
final unixBuilder = ScriptBuilderFactory.getBuilder(false);
|
||||
final installCmd = unixBuilder.getInstallCommand(testDir, testPath);
|
||||
|
||||
expect(installCmd, contains('mkdir'));
|
||||
expect(installCmd, contains('chmod 755'));
|
||||
expect(installCmd, contains(testPath));
|
||||
|
||||
const testDirWindows = 'C:\\temp\\test';
|
||||
const testPathWindows = 'C:\\temp\\test\\script.ps1';
|
||||
|
||||
final windowsBuilder = ScriptBuilderFactory.getBuilder(true);
|
||||
final installCmdWindows = windowsBuilder.getInstallCommand(testDirWindows, testPathWindows);
|
||||
|
||||
expect(installCmdWindows, contains('New-Item'));
|
||||
expect(installCmdWindows, contains('Set-Content'));
|
||||
expect(installCmdWindows, contains(testPathWindows));
|
||||
});
|
||||
|
||||
test('exec commands are generated correctly for all platforms', () {
|
||||
const testPath = '/tmp/test/script.sh';
|
||||
const testPathWindows = 'C:\\temp\\test\\script.ps1';
|
||||
|
||||
final unixBuilder = ScriptBuilderFactory.getBuilder(false);
|
||||
final windowsBuilder = ScriptBuilderFactory.getBuilder(true);
|
||||
|
||||
for (final func in ShellFunc.values) {
|
||||
final unixExec = unixBuilder.getExecCommand(testPath, func);
|
||||
expect(unixExec, contains(testPath));
|
||||
expect(unixExec, contains(func.flag));
|
||||
|
||||
final windowsExec = windowsBuilder.getExecCommand(testPathWindows, func);
|
||||
expect(windowsExec, contains('powershell'));
|
||||
expect(windowsExec, contains('-ExecutionPolicy Bypass'));
|
||||
expect(windowsExec, contains(func.flag));
|
||||
}
|
||||
});
|
||||
|
||||
test('script headers contain proper metadata', () {
|
||||
final windowsBuilder = ScriptBuilderFactory.getBuilder(true);
|
||||
final unixBuilder = ScriptBuilderFactory.getBuilder(false);
|
||||
|
||||
expect(windowsBuilder.scriptHeader, contains('PowerShell script for ServerBox'));
|
||||
expect(windowsBuilder.scriptHeader, contains('DO NOT delete this file'));
|
||||
expect(windowsBuilder.scriptHeader, contains('\$ErrorActionPreference = "SilentlyContinue"'));
|
||||
|
||||
expect(unixBuilder.scriptHeader, contains('#!/bin/sh'));
|
||||
expect(unixBuilder.scriptHeader, contains('Script for ServerBox'));
|
||||
expect(unixBuilder.scriptHeader, contains('DO NOT delete this file'));
|
||||
expect(unixBuilder.scriptHeader, contains('export LANG=en_US.UTF-8'));
|
||||
});
|
||||
|
||||
test('command dividers are consistent', () {
|
||||
final windowsBuilder = ScriptBuilderFactory.getBuilder(true);
|
||||
final unixBuilder = ScriptBuilderFactory.getBuilder(false);
|
||||
|
||||
expect(windowsBuilder.cmdDivider, equals(ScriptConstants.cmdDivider));
|
||||
expect(unixBuilder.cmdDivider, equals(ScriptConstants.cmdDivider));
|
||||
expect(ScriptConstants.cmdDivider, contains(ScriptConstants.separator));
|
||||
});
|
||||
|
||||
test('scripts handle all system types properly', () {
|
||||
// Test that system type detection is properly handled
|
||||
final unixScript = ShellFuncManager.allScript(null, systemType: SystemType.linux);
|
||||
final bsdScript = ShellFuncManager.allScript(null, systemType: SystemType.bsd);
|
||||
final windowsScript = ShellFuncManager.allScript(null, systemType: SystemType.windows);
|
||||
|
||||
expect(unixScript, contains('#!/bin/sh'));
|
||||
expect(bsdScript, contains('#!/bin/sh')); // BSD uses same script as Linux
|
||||
expect(windowsScript, contains('PowerShell script'));
|
||||
|
||||
// Verify OS detection logic in Unix script
|
||||
expect(unixScript, contains('macSign='));
|
||||
expect(unixScript, contains('bsdSign='));
|
||||
expect(unixScript, contains('isBusybox='));
|
||||
});
|
||||
|
||||
test('error handling in script generation', () {
|
||||
// Test that script generation doesn't throw with edge cases
|
||||
expect(() => ShellFuncManager.allScript({}, systemType: SystemType.linux), returnsNormally);
|
||||
expect(() => ShellFuncManager.allScript(null, systemType: SystemType.windows), returnsNormally);
|
||||
|
||||
// Test with empty custom commands
|
||||
expect(() => ShellFuncManager.allScript({}, systemType: SystemType.bsd), returnsNormally);
|
||||
|
||||
// Test with null system type (should default to something)
|
||||
expect(() => ShellFuncManager.allScript(null), returnsNormally);
|
||||
});
|
||||
});
|
||||
|
||||
group('ScriptBuilderFactory Tests', () {
|
||||
test('factory returns correct builder types', () {
|
||||
final windowsBuilder = ScriptBuilderFactory.getBuilder(true);
|
||||
final unixBuilder = ScriptBuilderFactory.getBuilder(false);
|
||||
|
||||
expect(windowsBuilder, isA<WindowsScriptBuilder>());
|
||||
expect(unixBuilder, isA<UnixScriptBuilder>());
|
||||
});
|
||||
|
||||
test('getAllBuilders returns all available builders', () {
|
||||
final builders = ScriptBuilderFactory.getAllBuilders();
|
||||
|
||||
expect(builders, hasLength(2));
|
||||
expect(builders.any((b) => b is WindowsScriptBuilder), isTrue);
|
||||
expect(builders.any((b) => b is UnixScriptBuilder), isTrue);
|
||||
});
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user