Replace geofence polling with native Android geofence
This commit is contained in:
86
test/current_home_geofence_sync_test.dart
Normal file
86
test/current_home_geofence_sync_test.dart
Normal file
@@ -0,0 +1,86 @@
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:ignis_app/features/homes/providers/homes_providers.dart';
|
||||
import 'package:ignis_app/features/homes/services/geofence_automation_service.dart';
|
||||
import 'package:ignis_app/features/shared/providers/core_providers.dart';
|
||||
import 'package:ignis_app/models/home_config.dart';
|
||||
import 'package:ignis_app/services/settings_service.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
import 'test_support.dart';
|
||||
|
||||
void main() {
|
||||
TestWidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
test('loading current home syncs geofence with active ready home', () async {
|
||||
SharedPreferences.setMockInitialValues({
|
||||
'ignis_homes':
|
||||
'[{"id":"home-1","name":"Home 1","url":"https://one.example","latitude":55.75,"longitude":37.61,"geofenceEnabled":true,"geofenceRadiusMeters":700}]',
|
||||
'ignis_current_home_id': 'home-1',
|
||||
});
|
||||
|
||||
final settingsService = SettingsService(
|
||||
credentialsStorage: InMemoryCredentialsStorage(),
|
||||
);
|
||||
await settingsService.setHomeApiKey('home-1', 'key-1');
|
||||
final geofenceService = _RecordingGeofenceAutomationService();
|
||||
final container = ProviderContainer(
|
||||
overrides: [
|
||||
settingsServiceProvider.overrideWithValue(settingsService),
|
||||
geofenceAutomationServiceProvider.overrideWithValue(geofenceService),
|
||||
],
|
||||
);
|
||||
addTearDown(container.dispose);
|
||||
|
||||
await container.read(currentHomeProvider.notifier).load();
|
||||
|
||||
expect(container.read(currentHomeProvider)?.id, 'home-1');
|
||||
expect(geofenceService.syncedHomes, hasLength(1));
|
||||
expect(geofenceService.syncedHomes.single?.geofenceReady, isTrue);
|
||||
expect(geofenceService.syncedHomes.single?.geofenceRadiusMeters, 700);
|
||||
});
|
||||
|
||||
test('clearing current home disarms geofence automation', () async {
|
||||
SharedPreferences.setMockInitialValues({
|
||||
'ignis_homes':
|
||||
'[{"id":"home-1","name":"Home 1","url":"https://one.example","latitude":55.75,"longitude":37.61,"geofenceEnabled":true}]',
|
||||
'ignis_current_home_id': 'home-1',
|
||||
});
|
||||
|
||||
final settingsService = SettingsService(
|
||||
credentialsStorage: InMemoryCredentialsStorage(),
|
||||
);
|
||||
await settingsService.setHomeApiKey('home-1', 'key-1');
|
||||
final geofenceService = _RecordingGeofenceAutomationService();
|
||||
final container = ProviderContainer(
|
||||
overrides: [
|
||||
settingsServiceProvider.overrideWithValue(settingsService),
|
||||
geofenceAutomationServiceProvider.overrideWithValue(geofenceService),
|
||||
],
|
||||
);
|
||||
addTearDown(container.dispose);
|
||||
|
||||
await container.read(currentHomeProvider.notifier).load();
|
||||
await container.read(currentHomeProvider.notifier).clear();
|
||||
|
||||
expect(container.read(currentHomeProvider), isNull);
|
||||
expect(geofenceService.syncedHomes, hasLength(2));
|
||||
expect(geofenceService.syncedHomes.last, isNull);
|
||||
});
|
||||
}
|
||||
|
||||
class _RecordingGeofenceAutomationService extends GeofenceAutomationService {
|
||||
_RecordingGeofenceAutomationService()
|
||||
: super(
|
||||
settingsService: SettingsService(
|
||||
credentialsStorage: InMemoryCredentialsStorage(),
|
||||
),
|
||||
);
|
||||
|
||||
final List<HomeConfig?> syncedHomes = [];
|
||||
|
||||
@override
|
||||
Future<void> syncActiveHome(HomeConfig? home) async {
|
||||
syncedHomes.add(home);
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:ignis_app/models/home_config.dart';
|
||||
import 'package:ignis_app/screens/api_keys_screen.dart';
|
||||
import 'package:ignis_app/screens/group_edit_screen.dart';
|
||||
import 'package:ignis_app/screens/home_edit_screen.dart';
|
||||
@@ -114,6 +115,11 @@ void main() {
|
||||
testWidgets('home edit screen validates fields and saves normalized home', (
|
||||
tester,
|
||||
) async {
|
||||
tester.view.physicalSize = const Size(800, 1400);
|
||||
tester.view.devicePixelRatio = 1;
|
||||
addTearDown(tester.view.resetPhysicalSize);
|
||||
addTearDown(tester.view.resetDevicePixelRatio);
|
||||
|
||||
SharedPreferences.setMockInitialValues({});
|
||||
final settingsService = SettingsService(
|
||||
credentialsStorage: InMemoryCredentialsStorage(),
|
||||
@@ -170,9 +176,6 @@ void main() {
|
||||
);
|
||||
await tester.pump();
|
||||
|
||||
await tester.tap(find.text('Выключать свет при уходе'));
|
||||
await tester.pump();
|
||||
await tester.ensureVisible(saveHomeButton);
|
||||
await tester.tap(saveHomeButton);
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
@@ -185,7 +188,8 @@ void main() {
|
||||
expect(savedHome.url, 'https://ignis.akokos.ru');
|
||||
expect(savedHome.latitude, 55.75);
|
||||
expect(savedHome.longitude, 37.61);
|
||||
expect(savedHome.geofenceEnabled, isTrue);
|
||||
expect(savedHome.geofenceEnabled, isFalse);
|
||||
expect(savedHome.geofenceRadiusMeters, HomeConfig.defaultGeofenceRadiusMeters);
|
||||
expect(savedApiKey, 'secret-key');
|
||||
});
|
||||
}
|
||||
|
||||
95
test/geofence_automation_service_test.dart
Normal file
95
test/geofence_automation_service_test.dart
Normal file
@@ -0,0 +1,95 @@
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:ignis_app/features/homes/services/geofence_automation_service.dart';
|
||||
import 'package:ignis_app/models/home_config.dart';
|
||||
import 'package:ignis_app/services/settings_service.dart';
|
||||
|
||||
import 'test_support.dart';
|
||||
|
||||
void main() {
|
||||
TestWidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
const channel = MethodChannel('ignis/geofence_automation');
|
||||
final calls = <MethodCall>[];
|
||||
|
||||
setUp(() {
|
||||
calls.clear();
|
||||
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
|
||||
.setMockMethodCallHandler(channel, (call) async {
|
||||
calls.add(call);
|
||||
return null;
|
||||
});
|
||||
});
|
||||
|
||||
tearDown(() {
|
||||
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
|
||||
.setMockMethodCallHandler(channel, null);
|
||||
});
|
||||
|
||||
test('disarms native geofence when active home is null', () async {
|
||||
final service = GeofenceAutomationService(
|
||||
settingsService: SettingsService(
|
||||
credentialsStorage: InMemoryCredentialsStorage(),
|
||||
),
|
||||
);
|
||||
|
||||
await service.syncActiveHome(null);
|
||||
|
||||
expect(calls, hasLength(1));
|
||||
expect(calls.single.method, 'disarmGeofence');
|
||||
expect(calls.single.arguments, isNull);
|
||||
});
|
||||
|
||||
test('disarms native geofence when home is not geofence-ready', () async {
|
||||
final service = GeofenceAutomationService(
|
||||
settingsService: SettingsService(
|
||||
credentialsStorage: InMemoryCredentialsStorage(),
|
||||
),
|
||||
);
|
||||
|
||||
await service.syncActiveHome(
|
||||
HomeConfig(
|
||||
id: 'home-1',
|
||||
name: 'Home 1',
|
||||
url: 'https://one.example',
|
||||
latitude: 55.75,
|
||||
longitude: 37.61,
|
||||
geofenceEnabled: false,
|
||||
),
|
||||
);
|
||||
|
||||
expect(calls, hasLength(1));
|
||||
expect(calls.single.method, 'disarmGeofence');
|
||||
});
|
||||
|
||||
test('arms native geofence with stored api key and radius', () async {
|
||||
final settingsService = SettingsService(
|
||||
credentialsStorage: InMemoryCredentialsStorage(),
|
||||
);
|
||||
await settingsService.setHomeApiKey('home-1', 'secret-key');
|
||||
final service = GeofenceAutomationService(settingsService: settingsService);
|
||||
|
||||
await service.syncActiveHome(
|
||||
HomeConfig(
|
||||
id: 'home-1',
|
||||
name: 'Home 1',
|
||||
url: 'https://one.example',
|
||||
latitude: 55.75,
|
||||
longitude: 37.61,
|
||||
geofenceEnabled: true,
|
||||
geofenceRadiusMeters: 750,
|
||||
),
|
||||
);
|
||||
|
||||
expect(calls, hasLength(1));
|
||||
expect(calls.single.method, 'armGeofence');
|
||||
expect(calls.single.arguments, <String, Object?>{
|
||||
'homeId': 'home-1',
|
||||
'baseUrl': 'https://one.example',
|
||||
'apiKey': 'secret-key',
|
||||
'latitude': 55.75,
|
||||
'longitude': 37.61,
|
||||
'radiusMeters': 750,
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:geolocator/geolocator.dart';
|
||||
import 'package:ignis_app/features/homes/geofence_logic.dart';
|
||||
import 'package:ignis_app/features/homes/providers/location_providers.dart';
|
||||
|
||||
void main() {
|
||||
test('distance formatting stays readable across ranges', () {
|
||||
expect(formatDistance(0.42), '420 м');
|
||||
expect(formatDistance(2.34), '2.3 км');
|
||||
expect(formatDistance(12.8), '13 км');
|
||||
expect(formatDistanceMeters(450), '450 м');
|
||||
expect(formatDistanceMeters(1450), '1.4 км');
|
||||
});
|
||||
|
||||
test('distance calculation stays in realistic range', () {
|
||||
final distanceKm = calculateDistanceKm(55.75, 37.61, 55.76, 37.61);
|
||||
expect(distanceKm, closeTo(1.11, 0.15));
|
||||
});
|
||||
|
||||
test('background location access requires always permission', () {
|
||||
expect(hasForegroundLocationAccess(LocationPermission.whileInUse), isTrue);
|
||||
expect(hasBackgroundLocationAccess(LocationPermission.whileInUse), isFalse);
|
||||
expect(hasBackgroundLocationAccess(LocationPermission.always), isTrue);
|
||||
});
|
||||
|
||||
test('retry remaining expires after cooldown window', () {
|
||||
final now = DateTime(2026, 5, 1, 12, 0, 0);
|
||||
final lastFailure = now.subtract(const Duration(minutes: 10));
|
||||
final retryRemaining = geofenceRetryRemaining(lastFailure, now: now);
|
||||
|
||||
expect(retryRemaining, isNotNull);
|
||||
expect(retryRemaining!.inMinutes, 20);
|
||||
expect(
|
||||
geofenceRetryRemaining(
|
||||
now.subtract(const Duration(minutes: 31)),
|
||||
now: now,
|
||||
),
|
||||
isNull,
|
||||
);
|
||||
});
|
||||
}
|
||||
@@ -1,79 +0,0 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:ignis_app/features/homes/services/geofence_runtime_store.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
void main() {
|
||||
TestWidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
test('runtime store persists armed home and success markers', () async {
|
||||
SharedPreferences.setMockInitialValues({});
|
||||
|
||||
final store = GeofenceRuntimeStore();
|
||||
await store.armForHome('home-1');
|
||||
|
||||
var runtime = await store.load();
|
||||
expect(runtime.armedHomeId, 'home-1');
|
||||
|
||||
runtime = runtime.recordSuccess(
|
||||
'home-1',
|
||||
triggeredAt: DateTime(2026, 5, 1, 18, 30),
|
||||
distanceMeters: 820,
|
||||
);
|
||||
await store.save(runtime);
|
||||
|
||||
final loaded = await store.load();
|
||||
expect(loaded.isTriggeredFor('home-1'), isTrue);
|
||||
expect(loaded.lastSuccessHomeId, 'home-1');
|
||||
expect(loaded.lastDistanceMeters, 820);
|
||||
});
|
||||
|
||||
test(
|
||||
'returning into home radius rearms geofence and clears failure',
|
||||
() async {
|
||||
SharedPreferences.setMockInitialValues({});
|
||||
|
||||
final store = GeofenceRuntimeStore();
|
||||
var runtime = await store.armForHome('home-1');
|
||||
runtime = runtime.recordFailure(
|
||||
'home-1',
|
||||
failedAt: DateTime(2026, 5, 1, 19, 0),
|
||||
distanceMeters: 900,
|
||||
message: 'Backend умер по дороге.',
|
||||
);
|
||||
runtime = runtime.recordInsideHome(
|
||||
'home-1',
|
||||
checkedAt: DateTime(2026, 5, 1, 22, 0),
|
||||
distanceMeters: 120,
|
||||
);
|
||||
await store.save(runtime);
|
||||
|
||||
final loaded = await store.load();
|
||||
expect(loaded.failureAtFor('home-1'), isNull);
|
||||
expect(loaded.isTriggeredFor('home-1'), isFalse);
|
||||
expect(loaded.lastDistanceMeters, 120);
|
||||
},
|
||||
);
|
||||
|
||||
test(
|
||||
'removing home clears armed and historical runtime for that home',
|
||||
() async {
|
||||
SharedPreferences.setMockInitialValues({});
|
||||
|
||||
final store = GeofenceRuntimeStore();
|
||||
var runtime = await store.armForHome('home-1');
|
||||
runtime = runtime.recordSuccess(
|
||||
'home-1',
|
||||
triggeredAt: DateTime(2026, 5, 1, 20, 0),
|
||||
distanceMeters: 760,
|
||||
);
|
||||
await store.save(runtime);
|
||||
|
||||
await store.removeHome('home-1');
|
||||
final loaded = await store.load();
|
||||
|
||||
expect(loaded.armedHomeId, isNull);
|
||||
expect(loaded.lastSuccessHomeId, isNull);
|
||||
expect(loaded.triggeredHomeId, isNull);
|
||||
},
|
||||
);
|
||||
}
|
||||
72
test/home_config_test.dart
Normal file
72
test/home_config_test.dart
Normal file
@@ -0,0 +1,72 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:ignis_app/models/home_config.dart';
|
||||
|
||||
void main() {
|
||||
test('home config persists geofence radius in json', () {
|
||||
final home = HomeConfig(
|
||||
id: 'home-1',
|
||||
name: 'Home 1',
|
||||
url: 'https://one.example',
|
||||
latitude: 55.75,
|
||||
longitude: 37.61,
|
||||
geofenceEnabled: true,
|
||||
geofenceRadiusMeters: 900,
|
||||
);
|
||||
|
||||
final decoded = HomeConfig.fromJson(home.toJson());
|
||||
|
||||
expect(decoded.geofenceEnabled, isTrue);
|
||||
expect(decoded.geofenceRadiusMeters, 900);
|
||||
expect(decoded.latitude, 55.75);
|
||||
expect(decoded.longitude, 37.61);
|
||||
});
|
||||
|
||||
test(
|
||||
'home config clamps geofence radius from legacy or invalid payloads',
|
||||
() {
|
||||
final tooSmall = HomeConfig.fromJson({
|
||||
'id': 'home-1',
|
||||
'name': 'Home 1',
|
||||
'url': 'https://one.example',
|
||||
'geofenceRadiusMeters': 50,
|
||||
});
|
||||
final tooLarge = HomeConfig.fromJson({
|
||||
'id': 'home-1',
|
||||
'name': 'Home 1',
|
||||
'url': 'https://one.example',
|
||||
'geofenceRadiusMeters': 9000,
|
||||
});
|
||||
final missing = HomeConfig.fromJson({
|
||||
'id': 'home-1',
|
||||
'name': 'Home 1',
|
||||
'url': 'https://one.example',
|
||||
});
|
||||
|
||||
expect(tooSmall.geofenceRadiusMeters, 100);
|
||||
expect(tooLarge.geofenceRadiusMeters, 5000);
|
||||
expect(
|
||||
missing.geofenceRadiusMeters,
|
||||
HomeConfig.defaultGeofenceRadiusMeters,
|
||||
);
|
||||
},
|
||||
);
|
||||
|
||||
test('clearing coordinates also disables geofence', () {
|
||||
final home = HomeConfig(
|
||||
id: 'home-1',
|
||||
name: 'Home 1',
|
||||
url: 'https://one.example',
|
||||
latitude: 55.75,
|
||||
longitude: 37.61,
|
||||
geofenceEnabled: true,
|
||||
geofenceRadiusMeters: 700,
|
||||
);
|
||||
|
||||
final cleared = home.copyWith(clearCoordinates: true);
|
||||
|
||||
expect(cleared.latitude, isNull);
|
||||
expect(cleared.longitude, isNull);
|
||||
expect(cleared.geofenceEnabled, isFalse);
|
||||
expect(cleared.geofenceRadiusMeters, 700);
|
||||
});
|
||||
}
|
||||
@@ -1,90 +1,14 @@
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:ignis_app/models/ignis_group.dart';
|
||||
import 'package:ignis_app/providers/providers.dart';
|
||||
import 'package:ignis_app/screens/remote_screen.dart';
|
||||
import 'package:ignis_app/services/settings_service.dart';
|
||||
import 'package:ignis_app/widgets/group_card.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
import 'test_support.dart';
|
||||
|
||||
void main() {
|
||||
TestWidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
testWidgets('remote screen shows api keys menu for admin only', (
|
||||
tester,
|
||||
) async {
|
||||
final adminApi = FakeIgnisApi(
|
||||
authData: {'is_admin': true, 'name': 'owner'},
|
||||
groupsData: <Object>[],
|
||||
);
|
||||
final adminContainer = await _pumpRemoteScreen(
|
||||
tester,
|
||||
api: adminApi,
|
||||
settingsService: await _seedSettingsService(),
|
||||
);
|
||||
await adminContainer.read(authInfoProvider.notifier).load();
|
||||
await tester.pump();
|
||||
|
||||
await tester.tap(find.byIcon(Icons.more_vert));
|
||||
await tester.pumpAndSettle();
|
||||
expect(find.text('API-ключи'), findsOneWidget);
|
||||
|
||||
await tester.tapAt(const Offset(10, 10));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
final guestApi = FakeIgnisApi(
|
||||
authData: {'is_admin': false, 'name': 'guest'},
|
||||
groupsData: <Object>[],
|
||||
);
|
||||
final guestContainer = await _pumpRemoteScreen(
|
||||
tester,
|
||||
api: guestApi,
|
||||
settingsService: await _seedSettingsService(),
|
||||
);
|
||||
await guestContainer.read(authInfoProvider.notifier).load();
|
||||
await tester.pump();
|
||||
|
||||
await tester.tap(find.byIcon(Icons.more_vert));
|
||||
await tester.pumpAndSettle();
|
||||
expect(find.text('API-ключи'), findsNothing);
|
||||
});
|
||||
|
||||
testWidgets('remote screen deletes group after confirmation', (tester) async {
|
||||
final api = FakeIgnisApi(
|
||||
authData: {'is_admin': true, 'name': 'owner'},
|
||||
groupsData: {
|
||||
'kitchen': {
|
||||
'name': 'Kitchen',
|
||||
'macs': ['AA:BB'],
|
||||
},
|
||||
},
|
||||
);
|
||||
final container = await _pumpRemoteScreen(
|
||||
tester,
|
||||
api: api,
|
||||
settingsService: await _seedSettingsService(),
|
||||
);
|
||||
|
||||
await container.read(groupsProvider.notifier).refresh();
|
||||
await tester.pump(const Duration(milliseconds: 300));
|
||||
|
||||
expect(find.text('Kitchen'), findsOneWidget);
|
||||
|
||||
await tester.drag(find.text('Kitchen'), const Offset(-500, 0));
|
||||
await tester.pumpAndSettle();
|
||||
expect(find.text('Удалить группу?'), findsOneWidget);
|
||||
|
||||
await tester.tap(find.text('Удалить'));
|
||||
await tester.pumpAndSettle();
|
||||
|
||||
expect(api.deletedGroupId, 'kitchen');
|
||||
expect(find.text('Kitchen'), findsNothing);
|
||||
});
|
||||
|
||||
testWidgets('group card toggles power and creates 4 hour timer', (
|
||||
tester,
|
||||
) async {
|
||||
@@ -180,36 +104,3 @@ void main() {
|
||||
expect(find.text('Party'), findsOneWidget);
|
||||
});
|
||||
}
|
||||
|
||||
Future<ProviderContainer> _pumpRemoteScreen(
|
||||
WidgetTester tester, {
|
||||
required FakeIgnisApi api,
|
||||
required SettingsService settingsService,
|
||||
}) async {
|
||||
final container = createTestContainer(api, settingsService: settingsService);
|
||||
await container.read(currentHomeProvider.notifier).load();
|
||||
|
||||
await tester.pumpWidget(
|
||||
UncontrolledProviderScope(
|
||||
container: container,
|
||||
child: const MaterialApp(home: RemoteScreen()),
|
||||
),
|
||||
);
|
||||
await tester.pump();
|
||||
await tester.pump(const Duration(milliseconds: 100));
|
||||
return container;
|
||||
}
|
||||
|
||||
Future<SettingsService> _seedSettingsService() async {
|
||||
SharedPreferences.setMockInitialValues({
|
||||
'ignis_homes':
|
||||
'[{"id":"home-1","name":"Home 1","url":"https://one.example","geofenceEnabled":false}]',
|
||||
'ignis_current_home_id': 'home-1',
|
||||
});
|
||||
|
||||
final settingsService = SettingsService(
|
||||
credentialsStorage: InMemoryCredentialsStorage(),
|
||||
);
|
||||
await settingsService.setHomeApiKey('home-1', 'key-1');
|
||||
return settingsService;
|
||||
}
|
||||
|
||||
@@ -335,8 +335,12 @@ class FakeIgnisApi extends IgnisApi {
|
||||
ProviderContainer createTestContainer(
|
||||
FakeIgnisApi api, {
|
||||
SettingsService? settingsService,
|
||||
bool remotePollingEnabled = true,
|
||||
}) {
|
||||
final overrides = [apiProvider.overrideWithValue(api)];
|
||||
final overrides = [
|
||||
apiProvider.overrideWithValue(api),
|
||||
remotePollingEnabledProvider.overrideWithValue(remotePollingEnabled),
|
||||
];
|
||||
if (settingsService != null) {
|
||||
overrides.add(settingsServiceProvider.overrideWithValue(settingsService));
|
||||
}
|
||||
@@ -351,10 +355,12 @@ Future<ProviderContainer> pumpTestApp(
|
||||
required Widget child,
|
||||
FakeIgnisApi? api,
|
||||
SettingsService? settingsService,
|
||||
bool remotePollingEnabled = true,
|
||||
}) async {
|
||||
final container = createTestContainer(
|
||||
api ?? FakeIgnisApi(),
|
||||
settingsService: settingsService,
|
||||
remotePollingEnabled: remotePollingEnabled,
|
||||
);
|
||||
|
||||
await tester.pumpWidget(
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:ignis_app/screens/homes_screen.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
import 'package:ignis_app/main.dart';
|
||||
|
||||
void main() {
|
||||
TestWidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
@@ -12,8 +12,10 @@ void main() {
|
||||
) async {
|
||||
SharedPreferences.setMockInitialValues({});
|
||||
|
||||
await tester.pumpWidget(const ProviderScope(child: IgnisApp()));
|
||||
await tester.pumpAndSettle();
|
||||
await tester.pumpWidget(
|
||||
const ProviderScope(child: MaterialApp(home: HomesScreen())),
|
||||
);
|
||||
await tester.pump();
|
||||
|
||||
expect(find.text('ДОМА'), findsOneWidget);
|
||||
expect(find.text('Нет добавленных домов'), findsOneWidget);
|
||||
|
||||
Reference in New Issue
Block a user