From 8eb14555dc59ef0621e448ca23b04d5c3468262f Mon Sep 17 00:00:00 2001 From: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Date: Thu, 30 Apr 2026 03:02:49 +0700 Subject: [PATCH] more test --- .../repositories/metadata.repository.dart | 16 ++++++++++------ .../repositories/metadata_repository_test.dart | 1 + .../repositories/metadata_repository_test.dart | 15 +++++++++++++++ 3 files changed, 26 insertions(+), 6 deletions(-) create mode 100644 mobile/test/unit/repositories/metadata_repository_test.dart diff --git a/mobile/lib/infrastructure/repositories/metadata.repository.dart b/mobile/lib/infrastructure/repositories/metadata.repository.dart index e0977ef580..5f04063389 100644 --- a/mobile/lib/infrastructure/repositories/metadata.repository.dart +++ b/mobile/lib/infrastructure/repositories/metadata.repository.dart @@ -1,4 +1,6 @@ +import 'package:collection/collection.dart'; import 'package:drift/drift.dart'; +import 'package:flutter/foundation.dart'; import 'package:immich_mobile/domain/models/config/app_config.dart'; import 'package:immich_mobile/domain/models/config/system_config.dart'; import 'package:immich_mobile/domain/models/config/theme_config.dart'; @@ -40,7 +42,7 @@ class MetadataRepository extends DriftDatabaseRepository { final rows = await _db.select(_db.metadataEntity).get(); for (final row in rows) { final key = MetadataKey.fromKey(row.key); - if (key != null) _cache[key] = _decode(key, row.value); + if (key != null) _cache[key] = decode(key, row.value); } } @@ -52,21 +54,23 @@ class MetadataRepository extends DriftDatabaseRepository { await _db .into(_db.metadataEntity) .insertOnConflictUpdate( - MetadataEntityCompanion.insert(key: key.key, value: _encode(value), updatedAt: Value(DateTime.now())), + MetadataEntityCompanion.insert(key: key.key, value: encode(value), updatedAt: Value(DateTime.now())), ); _cache[key] = value; } - String _encode(T value) => switch (value) { + @visibleForTesting + static String encode(T value) => switch (value) { Enum() => value.name, DateTime() => value.toIso8601String(), _ => throw ArgumentError('Unsupported metadata value type: ${value.runtimeType}'), }; - T _decode(MetadataKey key, String raw) { + @visibleForTesting + static T decode(MetadataKey key, String raw) { final enumValues = key.enumValues; if (enumValues != null) { - return enumValues.where((v) => (v as Enum).name == raw).firstOrNull ?? key.defaultValue; + return enumValues.firstWhereOrNull((v) => (v as Enum).name == raw) ?? key.defaultValue; } return switch (key.defaultValue) { DateTime() => (DateTime.tryParse(raw) ?? key.defaultValue) as T, @@ -96,6 +100,6 @@ class MetadataRepository extends DriftDatabaseRepository { void _updateCacheForRow(MetadataEntityData row) { final key = MetadataKey.fromKey(row.key); if (key == null) return; - _cache[key] = _decode(key, row.value); + _cache[key] = decode(key, row.value); } } diff --git a/mobile/test/medium/repositories/metadata_repository_test.dart b/mobile/test/medium/repositories/metadata_repository_test.dart index 06c908f5c2..32f613483d 100644 --- a/mobile/test/medium/repositories/metadata_repository_test.dart +++ b/mobile/test/medium/repositories/metadata_repository_test.dart @@ -135,4 +135,5 @@ void main() { await expectation; }); }); + } diff --git a/mobile/test/unit/repositories/metadata_repository_test.dart b/mobile/test/unit/repositories/metadata_repository_test.dart new file mode 100644 index 0000000000..6b2cb2652e --- /dev/null +++ b/mobile/test/unit/repositories/metadata_repository_test.dart @@ -0,0 +1,15 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:immich_mobile/domain/models/metadata_key.dart'; +import 'package:immich_mobile/infrastructure/repositories/metadata.repository.dart'; + +void main() { + group('codec', () { + test('every MetadataKey encodes and decodes values losslessly', () { + for (final key in MetadataKey.values) { + final encoded = MetadataRepository.encode(key.defaultValue); + final decoded = MetadataRepository.decode(key, encoded); + expect(decoded, key.defaultValue, reason: 'codec round-trip failed for ${key.name}'); + } + }); + }); +}