implemented connectivity debouncing and refetch throttling for loadable state UI components

This commit is contained in:
2026-08-01 18:16:22 +02:00
parent 32be67426c
commit 2d690736e3
7 changed files with 194 additions and 28 deletions
@@ -0,0 +1,107 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:marianum_mobile/state/app/infrastructure/loadable_state/loadable_state_indicators.dart';
void main() {
group('shouldShowOfflineBar', () {
test('shows when offline with cache and not loading', () {
expect(
shouldShowOfflineBar(
hasContent: true,
loading: false,
connectivityKnown: true,
connected: false,
),
isTrue,
);
});
test('is suppressed while loading even if offline with cache', () {
expect(
shouldShowOfflineBar(
hasContent: true,
loading: true,
connectivityKnown: true,
connected: false,
),
isFalse,
);
});
test('is hidden without cached content', () {
expect(
shouldShowOfflineBar(
hasContent: false,
loading: false,
connectivityKnown: true,
connected: false,
),
isFalse,
);
});
test('is hidden while connectivity is unknown', () {
expect(
shouldShowOfflineBar(
hasContent: true,
loading: false,
connectivityKnown: false,
connected: false,
),
isFalse,
);
});
test('is hidden when connected', () {
expect(
shouldShowOfflineBar(
hasContent: true,
loading: false,
connectivityKnown: true,
connected: true,
),
isFalse,
);
});
});
group('shouldRefetch', () {
final window = const Duration(seconds: 10);
final base = DateTime(2026, 1, 1, 12, 0, 0);
test('is false within the throttle window', () {
expect(
shouldRefetch(
base,
base.add(const Duration(seconds: 9)),
window,
hasReFetch: true,
),
isFalse,
);
});
test('is true once the window has elapsed', () {
expect(
shouldRefetch(
base,
base.add(const Duration(seconds: 10)),
window,
hasReFetch: true,
),
isTrue,
);
});
test('is false without a refetch callback', () {
expect(
shouldRefetch(
base,
base.add(const Duration(minutes: 5)),
window,
hasReFetch: false,
),
isFalse,
);
});
});
}