refactor(apps): 主题系统迁移至 ColorScheme + 扩展架构并支持 Dark Mode
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:social_app/data/cache/hybrid_cache_store.dart';
|
||||
import 'package:social_app/data/cache/memory_cache_store.dart';
|
||||
import 'package:social_app/data/models/user_profile.dart';
|
||||
import 'package:social_app/data/cache/persistent_cache_store.dart';
|
||||
import 'package:social_app/features/settings/data/services/user_profile_cache_repository.dart';
|
||||
|
||||
void main() {
|
||||
group('UserProfileCacheRepository', () {
|
||||
test('keeps in-memory snapshot and invalidates correctly', () async {
|
||||
var remoteCalls = 0;
|
||||
final repository = UserProfileCacheRepository(
|
||||
store: HybridCacheStore(
|
||||
memory: MemoryCacheStore(),
|
||||
persistent: PersistentCacheStore(),
|
||||
),
|
||||
remoteLoader: () async {
|
||||
remoteCalls += 1;
|
||||
return UserProfile(id: 'u1', username: 'user-$remoteCalls');
|
||||
},
|
||||
);
|
||||
|
||||
final first = await repository.getProfile();
|
||||
final second = await repository.getProfile();
|
||||
|
||||
expect(first.username, 'user-1');
|
||||
expect(second.username, 'user-1');
|
||||
expect(repository.cachedUser?.username, 'user-1');
|
||||
expect(remoteCalls, 1);
|
||||
|
||||
await repository.invalidate();
|
||||
|
||||
expect(repository.cachedUser, isNull);
|
||||
|
||||
final afterInvalidate = await repository.getProfile();
|
||||
expect(afterInvalidate.username, 'user-2');
|
||||
expect(remoteCalls, 2);
|
||||
});
|
||||
|
||||
test(
|
||||
'invalidate prevents stale in-flight refresh from restoring cache',
|
||||
() async {
|
||||
final completer = Completer<UserProfile>();
|
||||
final repository = UserProfileCacheRepository(
|
||||
store: HybridCacheStore(
|
||||
memory: MemoryCacheStore(),
|
||||
persistent: PersistentCacheStore(),
|
||||
),
|
||||
remoteLoader: () => completer.future,
|
||||
);
|
||||
|
||||
final pending = repository.getProfile(forceRefresh: true);
|
||||
await repository.invalidate();
|
||||
|
||||
completer.complete(
|
||||
const UserProfile(id: 'u-old', username: 'old-user'),
|
||||
);
|
||||
await pending;
|
||||
|
||||
expect(repository.cachedUser, isNull);
|
||||
|
||||
final cachedEntry = await repository.readCacheEntry(
|
||||
UserProfileCacheRepository.cacheKey,
|
||||
);
|
||||
expect(cachedEntry, isNull);
|
||||
},
|
||||
);
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user