import 'package:flutter_test/flutter_test.dart'; import 'package:social_app/features/chat/data/tools/route_navigation_tool.dart'; import 'package:social_app/features/chat/data/tools/tool_registry.dart'; void main() { setUp(() { ToolRegistry.initialize(); }); tearDown(() { RouteNavigationTool.instance.clearNavigator(); }); group('getTool', () { test('returns tool definition for front.navigate_to_route', () { final tool = ToolRegistry.getTool('front.navigate_to_route'); expect(tool, isNotNull); expect(tool!.name, 'front.navigate_to_route'); expect(tool.description, isNotEmpty); }); test('returns null for unknown tool', () { expect(ToolRegistry.getTool('unknown_tool'), isNull); }); }); group('validateArgs', () { test('returns error for empty args (missing target)', () { final result = ToolRegistry.validateArgs('front.navigate_to_route', {}); expect(result.ok, false); expect(result.error, contains('target')); }); test('returns ok: true for valid args', () { final result = ToolRegistry.validateArgs('front.navigate_to_route', { 'target': '/settings', }); expect(result.ok, true); expect(result.error, isNull); }); test('returns error for unknown tool', () { final result = ToolRegistry.validateArgs('unknown_tool', {}); expect(result.ok, false); expect(result.error, contains('Tool not found')); }); }); group('execute', () { test('throws ToolNotFoundException for unknown tool', () async { expect( () => ToolRegistry.execute('unknown_tool', {}), throwsA(isA()), ); }); test('front.navigate_to_route rejects disallowed target', () async { final result = await ToolRegistry.execute('front.navigate_to_route', { 'target': '/admin', }); expect(result['ok'], false); expect(result['error'], contains('not allowed')); }); test( 'front.navigate_to_route executes allowed target when navigator is bound', () async { String? navigatedTo; bool replaced = false; RouteNavigationTool.instance.bindNavigator((target, {replace = false}) { navigatedTo = target; replaced = replace; }); final result = await ToolRegistry.execute('front.navigate_to_route', { 'target': '/settings', 'replace': true, }); expect(result['ok'], true); expect(navigatedTo, '/settings'); expect(replaced, true); }, ); }); group('getAllTools', () { test('returns list of tool definitions', () { final tools = ToolRegistry.getAllTools(); expect(tools, isNotEmpty); expect(tools.any((t) => t.name == 'front.navigate_to_route'), true); expect(tools.any((t) => t.name == 'create_calendar_event'), false); }); }); }