Files
Client/test/state/app_modules_order_test.dart
T

96 lines
3.2 KiB
Dart

import 'package:flutter_test/flutter_test.dart';
import 'package:marianum_mobile/state/app/modules/app_modules.dart';
import 'package:marianum_mobile/storage/modules_settings.dart';
void main() {
ModulesSettings settingsWith(List<Modules> order) =>
ModulesSettings(moduleOrder: order, hiddenModules: []);
group('effectiveModuleOrder', () {
test('inserts modules missing from a stale persisted order at their '
'default position', () {
// Regression: persisted settings from before the ticker module existed
// repeatedly made new modules vanish from bar, "Mehr" and settings list.
final stale = Modules.values
.where((m) => m != Modules.ticker)
.toList();
final effective = AppModule.effectiveModuleOrder(settingsWith(stale));
expect(effective, Modules.values);
});
test('inserts a missing module after its closest present predecessor', () {
final custom = [
Modules.files,
Modules.timetable,
Modules.talk,
Modules.marianumMessage,
];
final effective = AppModule.effectiveModuleOrder(settingsWith(custom));
expect(
effective.indexOf(Modules.ticker),
effective.indexOf(Modules.timetable) + 1,
);
expect(effective.toSet(), Modules.values.toSet());
});
test('keeps a complete persisted order untouched', () {
final order = Modules.values.reversed.toList();
expect(AppModule.effectiveModuleOrder(settingsWith(order)), order);
});
test('drops duplicates while preserving first occurrence', () {
final order = [Modules.talk, Modules.timetable, Modules.talk];
final effective = AppModule.effectiveModuleOrder(settingsWith(order));
expect(effective.where((m) => m == Modules.talk), hasLength(1));
expect(effective.first, Modules.talk);
expect(effective.toSet(), Modules.values.toSet());
});
});
group('reorderModuleOrder', () {
test('moves within the displayed subset', () {
final effective = AppModule.effectiveModuleOrder(settingsWith([]));
final result = AppModule.reorderModuleOrder(
displayed: effective,
effective: effective,
oldIndex: 0,
newIndex: 2,
);
expect(result[2], effective[0]);
expect(result.toSet(), effective.toSet());
});
test('non-displayed modules keep their slots', () {
// Ticker is capability-filtered from the settings list; a reorder of the
// visible modules must not move or drop it (previously the raw persisted
// indices were used, moving the wrong module).
final effective = AppModule.effectiveModuleOrder(settingsWith([]));
final displayed = effective
.where((m) => m != Modules.ticker)
.toList();
final tickerSlot = effective.indexOf(Modules.ticker);
final result = AppModule.reorderModuleOrder(
displayed: displayed,
effective: effective,
oldIndex: 0,
newIndex: displayed.length - 1,
);
expect(result[tickerSlot], Modules.ticker);
expect(result.toSet(), effective.toSet());
expect(
result.where((m) => m != Modules.ticker).toList(),
displayed.sublist(1)..add(displayed.first),
);
});
});
}