|
|
|
import 'package:doublefeel_flutter/core/result/app_result.dart';
|
|
|
|
import 'package:doublefeel_flutter/core/services/health_raw_data_core_service.dart';
|
|
|
|
import 'package:doublefeel_flutter/data/datasource/health/health_local_data_convert.dart';
|
|
|
|
import 'package:doublefeel_flutter/data/datasource/health/health_local_datasource.dart';
|
|
|
|
import 'package:doublefeel_flutter/data/models/enums/app_enums.dart';
|
|
|
|
import 'package:doublefeel_flutter/pigeon/health_kit_api.g.dart';
|
|
|
|
import 'package:doublefeel_flutter/pigeon/health_kit_raw_data_api.g.dart';
|
|
...
|
...
|
@@ -411,6 +413,38 @@ void main() { |
|
|
|
expect(api.sleepUploadCallCount, 1);
|
|
|
|
expect(rows.sleepRows.single['uploaded'], 1);
|
|
|
|
});
|
|
|
|
|
|
|
|
test('local data source returns earliest local hr start time', () async {
|
|
|
|
const base = 1800000000;
|
|
|
|
final api = _FakeHealthKitRawDataHostApi();
|
|
|
|
final store = _MemoryHealthRawStressLocalStore();
|
|
|
|
final service = HealthRawDataCoreService(
|
|
|
|
healthApi: _FakeHealthKitHostApi(),
|
|
|
|
rawDataApi: api,
|
|
|
|
localStore: store,
|
|
|
|
userIdProvider: () => 42,
|
|
|
|
uploadResultsAfterCalculation: false,
|
|
|
|
);
|
|
|
|
await store.upsertResult(
|
|
|
|
HealthRawStressCalculationResult(
|
|
|
|
userId: 42,
|
|
|
|
hrvStressPoints: const <HealthRawHrvStressPoint>[],
|
|
|
|
realtimeStressPoints: [
|
|
|
|
_realtimeStressPoint(base + 200),
|
|
|
|
_realtimeStressPoint(base + 100),
|
|
|
|
],
|
|
|
|
dailyStressPoints: const <HealthRawDailyStressPoint>[],
|
|
|
|
),
|
|
|
|
);
|
|
|
|
|
|
|
|
final result = await LocalHealthDataSource(coreService: service)
|
|
|
|
.getHealthDataEverUploaded();
|
|
|
|
|
|
|
|
expect(result, isA<AppSuccess>());
|
|
|
|
final data = (result as AppSuccess).data;
|
|
|
|
expect(data.flag, isTrue);
|
|
|
|
expect(data.startTime, base + 100);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
HealthKitRawDataPoint _point(
|
|
...
|
...
|
@@ -427,6 +461,17 @@ HealthKitRawDataPoint _point( |
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
HealthRawRealtimeStressPoint _realtimeStressPoint(int time) {
|
|
|
|
return HealthRawRealtimeStressPoint(
|
|
|
|
userId: 42,
|
|
|
|
rawEndTime: time,
|
|
|
|
rawHr: 70,
|
|
|
|
result: 30,
|
|
|
|
sourceStartTime: time,
|
|
|
|
sourceEndTime: time,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
class _FakeHealthKitRawDataHostApi extends HealthKitRawDataHostApi {
|
|
|
|
final Map<int, List<HealthKitRawDataPoint>> _pointsByType = {};
|
|
|
|
final List<HealthKitRawWorkoutDataPoint> _workoutPoints = [];
|
|
...
|
...
|
@@ -436,6 +481,7 @@ class _FakeHealthKitRawDataHostApi extends HealthKitRawDataHostApi { |
|
|
|
var workoutCallCount = 0;
|
|
|
|
var sleepUploadCallCount = 0;
|
|
|
|
var sleepUploadUntil = 0;
|
|
|
|
var hasData = true;
|
|
|
|
|
|
|
|
void setPoints(int dataType, List<HealthKitRawDataPoint> points) {
|
|
|
|
_pointsByType[dataType] = points;
|
|
...
|
...
|
@@ -458,6 +504,9 @@ class _FakeHealthKitRawDataHostApi extends HealthKitRawDataHostApi { |
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
Future<bool> hasHealthData() async => hasData;
|
|
|
|
|
|
|
|
@override
|
|
|
|
Future<List<HealthKitRawDataPoint>> getHealthKitRawData(
|
|
|
|
int dataType,
|
|
|
|
int startTime,
|
|
...
|
...
|
@@ -777,6 +826,13 @@ class _MemoryHealthRawStressLocalStore extends HealthRawStressLocalStore { |
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
Future<int?> earliestRealtimeRawEndTime(int userId) async {
|
|
|
|
final points = _realtime[userId];
|
|
|
|
if (points == null || points.isEmpty) return null;
|
|
|
|
return points.first.rawEndTime;
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
Future<int?> latestSleepResultTime(int userId) async {
|
|
|
|
final results = _sleep[userId];
|
|
|
|
if (results == null || results.isEmpty) return null;
|
...
|
...
|
|