health_local_data_convert_test.dart 1.99 KB
import 'package:doublefeel_flutter/data/datasource/health/health_local_data_convert.dart';
import 'package:doublefeel_flutter/pigeon/health_kit_raw_data_api.g.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  group('LocalHealthDataConvert sleep intervals', () {
    test('keeps previous-day sleep start for next-day sleep statistics', () {
      final july15 = DateTime(2026, 7, 15);
      final july16 = DateTime(2026, 7, 16);
      final sleepStart = DateTime(2026, 7, 15, 23, 56);
      final midnight = DateTime(2026, 7, 16);
      final sleepEnd = DateTime(2026, 7, 16, 7);
      final intervals = [
        HealthKitRawDataPoint(
          dataType: 3,
          startTime: LocalHealthDataConvert.unixSeconds(sleepStart),
          endTime: LocalHealthDataConvert.unixSeconds(midnight),
        ),
        HealthKitRawDataPoint(
          dataType: 3,
          startTime: LocalHealthDataConvert.unixSeconds(midnight),
          endTime: LocalHealthDataConvert.unixSeconds(sleepEnd),
        ),
      ];

      final previousDayIntervals =
          LocalHealthDataConvert.completeSleepIntervalsForDay(
        july15,
        intervals,
      );
      final currentDayIntervals =
          LocalHealthDataConvert.completeSleepIntervalsForDay(
        july16,
        intervals,
      );
      final statistics = LocalHealthDataConvert.sleepStatistics(
        dateRangeType: 3,
        days: [july16],
        previousDays: const [],
        sleepIntervals: intervals,
        heartRate: const [],
      );

      expect(previousDayIntervals, isEmpty);
      expect(currentDayIntervals, hasLength(2));
      expect(
        currentDayIntervals.first.startTime,
        LocalHealthDataConvert.unixSeconds(sleepStart),
      );
      expect(
        statistics.asleepTimeTrendList?.single.asleepTime,
        LocalHealthDataConvert.unixSeconds(sleepStart),
      );
      expect(
        statistics.sleepTrendList?.single.totalTime,
        const Duration(hours: 7, minutes: 4).inSeconds,
      );
    });
  });
}