chain-studio-flow-editor/test/fix_dialog_test.dart
flemming-it 5c5ec4f990 test(editor): cover quick-fix exposure + driver approval contract
Two new test files:

  - fix_dialog_test.dart — surface tests for the controller API
    the new Fix dialog reads: fixesFor() returns the analyzer-
    attached list, analyzerErrorCount tracks errors, and the
    English AnalyzerStrings produce the labels the dialog
    renders ('Install <cap>', 'Add source for <cap>…', etc).
  - inline_approval_test.dart — covers the FlowRunDriver
    approval hooks added in 0.21.0. Validates the default
    stubs throw UnsupportedError (so legacy hosts surface in
    CI rather than at runtime) and that a fake driver
    implementation can drive the happy + reject paths.

44 editor tests green.

Signed-off-by: flemming-it <sf@flemming.it>
2026-06-09 09:32:13 +02:00

67 lines
2.4 KiB
Dart

// Surface-level tests for the diagnostic-strip Fix dialog
// support. The dialog itself is a private widget; this file
// exercises the controller-side API the dialog reads (issues,
// fixesFor, analyzerErrorCount, AnalyzerStrings) so a future
// regression on the data flow surfaces in CI.
import 'package:fai_studio_flow_editor/src/flow_yaml_controller.dart';
import 'package:fai_studio_flow_editor/src/l10n.dart';
import 'package:fai_studio_flow_editor/src/quick_fix.dart';
import 'package:flutter_code_editor/flutter_code_editor.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('FlowYamlCodeController quick-fix exposure', () {
test('fixesFor returns the analyzer-attached list', () async {
final c = FlowYamlCodeController(
availableCapabilities: () => const <String>['debug.echo'],
storeCapabilities: () => const <String>['text.classify'],
);
addTearDown(c.dispose);
c.fullText = '''
name: hello
steps:
- id: c
use: text.classify@^1
''';
// Wait for the analyzer's debounce.
await Future.delayed(const Duration(milliseconds: 700));
final issues = c.analysisResult.issues;
expect(
issues,
isNotEmpty,
reason: 'analyzer should flag the unknown capability',
);
final fixes = c.fixesFor(issues.first);
expect(fixes, hasLength(1));
expect(fixes.first, isA<InstallCapabilityFix>());
});
test('analyzerErrorCount tracks error severity', () async {
final c = FlowYamlCodeController(
availableCapabilities: () => const <String>['debug.echo'],
);
addTearDown(c.dispose);
expect(c.analysisResult.issues, isEmpty);
c.fullText = '''
steps:
- id: x
use: nope@^1
''';
await Future.delayed(const Duration(milliseconds: 700));
final errors = c.analysisResult.issues
.where((i) => i.type == IssueType.error)
.length;
expect(errors, greaterThan(0));
});
test('AnalyzerStrings.english produces the expected fix labels', () {
final strings = AnalyzerStrings.english;
expect(strings.fixInstallCap('text.echo'), 'Install text.echo');
expect(strings.fixAddSource('text.echo'), 'Add source for text.echo…');
expect(strings.fixChangeTo('bytes'), 'Change to "bytes"');
expect(strings.fixUseInstead('text.echo@^0.1'),
'Use "text.echo@^0.1"');
});
});
}