Clean up withings tests (#102548)

pull/102501/head
Joost Lekkerkerker 2023-10-22 21:58:30 +02:00 committed by GitHub
parent 3f88c518a5
commit e3b238861d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 585 additions and 605 deletions

View File

@ -5,13 +5,19 @@ from typing import Any
from urllib.parse import urlparse
from aiohttp.test_utils import TestClient
from aiowithings import Goals, MeasurementGroup
from freezegun.api import FrozenDateTimeFactory
from homeassistant.components.webhook import async_generate_url
from homeassistant.config import async_process_ha_core_config
from homeassistant.core import HomeAssistant
from tests.common import MockConfigEntry, async_fire_time_changed
from tests.common import (
MockConfigEntry,
async_fire_time_changed,
load_json_array_fixture,
load_json_object_fixture,
)
@dataclass
@ -64,3 +70,17 @@ async def prepare_webhook_setup(
freezer.tick(timedelta(seconds=1))
async_fire_time_changed(hass)
await hass.async_block_till_done()
def load_goals_fixture(fixture: str = "withings/goals.json") -> Goals:
"""Return goals from fixture."""
goals_json = load_json_object_fixture(fixture)
return Goals.from_api(goals_json)
def load_measurements_fixture(
fixture: str = "withings/measurements.json",
) -> list[MeasurementGroup]:
"""Return measurement from fixture."""
meas_json = load_json_array_fixture(fixture)
return [MeasurementGroup.from_api(measurement) for measurement in meas_json]

View File

@ -3,7 +3,7 @@ from datetime import timedelta
import time
from unittest.mock import AsyncMock, patch
from aiowithings import Device, Goals, MeasurementGroup, SleepSummary, WithingsClient
from aiowithings import Device, SleepSummary, WithingsClient
from aiowithings.models import NotificationConfiguration
import pytest
@ -15,7 +15,8 @@ from homeassistant.components.withings.const import DOMAIN
from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component
from tests.common import MockConfigEntry, load_json_object_fixture
from tests.common import MockConfigEntry, load_json_array_fixture
from tests.components.withings import load_goals_fixture, load_measurements_fixture
CLIENT_ID = "1234"
CLIENT_SECRET = "5678"
@ -128,32 +129,24 @@ def polling_config_entry(expires_at: int, scopes: list[str]) -> MockConfigEntry:
def mock_withings():
"""Mock withings."""
devices_json = load_json_object_fixture("withings/get_device.json")
devices = [Device.from_api(device) for device in devices_json["devices"]]
devices_json = load_json_array_fixture("withings/devices.json")
devices = [Device.from_api(device) for device in devices_json]
meas_json = load_json_object_fixture("withings/get_meas.json")
measurement_groups = [
MeasurementGroup.from_api(measurement)
for measurement in meas_json["measuregrps"]
]
measurement_groups = load_measurements_fixture("withings/measurements.json")
sleep_json = load_json_object_fixture("withings/get_sleep.json")
sleep_json = load_json_array_fixture("withings/sleep_summaries.json")
sleep_summaries = [
SleepSummary.from_api(sleep_summary) for sleep_summary in sleep_json["series"]
SleepSummary.from_api(sleep_summary) for sleep_summary in sleep_json
]
notification_json = load_json_object_fixture("withings/notify_list.json")
notification_json = load_json_array_fixture("withings/notifications.json")
notifications = [
NotificationConfiguration.from_api(not_conf)
for not_conf in notification_json["profiles"]
NotificationConfiguration.from_api(not_conf) for not_conf in notification_json
]
goals_json = load_json_object_fixture("withings/goals.json")
goals = Goals.from_api(goals_json)
mock = AsyncMock(spec=WithingsClient)
mock.get_devices.return_value = devices
mock.get_goals.return_value = goals
mock.get_goals.return_value = load_goals_fixture("withings/goals.json")
mock.get_measurement_in_period.return_value = measurement_groups
mock.get_measurement_since.return_value = measurement_groups
mock.get_sleep_summary_since.return_value = sleep_summaries

View File

@ -0,0 +1,13 @@
[
{
"type": "Scale",
"battery": "high",
"model": "Body+",
"model_id": 5,
"timezone": "Europe/Amsterdam",
"first_session_date": null,
"last_session_date": 1693867179,
"deviceid": "f998be4b9ccc9e136fd8cd8e8e344c31ec3b271d",
"hash_deviceid": "f998be4b9ccc9e136fd8cd8e8e344c31ec3b271d"
}
]

View File

@ -1,15 +0,0 @@
{
"devices": [
{
"type": "Scale",
"battery": "high",
"model": "Body+",
"model_id": 5,
"timezone": "Europe/Amsterdam",
"first_session_date": null,
"last_session_date": 1693867179,
"deviceid": "f998be4b9ccc9e136fd8cd8e8e344c31ec3b271d",
"hash_deviceid": "f998be4b9ccc9e136fd8cd8e8e344c31ec3b271d"
}
]
}

View File

@ -1,313 +0,0 @@
{
"more": false,
"timezone": "UTC",
"updatetime": 1564617600,
"offset": 0,
"measuregrps": [
{
"grpid": 1,
"attrib": 0,
"date": 1564660800,
"created": 1564660800,
"modified": 1564660800,
"category": 1,
"deviceid": "91a7e556c2022ef54dca6e07a853c3193734d148",
"hash_deviceid": "91a7e556c2022ef54dca6e07a853c3193734d148",
"measures": [
{
"type": 1,
"unit": 0,
"value": 70
},
{
"type": 8,
"unit": 0,
"value": 5
},
{
"type": 5,
"unit": 0,
"value": 60
},
{
"type": 76,
"unit": 0,
"value": 50
},
{
"type": 88,
"unit": 0,
"value": 10
},
{
"type": 4,
"unit": 0,
"value": 2
},
{
"type": 12,
"unit": 0,
"value": 40
},
{
"type": 71,
"unit": 0,
"value": 40
},
{
"type": 73,
"unit": 0,
"value": 20
},
{
"type": 6,
"unit": -3,
"value": 70
},
{
"type": 9,
"unit": 0,
"value": 70
},
{
"type": 10,
"unit": 0,
"value": 100
},
{
"type": 11,
"unit": 0,
"value": 60
},
{
"type": 54,
"unit": -2,
"value": 95
},
{
"type": 77,
"unit": -2,
"value": 95
},
{
"type": 91,
"unit": 0,
"value": 100
},
{
"type": 123,
"unit": 0,
"value": 100
},
{
"type": 155,
"unit": 0,
"value": 100
},
{
"type": 168,
"unit": 0,
"value": 100
},
{
"type": 169,
"unit": 0,
"value": 100
}
],
"modelid": 45,
"model": "BPM Connect",
"comment": null
},
{
"grpid": 1,
"attrib": 0,
"date": 1564657200,
"created": 1564657200,
"modified": 1564657200,
"category": 1,
"deviceid": "91a7e556c2022ef54dca6e07a853c3193734d148",
"hash_deviceid": "91a7e556c2022ef54dca6e07a853c3193734d148",
"measures": [
{
"type": 1,
"unit": 0,
"value": 71
},
{
"type": 8,
"unit": 0,
"value": 51
},
{
"type": 5,
"unit": 0,
"value": 61
},
{
"type": 76,
"unit": 0,
"value": 51
},
{
"type": 88,
"unit": 0,
"value": 11
},
{
"type": 4,
"unit": 0,
"value": 21
},
{
"type": 12,
"unit": 0,
"value": 41
},
{
"type": 71,
"unit": 0,
"value": 41
},
{
"type": 73,
"unit": 0,
"value": 21
},
{
"type": 6,
"unit": -3,
"value": 71
},
{
"type": 9,
"unit": 0,
"value": 71
},
{
"type": 10,
"unit": 0,
"value": 101
},
{
"type": 11,
"unit": 0,
"value": 61
},
{
"type": 54,
"unit": -2,
"value": 96
},
{
"type": 77,
"unit": -2,
"value": 96
},
{
"type": 91,
"unit": 0,
"value": 101
}
],
"modelid": 45,
"model": "BPM Connect",
"comment": null
},
{
"grpid": 1,
"attrib": 1,
"date": 1564664400,
"created": 1564664400,
"modified": 1564664400,
"category": 1,
"deviceid": "91a7e556c2022ef54dca6e07a853c3193734d148",
"hash_deviceid": "91a7e556c2022ef54dca6e07a853c3193734d148",
"measures": [
{
"type": 1,
"unit": 0,
"value": 71
},
{
"type": 8,
"unit": 0,
"value": 4
},
{
"type": 5,
"unit": 0,
"value": 40
},
{
"type": 76,
"unit": 0,
"value": 51
},
{
"type": 88,
"unit": 0,
"value": 11
},
{
"type": 4,
"unit": 0,
"value": 201
},
{
"type": 12,
"unit": 0,
"value": 41
},
{
"type": 71,
"unit": 0,
"value": 34
},
{
"type": 73,
"unit": 0,
"value": 21
},
{
"type": 6,
"unit": -3,
"value": 71
},
{
"type": 9,
"unit": 0,
"value": 71
},
{
"type": 10,
"unit": 0,
"value": 101
},
{
"type": 11,
"unit": 0,
"value": 61
},
{
"type": 54,
"unit": -2,
"value": 98
},
{
"type": 77,
"unit": -2,
"value": 96
},
{
"type": 91,
"unit": 0,
"value": 102
}
],
"modelid": 45,
"model": "BPM Connect",
"comment": null
}
]
}

View File

@ -1,201 +0,0 @@
{
"more": false,
"offset": 0,
"series": [
{
"id": 2081804182,
"timezone": "Europe/Paris",
"model": 32,
"model_id": 63,
"hash_deviceid": "201d0b9a0556d6b755166b2cf8d22d3bdf0487ee",
"startdate": 1618691453,
"enddate": 1618713173,
"date": "2021-04-18",
"data": {
"wakeupduration": 3060,
"wakeupcount": 1,
"durationtosleep": 540,
"remsleepduration": 2400,
"durationtowakeup": 1140,
"total_sleep_time": 18660,
"sleep_efficiency": 0.86,
"sleep_latency": 540,
"wakeup_latency": 1140,
"waso": 1380,
"nb_rem_episodes": 1,
"out_of_bed_count": 0,
"lightsleepduration": 10440,
"deepsleepduration": 5820,
"hr_average": 103,
"hr_min": 70,
"hr_max": 120,
"rr_average": 14,
"rr_min": 10,
"rr_max": 20,
"breathing_disturbances_intensity": 9,
"snoring": 1080,
"snoringepisodecount": 18,
"sleep_score": 37,
"apnea_hypopnea_index": 9
},
"created": 1620237476,
"modified": 1620237476
},
{
"id": 2081804265,
"timezone": "Europe/Paris",
"model": 32,
"model_id": 63,
"hash_deviceid": "201d0b9a0556d6b755166b2cf8d22d3bdf0487ee",
"startdate": 1618605055,
"enddate": 1618636975,
"date": "2021-04-17",
"data": {
"wakeupduration": 2520,
"wakeupcount": 3,
"durationtosleep": 900,
"remsleepduration": 6840,
"durationtowakeup": 420,
"total_sleep_time": 26880,
"sleep_efficiency": 0.91,
"sleep_latency": 900,
"wakeup_latency": 420,
"waso": 1200,
"nb_rem_episodes": 2,
"out_of_bed_count": 0,
"lightsleepduration": 12840,
"deepsleepduration": 7200,
"hr_average": 85,
"hr_min": 50,
"hr_max": 120,
"rr_average": 16,
"rr_min": 10,
"rr_max": 20,
"breathing_disturbances_intensity": 14,
"snoring": 1140,
"snoringepisodecount": 19,
"sleep_score": 90,
"apnea_hypopnea_index": 14
},
"created": 1620237480,
"modified": 1620237479
},
{
"id": 2081804358,
"timezone": "Europe/Paris",
"model": 32,
"model_id": 63,
"hash_deviceid": "201d0b9a0556d6b755166b2cf8d22d3bdf0487ee",
"startdate": 1618518658,
"enddate": 1618548058,
"date": "2021-04-16",
"data": {
"wakeupduration": 4080,
"wakeupcount": 1,
"durationtosleep": 840,
"remsleepduration": 2040,
"durationtowakeup": 1560,
"total_sleep_time": 16860,
"sleep_efficiency": 0.81,
"sleep_latency": 840,
"wakeup_latency": 1560,
"waso": 1680,
"nb_rem_episodes": 2,
"out_of_bed_count": 0,
"lightsleepduration": 11100,
"deepsleepduration": 3720,
"hr_average": 65,
"hr_min": 50,
"hr_max": 91,
"rr_average": 14,
"rr_min": 10,
"rr_max": 20,
"breathing_disturbances_intensity": -1,
"snoring": 1020,
"snoringepisodecount": 17,
"sleep_score": 20,
"apnea_hypopnea_index": -1
},
"created": 1620237484,
"modified": 1620237484
},
{
"id": 2081804405,
"timezone": "Europe/Paris",
"model": 32,
"model_id": 63,
"hash_deviceid": "201d0b9a0556d6b755166b2cf8d22d3bdf0487ee",
"startdate": 1618432203,
"enddate": 1618453143,
"date": "2021-04-15",
"data": {
"wakeupduration": 4080,
"wakeupcount": 1,
"durationtosleep": 840,
"remsleepduration": 2040,
"durationtowakeup": 1560,
"total_sleep_time": 16860,
"sleep_efficiency": 0.81,
"sleep_latency": 840,
"wakeup_latency": 1560,
"waso": 1680,
"nb_rem_episodes": 2,
"out_of_bed_count": 0,
"lightsleepduration": 11100,
"deepsleepduration": 3720,
"hr_average": 65,
"hr_min": 50,
"hr_max": 91,
"rr_average": 14,
"rr_min": 10,
"rr_max": 20,
"breathing_disturbances_intensity": -1,
"snoring": 1020,
"snoringepisodecount": 17,
"sleep_score": 20,
"apnea_hypopnea_index": -1
},
"created": 1620237486,
"modified": 1620237486
},
{
"id": 2081804490,
"timezone": "Europe/Paris",
"model": 32,
"model_id": 63,
"hash_deviceid": "201d0b9a0556d6b755166b2cf8d22d3bdf0487ee",
"startdate": 1618345805,
"enddate": 1618373504,
"date": "2021-04-14",
"data": {
"wakeupduration": 3600,
"wakeupcount": 2,
"durationtosleep": 780,
"remsleepduration": 3960,
"durationtowakeup": 300,
"total_sleep_time": 22680,
"sleep_efficiency": 0.86,
"sleep_latency": 780,
"wakeup_latency": 300,
"waso": 3939,
"nb_rem_episodes": 4,
"out_of_bed_count": 3,
"lightsleepduration": 12960,
"deepsleepduration": 5760,
"hr_average": 98,
"hr_min": 70,
"hr_max": 120,
"rr_average": 13,
"rr_min": 10,
"rr_max": 20,
"breathing_disturbances_intensity": 29,
"snoring": 960,
"snoringepisodecount": 16,
"sleep_score": 62,
"apnea_hypopnea_index": 29
},
"created": 1620237490,
"modified": 1620237489
}
]
}

View File

@ -0,0 +1,307 @@
[
{
"grpid": 1,
"attrib": 0,
"date": 1564660800,
"created": 1564660800,
"modified": 1564660800,
"category": 1,
"deviceid": "91a7e556c2022ef54dca6e07a853c3193734d148",
"hash_deviceid": "91a7e556c2022ef54dca6e07a853c3193734d148",
"measures": [
{
"type": 1,
"unit": 0,
"value": 70
},
{
"type": 8,
"unit": 0,
"value": 5
},
{
"type": 5,
"unit": 0,
"value": 60
},
{
"type": 76,
"unit": 0,
"value": 50
},
{
"type": 88,
"unit": 0,
"value": 10
},
{
"type": 4,
"unit": 0,
"value": 2
},
{
"type": 12,
"unit": 0,
"value": 40
},
{
"type": 71,
"unit": 0,
"value": 40
},
{
"type": 73,
"unit": 0,
"value": 20
},
{
"type": 6,
"unit": -3,
"value": 70
},
{
"type": 9,
"unit": 0,
"value": 70
},
{
"type": 10,
"unit": 0,
"value": 100
},
{
"type": 11,
"unit": 0,
"value": 60
},
{
"type": 54,
"unit": -2,
"value": 95
},
{
"type": 77,
"unit": -2,
"value": 95
},
{
"type": 91,
"unit": 0,
"value": 100
},
{
"type": 123,
"unit": 0,
"value": 100
},
{
"type": 155,
"unit": 0,
"value": 100
},
{
"type": 168,
"unit": 0,
"value": 100
},
{
"type": 169,
"unit": 0,
"value": 100
}
],
"modelid": 45,
"model": "BPM Connect",
"comment": null
},
{
"grpid": 1,
"attrib": 0,
"date": 1564657200,
"created": 1564657200,
"modified": 1564657200,
"category": 1,
"deviceid": "91a7e556c2022ef54dca6e07a853c3193734d148",
"hash_deviceid": "91a7e556c2022ef54dca6e07a853c3193734d148",
"measures": [
{
"type": 1,
"unit": 0,
"value": 71
},
{
"type": 8,
"unit": 0,
"value": 51
},
{
"type": 5,
"unit": 0,
"value": 61
},
{
"type": 76,
"unit": 0,
"value": 51
},
{
"type": 88,
"unit": 0,
"value": 11
},
{
"type": 4,
"unit": 0,
"value": 21
},
{
"type": 12,
"unit": 0,
"value": 41
},
{
"type": 71,
"unit": 0,
"value": 41
},
{
"type": 73,
"unit": 0,
"value": 21
},
{
"type": 6,
"unit": -3,
"value": 71
},
{
"type": 9,
"unit": 0,
"value": 71
},
{
"type": 10,
"unit": 0,
"value": 101
},
{
"type": 11,
"unit": 0,
"value": 61
},
{
"type": 54,
"unit": -2,
"value": 96
},
{
"type": 77,
"unit": -2,
"value": 96
},
{
"type": 91,
"unit": 0,
"value": 101
}
],
"modelid": 45,
"model": "BPM Connect",
"comment": null
},
{
"grpid": 1,
"attrib": 1,
"date": 1564664400,
"created": 1564664400,
"modified": 1564664400,
"category": 1,
"deviceid": "91a7e556c2022ef54dca6e07a853c3193734d148",
"hash_deviceid": "91a7e556c2022ef54dca6e07a853c3193734d148",
"measures": [
{
"type": 1,
"unit": 0,
"value": 71
},
{
"type": 8,
"unit": 0,
"value": 4
},
{
"type": 5,
"unit": 0,
"value": 40
},
{
"type": 76,
"unit": 0,
"value": 51
},
{
"type": 88,
"unit": 0,
"value": 11
},
{
"type": 4,
"unit": 0,
"value": 201
},
{
"type": 12,
"unit": 0,
"value": 41
},
{
"type": 71,
"unit": 0,
"value": 34
},
{
"type": 73,
"unit": 0,
"value": 21
},
{
"type": 6,
"unit": -3,
"value": 71
},
{
"type": 9,
"unit": 0,
"value": 71
},
{
"type": 10,
"unit": 0,
"value": 101
},
{
"type": 11,
"unit": 0,
"value": 61
},
{
"type": 54,
"unit": -2,
"value": 98
},
{
"type": 77,
"unit": -2,
"value": 96
},
{
"type": 91,
"unit": 0,
"value": 102
}
],
"modelid": 45,
"model": "BPM Connect",
"comment": null
}
]

View File

@ -0,0 +1,20 @@
[
{
"appli": 50,
"callbackurl": "https://not.my.callback/url",
"expires": 2147483647,
"comment": null
},
{
"appli": 50,
"callbackurl": "https://example.com/api/webhook/55a7335ea8dee830eed4ef8f84cda8f6d80b83af0847dc74032e86120bffed5e",
"expires": 2147483647,
"comment": null
},
{
"appli": 51,
"callbackurl": "https://example.com/api/webhook/55a7335ea8dee830eed4ef8f84cda8f6d80b83af0847dc74032e86120bffed5e",
"expires": 2147483647,
"comment": null
}
]

View File

@ -1,22 +0,0 @@
{
"profiles": [
{
"appli": 50,
"callbackurl": "https://not.my.callback/url",
"expires": 2147483647,
"comment": null
},
{
"appli": 50,
"callbackurl": "https://example.com/api/webhook/55a7335ea8dee830eed4ef8f84cda8f6d80b83af0847dc74032e86120bffed5e",
"expires": 2147483647,
"comment": null
},
{
"appli": 51,
"callbackurl": "https://example.com/api/webhook/55a7335ea8dee830eed4ef8f84cda8f6d80b83af0847dc74032e86120bffed5e",
"expires": 2147483647,
"comment": null
}
]
}

View File

@ -0,0 +1,197 @@
[
{
"id": 2081804182,
"timezone": "Europe/Paris",
"model": 32,
"model_id": 63,
"hash_deviceid": "201d0b9a0556d6b755166b2cf8d22d3bdf0487ee",
"startdate": 1618691453,
"enddate": 1618713173,
"date": "2021-04-18",
"data": {
"wakeupduration": 3060,
"wakeupcount": 1,
"durationtosleep": 540,
"remsleepduration": 2400,
"durationtowakeup": 1140,
"total_sleep_time": 18660,
"sleep_efficiency": 0.86,
"sleep_latency": 540,
"wakeup_latency": 1140,
"waso": 1380,
"nb_rem_episodes": 1,
"out_of_bed_count": 0,
"lightsleepduration": 10440,
"deepsleepduration": 5820,
"hr_average": 103,
"hr_min": 70,
"hr_max": 120,
"rr_average": 14,
"rr_min": 10,
"rr_max": 20,
"breathing_disturbances_intensity": 9,
"snoring": 1080,
"snoringepisodecount": 18,
"sleep_score": 37,
"apnea_hypopnea_index": 9
},
"created": 1620237476,
"modified": 1620237476
},
{
"id": 2081804265,
"timezone": "Europe/Paris",
"model": 32,
"model_id": 63,
"hash_deviceid": "201d0b9a0556d6b755166b2cf8d22d3bdf0487ee",
"startdate": 1618605055,
"enddate": 1618636975,
"date": "2021-04-17",
"data": {
"wakeupduration": 2520,
"wakeupcount": 3,
"durationtosleep": 900,
"remsleepduration": 6840,
"durationtowakeup": 420,
"total_sleep_time": 26880,
"sleep_efficiency": 0.91,
"sleep_latency": 900,
"wakeup_latency": 420,
"waso": 1200,
"nb_rem_episodes": 2,
"out_of_bed_count": 0,
"lightsleepduration": 12840,
"deepsleepduration": 7200,
"hr_average": 85,
"hr_min": 50,
"hr_max": 120,
"rr_average": 16,
"rr_min": 10,
"rr_max": 20,
"breathing_disturbances_intensity": 14,
"snoring": 1140,
"snoringepisodecount": 19,
"sleep_score": 90,
"apnea_hypopnea_index": 14
},
"created": 1620237480,
"modified": 1620237479
},
{
"id": 2081804358,
"timezone": "Europe/Paris",
"model": 32,
"model_id": 63,
"hash_deviceid": "201d0b9a0556d6b755166b2cf8d22d3bdf0487ee",
"startdate": 1618518658,
"enddate": 1618548058,
"date": "2021-04-16",
"data": {
"wakeupduration": 4080,
"wakeupcount": 1,
"durationtosleep": 840,
"remsleepduration": 2040,
"durationtowakeup": 1560,
"total_sleep_time": 16860,
"sleep_efficiency": 0.81,
"sleep_latency": 840,
"wakeup_latency": 1560,
"waso": 1680,
"nb_rem_episodes": 2,
"out_of_bed_count": 0,
"lightsleepduration": 11100,
"deepsleepduration": 3720,
"hr_average": 65,
"hr_min": 50,
"hr_max": 91,
"rr_average": 14,
"rr_min": 10,
"rr_max": 20,
"breathing_disturbances_intensity": -1,
"snoring": 1020,
"snoringepisodecount": 17,
"sleep_score": 20,
"apnea_hypopnea_index": -1
},
"created": 1620237484,
"modified": 1620237484
},
{
"id": 2081804405,
"timezone": "Europe/Paris",
"model": 32,
"model_id": 63,
"hash_deviceid": "201d0b9a0556d6b755166b2cf8d22d3bdf0487ee",
"startdate": 1618432203,
"enddate": 1618453143,
"date": "2021-04-15",
"data": {
"wakeupduration": 4080,
"wakeupcount": 1,
"durationtosleep": 840,
"remsleepduration": 2040,
"durationtowakeup": 1560,
"total_sleep_time": 16860,
"sleep_efficiency": 0.81,
"sleep_latency": 840,
"wakeup_latency": 1560,
"waso": 1680,
"nb_rem_episodes": 2,
"out_of_bed_count": 0,
"lightsleepduration": 11100,
"deepsleepduration": 3720,
"hr_average": 65,
"hr_min": 50,
"hr_max": 91,
"rr_average": 14,
"rr_min": 10,
"rr_max": 20,
"breathing_disturbances_intensity": -1,
"snoring": 1020,
"snoringepisodecount": 17,
"sleep_score": 20,
"apnea_hypopnea_index": -1
},
"created": 1620237486,
"modified": 1620237486
},
{
"id": 2081804490,
"timezone": "Europe/Paris",
"model": 32,
"model_id": 63,
"hash_deviceid": "201d0b9a0556d6b755166b2cf8d22d3bdf0487ee",
"startdate": 1618345805,
"enddate": 1618373504,
"date": "2021-04-14",
"data": {
"wakeupduration": 3600,
"wakeupcount": 2,
"durationtosleep": 780,
"remsleepduration": 3960,
"durationtowakeup": 300,
"total_sleep_time": 22680,
"sleep_efficiency": 0.86,
"sleep_latency": 780,
"wakeup_latency": 300,
"waso": 3939,
"nb_rem_episodes": 4,
"out_of_bed_count": 3,
"lightsleepduration": 12960,
"deepsleepduration": 5760,
"hr_average": 98,
"hr_min": 70,
"hr_max": 120,
"rr_average": 13,
"rr_min": 10,
"rr_max": 20,
"breathing_disturbances_intensity": 29,
"snoring": 960,
"snoringepisodecount": 16,
"sleep_score": 62,
"apnea_hypopnea_index": 29
},
"created": 1620237490,
"modified": 1620237489
}
]

View File

@ -120,11 +120,9 @@ async def test_data_manager_webhook_subscription(
hass: HomeAssistant,
withings: AsyncMock,
webhook_config_entry: MockConfigEntry,
hass_client_no_auth: ClientSessionGenerator,
) -> None:
"""Test data manager webhook subscriptions."""
await setup_integration(hass, webhook_config_entry)
await hass_client_no_auth()
await hass.async_block_till_done()
async_fire_time_changed(hass, dt_util.utcnow() + timedelta(seconds=1))
await hass.async_block_till_done()
@ -158,12 +156,10 @@ async def test_webhook_subscription_polling_config(
hass: HomeAssistant,
withings: AsyncMock,
polling_config_entry: MockConfigEntry,
hass_client_no_auth: ClientSessionGenerator,
freezer: FrozenDateTimeFactory,
) -> None:
"""Test webhook subscriptions not run when polling."""
await setup_integration(hass, polling_config_entry, False)
await hass_client_no_auth()
await hass.async_block_till_done()
freezer.tick(timedelta(seconds=1))
async_fire_time_changed(hass)

View File

@ -2,7 +2,6 @@
from datetime import timedelta
from unittest.mock import AsyncMock, patch
from aiowithings import Goals, MeasurementGroup
from freezegun.api import FrozenDateTimeFactory
import pytest
from syrupy import SnapshotAssertion
@ -11,14 +10,9 @@ from homeassistant.const import STATE_UNAVAILABLE, Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er
from . import setup_integration
from . import load_goals_fixture, load_measurements_fixture, setup_integration
from tests.common import (
MockConfigEntry,
async_fire_time_changed,
load_json_array_fixture,
load_json_object_fixture,
)
from tests.common import MockConfigEntry, async_fire_time_changed
@pytest.mark.usefixtures("entity_registry_enabled_by_default")
@ -78,11 +72,6 @@ async def test_update_updates_incrementally(
async_fire_time_changed(hass)
await hass.async_block_till_done()
meas_json = load_json_array_fixture("withings/get_meas_1.json")
measurement_groups = [
MeasurementGroup.from_api(measurement) for measurement in meas_json
]
assert withings.get_measurement_since.call_args_list == []
await _skip_10_minutes()
assert (
@ -90,7 +79,10 @@ async def test_update_updates_incrementally(
== "2019-08-01 12:00:00+00:00"
)
withings.get_measurement_since.return_value = measurement_groups
withings.get_measurement_since.return_value = load_measurements_fixture(
"withings/measurements_1.json"
)
await _skip_10_minutes()
assert (
str(withings.get_measurement_since.call_args_list[1].args[0])
@ -116,21 +108,16 @@ async def test_update_new_measurement_creates_new_sensor(
freezer: FrozenDateTimeFactory,
) -> None:
"""Test fetching a new measurement will add a new sensor."""
meas_json = load_json_array_fixture("withings/get_meas_1.json")
measurement_groups = [
MeasurementGroup.from_api(measurement) for measurement in meas_json
]
withings.get_measurement_in_period.return_value = measurement_groups
withings.get_measurement_in_period.return_value = load_measurements_fixture(
"withings/measurements_1.json"
)
await setup_integration(hass, polling_config_entry, False)
assert hass.states.get("sensor.henk_fat_mass") is None
meas_json = load_json_object_fixture("withings/get_meas.json")
measurement_groups = [
MeasurementGroup.from_api(measurement)
for measurement in meas_json["measuregrps"]
]
withings.get_measurement_in_period.return_value = measurement_groups
withings.get_measurement_in_period.return_value = load_measurements_fixture(
"withings/measurements.json"
)
freezer.tick(timedelta(minutes=10))
async_fire_time_changed(hass)
@ -146,17 +133,15 @@ async def test_update_new_goals_creates_new_sensor(
freezer: FrozenDateTimeFactory,
) -> None:
"""Test fetching new goals will add a new sensor."""
goals_json = load_json_object_fixture("withings/goals_1.json")
goals = Goals.from_api(goals_json)
withings.get_goals.return_value = goals
withings.get_goals.return_value = load_goals_fixture("withings/goals_1.json")
await setup_integration(hass, polling_config_entry, False)
assert hass.states.get("sensor.henk_step_goal") is None
assert hass.states.get("sensor.henk_weight_goal") is not None
goals_json = load_json_object_fixture("withings/goals.json")
goals = Goals.from_api(goals_json)
withings.get_goals.return_value = goals
withings.get_goals.return_value = load_goals_fixture("withings/goals.json")
freezer.tick(timedelta(hours=1))
async_fire_time_changed(hass)