test(installed-apps): add InstalledAppsController unit tests (3 cases)

This commit is contained in:
2026-04-26 08:29:16 +02:00
parent 92f6035b84
commit 323d28bb17

View File

@@ -0,0 +1,110 @@
import 'package:device_management/src/core/domain/repositories/installed_apps_repository.dart';
import 'package:device_management/src/core/providers/installed_apps_repository_provider.dart';
import 'package:device_management/src/features/installed_apps/presentation/providers/installed_apps_controller.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:sf_infrastructure/sf_infrastructure.dart';
import 'package:sf_shared/testing.dart';
import 'package:sf_tracking/sf_tracking.dart';
class MockInstalledAppsRepository extends Mock
implements InstalledAppsRepository {}
void main() {
ProviderContainer buildContainer(InstalledAppsRepository repository) {
return makeContainer(
overrides: [
installedAppsRepositoryProvider.overrideWithValue(repository),
sfTrackingProvider.overrideWithValue(
SfTrackingRepository(clients: const []),
),
],
);
}
group('InstalledAppsController.toggleApp', () {
test('transitions to AsyncData on success', () async {
final repository = MockInstalledAppsRepository();
when(
() => repository.updateInstalledApps(
identificator: any(named: 'identificator'),
apps: any(named: 'apps'),
),
).thenAnswer((_) async => []);
final container = buildContainer(repository);
addTearDown(container.dispose);
await container
.read(installedAppsControllerProvider.notifier)
.toggleApp(
identificator: 'imei-1',
appUid: 'app-1',
isEnabled: false,
);
expect(
container.read(installedAppsControllerProvider),
isA<AsyncData<void>>(),
);
});
test('calls repository with correct parameters', () async {
final repository = MockInstalledAppsRepository();
when(
() => repository.updateInstalledApps(
identificator: any(named: 'identificator'),
apps: any(named: 'apps'),
),
).thenAnswer((_) async => []);
final container = buildContainer(repository);
addTearDown(container.dispose);
await container
.read(installedAppsControllerProvider.notifier)
.toggleApp(
identificator: 'imei-1',
appUid: 'app-1',
isEnabled: false,
);
verify(
() => repository.updateInstalledApps(
identificator: 'imei-1',
apps: [
{'appUid': 'app-1', 'isEnabled': false},
],
),
).called(1);
});
test('exposes AsyncError when repository fails', () async {
final repository = MockInstalledAppsRepository();
when(
() => repository.updateInstalledApps(
identificator: any(named: 'identificator'),
apps: any(named: 'apps'),
),
).thenThrow(
const ApiException(message: 'boom', isNetworkError: true));
final container = buildContainer(repository);
addTearDown(container.dispose);
await container
.read(installedAppsControllerProvider.notifier)
.toggleApp(
identificator: 'imei-1',
appUid: 'app-1',
isEnabled: true,
);
expect(
container.read(installedAppsControllerProvider),
isA<AsyncError<void>>(),
);
});
});
}