main
dart 58 lines 1.99 KB
Raw
1 import 'package:flutter_riverpod/flutter_riverpod.dart';
2 import 'package:flutter_test/flutter_test.dart';
3 import 'package:localmind/core/providers/storage_providers.dart';
4 import 'package:localmind/features/models/providers/model_metadata_providers.dart';
5 import 'package:shared_preferences/shared_preferences.dart';
6
7 void main() {
8 group('ModelMetadataNotifier (Issue #50)', () {
9 test('loads metadata for server and toggles favorite', () async {
10 SharedPreferences.setMockInitialValues({});
11 final prefs = await SharedPreferences.getInstance();
12
13 final container = ProviderContainer(
14 overrides: [sharedPreferencesProvider.overrideWithValue(prefs)],
15 );
16 addTearDown(container.dispose);
17
18 final notifier = container.read(modelMetadataProvider.notifier);
19 notifier.loadForServer('server-1');
20
21 expect(container.read(modelMetadataProvider), isEmpty);
22
23 await notifier.toggleFavorite('model-1');
24 expect(
25 container.read(modelMetadataProvider)['model-1']?.isFavorite,
26 isTrue,
27 );
28
29 await notifier.setNote('model-1', 'My favorite model');
30 expect(
31 container.read(modelMetadataProvider)['model-1']?.note,
32 'My favorite model',
33 );
34 });
35
36 test(
37 'does not throw or access disposed Ref when disposed during async write',
38 () async {
39 SharedPreferences.setMockInitialValues({});
40 final prefs = await SharedPreferences.getInstance();
41
42 final container = ProviderContainer(
43 overrides: [sharedPreferencesProvider.overrideWithValue(prefs)],
44 );
45
46 final notifier = container.read(modelMetadataProvider.notifier);
47 notifier.loadForServer('server-1');
48
49 // Start async toggleFavorite and dispose container immediately
50 final future = notifier.toggleFavorite('model-1');
51 container.dispose();
52
53 // Completing without throwing StateError confirms ref.mounted guard works
54 await expectLater(future, completes);
55 },
56 );
57 });
58 }