test: expand client-side coverage and fix lifecycle issues
This commit is contained in:
90
test/provider_mutation_test.dart
Normal file
90
test/provider_mutation_test.dart
Normal file
@@ -0,0 +1,90 @@
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:ignis_app/app/load_state.dart';
|
||||
import 'package:ignis_app/providers/providers.dart';
|
||||
|
||||
import 'test_support.dart';
|
||||
|
||||
void main() {
|
||||
TestWidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
test('tasks addOnce sends runAt and reloads tasks', () async {
|
||||
final api = FakeIgnisApi(tasksData: {'tasks': <Object>[]});
|
||||
final container = createTestContainer(api);
|
||||
|
||||
await container
|
||||
.read(tasksProvider.notifier)
|
||||
.addOnce(
|
||||
targetId: 'bedroom',
|
||||
targetState: false,
|
||||
runAt: '2026-05-01T18:00:00Z',
|
||||
);
|
||||
|
||||
expect(api.scheduledOnceParams, isNotNull);
|
||||
expect(api.scheduledOnceParams, containsPair('target_id', 'bedroom'));
|
||||
expect(api.scheduledOnceParams, containsPair('state', false));
|
||||
expect(
|
||||
api.scheduledOnceParams,
|
||||
containsPair('run_at', '2026-05-01T18:00:00Z'),
|
||||
);
|
||||
expect(api.scheduledOnceParams, containsPair('is_group', true));
|
||||
expect(container.read(tasksProvider).status, LoadStatus.empty);
|
||||
});
|
||||
|
||||
test(
|
||||
'tasks addCron sends normalized cron params and reloads tasks',
|
||||
() async {
|
||||
final api = FakeIgnisApi(tasksData: {'tasks': <Object>[]});
|
||||
final container = createTestContainer(api);
|
||||
|
||||
await container
|
||||
.read(tasksProvider.notifier)
|
||||
.addCron(
|
||||
targetId: 'kitchen',
|
||||
hour: '7',
|
||||
minute: '30',
|
||||
dayOfWeek: '1,2,3,4,5',
|
||||
targetState: true,
|
||||
);
|
||||
|
||||
expect(api.scheduledCronParams, isNotNull);
|
||||
expect(api.scheduledCronParams, containsPair('target_id', 'kitchen'));
|
||||
expect(api.scheduledCronParams, containsPair('hour', '7'));
|
||||
expect(api.scheduledCronParams, containsPair('minute', '30'));
|
||||
expect(api.scheduledCronParams, containsPair('day_of_week', '1,2,3,4,5'));
|
||||
expect(api.scheduledCronParams, containsPair('state', true));
|
||||
expect(api.scheduledCronParams, containsPair('is_group', true));
|
||||
expect(container.read(tasksProvider).status, LoadStatus.empty);
|
||||
},
|
||||
);
|
||||
|
||||
test('groups setTimer4h toggles on and schedules auto-off', () async {
|
||||
final api = FakeIgnisApi(tasksData: {'tasks': <Object>[]});
|
||||
final container = createTestContainer(api);
|
||||
|
||||
await container.read(groupsProvider.notifier).setTimer4h('hall');
|
||||
|
||||
expect(api.controlledGroupId, 'hall');
|
||||
expect(api.controlGroupParams, containsPair('state', true));
|
||||
expect(api.scheduledOnceParams, containsPair('target_id', 'hall'));
|
||||
expect(api.scheduledOnceParams, containsPair('state', false));
|
||||
expect(api.scheduledOnceParams, containsPair('hours_from_now', 4));
|
||||
expect(api.scheduledOnceParams, containsPair('is_group', true));
|
||||
});
|
||||
|
||||
test('api key create returns token and refreshes list', () async {
|
||||
final api = FakeIgnisApi(apiKeysData: {'keys': <Object>[]});
|
||||
final container = createTestContainer(api);
|
||||
|
||||
final createdKey = await container
|
||||
.read(apiKeysProvider.notifier)
|
||||
.create('Guest', isAdmin: true);
|
||||
|
||||
expect(createdKey, 'Guest_token');
|
||||
expect(api.createdApiKeyName, 'Guest');
|
||||
expect(api.createdApiKeyIsAdmin, isTrue);
|
||||
final state = container.read(apiKeysProvider);
|
||||
expect(state.status, LoadStatus.data);
|
||||
expect(state.data.single.name, 'Guest');
|
||||
expect(state.data.single.isAdmin, isTrue);
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user