- Split BuildIOS command into build_ios_archive and build_ios_build - Split Git command into git_branch, git_remote, git_revision, git_stash - Add cli_style.dart and printer.dart for consistent CLI output - Add macos_signing.dart for macOS/iOS code signing - Refactor pipeline system (pipeline, pipeline_condition, pipeline_contain, etc.) - Update tag_system, defined_data, pipeline_data - Update application and command files for new structure - Add tests for new command catalog and core functionality - Update README with new features
185 lines
4.3 KiB
Dart
185 lines
4.3 KiB
Dart
import 'dart:io';
|
|
|
|
import 'package:oto/cli/commands/command_exe.dart';
|
|
import 'package:oto/oto/application.dart';
|
|
import 'package:test/test.dart';
|
|
|
|
void main() {
|
|
setUp(() {
|
|
Application.instance.property = {};
|
|
Application.instance.commandStates = {};
|
|
Application.instance.dataCommandMap = {};
|
|
});
|
|
|
|
test('build returns failure instead of exiting on invalid yaml', () async {
|
|
const invalidYaml = '''
|
|
property:
|
|
workspace: .
|
|
commands:
|
|
- command: Print
|
|
id: hello
|
|
param:
|
|
message: hi
|
|
pipeline:
|
|
id: main
|
|
workflow:
|
|
- exe: doesNotExist
|
|
''';
|
|
|
|
final result = await Application.instance
|
|
.build(BuildType.file, yamlContent: invalidYaml);
|
|
|
|
expect(result.success, isFalse);
|
|
expect(result.exitCode, 10);
|
|
expect(result.error, isNotNull);
|
|
});
|
|
|
|
test('file build returns success for print-only pipeline', () async {
|
|
const yaml = '''
|
|
property:
|
|
workspace: .
|
|
commands:
|
|
- command: Print
|
|
id: hello
|
|
param:
|
|
message: hi
|
|
pipeline:
|
|
id: main
|
|
workflow:
|
|
- exe: hello
|
|
''';
|
|
|
|
final result =
|
|
await Application.instance.build(BuildType.file, yamlContent: yaml);
|
|
|
|
expect(result.success, isTrue);
|
|
expect(result.exitCode, 0);
|
|
});
|
|
|
|
test('file build can run twice in same process', () async {
|
|
const yaml = '''
|
|
property:
|
|
workspace: .
|
|
commands:
|
|
- command: Print
|
|
id: hello
|
|
param:
|
|
message: hi
|
|
pipeline:
|
|
id: main
|
|
workflow:
|
|
- exe: hello
|
|
''';
|
|
|
|
final first =
|
|
await Application.instance.build(BuildType.file, yamlContent: yaml);
|
|
final second =
|
|
await Application.instance.build(BuildType.file, yamlContent: yaml);
|
|
|
|
expect(first.success, isTrue);
|
|
expect(second.success, isTrue);
|
|
});
|
|
|
|
test('build fails with message when YAML root is not a map', () async {
|
|
const yaml = '''
|
|
- command: Print
|
|
id: hello
|
|
''';
|
|
final result =
|
|
await Application.instance.build(BuildType.file, yamlContent: yaml);
|
|
expect(result.success, isFalse);
|
|
expect(result.error.toString(), contains('Build YAML root must be a map'));
|
|
});
|
|
|
|
test('build fails with message when property is not a map', () async {
|
|
const yaml = '''
|
|
property:
|
|
- bad
|
|
commands:
|
|
- command: Print
|
|
id: hello
|
|
param:
|
|
message: hi
|
|
pipeline:
|
|
id: main
|
|
workflow:
|
|
- exe: hello
|
|
''';
|
|
final result =
|
|
await Application.instance.build(BuildType.file, yamlContent: yaml);
|
|
expect(result.success, isFalse);
|
|
expect(result.error.toString(), contains('Validate build yaml'));
|
|
});
|
|
|
|
test('build fails with message when command id is not a string', () async {
|
|
const yaml = '''
|
|
commands:
|
|
- command: Print
|
|
id: 123
|
|
param:
|
|
message: hi
|
|
pipeline:
|
|
id: main
|
|
workflow:
|
|
- exe: hello
|
|
''';
|
|
final result =
|
|
await Application.instance.build(BuildType.file, yamlContent: yaml);
|
|
expect(result.success, isFalse);
|
|
expect(result.error.toString(), contains('Validate command list'));
|
|
});
|
|
|
|
test('build fails with message when command type is not a string', () async {
|
|
const yaml = '''
|
|
commands:
|
|
- command: 999
|
|
id: hello
|
|
param:
|
|
message: hi
|
|
pipeline:
|
|
id: main
|
|
workflow:
|
|
- exe: hello
|
|
''';
|
|
final result =
|
|
await Application.instance.build(BuildType.file, yamlContent: yaml);
|
|
expect(result.success, isFalse);
|
|
expect(result.error.toString(), contains('Validate command list'));
|
|
});
|
|
|
|
test('build fails with validation message when workflow key is not a string',
|
|
() async {
|
|
const yaml = '''
|
|
commands:
|
|
- command: Print
|
|
id: hello
|
|
param:
|
|
message: hi
|
|
pipeline:
|
|
id: main
|
|
workflow:
|
|
- 123: hello
|
|
''';
|
|
final result =
|
|
await Application.instance.build(BuildType.file, yamlContent: yaml);
|
|
expect(result.success, isFalse);
|
|
expect(result.error.toString(),
|
|
isNot(contains('Converting object to an encodable object failed')));
|
|
expect(result.error.toString(), contains('workflow[0]'));
|
|
});
|
|
|
|
test('CommandExe exe -f handles missing file without LateInitializationError',
|
|
() async {
|
|
final missing =
|
|
'/tmp/oto_missing_${DateTime.now().microsecondsSinceEpoch}.yaml';
|
|
expect(File(missing).existsSync(), isFalse);
|
|
|
|
final command = CommandExe();
|
|
final priorExitCode = exitCode;
|
|
try {
|
|
await command.execute(['-f', missing]);
|
|
} finally {
|
|
exitCode = priorExitCode;
|
|
}
|
|
});
|
|
}
|