Skip to content

Commit e830a43

Browse files
committed
test: Enhance localization handling in devices screen tests with a fake gettext delegate
1 parent 0dc5369 commit e830a43

3 files changed

Lines changed: 41 additions & 5 deletions

File tree

client/test/core/services/scene_manager_impl_test.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ import 'package:sembast/sembast_memory.dart';
77
import '../../mocks/mocks.dart';
88

99
void main() {
10+
// some tests in this file access asset bundles via ServicesBinding; ensure
11+
// the binding is initialized before any code runs.
12+
TestWidgetsFlutterBinding.ensureInitialized();
13+
1014
group('SceneManagerImpl', () {
1115
late SceneManagerImpl manager;
1216
late EventBus bus;

client/test/features/devices/devices_screen_test.dart

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,27 @@ import 'package:borneo_app/features/devices/view_models/grouped_devices_view_mod
33
import 'package:borneo_app/core/models/scene_entity.dart';
44
import 'package:borneo_app/core/models/events.dart';
55
import 'package:flutter/material.dart';
6+
import 'package:flutter_gettext/flutter_gettext/gettext_localizations.dart';
67
import '../../mocks/mocks.dart';
78
import 'package:event_bus/event_bus.dart';
89
import 'package:flutter_test/flutter_test.dart' hide EventDispatcher;
910
import 'package:provider/provider.dart';
1011

12+
// A simple delegate that always returns [FakeGettext] so widgets
13+
// calling `GettextLocalizations.of(context)` don't crash.
14+
class _FakeGettextDelegate extends LocalizationsDelegate<GettextLocalizations> {
15+
const _FakeGettextDelegate();
16+
17+
@override
18+
bool isSupported(Locale locale) => true;
19+
20+
@override
21+
Future<GettextLocalizations> load(Locale locale) async => FakeGettext();
22+
23+
@override
24+
bool shouldReload(covariant LocalizationsDelegate<GettextLocalizations> old) => false;
25+
}
26+
1127
void main() {
1228
testWidgets('AppBar title updates when scene name changes', (WidgetTester tester) async {
1329
final bus = EventBus();
@@ -27,18 +43,22 @@ void main() {
2743

2844
await tester.pumpWidget(
2945
MaterialApp(
46+
localizationsDelegates: const [_FakeGettextDelegate()],
47+
supportedLocales: const [Locale('en', 'US')],
3048
home: ChangeNotifierProvider<GroupedDevicesViewModel>.value(value: vm, child: DevicesScreen()),
3149
),
3250
);
51+
// give the framework a chance to lay out slivers, etc.
52+
await tester.pumpAndSettle();
3353

34-
// initial title should reflect "Initial"
35-
expect(find.textContaining('Initial'), findsOneWidget);
54+
// initial title should reflect the scene name via the translation string
55+
expect(find.textContaining('Devices in Initial'), findsOneWidget);
3656

3757
// modify scene name and fire event
3858
sceneMgr.currentScene = scene.copyWith(name: 'Updated');
3959
bus.fire(SceneUpdatedEvent(sceneMgr.currentScene));
40-
await tester.pump();
60+
await tester.pumpAndSettle();
4161

42-
expect(find.textContaining('Updated'), findsOneWidget);
62+
expect(find.textContaining('Devices in Updated'), findsOneWidget);
4363
});
4464
}

client/test/mocks/gettext.dart

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,17 @@ class FakeGettext implements GettextLocalizations {
1010
String msgctxt = '',
1111
Map<String, Object>? nArgs,
1212
List<Object>? pArgs,
13-
}) => key;
13+
}) {
14+
if (nArgs != null && nArgs.isNotEmpty) {
15+
nArgs.forEach((name, value) {
16+
key = key.replaceAll('{$name}', value.toString());
17+
});
18+
}
19+
if (pArgs != null && pArgs.isNotEmpty) {
20+
for (var i = 0; i < pArgs.length; i++) {
21+
key = key.replaceAll('{$i}', pArgs[i].toString());
22+
}
23+
}
24+
return key;
25+
}
1426
}

0 commit comments

Comments
 (0)