aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorLudwig Schwiedrzik <ludwig.schwiedrzik@d-fine.com>2024-08-14 11:50:33 +0200
committerScott Murray <scott.murray@konsulko.com>2024-09-12 16:58:42 +0000
commit7ea2d37528da61ff40a50da5843397d51fc0e789 (patch)
treede3b9dcafda931aa3d0297c60bc2586c89e03782 /test
parenta2dcd701777968a65d3176eaf28aa7023d97c16b (diff)
Integration of Storage API to flutter - Users, Units
Updated user and units notifiers to make use of persistent storage. New users are stored with a name and id in the default namespace, and their unit preferences (distance, temperature, tire pressure) are stored in namespaces corresponding to each user's id. Added new initialize_settings to load user and unit settings from storage on startup. For first-time startup, default users with ids have been added to storage as well. Added unit tests for new user and unit handling. Bug-AGL: [SPEC-5228] Change-Id: I9cbcfc3ea5045dcb27db1b05e332f89abfc284a1 Signed-off-by: Tom Kronsbein <tom.kronsbein@d-fine.com> Signed-off-by: Ludwig Schwiedrzik <ludwig.schwiedrzik@d-fine.com>
Diffstat (limited to 'test')
-rw-r--r--test/storageAPI_UnitsForUsers_test.dart286
1 files changed, 286 insertions, 0 deletions
diff --git a/test/storageAPI_UnitsForUsers_test.dart b/test/storageAPI_UnitsForUsers_test.dart
new file mode 100644
index 0000000..c4bdb14
--- /dev/null
+++ b/test/storageAPI_UnitsForUsers_test.dart
@@ -0,0 +1,286 @@
+import 'package:flutter_test/flutter_test.dart';
+import 'package:protos/storage-api.dart' as storage_api;
+import 'package:flutter_ics_homescreen/export.dart';
+
+import 'package:flutter_ics_homescreen/data/data_providers/storage_client.dart';
+import 'package:flutter_ics_homescreen/data/data_providers/initialize_settings.dart';
+
+// Mock implementation of Ref if necessary.
+class MockRef extends Ref {
+ @override
+ dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+void main() {
+ late StorageClient storageClient;
+ late ProviderContainer container;
+
+ setUp(() {
+ storageClient = StorageClient(
+ config: StorageConfig.defaultConfig(),
+ ref: MockRef(),
+ );
+ container = ProviderContainer();
+ // Dispose container after each test.
+ addTearDown(container.dispose);
+ });
+
+ test('add User', () async {
+ await storageClient.destroyDB();
+ final userClient = container.read(usersProvider.notifier);
+ await userClient.addUser('Mark');
+ // Access state.
+ var userState = container.read(usersProvider);
+ final userId = userState.users[0].id;
+ final searchResponse = await storageClient.read(storage_api.Key(key: '${UsersPath.InfotainmentUsers}.$userId.name'));
+ expect(searchResponse.success, isTrue);
+ expect(searchResponse.result, 'Mark');
+ await storageClient.destroyDB();
+ });
+
+ test('remove User', () async {
+ await storageClient.destroyDB();
+ // Add User.
+ final userClient = container.read(usersProvider.notifier);
+ await userClient.addUser('Mark');
+ // Access state.
+ var userState = container.read(usersProvider);
+ final markId = userState.users[0].id;
+
+ // Remove User.
+ await userClient.removeUser(markId);
+ final searchResponse = await storageClient.search(storage_api.Key(key: markId));
+ expect(searchResponse.success, isTrue);
+ expect(searchResponse.result, []);
+ await storageClient.destroyDB();
+ });
+
+ test('add users, select user', () async {
+ await storageClient.destroyDB();
+ // Add Users.
+ final userClient = container.read(usersProvider.notifier);
+ await userClient.addUser('Mark');
+ await userClient.addUser('Clara');
+
+ var userState = container.read(usersProvider);
+ final markId = userState.users[1].id;
+ await userClient.selectUser(markId);
+
+ final readResponseAfterSelectUser = await storageClient.read(storage_api.Key(key: UsersPath.InfotainmentCurrentUser));
+ expect(readResponseAfterSelectUser.success, isTrue);
+ expect(readResponseAfterSelectUser.result, markId);
+ await storageClient.destroyDB();
+ });
+
+ test('selected user default', () async {
+ await storageClient.destroyDB();
+
+ // Access state.
+ var userState = container.read(usersProvider);
+ final selectedId = userState.selectedUser.id;
+
+ final readResponse = await storageClient.read(storage_api.Key(key: UsersPath.InfotainmentCurrentUser));
+ expect(readResponse.success, isFalse);
+ expect(selectedId, '0');
+ await storageClient.destroyDB();
+ });
+
+ test('save Unit preference for a User', () async {
+ await storageClient.destroyDB();
+ // Add Users.
+ final userClient = container.read(usersProvider.notifier);
+ final unitsClient = container.read(unitStateProvider.notifier);
+ await userClient.addUser('Mark');
+ await userClient.addUser('Clara');
+
+ var userState = container.read(usersProvider);
+ final markId = userState.users[1].id;
+ await userClient.selectUser(markId);
+
+ await unitsClient.setDistanceUnit(DistanceUnit.miles);
+
+ final readResponse = await storageClient.read(storage_api.Key(key: VSSPath.vehicleHmiDistanceUnit, namespace: markId));
+ expect(readResponse.success, isTrue);
+ expect(readResponse.result, 'MILES');
+ await storageClient.destroyDB();
+ });
+
+ test('load settings: add users, selcect user, setDistanceUnit, kill state, initialize', () async {
+ await storageClient.destroyDB();
+
+ final userClient = container.read(usersProvider.notifier);
+ final unitsClient = container.read(unitStateProvider.notifier);
+
+ // Prepare state.
+ await userClient.addUser('Mark');
+ await userClient.addUser('Clara');
+ var userState = container.read(usersProvider);
+ final markId = userState.users[1].id;
+ await userClient.selectUser(markId);
+ await unitsClient.setDistanceUnit(DistanceUnit.miles);
+
+ // Check success.
+ var unitState = container.read(unitStateProvider);
+ userState = container.read(usersProvider);
+ expect(userState.users[0].name, 'Clara');
+ expect(userState.users[1].name, 'Mark');
+ expect(userState.users.length, 5);
+ expect(userState.selectedUser.id, markId);
+ expect(unitState.distanceUnit, DistanceUnit.miles);
+
+ // Killing state.
+ container.dispose();
+ container = ProviderContainer();
+ addTearDown(container.dispose);
+
+ // Check that state is killed.
+ userState = container.read(usersProvider);
+ unitState = container.read(unitStateProvider);
+ expect(userState.selectedUser.id, '0');
+ expect(unitState.distanceUnit, DistanceUnit.kilometers);
+
+ // Load state.
+ await initializeSettings(container);
+
+ // Check success.
+ unitState = container.read(unitStateProvider);
+ userState = container.read(usersProvider);
+ expect(userState.selectedUser.id, markId);
+ List<String> userNames = userState.users.map((user) => user.name).toList();
+ expect(userNames.contains('Mark'), isTrue);
+ expect(userNames.contains('Clara'), isTrue);
+ expect(userState.users.length, 2);
+ expect(unitState.distanceUnit, DistanceUnit.miles);
+
+ await storageClient.destroyDB();
+ });
+
+ test('loadsettings: add users, setDistanceUnit, kill state, initialize', () async {
+ await storageClient.destroyDB();
+
+ final userClient = container.read(usersProvider.notifier);
+ final unitsClient = container.read(unitStateProvider.notifier);
+
+ // Prepare state.
+ await userClient.addUser('Mark');
+ await userClient.addUser('Clara');
+ var userState = container.read(usersProvider);
+ final claraId = userState.users[0].id;
+ await unitsClient.setDistanceUnit(DistanceUnit.miles);
+
+ // Check success.
+ var unitState = container.read(unitStateProvider);
+ userState = container.read(usersProvider);
+ expect(userState.users[0].name, 'Clara');
+ expect(userState.users[1].name, 'Mark');
+ expect(userState.selectedUser.id, claraId);
+ expect(unitState.distanceUnit, DistanceUnit.miles);
+
+ // Killing state.
+ container.dispose();
+ container = ProviderContainer();
+ addTearDown(container.dispose);
+
+ // Check that state is killed.
+ userState = container.read(usersProvider);
+ unitState = container.read(unitStateProvider);
+ expect(userState.selectedUser.id, '0');
+ expect(unitState.distanceUnit, DistanceUnit.kilometers);
+
+ // Load state.
+ await initializeSettings(container);
+
+ // Check success.
+ unitState = container.read(unitStateProvider);
+ userState = container.read(usersProvider);
+ expect(userState.selectedUser.id, claraId);
+ List<String> userNames = userState.users.map((user) => user.name).toList();
+ expect(userNames.contains('Mark'), isTrue);
+ expect(userNames.contains('Clara'), isTrue);
+ expect(unitState.distanceUnit, DistanceUnit.miles);
+
+ await storageClient.destroyDB();
+ });
+
+ test('loadsettings: initialize, add no user, setDistanceUnit, kill state, inizialize', () async {
+ await storageClient.destroyDB();
+ await initializeSettings(container);
+
+ var userState = container.read(usersProvider);
+ var readResponse = await storageClient.read(storage_api.Key(key: '${UsersPath.InfotainmentUsers}.1.name'));
+ expect(readResponse.result, 'Heather');
+
+ final unitsClient = container.read(unitStateProvider.notifier);
+
+ // Prepare state.
+ userState = container.read(usersProvider);
+ await unitsClient.setDistanceUnit(DistanceUnit.miles);
+
+ // Check success.
+ var unitState = container.read(unitStateProvider);
+ userState = container.read(usersProvider);
+ expect(userState.users[0].name, 'Heather');
+ expect(unitState.distanceUnit, DistanceUnit.miles);
+ expect(userState.selectedUser.id, '1');
+
+ // Killing state.
+ container.dispose();
+ container = ProviderContainer();
+ addTearDown(container.dispose);
+
+ // Check that state is killed.
+ userState = container.read(usersProvider);
+ unitState = container.read(unitStateProvider);
+ expect(userState.selectedUser.id, '0');
+ expect(unitState.distanceUnit, DistanceUnit.kilometers);
+
+ // Load state.
+ await initializeSettings(container);
+
+ // Check success.
+ unitState = container.read(unitStateProvider);
+ userState = container.read(usersProvider);
+ expect(userState.users[0].name, 'Heather');
+ expect(unitState.distanceUnit, DistanceUnit.miles);
+ expect(userState.selectedUser.name, 'Heather');
+
+ await storageClient.destroyDB();
+ });
+
+ test('select user: load settings', () async {
+ await storageClient.destroyDB();
+
+ final userClient = container.read(usersProvider.notifier);
+ final unitsClient = container.read(unitStateProvider.notifier);
+ // Prepare state.
+ await userClient.addUser('Mark');
+ await userClient.addUser('Clara');
+ var userState = container.read(usersProvider);
+ final claraId = userState.users[0].id;
+ final markId = userState.users[1].id;
+ // Note: current user is Clara.
+ await unitsClient.setDistanceUnit(DistanceUnit.miles);
+ await unitsClient.setTemperatureUnit(TemperatureUnit.fahrenheit);
+ await unitsClient.setPressureUnit(PressureUnit.psi);
+
+ await userClient.selectUser(markId);
+ await unitsClient.setDistanceUnit(DistanceUnit.miles);
+ await unitsClient.setTemperatureUnit(TemperatureUnit.celsius);
+ await unitsClient.setPressureUnit(PressureUnit.kilopascals);
+
+ await userClient.selectUser(claraId);
+ var unitState = container.read(unitStateProvider);
+ expect(unitState.distanceUnit, DistanceUnit.miles);
+ expect(unitState.temperatureUnit, TemperatureUnit.fahrenheit);
+ expect(unitState.pressureUnit, PressureUnit.psi);
+
+ var readResponse = await storageClient.read(storage_api.Key(key: VSSPath.vehicleHmiDistanceUnit, namespace: claraId));
+ expect(readResponse.result, 'MILES');
+ readResponse = await storageClient.read(storage_api.Key(key: VSSPath.vehicleHmiTemperatureUnit, namespace: claraId));
+ expect(readResponse.result, 'F');
+ readResponse = await storageClient.read(storage_api.Key(key: VSSPath. vehicleHmiPressureUnit, namespace: claraId));
+ expect(readResponse.result, 'PSI');
+
+ await storageClient.destroyDB();
+ });
+}