import 'package:flowy_infra/colorscheme/colorscheme.dart'; import 'package:flowy_infra/plugins/service/location_service.dart'; import 'package:flowy_infra/plugins/service/models/flowy_dynamic_plugin.dart'; import 'package:flowy_infra/plugins/service/plugin_service.dart'; import 'package:flowy_infra/theme.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; class MockPluginService implements FlowyPluginService { @override Future addPlugin(FlowyDynamicPlugin plugin) => throw UnimplementedError(); @override Future lookup({required String name}) => throw UnimplementedError(); @override Future get plugins async => const Iterable.empty(); @override void setLocation(PluginLocationService locationService) => throw UnimplementedError(); } void main() { WidgetsFlutterBinding.ensureInitialized(); group('AppTheme', () { test('fallback theme', () { const theme = AppTheme.fallback; expect(theme.builtIn, true); expect(theme.themeName, BuiltInTheme.defaultTheme); expect(theme.lightTheme, isA()); expect(theme.darkTheme, isA()); }); test('built-in themes', () { final themes = AppTheme.builtins; expect(themes, isNotEmpty); for (final theme in themes) { expect(theme.builtIn, true); expect( theme.themeName, anyOf([ BuiltInTheme.defaultTheme, BuiltInTheme.dandelion, BuiltInTheme.lavender, ]), ); expect(theme.lightTheme, isA()); expect(theme.darkTheme, isA()); } }); test('fromName returns existing theme', () async { final theme = await AppTheme.fromName( BuiltInTheme.defaultTheme, pluginService: MockPluginService(), ); expect(theme, isNotNull); expect(theme.builtIn, true); expect(theme.themeName, BuiltInTheme.defaultTheme); expect(theme.lightTheme, isA()); expect(theme.darkTheme, isA()); }); test('fromName throws error for non-existent theme', () async { expect( () async => await AppTheme.fromName( 'bogus', pluginService: MockPluginService(), ), throwsArgumentError, ); }); }); }