+package fitbit
+
+import (
+ "context"
+ "reflect"
+ "testing"
+ "time"
+)
+
+func TestParseSleep(t *testing.T) {
+ ctx := context.Background()
+
+ input := `{
+ "dateOfSleep": "2017-04-02",
+ "duration": 42000,
+ "efficiency": 42,
+ "isMainSleep": true,
+ "levels": {
+ "summary": {
+ "deep": {
+ "count": 42,
+ "minutes": 42,
+ "thirtyDayAvgMinutes": 42
+ },
+ "light": {
+ "count": 42,
+ "minutes": 42,
+ "thirtyDayAvgMinutes": 42
+ },
+ "rem": {
+ "count": 42,
+ "minutes": 42,
+ "thirtyDayAvgMinutes": 42
+ },
+ "wake": {
+ "count": 42,
+ "minutes": 42,
+ "thirtyDayAvgMinutes": 42
+ }
+ },
+ "data": [
+ {
+ "datetime": "2017-04-01T23:58:30.000",
+ "level": "wake",
+ "seconds": 1080
+ },
+ {
+ "datetime": "2017-04-02T00:16:30.000",
+ "level": "rem",
+ "seconds": 2000
+ }
+ ],
+ "shortData": [
+ {
+ "datetime": "2017-04-01T23:58:30.000",
+ "level": "wake",
+ "seconds": 1080
+ },
+ {
+ "datetime": "2017-04-02T00:16:30.000",
+ "level": "deep",
+ "seconds": 100
+ },
+ {
+ "datetime": "2017-04-02T00:18:10.000",
+ "level": "rem",
+ "seconds": 1900
+ }
+ ]
+ },
+ "logId": 42,
+ "minutesAfterWakeup": 42,
+ "minutesAsleep": 42,
+ "minutesAwake": 42,
+ "minutesToFallAsleep": 0,
+ "startTime": "2017-04-01T23:58:30.000",
+ "timeInBed": 42,
+ "type": "stages"
+}`
+
+ want := &Sleep{
+ Stages: []SleepStage{
+ SleepStage{
+ StartTime: time.Date(2017, time.April, 1, 23, 58, 30, 0, time.UTC),
+ EndTime: time.Date(2017, time.April, 2, 0, 16, 30, 0, time.UTC),
+ Level: SleepLevelWake,
+ },
+ SleepStage{
+ StartTime: time.Date(2017, time.April, 2, 0, 16, 30, 0, time.UTC),
+ EndTime: time.Date(2017, time.April, 2, 0, 18, 10, 0, time.UTC),
+ Level: SleepLevelDeep,
+ },
+ SleepStage{
+ StartTime: time.Date(2017, time.April, 2, 0, 18, 10, 0, time.UTC),
+ EndTime: time.Date(2017, time.April, 2, 0, 49, 50, 0, time.UTC),
+ Level: SleepLevelREM,
+ },
+ },
+ }
+
+ got, err := parseSleep(ctx, []byte(input), time.UTC)
+ if err != nil {
+ t.Errorf("parseSleep() = %v", err)
+ }
+
+ for i, stg := range got.Stages {
+ t.Logf("got.Stages[%d] = %+v", i, stg)
+ }
+ for i, stg := range want.Stages {
+ t.Logf("want.Stages[%d] = %+v", i, stg)
+ }
+
+ if !reflect.DeepEqual(got, want) {
+ t.Errorf("parseSleep() = %+v, want %+v", got, want)
+ }
+}