feat: AI Agent 处理器扩展 + 服药打卡确认链路 + AI 气泡配色微调 + 数据刷新 providers 抽离 + 多端页面细节调整

This commit is contained in:
MingNian
2026-07-20 17:12:00 +08:00
parent 9cea41705e
commit 0cb5b8e85a
45 changed files with 1435 additions and 276 deletions

View File

@@ -9,10 +9,20 @@ void main() {
expect(container.read(adminDoctorsRefreshSignalProvider), 0);
expect(container.read(doctorFollowupsRefreshSignalProvider), 0);
expect(container.read(doctorReportsRefreshSignalProvider), 0);
expect(container.read(doctorDashboardRefreshSignalProvider), 0);
container.read(adminDoctorsRefreshSignalProvider.notifier).trigger();
expect(container.read(adminDoctorsRefreshSignalProvider), 1);
expect(container.read(doctorFollowupsRefreshSignalProvider), 0);
expect(container.read(doctorReportsRefreshSignalProvider), 0);
expect(container.read(doctorDashboardRefreshSignalProvider), 0);
container.read(doctorReportsRefreshSignalProvider.notifier).trigger();
container.read(doctorDashboardRefreshSignalProvider.notifier).trigger();
expect(container.read(doctorReportsRefreshSignalProvider), 1);
expect(container.read(doctorDashboardRefreshSignalProvider), 1);
});
}

View File

@@ -0,0 +1,21 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:health_app/providers/data_refresh_providers.dart';
void main() {
test('patient data refresh signals advance independently', () {
final container = ProviderContainer();
addTearDown(container.dispose);
expect(container.read(exerciseDataRefreshSignalProvider), 0);
expect(container.read(medicationDataRefreshSignalProvider), 0);
expect(container.read(dietDataRefreshSignalProvider), 0);
container.read(exerciseDataRefreshSignalProvider.notifier).trigger();
container.read(medicationDataRefreshSignalProvider.notifier).trigger();
expect(container.read(exerciseDataRefreshSignalProvider), 1);
expect(container.read(medicationDataRefreshSignalProvider), 1);
expect(container.read(dietDataRefreshSignalProvider), 0);
});
}

View File

@@ -46,6 +46,22 @@ void main() {
expect(messageAtDisplayIndex(messages, 1).id, 'user');
});
test('loaded history keeps one current health card at the top', () {
final history = [
ChatMessage(
id: 'history-message',
role: 'user',
content: '历史消息',
createdAt: DateTime(2026, 1, 1),
),
];
final withCard = prependTodayHealthCard(history, now: DateTime(2026, 1, 2));
expect(withCard.first.type, MessageType.taskCard);
expect(withCard[1].id, 'history-message');
});
test('today health keeps one cached snapshot during background refresh', () {
final providers = File(
'lib/providers/data_providers.dart',
@@ -112,10 +128,7 @@ void main() {
final source = File('lib/pages/home/home_page.dart').readAsStringSync();
expect(source, contains('drawerEnableOpenDragGesture: false'));
expect(
source,
contains('onHorizontalDragUpdate: _updateConversationDrawerDrag'),
);
expect(source, contains('_updateConversationDrawerDrag,'));
expect(source, isNot(contains('_drawerDragStartX')));
});
@@ -159,4 +172,16 @@ void main() {
expect(input, isNot(contains('Border.all(color: AppColors.borderLight)')));
expect(source, isNot(contains('class _RoundToolButton')));
});
test('keyboard translates the conversation layer without state updates', () {
final home = File('lib/pages/home/home_page.dart').readAsStringSync();
final keyboard = File('lib/widgets/keyboard_lift.dart').readAsStringSync();
expect(home, contains('KeyboardTranslate('));
expect(home, contains('resizeToAvoidBottomInset: false'));
expect(keyboard, contains('class KeyboardTranslate'));
expect(keyboard, contains('Transform.translate('));
expect(keyboard, contains('child: RepaintBoundary(child: child)'));
expect(keyboard, isNot(contains('setState(')));
});
}

View File

@@ -7,6 +7,15 @@ import 'package:health_app/pages/remaining_pages.dart';
import 'package:health_app/services/health_ble_service.dart';
void main() {
test('manual entry keyboard does not relayout the trend dashboard', () {
final source = File('lib/pages/chart/trend_page.dart').readAsStringSync();
expect(source, contains('resizeToAvoidBottomInset: false'));
expect(source, contains('class _KeyboardInsetPadding'));
expect(source, contains('MediaQuery.viewInsetsOf(context).bottom'));
expect(source, contains('child: RepaintBoundary('));
});
test('unknown trend metric falls back to blood pressure', () {
expect(normalizeTrendMetricType('unknown_metric'), 'blood_pressure');
expect(normalizeTrendMetricType(null), 'blood_pressure');

View File

@@ -178,7 +178,8 @@ void main() {
);
expect(row, contains('AppModuleVisuals.exercise.icon'));
expect(row, contains('color: AppColors.exerciseLight'));
expect(row, contains('color: _phaseColor(phase).withValues(alpha: 0.10)'));
expect(row, contains('color: _phaseColor(phase)'));
expect(row, contains('left: 68'));
expect(row, isNot(contains('width: 16')));
final modules = File('lib/core/app_module_visuals.dart').readAsStringSync();