mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-09 13:01:00 +00:00
test(dashboard): pin the summary before moving its builder
This commit is contained in:
1 parent
af5cf1ace2
commit
1b32217844
9 files changed
+2135
No files matched your search
@@ -0,0 +1,383 @@
|
||||
{
|
||||
"status": 200,
|
||||
"body": {
|
||||
"data": {
|
||||
"greeting": {
|
||||
"salutation": "Hi, Sam",
|
||||
"date": "anchor+0d+12:00:00"
|
||||
},
|
||||
"streak": {
|
||||
"currentDays": 120,
|
||||
"longest": 120,
|
||||
"label": "days in a row"
|
||||
},
|
||||
"compliance": {
|
||||
"scheduledToday": 2,
|
||||
"takenToday": 0
|
||||
},
|
||||
"highlightInsight": null,
|
||||
"metrics": [
|
||||
{
|
||||
"id": "weight",
|
||||
"kind": "weight",
|
||||
"titleKey": "dashboard.metric.title.weight",
|
||||
"latestValue": 82,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.weight",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
82.2,
|
||||
82.2,
|
||||
82.2,
|
||||
82.1,
|
||||
82.1,
|
||||
82,
|
||||
82
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 60,
|
||||
"lastSeenAt": "anchor+0d+06:30:00",
|
||||
"direction": {
|
||||
"direction": "up-bad",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "neutral"
|
||||
},
|
||||
{
|
||||
"id": "bp",
|
||||
"kind": "bloodPressure",
|
||||
"titleKey": "dashboard.metric.title.bloodPressure",
|
||||
"latestValue": 123,
|
||||
"secondaryValue": 78,
|
||||
"unitKey": "dashboard.metric.unit.bloodPressure",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "down",
|
||||
"sparkline": [
|
||||
135,
|
||||
128,
|
||||
136,
|
||||
129,
|
||||
137,
|
||||
130,
|
||||
123
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 182,
|
||||
"lastSeenAt": "anchor+0d+07:00:00",
|
||||
"direction": {
|
||||
"direction": "up-bad",
|
||||
"targetPosition": "above",
|
||||
"basis": "profile_default"
|
||||
},
|
||||
"trendSentiment": "positive"
|
||||
},
|
||||
{
|
||||
"id": "pulse",
|
||||
"kind": "pulse",
|
||||
"titleKey": "dashboard.metric.title.pulse",
|
||||
"latestValue": 64,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.pulse",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
64,
|
||||
69,
|
||||
68,
|
||||
67,
|
||||
66,
|
||||
65,
|
||||
64
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 60,
|
||||
"lastSeenAt": "anchor+0d+07:01:00",
|
||||
"direction": {
|
||||
"direction": "hold",
|
||||
"targetPosition": "inside",
|
||||
"basis": "profile_default"
|
||||
},
|
||||
"trendSentiment": "positive"
|
||||
},
|
||||
{
|
||||
"id": "bodyFat",
|
||||
"kind": "bodyFat",
|
||||
"titleKey": "dashboard.metric.title.bodyFat",
|
||||
"latestValue": 24,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.bodyFat",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
24.8,
|
||||
24.7,
|
||||
24.6,
|
||||
24.4,
|
||||
24.3,
|
||||
24.1,
|
||||
24
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 9,
|
||||
"lastSeenAt": "anchor+0d+06:31:00",
|
||||
"direction": {
|
||||
"direction": "up-bad",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "neutral"
|
||||
},
|
||||
{
|
||||
"id": "glucose",
|
||||
"kind": "glucose",
|
||||
"titleKey": "dashboard.metric.title.glucose",
|
||||
"latestValue": 128,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.glucose",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "down",
|
||||
"sparkline": [
|
||||
117,
|
||||
115.33333333333333,
|
||||
113.66666666666667,
|
||||
113.33333333333333,
|
||||
111.66666666666667,
|
||||
110,
|
||||
108.33333333333333
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 60,
|
||||
"lastSeenAt": "anchor+0d+11:00:00",
|
||||
"direction": {
|
||||
"direction": "up-bad",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "positive"
|
||||
},
|
||||
{
|
||||
"id": "sleep",
|
||||
"kind": "sleep",
|
||||
"titleKey": "dashboard.metric.title.sleep",
|
||||
"latestValue": 5.92,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.sleep",
|
||||
"unit": "h",
|
||||
"sleepStages": {
|
||||
"CORE": 3.33,
|
||||
"DEEP": 1.17,
|
||||
"REM": 1.42,
|
||||
"AWAKE": 0.2
|
||||
},
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
6.25,
|
||||
6.17,
|
||||
6.67,
|
||||
6.67,
|
||||
7.17,
|
||||
6.25,
|
||||
5.92
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 85,
|
||||
"lastSeenAt": "anchor+0d+04:15:00",
|
||||
"direction": {
|
||||
"direction": "up-good",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "neutral"
|
||||
},
|
||||
{
|
||||
"id": "steps",
|
||||
"kind": "steps",
|
||||
"titleKey": "dashboard.metric.title.steps",
|
||||
"latestValue": 6000,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.steps",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "down",
|
||||
"sparkline": [
|
||||
8238,
|
||||
7865,
|
||||
7492,
|
||||
7119,
|
||||
6746,
|
||||
6373,
|
||||
6000
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 30,
|
||||
"lastSeenAt": "anchor+0d+09:00:00",
|
||||
"direction": {
|
||||
"direction": "up-good",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "negative"
|
||||
},
|
||||
{
|
||||
"id": "oxygenSaturation",
|
||||
"kind": "oxygenSaturation",
|
||||
"titleKey": "dashboard.metric.title.oxygenSaturation",
|
||||
"latestValue": 96,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.oxygenSaturation",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
96,
|
||||
98,
|
||||
97,
|
||||
96,
|
||||
98,
|
||||
97,
|
||||
96
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 10,
|
||||
"lastSeenAt": "anchor+0d+04:40:00",
|
||||
"direction": {
|
||||
"direction": "up-good",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "neutral"
|
||||
},
|
||||
{
|
||||
"id": "mood",
|
||||
"kind": "mood",
|
||||
"titleKey": "dashboard.metric.title.mood",
|
||||
"latestValue": 1,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.mood",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "down",
|
||||
"sparkline": [
|
||||
4,
|
||||
1,
|
||||
3,
|
||||
5,
|
||||
2,
|
||||
4,
|
||||
1
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 45,
|
||||
"lastSeenAt": "anchor+0d+00:00:00",
|
||||
"direction": {
|
||||
"direction": "up-good",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "negative"
|
||||
},
|
||||
{
|
||||
"id": "bmi",
|
||||
"kind": "bmi",
|
||||
"titleKey": "dashboard.metric.title.bmi",
|
||||
"latestValue": 25.9,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.bmi",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
25.9,
|
||||
25.9,
|
||||
25.9,
|
||||
25.9,
|
||||
25.9,
|
||||
25.9,
|
||||
25.9
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 60,
|
||||
"lastSeenAt": "anchor+0d+06:30:00",
|
||||
"direction": {
|
||||
"direction": "up-bad",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "neutral"
|
||||
}
|
||||
],
|
||||
"sleepRhythm": {
|
||||
"sleepDebt": {
|
||||
"state": "ready",
|
||||
"debtMinutes": 145,
|
||||
"needMinutes": 420,
|
||||
"nightsCounted": 5,
|
||||
"windowNights": 5,
|
||||
"nightsUntilReady": 0,
|
||||
"source": "COMPUTED"
|
||||
},
|
||||
"chronotype": {
|
||||
"state": "ready",
|
||||
"msfMinutes": 63.33521977432794,
|
||||
"msfScMinutes": 63.335219774327925,
|
||||
"band": "extreme_early",
|
||||
"socialJetlagMinutes": 2.402527629787599,
|
||||
"freeNightsCounted": 6,
|
||||
"workNightsCounted": 15,
|
||||
"freeNightsUntilReady": 0
|
||||
},
|
||||
"averagePerNight": {
|
||||
"state": "ready",
|
||||
"averageMinutes": 388,
|
||||
"nightsCounted": 21,
|
||||
"nightsUntilReady": 0
|
||||
}
|
||||
},
|
||||
"lastUpdated": "anchor+0d+12:00:00"
|
||||
},
|
||||
"error": null
|
||||
},
|
||||
"events": [
|
||||
{
|
||||
"status": 200,
|
||||
"action": {
|
||||
"name": "dashboard.summary"
|
||||
},
|
||||
"meta": {
|
||||
"cache.analytics.key_hash": 3272136333,
|
||||
"cache.analytics.outcome": "miss",
|
||||
"dashboard.sub_allTime_ms": 0,
|
||||
"dashboard.sub_bmi_ms": 0,
|
||||
"dashboard.sub_latestEver_ms": 0,
|
||||
"dashboard.sub_medsToday_ms": 0,
|
||||
"dashboard.sub_moodSeries_ms": 0,
|
||||
"dashboard.sub_sleepNights_ms": 0,
|
||||
"dashboard.sub_sparkline_ms": 0,
|
||||
"dashboard.sub_streakDays_ms": 0,
|
||||
"dashboard.sub_streakIntakes_ms": 0,
|
||||
"metrics_emitted": 10,
|
||||
"metrics_gated": 0
|
||||
},
|
||||
"warnings": null,
|
||||
"error": null
|
||||
}
|
||||
],
|
||||
"effects": []
|
||||
}
|
||||
@@ -0,0 +1,374 @@
|
||||
{
|
||||
"status": 200,
|
||||
"body": {
|
||||
"data": {
|
||||
"greeting": {
|
||||
"salutation": "Hi, Sam",
|
||||
"date": "anchor+0d+12:00:00"
|
||||
},
|
||||
"streak": {
|
||||
"currentDays": 120,
|
||||
"longest": 120,
|
||||
"label": "days in a row"
|
||||
},
|
||||
"compliance": {
|
||||
"scheduledToday": 2,
|
||||
"takenToday": 0
|
||||
},
|
||||
"highlightInsight": null,
|
||||
"metrics": [
|
||||
{
|
||||
"id": "weight",
|
||||
"kind": "weight",
|
||||
"titleKey": "dashboard.metric.title.weight",
|
||||
"latestValue": 82,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.weight",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
82.2,
|
||||
82.2,
|
||||
82.2,
|
||||
82.1,
|
||||
82.1,
|
||||
82,
|
||||
82
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 60,
|
||||
"lastSeenAt": "anchor+0d+06:30:00",
|
||||
"direction": {
|
||||
"direction": "up-bad",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "neutral"
|
||||
},
|
||||
{
|
||||
"id": "bp",
|
||||
"kind": "bloodPressure",
|
||||
"titleKey": "dashboard.metric.title.bloodPressure",
|
||||
"latestValue": 123,
|
||||
"secondaryValue": 78,
|
||||
"unitKey": "dashboard.metric.unit.bloodPressure",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "down",
|
||||
"sparkline": [
|
||||
135,
|
||||
128,
|
||||
136,
|
||||
129,
|
||||
137,
|
||||
130,
|
||||
123
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 182,
|
||||
"lastSeenAt": "anchor+0d+07:00:00",
|
||||
"direction": {
|
||||
"direction": "up-bad",
|
||||
"targetPosition": "above",
|
||||
"basis": "profile_default"
|
||||
},
|
||||
"trendSentiment": "positive"
|
||||
},
|
||||
{
|
||||
"id": "pulse",
|
||||
"kind": "pulse",
|
||||
"titleKey": "dashboard.metric.title.pulse",
|
||||
"latestValue": 64,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.pulse",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
64,
|
||||
69,
|
||||
68,
|
||||
67,
|
||||
66,
|
||||
65,
|
||||
64
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 60,
|
||||
"lastSeenAt": "anchor+0d+07:01:00",
|
||||
"direction": {
|
||||
"direction": "hold",
|
||||
"targetPosition": "inside",
|
||||
"basis": "profile_default"
|
||||
},
|
||||
"trendSentiment": "positive"
|
||||
},
|
||||
{
|
||||
"id": "bodyFat",
|
||||
"kind": "bodyFat",
|
||||
"titleKey": "dashboard.metric.title.bodyFat",
|
||||
"latestValue": 24,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.bodyFat",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
24.8,
|
||||
24.7,
|
||||
24.6,
|
||||
24.4,
|
||||
24.3,
|
||||
24.1,
|
||||
24
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 9,
|
||||
"lastSeenAt": "anchor+0d+06:31:00",
|
||||
"direction": {
|
||||
"direction": "up-bad",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "neutral"
|
||||
},
|
||||
{
|
||||
"id": "glucose",
|
||||
"kind": "glucose",
|
||||
"titleKey": "dashboard.metric.title.glucose",
|
||||
"latestValue": 128,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.glucose",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "down",
|
||||
"sparkline": [
|
||||
117,
|
||||
115.33333333333333,
|
||||
113.66666666666667,
|
||||
113.33333333333333,
|
||||
111.66666666666667,
|
||||
110,
|
||||
108.33333333333333
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 60,
|
||||
"lastSeenAt": "anchor+0d+11:00:00",
|
||||
"direction": {
|
||||
"direction": "up-bad",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "positive"
|
||||
},
|
||||
{
|
||||
"id": "sleep",
|
||||
"kind": "sleep",
|
||||
"titleKey": "dashboard.metric.title.sleep",
|
||||
"latestValue": 5.92,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.sleep",
|
||||
"unit": "h",
|
||||
"sleepStages": {
|
||||
"CORE": 3.33,
|
||||
"DEEP": 1.17,
|
||||
"REM": 1.42,
|
||||
"AWAKE": 0.2
|
||||
},
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
6.25,
|
||||
6.17,
|
||||
6.67,
|
||||
6.67,
|
||||
7.17,
|
||||
6.25,
|
||||
5.92
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 85,
|
||||
"lastSeenAt": "anchor+0d+04:15:00",
|
||||
"direction": {
|
||||
"direction": "up-good",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "neutral"
|
||||
},
|
||||
{
|
||||
"id": "steps",
|
||||
"kind": "steps",
|
||||
"titleKey": "dashboard.metric.title.steps",
|
||||
"latestValue": 6000,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.steps",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "down",
|
||||
"sparkline": [
|
||||
8238,
|
||||
7865,
|
||||
7492,
|
||||
7119,
|
||||
6746,
|
||||
6373,
|
||||
6000
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 30,
|
||||
"lastSeenAt": "anchor+0d+09:00:00",
|
||||
"direction": {
|
||||
"direction": "up-good",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "negative"
|
||||
},
|
||||
{
|
||||
"id": "oxygenSaturation",
|
||||
"kind": "oxygenSaturation",
|
||||
"titleKey": "dashboard.metric.title.oxygenSaturation",
|
||||
"latestValue": 96,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.oxygenSaturation",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
96,
|
||||
98,
|
||||
97,
|
||||
96,
|
||||
98,
|
||||
97,
|
||||
96
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 10,
|
||||
"lastSeenAt": "anchor+0d+04:40:00",
|
||||
"direction": {
|
||||
"direction": "up-good",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "neutral"
|
||||
},
|
||||
{
|
||||
"id": "mood",
|
||||
"kind": "mood",
|
||||
"titleKey": "dashboard.metric.title.mood",
|
||||
"latestValue": 1,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.mood",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "down",
|
||||
"sparkline": [
|
||||
4,
|
||||
1,
|
||||
3,
|
||||
5,
|
||||
2,
|
||||
4,
|
||||
1
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 45,
|
||||
"lastSeenAt": "anchor+0d+00:00:00",
|
||||
"direction": {
|
||||
"direction": "up-good",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "negative"
|
||||
},
|
||||
{
|
||||
"id": "bmi",
|
||||
"kind": "bmi",
|
||||
"titleKey": "dashboard.metric.title.bmi",
|
||||
"latestValue": 25.9,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.bmi",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
25.9,
|
||||
25.9,
|
||||
25.9,
|
||||
25.9,
|
||||
25.9,
|
||||
25.9,
|
||||
25.9
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 60,
|
||||
"lastSeenAt": "anchor+0d+06:30:00",
|
||||
"direction": {
|
||||
"direction": "up-bad",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "neutral"
|
||||
}
|
||||
],
|
||||
"sleepRhythm": {
|
||||
"sleepDebt": {
|
||||
"state": "ready",
|
||||
"debtMinutes": 145,
|
||||
"needMinutes": 420,
|
||||
"nightsCounted": 5,
|
||||
"windowNights": 5,
|
||||
"nightsUntilReady": 0,
|
||||
"source": "COMPUTED"
|
||||
},
|
||||
"chronotype": {
|
||||
"state": "ready",
|
||||
"msfMinutes": 63.33521977432794,
|
||||
"msfScMinutes": 63.335219774327925,
|
||||
"band": "extreme_early",
|
||||
"socialJetlagMinutes": 2.402527629787599,
|
||||
"freeNightsCounted": 6,
|
||||
"workNightsCounted": 15,
|
||||
"freeNightsUntilReady": 0
|
||||
},
|
||||
"averagePerNight": {
|
||||
"state": "ready",
|
||||
"averageMinutes": 388,
|
||||
"nightsCounted": 21,
|
||||
"nightsUntilReady": 0
|
||||
}
|
||||
},
|
||||
"lastUpdated": "anchor+0d+12:00:00"
|
||||
},
|
||||
"error": null
|
||||
},
|
||||
"events": [
|
||||
{
|
||||
"status": 200,
|
||||
"action": {
|
||||
"name": "dashboard.summary"
|
||||
},
|
||||
"meta": {
|
||||
"cache.analytics.key_hash": 3272136333,
|
||||
"cache.analytics.outcome": "hit",
|
||||
"metrics_emitted": 10,
|
||||
"metrics_gated": 0
|
||||
},
|
||||
"warnings": null,
|
||||
"error": null
|
||||
}
|
||||
],
|
||||
"effects": []
|
||||
}
|
||||
+279
@@ -0,0 +1,279 @@
|
||||
{
|
||||
"status": 200,
|
||||
"body": {
|
||||
"data": {
|
||||
"greeting": {
|
||||
"salutation": "Hi, Sam",
|
||||
"date": "anchor+0d+12:00:00"
|
||||
},
|
||||
"streak": {
|
||||
"currentDays": 120,
|
||||
"longest": 120,
|
||||
"label": "days in a row"
|
||||
},
|
||||
"compliance": {
|
||||
"scheduledToday": 2,
|
||||
"takenToday": 0
|
||||
},
|
||||
"highlightInsight": null,
|
||||
"metrics": [
|
||||
{
|
||||
"id": "weight",
|
||||
"kind": "weight",
|
||||
"titleKey": "dashboard.metric.title.weight",
|
||||
"latestValue": 82,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.weight",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
82.2,
|
||||
82.2,
|
||||
82.2,
|
||||
82.1,
|
||||
82.1,
|
||||
82,
|
||||
82
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 60,
|
||||
"lastSeenAt": "anchor+0d+06:30:00",
|
||||
"direction": {
|
||||
"direction": "up-bad",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "neutral"
|
||||
},
|
||||
{
|
||||
"id": "bp",
|
||||
"kind": "bloodPressure",
|
||||
"titleKey": "dashboard.metric.title.bloodPressure",
|
||||
"latestValue": 123,
|
||||
"secondaryValue": 78,
|
||||
"unitKey": "dashboard.metric.unit.bloodPressure",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "down",
|
||||
"sparkline": [
|
||||
135,
|
||||
128,
|
||||
136,
|
||||
129,
|
||||
137,
|
||||
130,
|
||||
123
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 182,
|
||||
"lastSeenAt": "anchor+0d+07:00:00",
|
||||
"direction": {
|
||||
"direction": "up-bad",
|
||||
"targetPosition": "above",
|
||||
"basis": "profile_default"
|
||||
},
|
||||
"trendSentiment": "positive"
|
||||
},
|
||||
{
|
||||
"id": "pulse",
|
||||
"kind": "pulse",
|
||||
"titleKey": "dashboard.metric.title.pulse",
|
||||
"latestValue": 64,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.pulse",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
64,
|
||||
69,
|
||||
68,
|
||||
67,
|
||||
66,
|
||||
65,
|
||||
64
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 60,
|
||||
"lastSeenAt": "anchor+0d+07:01:00",
|
||||
"direction": {
|
||||
"direction": "hold",
|
||||
"targetPosition": "inside",
|
||||
"basis": "profile_default"
|
||||
},
|
||||
"trendSentiment": "positive"
|
||||
},
|
||||
{
|
||||
"id": "bodyFat",
|
||||
"kind": "bodyFat",
|
||||
"titleKey": "dashboard.metric.title.bodyFat",
|
||||
"latestValue": 24,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.bodyFat",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
24.8,
|
||||
24.7,
|
||||
24.6,
|
||||
24.4,
|
||||
24.3,
|
||||
24.1,
|
||||
24
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 9,
|
||||
"lastSeenAt": "anchor+0d+06:31:00",
|
||||
"direction": {
|
||||
"direction": "up-bad",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "neutral"
|
||||
},
|
||||
{
|
||||
"id": "steps",
|
||||
"kind": "steps",
|
||||
"titleKey": "dashboard.metric.title.steps",
|
||||
"latestValue": 6000,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.steps",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "down",
|
||||
"sparkline": [
|
||||
8238,
|
||||
7865,
|
||||
7492,
|
||||
7119,
|
||||
6746,
|
||||
6373,
|
||||
6000
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 30,
|
||||
"lastSeenAt": "anchor+0d+09:00:00",
|
||||
"direction": {
|
||||
"direction": "up-good",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "negative"
|
||||
},
|
||||
{
|
||||
"id": "oxygenSaturation",
|
||||
"kind": "oxygenSaturation",
|
||||
"titleKey": "dashboard.metric.title.oxygenSaturation",
|
||||
"latestValue": 96,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.oxygenSaturation",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
96,
|
||||
98,
|
||||
97,
|
||||
96,
|
||||
98,
|
||||
97,
|
||||
96
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 10,
|
||||
"lastSeenAt": "anchor+0d+04:40:00",
|
||||
"direction": {
|
||||
"direction": "up-good",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "neutral"
|
||||
},
|
||||
{
|
||||
"id": "bmi",
|
||||
"kind": "bmi",
|
||||
"titleKey": "dashboard.metric.title.bmi",
|
||||
"latestValue": 25.9,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.bmi",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
25.9,
|
||||
25.9,
|
||||
25.9,
|
||||
25.9,
|
||||
25.9,
|
||||
25.9,
|
||||
25.9
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 60,
|
||||
"lastSeenAt": "anchor+0d+06:30:00",
|
||||
"direction": {
|
||||
"direction": "up-bad",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "neutral"
|
||||
}
|
||||
],
|
||||
"sleepRhythm": {
|
||||
"sleepDebt": {
|
||||
"state": "ready",
|
||||
"debtMinutes": 145,
|
||||
"needMinutes": 420,
|
||||
"nightsCounted": 5,
|
||||
"windowNights": 5,
|
||||
"nightsUntilReady": 0,
|
||||
"source": "COMPUTED"
|
||||
},
|
||||
"chronotype": {
|
||||
"state": "ready",
|
||||
"msfMinutes": 63.33521977432794,
|
||||
"msfScMinutes": 63.335219774327925,
|
||||
"band": "extreme_early",
|
||||
"socialJetlagMinutes": 2.402527629787599,
|
||||
"freeNightsCounted": 6,
|
||||
"workNightsCounted": 15,
|
||||
"freeNightsUntilReady": 0
|
||||
},
|
||||
"averagePerNight": {
|
||||
"state": "ready",
|
||||
"averageMinutes": 388,
|
||||
"nightsCounted": 21,
|
||||
"nightsUntilReady": 0
|
||||
}
|
||||
},
|
||||
"lastUpdated": "anchor+0d+12:00:00"
|
||||
},
|
||||
"error": null
|
||||
},
|
||||
"events": [
|
||||
{
|
||||
"status": 200,
|
||||
"action": {
|
||||
"name": "dashboard.summary"
|
||||
},
|
||||
"meta": {
|
||||
"cache.analytics.key_hash": 3272136333,
|
||||
"cache.analytics.outcome": "hit",
|
||||
"metrics_emitted": 7,
|
||||
"metrics_gated": 3
|
||||
},
|
||||
"warnings": null,
|
||||
"error": null
|
||||
}
|
||||
],
|
||||
"effects": []
|
||||
}
|
||||
+374
@@ -0,0 +1,374 @@
|
||||
{
|
||||
"status": 200,
|
||||
"body": {
|
||||
"data": {
|
||||
"greeting": {
|
||||
"salutation": "Hi, Sam",
|
||||
"date": "anchor+0d+12:00:00"
|
||||
},
|
||||
"streak": {
|
||||
"currentDays": 120,
|
||||
"longest": 120,
|
||||
"label": "days in a row"
|
||||
},
|
||||
"compliance": {
|
||||
"scheduledToday": 2,
|
||||
"takenToday": 0
|
||||
},
|
||||
"highlightInsight": null,
|
||||
"metrics": [
|
||||
{
|
||||
"id": "weight",
|
||||
"kind": "weight",
|
||||
"titleKey": "dashboard.metric.title.weight",
|
||||
"latestValue": 82,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.weight",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
82.2,
|
||||
82.2,
|
||||
82.2,
|
||||
82.1,
|
||||
82.1,
|
||||
82,
|
||||
82
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 60,
|
||||
"lastSeenAt": "anchor+0d+06:30:00",
|
||||
"direction": {
|
||||
"direction": "up-bad",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "neutral"
|
||||
},
|
||||
{
|
||||
"id": "bp",
|
||||
"kind": "bloodPressure",
|
||||
"titleKey": "dashboard.metric.title.bloodPressure",
|
||||
"latestValue": 123,
|
||||
"secondaryValue": 78,
|
||||
"unitKey": "dashboard.metric.unit.bloodPressure",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "down",
|
||||
"sparkline": [
|
||||
135,
|
||||
128,
|
||||
136,
|
||||
129,
|
||||
137,
|
||||
130,
|
||||
123
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 182,
|
||||
"lastSeenAt": "anchor+0d+07:00:00",
|
||||
"direction": {
|
||||
"direction": "up-bad",
|
||||
"targetPosition": "above",
|
||||
"basis": "profile_default"
|
||||
},
|
||||
"trendSentiment": "positive"
|
||||
},
|
||||
{
|
||||
"id": "pulse",
|
||||
"kind": "pulse",
|
||||
"titleKey": "dashboard.metric.title.pulse",
|
||||
"latestValue": 64,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.pulse",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
64,
|
||||
69,
|
||||
68,
|
||||
67,
|
||||
66,
|
||||
65,
|
||||
64
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 60,
|
||||
"lastSeenAt": "anchor+0d+07:01:00",
|
||||
"direction": {
|
||||
"direction": "hold",
|
||||
"targetPosition": "inside",
|
||||
"basis": "profile_default"
|
||||
},
|
||||
"trendSentiment": "positive"
|
||||
},
|
||||
{
|
||||
"id": "bodyFat",
|
||||
"kind": "bodyFat",
|
||||
"titleKey": "dashboard.metric.title.bodyFat",
|
||||
"latestValue": 24,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.bodyFat",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
24.8,
|
||||
24.7,
|
||||
24.6,
|
||||
24.4,
|
||||
24.3,
|
||||
24.1,
|
||||
24
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 9,
|
||||
"lastSeenAt": "anchor+0d+06:31:00",
|
||||
"direction": {
|
||||
"direction": "up-bad",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "neutral"
|
||||
},
|
||||
{
|
||||
"id": "glucose",
|
||||
"kind": "glucose",
|
||||
"titleKey": "dashboard.metric.title.glucose",
|
||||
"latestValue": 128,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.glucose",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "down",
|
||||
"sparkline": [
|
||||
117,
|
||||
115.33333333333333,
|
||||
113.66666666666667,
|
||||
113.33333333333333,
|
||||
111.66666666666667,
|
||||
110,
|
||||
108.33333333333333
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 60,
|
||||
"lastSeenAt": "anchor+0d+11:00:00",
|
||||
"direction": {
|
||||
"direction": "up-bad",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "positive"
|
||||
},
|
||||
{
|
||||
"id": "sleep",
|
||||
"kind": "sleep",
|
||||
"titleKey": "dashboard.metric.title.sleep",
|
||||
"latestValue": 5.92,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.sleep",
|
||||
"unit": "h",
|
||||
"sleepStages": {
|
||||
"CORE": 3.33,
|
||||
"DEEP": 1.17,
|
||||
"REM": 1.42,
|
||||
"AWAKE": 0.2
|
||||
},
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
6.25,
|
||||
6.17,
|
||||
6.67,
|
||||
6.67,
|
||||
7.17,
|
||||
6.25,
|
||||
5.92
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 85,
|
||||
"lastSeenAt": "anchor+0d+04:15:00",
|
||||
"direction": {
|
||||
"direction": "up-good",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "neutral"
|
||||
},
|
||||
{
|
||||
"id": "steps",
|
||||
"kind": "steps",
|
||||
"titleKey": "dashboard.metric.title.steps",
|
||||
"latestValue": 6000,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.steps",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "down",
|
||||
"sparkline": [
|
||||
8238,
|
||||
7865,
|
||||
7492,
|
||||
7119,
|
||||
6746,
|
||||
6373,
|
||||
6000
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 30,
|
||||
"lastSeenAt": "anchor+0d+09:00:00",
|
||||
"direction": {
|
||||
"direction": "up-good",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "negative"
|
||||
},
|
||||
{
|
||||
"id": "oxygenSaturation",
|
||||
"kind": "oxygenSaturation",
|
||||
"titleKey": "dashboard.metric.title.oxygenSaturation",
|
||||
"latestValue": 96,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.oxygenSaturation",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
96,
|
||||
98,
|
||||
97,
|
||||
96,
|
||||
98,
|
||||
97,
|
||||
96
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 10,
|
||||
"lastSeenAt": "anchor+0d+04:40:00",
|
||||
"direction": {
|
||||
"direction": "up-good",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "neutral"
|
||||
},
|
||||
{
|
||||
"id": "mood",
|
||||
"kind": "mood",
|
||||
"titleKey": "dashboard.metric.title.mood",
|
||||
"latestValue": 1,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.mood",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "down",
|
||||
"sparkline": [
|
||||
4,
|
||||
1,
|
||||
3,
|
||||
5,
|
||||
2,
|
||||
4,
|
||||
1
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 45,
|
||||
"lastSeenAt": "anchor+0d+00:00:00",
|
||||
"direction": {
|
||||
"direction": "up-good",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "negative"
|
||||
},
|
||||
{
|
||||
"id": "bmi",
|
||||
"kind": "bmi",
|
||||
"titleKey": "dashboard.metric.title.bmi",
|
||||
"latestValue": 25.9,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.bmi",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
25.9,
|
||||
25.9,
|
||||
25.9,
|
||||
25.9,
|
||||
25.9,
|
||||
25.9,
|
||||
25.9
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 60,
|
||||
"lastSeenAt": "anchor+0d+06:30:00",
|
||||
"direction": {
|
||||
"direction": "up-bad",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "neutral"
|
||||
}
|
||||
],
|
||||
"sleepRhythm": {
|
||||
"sleepDebt": {
|
||||
"state": "ready",
|
||||
"debtMinutes": 145,
|
||||
"needMinutes": 420,
|
||||
"nightsCounted": 5,
|
||||
"windowNights": 5,
|
||||
"nightsUntilReady": 0,
|
||||
"source": "COMPUTED"
|
||||
},
|
||||
"chronotype": {
|
||||
"state": "ready",
|
||||
"msfMinutes": 63.33521977432794,
|
||||
"msfScMinutes": 63.335219774327925,
|
||||
"band": "extreme_early",
|
||||
"socialJetlagMinutes": 2.402527629787599,
|
||||
"freeNightsCounted": 6,
|
||||
"workNightsCounted": 15,
|
||||
"freeNightsUntilReady": 0
|
||||
},
|
||||
"averagePerNight": {
|
||||
"state": "ready",
|
||||
"averageMinutes": 388,
|
||||
"nightsCounted": 21,
|
||||
"nightsUntilReady": 0
|
||||
}
|
||||
},
|
||||
"lastUpdated": "anchor+0d+12:00:00"
|
||||
},
|
||||
"error": null
|
||||
},
|
||||
"events": [
|
||||
{
|
||||
"status": 200,
|
||||
"action": {
|
||||
"name": "dashboard.summary"
|
||||
},
|
||||
"meta": {
|
||||
"cache.analytics.key_hash": 3272136333,
|
||||
"cache.analytics.outcome": "hit",
|
||||
"metrics_emitted": 10,
|
||||
"metrics_gated": 0
|
||||
},
|
||||
"warnings": null,
|
||||
"error": null
|
||||
}
|
||||
],
|
||||
"effects": []
|
||||
}
|
||||
@@ -0,0 +1,374 @@
|
||||
{
|
||||
"status": 200,
|
||||
"body": {
|
||||
"data": {
|
||||
"greeting": {
|
||||
"salutation": "Hi, Sam",
|
||||
"date": "anchor+0d+12:00:00"
|
||||
},
|
||||
"streak": {
|
||||
"currentDays": 120,
|
||||
"longest": 120,
|
||||
"label": "days in a row"
|
||||
},
|
||||
"compliance": {
|
||||
"scheduledToday": 2,
|
||||
"takenToday": 0
|
||||
},
|
||||
"highlightInsight": null,
|
||||
"metrics": [
|
||||
{
|
||||
"id": "weight",
|
||||
"kind": "weight",
|
||||
"titleKey": "dashboard.metric.title.weight",
|
||||
"latestValue": 82,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.weight",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
82.2,
|
||||
82.2,
|
||||
82.2,
|
||||
82.1,
|
||||
82.1,
|
||||
82,
|
||||
82
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 60,
|
||||
"lastSeenAt": "anchor+0d+06:30:00",
|
||||
"direction": {
|
||||
"direction": "up-bad",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "neutral"
|
||||
},
|
||||
{
|
||||
"id": "bp",
|
||||
"kind": "bloodPressure",
|
||||
"titleKey": "dashboard.metric.title.bloodPressure",
|
||||
"latestValue": 123,
|
||||
"secondaryValue": 78,
|
||||
"unitKey": "dashboard.metric.unit.bloodPressure",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "down",
|
||||
"sparkline": [
|
||||
135,
|
||||
128,
|
||||
136,
|
||||
129,
|
||||
137,
|
||||
130,
|
||||
123
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 182,
|
||||
"lastSeenAt": "anchor+0d+07:00:00",
|
||||
"direction": {
|
||||
"direction": "up-bad",
|
||||
"targetPosition": "above",
|
||||
"basis": "profile_default"
|
||||
},
|
||||
"trendSentiment": "positive"
|
||||
},
|
||||
{
|
||||
"id": "pulse",
|
||||
"kind": "pulse",
|
||||
"titleKey": "dashboard.metric.title.pulse",
|
||||
"latestValue": 64,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.pulse",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
64,
|
||||
69,
|
||||
68,
|
||||
67,
|
||||
66,
|
||||
65,
|
||||
64
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 60,
|
||||
"lastSeenAt": "anchor+0d+07:01:00",
|
||||
"direction": {
|
||||
"direction": "hold",
|
||||
"targetPosition": "inside",
|
||||
"basis": "profile_default"
|
||||
},
|
||||
"trendSentiment": "positive"
|
||||
},
|
||||
{
|
||||
"id": "bodyFat",
|
||||
"kind": "bodyFat",
|
||||
"titleKey": "dashboard.metric.title.bodyFat",
|
||||
"latestValue": 24,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.bodyFat",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
24.8,
|
||||
24.7,
|
||||
24.6,
|
||||
24.4,
|
||||
24.3,
|
||||
24.1,
|
||||
24
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 9,
|
||||
"lastSeenAt": "anchor+0d+06:31:00",
|
||||
"direction": {
|
||||
"direction": "up-bad",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "neutral"
|
||||
},
|
||||
{
|
||||
"id": "glucose",
|
||||
"kind": "glucose",
|
||||
"titleKey": "dashboard.metric.title.glucose",
|
||||
"latestValue": 128,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.glucose",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "down",
|
||||
"sparkline": [
|
||||
117,
|
||||
115.33333333333333,
|
||||
113.66666666666667,
|
||||
113.33333333333333,
|
||||
111.66666666666667,
|
||||
110,
|
||||
108.33333333333333
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 60,
|
||||
"lastSeenAt": "anchor+0d+11:00:00",
|
||||
"direction": {
|
||||
"direction": "up-bad",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "positive"
|
||||
},
|
||||
{
|
||||
"id": "sleep",
|
||||
"kind": "sleep",
|
||||
"titleKey": "dashboard.metric.title.sleep",
|
||||
"latestValue": 5.92,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.sleep",
|
||||
"unit": "h",
|
||||
"sleepStages": {
|
||||
"CORE": 3.33,
|
||||
"DEEP": 1.17,
|
||||
"REM": 1.42,
|
||||
"AWAKE": 0.2
|
||||
},
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
6.25,
|
||||
6.17,
|
||||
6.67,
|
||||
6.67,
|
||||
7.17,
|
||||
6.25,
|
||||
5.92
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 85,
|
||||
"lastSeenAt": "anchor+0d+04:15:00",
|
||||
"direction": {
|
||||
"direction": "up-good",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "neutral"
|
||||
},
|
||||
{
|
||||
"id": "steps",
|
||||
"kind": "steps",
|
||||
"titleKey": "dashboard.metric.title.steps",
|
||||
"latestValue": 6000,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.steps",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "down",
|
||||
"sparkline": [
|
||||
8238,
|
||||
7865,
|
||||
7492,
|
||||
7119,
|
||||
6746,
|
||||
6373,
|
||||
6000
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 30,
|
||||
"lastSeenAt": "anchor+0d+09:00:00",
|
||||
"direction": {
|
||||
"direction": "up-good",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "negative"
|
||||
},
|
||||
{
|
||||
"id": "oxygenSaturation",
|
||||
"kind": "oxygenSaturation",
|
||||
"titleKey": "dashboard.metric.title.oxygenSaturation",
|
||||
"latestValue": 96,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.oxygenSaturation",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
96,
|
||||
98,
|
||||
97,
|
||||
96,
|
||||
98,
|
||||
97,
|
||||
96
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 10,
|
||||
"lastSeenAt": "anchor+0d+04:40:00",
|
||||
"direction": {
|
||||
"direction": "up-good",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "neutral"
|
||||
},
|
||||
{
|
||||
"id": "mood",
|
||||
"kind": "mood",
|
||||
"titleKey": "dashboard.metric.title.mood",
|
||||
"latestValue": 1,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.mood",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "down",
|
||||
"sparkline": [
|
||||
4,
|
||||
1,
|
||||
3,
|
||||
5,
|
||||
2,
|
||||
4,
|
||||
1
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 45,
|
||||
"lastSeenAt": "anchor+0d+00:00:00",
|
||||
"direction": {
|
||||
"direction": "up-good",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "negative"
|
||||
},
|
||||
{
|
||||
"id": "bmi",
|
||||
"kind": "bmi",
|
||||
"titleKey": "dashboard.metric.title.bmi",
|
||||
"latestValue": 25.9,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.bmi",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "flat",
|
||||
"sparkline": [
|
||||
25.9,
|
||||
25.9,
|
||||
25.9,
|
||||
25.9,
|
||||
25.9,
|
||||
25.9,
|
||||
25.9
|
||||
],
|
||||
"updatedAt": "<updatedAt>",
|
||||
"allTimeCount": 60,
|
||||
"lastSeenAt": "anchor+0d+06:30:00",
|
||||
"direction": {
|
||||
"direction": "up-bad",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "neutral"
|
||||
}
|
||||
],
|
||||
"sleepRhythm": {
|
||||
"sleepDebt": {
|
||||
"state": "ready",
|
||||
"debtMinutes": 145,
|
||||
"needMinutes": 420,
|
||||
"nightsCounted": 5,
|
||||
"windowNights": 5,
|
||||
"nightsUntilReady": 0,
|
||||
"source": "COMPUTED"
|
||||
},
|
||||
"chronotype": {
|
||||
"state": "ready",
|
||||
"msfMinutes": 63.33521977432794,
|
||||
"msfScMinutes": 63.335219774327925,
|
||||
"band": "extreme_early",
|
||||
"socialJetlagMinutes": 2.402527629787599,
|
||||
"freeNightsCounted": 6,
|
||||
"workNightsCounted": 15,
|
||||
"freeNightsUntilReady": 0
|
||||
},
|
||||
"averagePerNight": {
|
||||
"state": "ready",
|
||||
"averageMinutes": 388,
|
||||
"nightsCounted": 21,
|
||||
"nightsUntilReady": 0
|
||||
}
|
||||
},
|
||||
"lastUpdated": "anchor+0d+12:00:00"
|
||||
},
|
||||
"error": null
|
||||
},
|
||||
"events": [
|
||||
{
|
||||
"status": 200,
|
||||
"action": {
|
||||
"name": "dashboard.summary"
|
||||
},
|
||||
"meta": {
|
||||
"cache.analytics.key_hash": 3272136333,
|
||||
"cache.analytics.outcome": "hit",
|
||||
"metrics_emitted": 10,
|
||||
"metrics_gated": 0
|
||||
},
|
||||
"warnings": null,
|
||||
"error": null
|
||||
}
|
||||
],
|
||||
"effects": []
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"status": 403,
|
||||
"body": {
|
||||
"data": null,
|
||||
"error": "Account access denied",
|
||||
"meta": {
|
||||
"errorCode": "sharing.access.denied",
|
||||
"requestId": "<requestId>"
|
||||
}
|
||||
},
|
||||
"events": [
|
||||
{
|
||||
"status": 403,
|
||||
"action": null,
|
||||
"meta": {
|
||||
"sharing_refusal": "insufficient_access"
|
||||
},
|
||||
"warnings": null,
|
||||
"error": {
|
||||
"type": "SharingAccessDeniedError",
|
||||
"message": "Account access denied"
|
||||
}
|
||||
}
|
||||
],
|
||||
"effects": []
|
||||
}
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"status": 401,
|
||||
"body": {
|
||||
"data": null,
|
||||
"error": "Not authenticated",
|
||||
"meta": {
|
||||
"errorCode": "auth.missing",
|
||||
"requestId": "<requestId>"
|
||||
}
|
||||
},
|
||||
"events": [
|
||||
{
|
||||
"status": 401,
|
||||
"action": null,
|
||||
"meta": null,
|
||||
"warnings": null,
|
||||
"error": {
|
||||
"type": "HttpError",
|
||||
"message": "Not authenticated"
|
||||
}
|
||||
}
|
||||
],
|
||||
"effects": []
|
||||
}
|
||||
+100
@@ -0,0 +1,100 @@
|
||||
{
|
||||
"status": 200,
|
||||
"body": {
|
||||
"data": {
|
||||
"greeting": {
|
||||
"salutation": "Hi, empty-account",
|
||||
"date": "anchor+0d+12:00:00"
|
||||
},
|
||||
"streak": {
|
||||
"currentDays": 0,
|
||||
"longest": 0,
|
||||
"label": "days in a row"
|
||||
},
|
||||
"compliance": {
|
||||
"scheduledToday": 0,
|
||||
"takenToday": 0
|
||||
},
|
||||
"highlightInsight": null,
|
||||
"metrics": [
|
||||
{
|
||||
"id": "weight",
|
||||
"kind": "weight",
|
||||
"titleKey": "dashboard.metric.title.weight",
|
||||
"latestValue": null,
|
||||
"secondaryValue": null,
|
||||
"unitKey": "dashboard.metric.unit.weight",
|
||||
"unit": null,
|
||||
"sleepStages": null,
|
||||
"sleepSourceDiscrepancy": null,
|
||||
"trend": "unknown",
|
||||
"sparkline": [],
|
||||
"updatedAt": null,
|
||||
"allTimeCount": 0,
|
||||
"lastSeenAt": null,
|
||||
"direction": {
|
||||
"direction": "up-bad",
|
||||
"targetPosition": null,
|
||||
"basis": "metric_default"
|
||||
},
|
||||
"trendSentiment": "neutral"
|
||||
}
|
||||
],
|
||||
"sleepRhythm": {
|
||||
"sleepDebt": {
|
||||
"state": "partial",
|
||||
"debtMinutes": 0,
|
||||
"needMinutes": 420,
|
||||
"nightsCounted": 0,
|
||||
"windowNights": 5,
|
||||
"nightsUntilReady": 4,
|
||||
"source": "COMPUTED"
|
||||
},
|
||||
"chronotype": {
|
||||
"state": "learning",
|
||||
"msfMinutes": null,
|
||||
"msfScMinutes": null,
|
||||
"band": null,
|
||||
"socialJetlagMinutes": null,
|
||||
"freeNightsCounted": 0,
|
||||
"workNightsCounted": 0,
|
||||
"freeNightsUntilReady": 3
|
||||
},
|
||||
"averagePerNight": {
|
||||
"state": "partial",
|
||||
"averageMinutes": 0,
|
||||
"nightsCounted": 0,
|
||||
"nightsUntilReady": 4
|
||||
}
|
||||
},
|
||||
"lastUpdated": "anchor+0d+12:00:00"
|
||||
},
|
||||
"error": null
|
||||
},
|
||||
"events": [
|
||||
{
|
||||
"status": 200,
|
||||
"action": {
|
||||
"name": "dashboard.summary"
|
||||
},
|
||||
"meta": {
|
||||
"cache.analytics.key_hash": 1944272078,
|
||||
"cache.analytics.outcome": "miss",
|
||||
"dashboard.sub_allTime_ms": 0,
|
||||
"dashboard.sub_bmi_ms": 0,
|
||||
"dashboard.sub_latestEver_ms": 0,
|
||||
"dashboard.sub_medsToday_ms": 0,
|
||||
"dashboard.sub_moodSeries_ms": 0,
|
||||
"dashboard.sub_sleepNights_ms": 0,
|
||||
"dashboard.sub_sparkline_ms": 0,
|
||||
"dashboard.sub_streakDays_ms": 0,
|
||||
"dashboard.sub_streakIntakes_ms": 0,
|
||||
"metrics_emitted": 1,
|
||||
"metrics_gated": 0
|
||||
},
|
||||
"warnings": null,
|
||||
"error": null
|
||||
}
|
||||
],
|
||||
"effects": []
|
||||
}
|
||||
@@ -0,0 +1,201 @@
|
||||
/**
|
||||
* Parity for `GET /api/dashboard/summary` while its builder moves into
|
||||
* `src/lib/dashboard/`.
|
||||
*
|
||||
* One record carries every block the summary shapes (`record-fixture.ts`):
|
||||
* the walk reads it cold, warm, with modules off (gated after the cache),
|
||||
* in another language (served from the cache that still holds the first
|
||||
* greeting), for a delegate who may manage the record and one who may only
|
||||
* read it, without credentials, and for an account with no data. The
|
||||
* fire-and-forget rollup refresh is recorded instead of run.
|
||||
*
|
||||
* The clock is pinned to noon of the current UTC day and the snapshot is
|
||||
* written relative to the start of that day (`relativeToAnchor`), because
|
||||
* the per-type reads cut their windows in SQL against the database clock.
|
||||
*/
|
||||
import { afterAll, beforeAll, describe, expect, it, vi } from "vitest";
|
||||
|
||||
import { GET } from "@/app/api/dashboard/summary/route";
|
||||
import { settleBackgroundTasks } from "@/lib/logging/background-tasks";
|
||||
|
||||
import { anonymous, callRoute, type RouteAuth } from "../../../kit/call-route";
|
||||
import { makeGrant, makeSession, makeUser } from "../../../kit/factories";
|
||||
import {
|
||||
effectRecorder,
|
||||
eventFacts,
|
||||
expectParity,
|
||||
relativeToAnchor,
|
||||
stable,
|
||||
startOfUtcToday,
|
||||
wideEventRecorder,
|
||||
} from "../../../kit/parity";
|
||||
import {
|
||||
getPrismaClient,
|
||||
switchSessionTo,
|
||||
truncateAllTables,
|
||||
} from "../../setup";
|
||||
import { parityId, seedParityRecord } from "./record-fixture";
|
||||
|
||||
vi.mock("@/lib/logging/transports", async (importOriginal) => {
|
||||
const actual =
|
||||
await importOriginal<typeof import("@/lib/logging/transports")>();
|
||||
const { wideEventRecorder: recorder } = await import("../../../kit/parity");
|
||||
return {
|
||||
...actual,
|
||||
emitIfSampled: (event: (typeof recorder.events)[number]) => {
|
||||
recorder.events.push(event);
|
||||
},
|
||||
};
|
||||
});
|
||||
vi.mock("@/lib/rollups/measurement-rollups", async (importOriginal) => {
|
||||
const actual =
|
||||
await importOriginal<typeof import("@/lib/rollups/measurement-rollups")>();
|
||||
const { effectRecorder } = await import("../../../kit/parity");
|
||||
return {
|
||||
...actual,
|
||||
ensureUserRollupsFresh: async (...args: unknown[]) => {
|
||||
effectRecorder.record("ensureUserRollupsFresh", args);
|
||||
},
|
||||
};
|
||||
});
|
||||
|
||||
const prisma = getPrismaClient();
|
||||
const ANCHOR = startOfUtcToday();
|
||||
const NOW = new Date(ANCHOR.getTime() + 12 * 60 * 60 * 1000);
|
||||
const TZ = "UTC";
|
||||
const OWNER_ID = parityId("dashsum", 1);
|
||||
const EMPTY_ID = parityId("dashsum", 2);
|
||||
|
||||
let owner: RouteAuth;
|
||||
let empty: RouteAuth;
|
||||
let manager: RouteAuth & { sessionId: string };
|
||||
let reader: RouteAuth & { sessionId: string };
|
||||
|
||||
async function step(
|
||||
name: string,
|
||||
auth: RouteAuth = owner,
|
||||
contract?: { skip: string },
|
||||
): Promise<void> {
|
||||
wideEventRecorder.take();
|
||||
effectRecorder.take();
|
||||
const res = await callRoute(GET, {
|
||||
method: "GET",
|
||||
route: "/api/dashboard/summary",
|
||||
auth,
|
||||
...(contract ? { contract } : {}),
|
||||
});
|
||||
const events = wideEventRecorder.take();
|
||||
expect(events.length).toBeGreaterThan(0);
|
||||
await settleBackgroundTasks();
|
||||
await expectParity(
|
||||
`dashboard-summary.${name}`,
|
||||
stable(
|
||||
relativeToAnchor(
|
||||
{
|
||||
status: res.status,
|
||||
body: res.body,
|
||||
events: events.map(eventFacts).map(withSortedMeta),
|
||||
effects: effectRecorder.take(),
|
||||
},
|
||||
ANCHOR,
|
||||
),
|
||||
{ since: NOW },
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* The builder's sub-reads run concurrently and each annotates its own timing
|
||||
* when it settles, so the meta keys arrive in a different order on each run.
|
||||
* The values are the same; the keys are sorted.
|
||||
*/
|
||||
function withSortedMeta(facts: unknown): unknown {
|
||||
const f = facts as { meta?: Record<string, unknown> };
|
||||
if (!f.meta) return facts;
|
||||
return {
|
||||
...f,
|
||||
meta: Object.fromEntries(
|
||||
Object.entries(f.meta).sort(([a], [b]) => a.localeCompare(b)),
|
||||
),
|
||||
};
|
||||
}
|
||||
|
||||
beforeAll(async () => {
|
||||
vi.useFakeTimers({ toFake: ["Date"], now: NOW });
|
||||
await truncateAllTables(prisma);
|
||||
const ownerRow = await makeUser({
|
||||
id: OWNER_ID,
|
||||
timezone: TZ,
|
||||
locale: "en",
|
||||
displayName: "Sam",
|
||||
heightCm: 178,
|
||||
dateOfBirth: new Date("1975-04-02T00:00:00.000Z"),
|
||||
gender: "male",
|
||||
});
|
||||
await seedParityRecord({ userId: OWNER_ID, now: NOW, tz: TZ, tag: "ds" });
|
||||
const rollups = await vi.importActual<
|
||||
typeof import("@/lib/rollups/measurement-rollups")
|
||||
>("@/lib/rollups/measurement-rollups");
|
||||
await rollups.ensureUserRollupsFresh(OWNER_ID);
|
||||
await settleBackgroundTasks();
|
||||
owner = await makeSession(ownerRow);
|
||||
const emptyRow = await makeUser({
|
||||
id: EMPTY_ID,
|
||||
username: "empty-account",
|
||||
timezone: "UTC",
|
||||
});
|
||||
empty = await makeSession(emptyRow);
|
||||
const managerRow = await makeUser({ timezone: "UTC", locale: "de" });
|
||||
await makeGrant(ownerRow, managerRow, { access: "MANAGE" });
|
||||
manager = await makeSession(managerRow);
|
||||
const readerRow = await makeUser({ timezone: "UTC" });
|
||||
await makeGrant(ownerRow, readerRow);
|
||||
reader = await makeSession(readerRow);
|
||||
});
|
||||
|
||||
afterAll(() => {
|
||||
vi.useRealTimers();
|
||||
});
|
||||
|
||||
describe("GET /api/dashboard/summary parity", () => {
|
||||
it("01 cold, then warm", async () => {
|
||||
await step("01-cold");
|
||||
await step("02-warm");
|
||||
});
|
||||
|
||||
it("03 modules off, gated after the cache", async () => {
|
||||
await prisma.user.update({
|
||||
where: { id: OWNER_ID },
|
||||
data: {
|
||||
modulePreferencesJson: { glucose: false, sleep: false, mood: false },
|
||||
},
|
||||
});
|
||||
await step("03-modules-off");
|
||||
await prisma.user.update({
|
||||
where: { id: OWNER_ID },
|
||||
data: { modulePreferencesJson: {} },
|
||||
});
|
||||
});
|
||||
|
||||
it("04 another language, served from the cache", async () => {
|
||||
await prisma.user.update({
|
||||
where: { id: OWNER_ID },
|
||||
data: { locale: "de" },
|
||||
});
|
||||
await step("04-de-cached");
|
||||
});
|
||||
|
||||
it("05 a delegate who may manage, and one who may only read", async () => {
|
||||
await switchSessionTo(manager.sessionId, OWNER_ID);
|
||||
await step("05-manager", manager);
|
||||
await switchSessionTo(manager.sessionId, null);
|
||||
await switchSessionTo(reader.sessionId, OWNER_ID);
|
||||
await step("06-reader", reader);
|
||||
await switchSessionTo(reader.sessionId, null);
|
||||
});
|
||||
|
||||
it("07 no credentials, and an account with no data", async () => {
|
||||
await step("07-anonymous", anonymous);
|
||||
await step("08-empty-account", empty);
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user