mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-12-17 11:13:30 +00:00
71e8cc09d1
``` ___________________________ test_camera_off[pyloop] ____________________________ [gw5] linux -- Python 3.8.9 /nix/store/4s0h5aawbap3xhldxhcijvl26751qrjr-python3-3.8.9/bin/python3.8 hass = <homeassistant.core.HomeAssistant object at 0x7fff4433b580> async def test_camera_off(hass): """Test the camera turn off service.""" await setup_platform(hass, CAMERA_DOMAIN) with patch("abodepy.AbodeCamera.privacy_mode") as mock_capture: > await hass.services.async_call( CAMERA_DOMAIN, "turn_off", {ATTR_ENTITY_ID: "camera.test_cam"}, blocking=True, ) hass = <homeassistant.core.HomeAssistant object at 0x7fff4433b580> mock_capture = <MagicMock name='privacy_mode' id='140734337787888'> tests/components/abode/test_camera.py:64: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <homeassistant.core.ServiceRegistry object at 0x7fff442c1cd0> domain = 'camera', service = 'turn_off' service_data = {'entity_id': 'camera.test_cam'}, blocking = True context = Context(user_id=None, parent_id=None, id='20e520e6917f171d80558dcc4b10b219') limit = 10, target = None async def async_call( self, domain: str, service: str, service_data: dict | None = None, blocking: bool = False, context: Context | None = None, limit: float | None = SERVICE_CALL_LIMIT, target: dict | None = None, ) -> bool | None: """ Call a service. Specify blocking=True to wait until service is executed. Waits a maximum of limit, which may be None for no timeout. If blocking = True, will return boolean if service executed successfully within limit. This method will fire an event to indicate the service has been called. Because the service is sent as an event you are not allowed to use the keys ATTR_DOMAIN and ATTR_SERVICE in your service_data. This method is a coroutine. """ domain = domain.lower() service = service.lower() context = context or Context() service_data = service_data or {} try: handler = self._services[domain][service] except KeyError: > raise ServiceNotFound(domain, service) from None E homeassistant.exceptions.ServiceNotFound: Unable to find service camera.turn_off blocking = True context = Context(user_id=None, parent_id=None, id='20e520e6917f171d80558dcc4b10b219') domain = 'camera' limit = 10 self = <homeassistant.core.ServiceRegistry object at 0x7fff442c1cd0> service = 'turn_off' service_data = {'entity_id': 'camera.test_cam'} target = None homeassistant/core.py:1438: ServiceNotFound ---------------------------- Captured stderr setup ----------------------------- DEBUG:asyncio:Using selector: EpollSelector ------------------------------ Captured log setup ------------------------------ DEBUG asyncio:selector_events.py:59 Using selector: EpollSelector ----------------------------- Captured stderr call ----------------------------- INFO:homeassistant.loader:Loaded abode from homeassistant.components.abode INFO:homeassistant.setup:Setting up abode INFO:homeassistant.setup:Setup of domain abode took 0.0 seconds DEBUG:abodepy:Cache found at: /build/source/tests/testing_config/abodepy_cache.pickle WARNING:abodepy.utils:Empty pickle file: /build/source/tests/testing_config/abodepy_cache.pickle DEBUG:abodepy:Removing invalid cache file: /build/source/tests/testing_config/abodepy_cache.pickle ERROR:homeassistant.config_entries:Error setting up entry Mock Title for abode Traceback (most recent call last): File "/build/source/homeassistant/config_entries.py", line 293, in async_setup result = await component.async_setup_entry(hass, self) # type: ignore File "/build/source/homeassistant/components/abode/__init__.py", line 125, in async_setup_entry abode = await hass.async_add_executor_job( File "/nix/store/4s0h5aawbap3xhldxhcijvl26751qrjr-python3-3.8.9/lib/python3.8/concurrent/futures/thread.py", line 57, in run result = self.fn(*self.args, **self.kwargs) File "/nix/store/6s0sdvk0crvcfyv7w33yc7w4bkzl0y1w-python3.8-abodepy-1.2.1/lib/python3.8/site-packages/abodepy/__init__.py", line 85, in __init__ self._load_cache() File "/nix/store/6s0sdvk0crvcfyv7w33yc7w4bkzl0y1w-python3.8-abodepy-1.2.1/lib/python3.8/site-packages/abodepy/__init__.py", line 497, in _load_cache os.remove(self._cache_path) FileNotFoundError: [Errno 2] No such file or directory: '/build/source/tests/testing_config/abodepy_cache.pickle' DEBUG:homeassistant.core:Bus:Handling <Event component_loaded[L]: component=abode> ```
847 lines
21 KiB
Nix
847 lines
21 KiB
Nix
{ stdenv
|
|
, lib
|
|
, fetchFromGitHub
|
|
, python3
|
|
, inetutils
|
|
, nixosTests
|
|
|
|
# Look up dependencies of specified components in component-packages.nix
|
|
, extraComponents ? [ ]
|
|
|
|
# Additional packages to add to propagatedBuildInputs
|
|
, extraPackages ? ps: []
|
|
|
|
# Override Python packages using
|
|
# self: super: { pkg = super.pkg.overridePythonAttrs (oldAttrs: { ... }); }
|
|
# Applied after defaultOverrides
|
|
, packageOverrides ? self: super: {}
|
|
|
|
# Skip pip install of required packages on startup
|
|
, skipPip ? true }:
|
|
|
|
let
|
|
defaultOverrides = [
|
|
# Override the version of some packages pinned in Home Assistant's setup.py and requirements_all.txt
|
|
|
|
# https://github.com/NixOS/nixpkgs/pull/125414
|
|
(mkOverride "flask" "2.0.1" "0mcgwq7b4qd99mf5bsvs3wphchxarf8kgil4hwww3blj31xjak0w")
|
|
(mkOverride "itsdangerous" "2.0.1" "1w6gfb2zhbcmrfj6digwzw1z68w6zg1q87rm6la2m412zil4swly")
|
|
(mkOverride "jinja2" "3.0.1" "197ms1wimxql650245v63wkv04n8bicj549wfhp51bx68x5lhgvh")
|
|
(mkOverride "markupsafe" "2.0.1" "02k2ynmqvvd0z0gakkf8s4idyb606r7zgga41jrkhqmigy06fk2r")
|
|
(self: super: {
|
|
werkzeug = super.werkzeug.overridePythonAttrs (oldAttrs: rec {
|
|
version = "2.0.1";
|
|
src = oldAttrs.src.override {
|
|
inherit version;
|
|
sha256 = "0hlwawnn8c41f254qify5jnjj8xb97n294h09bqimzqhs0qdpq8x";
|
|
};
|
|
checkInputs = oldAttrs.checkInputs ++ [ python3.pkgs.pytest-xprocess ];
|
|
pytestFlagsArray = [ "-m 'not filterwarnings'" ];
|
|
});
|
|
})
|
|
(mkOverride "flask-restful" "0.3.9" "0gm5dz088v3d2k1dkcp9b3nnqpkk0fp2jly870hijj2xhc5nbv6c")
|
|
(self: super: {
|
|
debugpy = super.debugpy.overridePythonAttrs (oldAttrs: rec {
|
|
# tests fail with flask/werkezug>=2.0
|
|
doCheck = false;
|
|
});
|
|
})
|
|
|
|
# Pinned due to API changes in iaqualink>=2.0, remove after
|
|
# https://github.com/home-assistant/core/pull/48137 was merged
|
|
(self: super: {
|
|
iaqualink = super.iaqualink.overridePythonAttrs (oldAttrs: rec {
|
|
version = "0.3.90";
|
|
src = fetchFromGitHub {
|
|
owner = "flz";
|
|
repo = "iaqualink-py";
|
|
rev = "v${version}";
|
|
sha256 = "0c8ckbbr1n8gx5k63ymgyfkbz3d0rbdvghg8fqdvbg4nrigrs5v0";
|
|
};
|
|
checkInputs = oldAttrs.checkInputs ++ [ python3.pkgs.asynctest ];
|
|
});
|
|
})
|
|
|
|
# Pinned due to API changes in pyjwt>=2.0
|
|
(self: super: {
|
|
pyjwt = super.pyjwt.overridePythonAttrs (oldAttrs: rec {
|
|
version = "1.7.1";
|
|
src = oldAttrs.src.override {
|
|
inherit version;
|
|
sha256 = "15hflax5qkw1v6nssk1r0wkj83jgghskcmn875m3wgvpzdvajncd";
|
|
};
|
|
disabledTests = [
|
|
"test_ec_verify_should_return_false_if_signature_invalid"
|
|
];
|
|
});
|
|
})
|
|
|
|
# Pinned due to bug in ring-doorbell 0.7.0
|
|
# https://github.com/tchellomello/python-ring-doorbell/issues/240
|
|
(mkOverride "ring-doorbell" "0.6.2"
|
|
"fbd537722a27b3b854c26506d894b7399bb8dc57ff36083285971227a2d46560")
|
|
|
|
# Pinned due to API changes in pyflunearyou>=2.0
|
|
(self: super: {
|
|
pyflunearyou = super.pyflunearyou.overridePythonAttrs (oldAttrs: rec {
|
|
version = "1.0.7";
|
|
src = fetchFromGitHub {
|
|
owner = "bachya";
|
|
repo = "pyflunearyou";
|
|
rev = version;
|
|
sha256 = "0hq55k298m9a90qb3lasw9bi093hzndrah00rfq94bp53aq0is99";
|
|
};
|
|
postPatch = ''
|
|
substituteInPlace pyproject.toml \
|
|
--replace "poetry.masonry.api" "poetry.core.masonry.api" \
|
|
--replace 'msgpack = "^0.6.2"' 'msgpack = "*"' \
|
|
--replace 'ujson = "^1.35"' 'ujson = "*"'
|
|
'';
|
|
});
|
|
})
|
|
|
|
# Pinned due to API changes in pylast 4.2.1
|
|
(mkOverride "pylast" "4.2.0"
|
|
"0zd0dn2l738ndz62vpa751z0ldnm91dcz9zzbvxv53r08l0s9yf3")
|
|
|
|
# Pinned due to API changes in pyopenuv>=1.1.0
|
|
(self: super: {
|
|
pyopenuv = super.pyopenuv.overridePythonAttrs (oldAttrs: rec {
|
|
version = "1.0.13";
|
|
src = fetchFromGitHub {
|
|
owner = "bachya";
|
|
repo = "pyopenuv";
|
|
rev = version;
|
|
sha256 = "1gx9xjkyvqqy8410lnbshq1j5y4cb0cdc4m505g17rwdzdwb01y8";
|
|
};
|
|
postPatch = ''
|
|
substituteInPlace pyproject.toml \
|
|
--replace "poetry.masonry.api" "poetry.core.masonry.api"
|
|
'';
|
|
});
|
|
})
|
|
|
|
# Pinned due to API changes in pyruckus>0.12
|
|
(self: super: {
|
|
pyruckus = super.pyruckus.overridePythonAttrs (oldAttrs: rec {
|
|
version = "0.12";
|
|
src = fetchFromGitHub {
|
|
owner = "gabe565";
|
|
repo = "pyruckus";
|
|
rev = version;
|
|
sha256 = "0ykv6r6blbj3fg9fplk9i7xclkv5d93rwvx0fm5s8ms9f2s9ih8z";
|
|
};
|
|
});
|
|
})
|
|
|
|
# Pinned due to API changes in eebrightbox>=0.0.5
|
|
(self: super: {
|
|
eebrightbox = super.eebrightbox.overridePythonAttrs (oldAttrs: rec {
|
|
version = "0.0.4";
|
|
src = fetchFromGitHub {
|
|
owner = "krygal";
|
|
repo = "eebrightbox";
|
|
rev = version;
|
|
sha256 = "0d8mmpwgrd7gymw5263r1v2wjv6dx6w6pq13d62fkfm4h2hya4a4";
|
|
};
|
|
});
|
|
})
|
|
|
|
# home-assistant-frontend does not exist in python3.pkgs
|
|
(self: super: {
|
|
home-assistant-frontend = self.callPackage ./frontend.nix { };
|
|
})
|
|
];
|
|
|
|
mkOverride = attrname: version: sha256:
|
|
self: super: {
|
|
${attrname} = super.${attrname}.overridePythonAttrs (oldAttrs: {
|
|
inherit version;
|
|
src = oldAttrs.src.override {
|
|
inherit version sha256;
|
|
};
|
|
});
|
|
};
|
|
|
|
py = python3.override {
|
|
# Put packageOverrides at the start so they are applied after defaultOverrides
|
|
packageOverrides = lib.foldr lib.composeExtensions (self: super: { }) ([ packageOverrides ] ++ defaultOverrides);
|
|
};
|
|
|
|
componentPackages = import ./component-packages.nix;
|
|
|
|
availableComponents = builtins.attrNames componentPackages.components;
|
|
|
|
getPackages = component: builtins.getAttr component componentPackages.components;
|
|
|
|
componentBuildInputs = lib.concatMap (component: getPackages component py.pkgs) extraComponents;
|
|
|
|
# Ensure that we are using a consistent package set
|
|
extraBuildInputs = extraPackages py.pkgs;
|
|
|
|
# Don't forget to run parse-requirements.py after updating
|
|
hassVersion = "2021.6.5";
|
|
|
|
in with py.pkgs; buildPythonApplication rec {
|
|
pname = "homeassistant";
|
|
version = assert (componentPackages.version == hassVersion); hassVersion;
|
|
|
|
# check REQUIRED_PYTHON_VER in homeassistant/const.py
|
|
disabled = pythonOlder "3.8";
|
|
|
|
# don't try and fail to strip 6600+ python files, it takes minutes!
|
|
dontStrip = true;
|
|
|
|
# PyPI tarball is missing tests/ directory
|
|
src = fetchFromGitHub {
|
|
owner = "home-assistant";
|
|
repo = "core";
|
|
rev = version;
|
|
sha256 = "1cp294hy35k9hjbp8iqmaf1m5qbbkh3jwf92ym49waw8di5a5wvh";
|
|
};
|
|
|
|
# leave this in, so users don't have to constantly update their downstream patch handling
|
|
patches = [
|
|
];
|
|
|
|
postPatch = ''
|
|
substituteInPlace setup.py \
|
|
--replace "attrs==21.2.0" "attrs" \
|
|
--replace "awesomeversion==21.4.0" "awesomeversion" \
|
|
--replace "bcrypt==3.1.7" "bcrypt" \
|
|
--replace "cryptography==3.3.2" "cryptography" \
|
|
--replace "pip>=8.0.3,<20.3" "pip" \
|
|
--replace "ruamel.yaml==0.15.100" "ruamel.yaml"
|
|
substituteInPlace tests/test_config.py --replace '"/usr"' '"/build/media"'
|
|
'';
|
|
|
|
propagatedBuildInputs = [
|
|
# Only packages required in setup.py
|
|
aiohttp
|
|
astral
|
|
async-timeout
|
|
attrs
|
|
awesomeversion
|
|
bcrypt
|
|
certifi
|
|
ciso8601
|
|
cryptography
|
|
httpx
|
|
jinja2
|
|
pip
|
|
pyjwt
|
|
python-slugify
|
|
pytz
|
|
pyyaml
|
|
requests
|
|
ruamel_yaml
|
|
voluptuous
|
|
voluptuous-serialize
|
|
yarl
|
|
] ++ lib.optionals (pythonOlder "3.9") [
|
|
backports-zoneinfo
|
|
] ++ componentBuildInputs ++ extraBuildInputs;
|
|
|
|
makeWrapperArgs = lib.optional skipPip "--add-flags --skip-pip";
|
|
|
|
# upstream only tests on Linux, so do we.
|
|
doCheck = stdenv.isLinux;
|
|
|
|
checkInputs = [
|
|
# test infrastructure (selectively from requirement_test.txt)
|
|
pytest-aiohttp
|
|
pytest-mock
|
|
pytest-rerunfailures
|
|
pytest-xdist
|
|
pytestCheckHook
|
|
requests-mock
|
|
jsonpickle
|
|
respx
|
|
# required by tests/auth/mfa_modules
|
|
pyotp
|
|
] ++ lib.concatMap (component: getPackages component py.pkgs) componentTests;
|
|
|
|
# We can reasonably test components that don't communicate with any network
|
|
# services. Before adding new components to this list make sure we have all
|
|
# its dependencies packaged and listed in ./component-packages.nix.
|
|
componentTests = [
|
|
"abode"
|
|
"accuweather"
|
|
"acmeda"
|
|
"adguard"
|
|
"advantage_air"
|
|
"aemet"
|
|
"agent_dvr"
|
|
"air_quality"
|
|
"airly"
|
|
"airnow"
|
|
"airvisual"
|
|
"alarm_control_panel"
|
|
"alarmdecoder"
|
|
"alert"
|
|
"alexa"
|
|
"almond"
|
|
"ambiclimate"
|
|
"ambient_station"
|
|
"analytics"
|
|
"androidtv"
|
|
"apache_kafka"
|
|
"api"
|
|
"apple_tv"
|
|
"apprise"
|
|
"aprs"
|
|
"arcam_fmj"
|
|
"arlo"
|
|
"asuswrt"
|
|
"atag"
|
|
"august"
|
|
"aurora"
|
|
"auth"
|
|
"automation"
|
|
"awair"
|
|
"aws"
|
|
"axis"
|
|
"azure_devops"
|
|
"azure_event_hub"
|
|
"bayesian"
|
|
"binary_sensor"
|
|
"blackbird"
|
|
"blebox"
|
|
"blink"
|
|
"blueprint"
|
|
"bluetooth_le_tracker"
|
|
"bmw_connected_drive"
|
|
"bond"
|
|
"bosch_shc"
|
|
"braviatv"
|
|
"broadlink"
|
|
"brother"
|
|
"bsblan"
|
|
"buienradar"
|
|
"caldav"
|
|
"calendar"
|
|
"camera"
|
|
"canary"
|
|
"cast"
|
|
"cert_expiry"
|
|
"climacell"
|
|
"climate"
|
|
"cloud"
|
|
"cloudflare"
|
|
"color_extractor"
|
|
"comfoconnect"
|
|
"command_line"
|
|
"compensation"
|
|
"config"
|
|
"configurator"
|
|
"control4"
|
|
"conversation"
|
|
"coolmaster"
|
|
"coronavirus"
|
|
"counter"
|
|
"cover"
|
|
"daikin"
|
|
"darksky"
|
|
"datadog"
|
|
"deconz"
|
|
"default_config"
|
|
"demo"
|
|
"denonavr"
|
|
"derivative"
|
|
"device_automation"
|
|
"device_sun_light_trigger"
|
|
"device_tracker"
|
|
"devolo_home_control"
|
|
"dexcom"
|
|
"dhcp"
|
|
"dialogflow"
|
|
"directv"
|
|
"discovery"
|
|
"doorbird"
|
|
"dsmr"
|
|
"dte_energy_bridge"
|
|
"duckdns"
|
|
"dunehd"
|
|
"dyson"
|
|
"eafm"
|
|
"ecobee"
|
|
"econet"
|
|
"ee_brightbox"
|
|
"efergy"
|
|
"elgato"
|
|
"emonitor"
|
|
"emulated_hue"
|
|
"emulated_kasa"
|
|
"emulated_roku"
|
|
"enocean"
|
|
"enphase_envoy"
|
|
"epson"
|
|
"esphome"
|
|
"everlights"
|
|
"ezviz"
|
|
"faa_delays"
|
|
"facebook"
|
|
"facebox"
|
|
"fail2ban"
|
|
"fan"
|
|
"feedreader"
|
|
"ffmpeg"
|
|
"fido"
|
|
"file"
|
|
"filesize"
|
|
"filter"
|
|
"fireservicerota"
|
|
"firmata"
|
|
"flick_electric"
|
|
"flo"
|
|
"flume"
|
|
"flunearyou"
|
|
"flux"
|
|
"folder"
|
|
"folder_watcher"
|
|
"foobot"
|
|
"foscam"
|
|
"freebox"
|
|
"freedns"
|
|
"fritz"
|
|
"fritzbox"
|
|
"fritzbox_callmonitor"
|
|
"frontend"
|
|
"garages_amsterdam"
|
|
"garmin_connect"
|
|
"gdacs"
|
|
"generic"
|
|
"generic_thermostat"
|
|
"geo_json_events"
|
|
"geo_location"
|
|
"geo_rss_events"
|
|
"geofency"
|
|
"geonetnz_quakes"
|
|
"geonetnz_volcano"
|
|
"gios"
|
|
"glances"
|
|
"goalzero"
|
|
"gogogate2"
|
|
"google"
|
|
"google_assistant"
|
|
"google_domains"
|
|
"google_pubsub"
|
|
"google_translate"
|
|
"google_travel_time"
|
|
"google_wifi"
|
|
"gpslogger"
|
|
"graphite"
|
|
"gree"
|
|
"group"
|
|
"growatt_server"
|
|
"guardian"
|
|
"habitica"
|
|
"hangouts"
|
|
"harmony"
|
|
"hassio"
|
|
"hddtemp"
|
|
"heos"
|
|
"here_travel_time"
|
|
"history"
|
|
"history_stats"
|
|
"hive"
|
|
"home_connect"
|
|
"home_plus_control"
|
|
"homeassistant"
|
|
"homekit"
|
|
"homekit_controller"
|
|
"homematic"
|
|
"homematicip_cloud"
|
|
"html5"
|
|
"http"
|
|
"hue"
|
|
"humidifier"
|
|
"hyperion"
|
|
"ialarm"
|
|
"iaqualink"
|
|
"icloud"
|
|
"ifttt"
|
|
"image"
|
|
"image_processing"
|
|
"imap_email_content"
|
|
"influxdb"
|
|
"input_boolean"
|
|
"input_datetime"
|
|
"input_number"
|
|
"input_select"
|
|
"input_text"
|
|
"insteon"
|
|
"integration"
|
|
"intent"
|
|
"intent_script"
|
|
"ios"
|
|
"ipma"
|
|
"ipp"
|
|
"iqvia"
|
|
"islamic_prayer_times"
|
|
"jewish_calendar"
|
|
"kira"
|
|
"kmtronic"
|
|
"knx"
|
|
"kodi"
|
|
"kulersky"
|
|
"lastfm"
|
|
"lcn"
|
|
"light"
|
|
"litterrobot"
|
|
"local_file"
|
|
"local_ip"
|
|
"locative"
|
|
"lock"
|
|
"logbook"
|
|
"logentries"
|
|
"logger"
|
|
"london_air"
|
|
"lovelace"
|
|
"luftdaten"
|
|
"lutron_caseta"
|
|
"lyric"
|
|
"mailbox"
|
|
"manual"
|
|
"manual_mqtt"
|
|
"mazda"
|
|
"media_player"
|
|
"media_source"
|
|
"meraki"
|
|
"met"
|
|
"met_eireann"
|
|
"meteoclimatic"
|
|
"mhz19"
|
|
"microsoft_face"
|
|
"microsoft_face_detect"
|
|
"microsoft_face_identify"
|
|
"mikrotik"
|
|
"mill"
|
|
"min_max"
|
|
"minecraft_server"
|
|
"minio"
|
|
"mobile_app"
|
|
"modbus"
|
|
"mold_indicator"
|
|
"moon"
|
|
"motioneye"
|
|
"mqtt"
|
|
"mqtt_eventstream"
|
|
"mqtt_json"
|
|
"mqtt_room"
|
|
"mqtt_statestream"
|
|
"mullvad"
|
|
"mutesync"
|
|
"my"
|
|
"myq"
|
|
"mysensors"
|
|
"nam"
|
|
"namecheapdns"
|
|
"neato"
|
|
"netatmo"
|
|
"nexia"
|
|
"no_ip"
|
|
"notify"
|
|
"notion"
|
|
"nsw_rural_fire_service_feed"
|
|
"nuki"
|
|
"number"
|
|
"nws"
|
|
"nx584"
|
|
"omnilogic"
|
|
"onboarding"
|
|
"ondilo_ico"
|
|
"openalpr_cloud"
|
|
"openalpr_local"
|
|
"openerz"
|
|
"openhardwaremonitor"
|
|
"opentherm_gw"
|
|
"openuv"
|
|
"openweathermap"
|
|
"opnsense"
|
|
"ovo_energy"
|
|
"owntracks"
|
|
"ozw"
|
|
"panel_custom"
|
|
"panel_iframe"
|
|
"persistent_notification"
|
|
"person"
|
|
"philips_js"
|
|
"pi_hole"
|
|
"picnic"
|
|
"ping"
|
|
"plaato"
|
|
"plant"
|
|
"plex"
|
|
"plugwise"
|
|
"poolsense"
|
|
"profiler"
|
|
"prometheus"
|
|
"proximity"
|
|
"push"
|
|
"pushbullet"
|
|
"pvpc_hourly_pricing"
|
|
"python_script"
|
|
"rachio"
|
|
"radarr"
|
|
"rainmachine"
|
|
"random"
|
|
"recollect_waste"
|
|
"recorder"
|
|
"reddit"
|
|
"remote"
|
|
"rest"
|
|
"rest_command"
|
|
"ring"
|
|
"risco"
|
|
"rituals_perfume_genie"
|
|
"rmvtransport"
|
|
"roku"
|
|
"roomba"
|
|
"roon"
|
|
"rss_feed_template"
|
|
"ruckus_unleashed"
|
|
"safe_mode"
|
|
"samsungtv"
|
|
"scene"
|
|
"screenlogic"
|
|
"script"
|
|
"search"
|
|
"season"
|
|
"sense"
|
|
"sensor"
|
|
"sentry"
|
|
"sharkiq"
|
|
"shell_command"
|
|
"shelly"
|
|
"shopping_list"
|
|
"sigfox"
|
|
"sighthound"
|
|
"simplisafe"
|
|
"simulated"
|
|
"slack"
|
|
"sleepiq"
|
|
"sma"
|
|
"smappee"
|
|
"smartthings"
|
|
"smarttub"
|
|
"smhi"
|
|
"smtp"
|
|
"snips"
|
|
"solaredge"
|
|
"soma"
|
|
"somfy"
|
|
"sonos"
|
|
"soundtouch"
|
|
"spaceapi"
|
|
"speedtestdotnet"
|
|
"spider"
|
|
"spotify"
|
|
"sql"
|
|
"squeezebox"
|
|
"ssdp"
|
|
"startca"
|
|
"statistics"
|
|
"statsd"
|
|
"stream"
|
|
"stt"
|
|
"subaru"
|
|
"sun"
|
|
"surepetcare"
|
|
"switch"
|
|
"switcher_kis"
|
|
"system_health"
|
|
"system_log"
|
|
"tado"
|
|
"tag"
|
|
"tasmota"
|
|
"tcp"
|
|
"telegram"
|
|
"tellduslive"
|
|
"template"
|
|
"tesla"
|
|
"threshold"
|
|
"tibber"
|
|
"tile"
|
|
"time_date"
|
|
"timer"
|
|
"tod"
|
|
"tomato"
|
|
"toon"
|
|
"tplink"
|
|
"trace"
|
|
"transmission"
|
|
"trend"
|
|
"tts"
|
|
"tuya"
|
|
"twentemilieu"
|
|
"twilio"
|
|
"twinkly"
|
|
"twitch"
|
|
"uk_transport"
|
|
"unifi"
|
|
"unifi_direct"
|
|
"universal"
|
|
"updater"
|
|
"upnp"
|
|
"uptime"
|
|
"usgs_earthquakes_feed"
|
|
"utility_meter"
|
|
"uvc"
|
|
"vacuum"
|
|
"velbus"
|
|
"venstar"
|
|
"vera"
|
|
"verisure"
|
|
"version"
|
|
"vesync"
|
|
"vizio"
|
|
"voicerss"
|
|
"volumio"
|
|
"vultr"
|
|
"wake_on_lan"
|
|
"wallbox"
|
|
"water_heater"
|
|
"waze_travel_time"
|
|
"weather"
|
|
"webhook"
|
|
"webostv"
|
|
"websocket_api"
|
|
"wemo"
|
|
"wiffi"
|
|
"wilight"
|
|
"wled"
|
|
"workday"
|
|
"worldclock"
|
|
"wsdot"
|
|
"wunderground"
|
|
"xbox"
|
|
"xiaomi"
|
|
"xiaomi_aqara"
|
|
"xiaomi_miio"
|
|
"yamaha"
|
|
"yandex_transport"
|
|
"yandextts"
|
|
"yeelight"
|
|
"zeroconf"
|
|
"zerproc"
|
|
"zha"
|
|
"zodiac"
|
|
"zone"
|
|
"zwave"
|
|
"zwave_js"
|
|
] ++ lib.optionals (builtins.any (s: s == stdenv.hostPlatform.system) debugpy.meta.platforms) [
|
|
"debugpy"
|
|
];
|
|
|
|
pytestFlagsArray = [
|
|
# parallelize test run
|
|
"--numprocesses auto"
|
|
# assign tests grouped by file to workers
|
|
"--dist loadfile"
|
|
# retry racy tests that end in "RuntimeError: Event loop is closed"
|
|
"--reruns 3"
|
|
"--only-rerun RuntimeError"
|
|
# enable full variable printing on error
|
|
"--showlocals"
|
|
# here_travel_time/test_sensor.py: Tries to access HERE API: herepy.error.HEREError: Error occured on __get
|
|
"--deselect tests/components/here_travel_time/test_sensor.py::test_invalid_credentials"
|
|
# screenlogic/test_config_flow.py: Tries to send out UDP broadcasts
|
|
"--deselect tests/components/screenlogic/test_config_flow.py::test_form_cannot_connect"
|
|
# abode/test_camera.py: Race condition in pickle file creationg
|
|
"--deselect tests/components/abode/test_camera.py::test_camera_off"
|
|
# asuswrt/test_config_flow.py: Sandbox network limitations, fails with unexpected error
|
|
"--deselect tests/components/asuswrt/test_config_flow.py::test_on_connect_failed"
|
|
# shelly/test_config_flow.py: Tries to join multicast group
|
|
"--deselect tests/components/shelly/test_config_flow.py::test_form"
|
|
"--deselect tests/components/shelly/test_config_flow.py::test_title_without_name"
|
|
"--deselect tests/components/shelly/test_config_flow.py::test_form_auth"
|
|
"--deselect tests/components/shelly/test_config_flow.py::test_form_errors_test_connection"
|
|
"--deselect tests/components/shelly/test_config_flow.py::test_user_setup_ignored_device"
|
|
"--deselect tests/components/shelly/test_config_flow.py::test_form_auth_errors_test_connection"
|
|
"--deselect tests/components/shelly/test_config_flow.py::test_form_auth_errors_test_connection"
|
|
"--deselect tests/components/shelly/test_config_flow.py::test_form_auth_errors_test_connection"
|
|
"--deselect tests/components/shelly/test_config_flow.py::test_zeroconf"
|
|
"--deselect tests/components/shelly/test_config_flow.py::test_zeroconf_sleeping_device"
|
|
"--deselect tests/components/shelly/test_config_flow.py::test_zeroconf_sleeping_device_error"
|
|
"--deselect tests/components/shelly/test_config_flow.py::test_zeroconf_sleeping_device_error"
|
|
"--deselect tests/components/shelly/test_config_flow.py::test_zeroconf_require_auth"
|
|
# prometheus/test_init.py: Spurious AssertionError regarding humidifier_target_humidity_percent metric
|
|
"--deselect tests/components/prometheus/test_init.py::test_view"
|
|
# smhi/test_init.py: Tries to fetch data from the network: socket.gaierror: [Errno -2] Name or service not known
|
|
"--deselect tests/components/smhi/test_init.py::test_remove_entry"
|
|
# wallbox/test_config_flow.py: Tries to connect to api.wall-box.cim: Failed to establish a new connection: [Errno -2] Name or service not known
|
|
"--deselect tests/components/wallbox/test_config_flow.py::test_form_invalid_auth"
|
|
"--deselect tests/components/wallbox/test_config_flow.py::test_form_cannot_connect"
|
|
# tests are located in tests/
|
|
"tests"
|
|
# dynamically add packages required for component tests
|
|
] ++ map (component: "tests/components/" + component) componentTests;
|
|
|
|
disabledTestPaths = [
|
|
# don't bulk test all components
|
|
"tests/components"
|
|
# pyotp since v2.4.0 complains about the short mock keys, hass pins v2.3.0
|
|
"tests/auth/mfa_modules/test_notify.py"
|
|
];
|
|
|
|
disabledTests = [
|
|
# AssertionError: assert 1 == 0
|
|
"test_error_posted_as_event"
|
|
"test_merge"
|
|
# ModuleNotFoundError: No module named 'pyqwikswitch'
|
|
"test_merge_id_schema"
|
|
# keyring.errors.NoKeyringError: No recommended backend was available.
|
|
"test_secrets_from_unrelated_fails"
|
|
"test_secrets_credstash"
|
|
# generic/test_camera.py: AssertionError: 500 == 200
|
|
"test_fetching_without_verify_ssl"
|
|
"test_fetching_url_with_verify_ssl"
|
|
# util/test_package.py: AssertionError on package.is_installed('homeassistant>=999.999.999')
|
|
"test_check_package_version_does_not_match"
|
|
# homeassistant/util/thread.py:51: SystemError
|
|
"test_executor_shutdown_can_interrupt_threads"
|
|
# {'theme_color': '#03A9F4'} != {'theme_color': 'blue'}
|
|
"test_webhook_handle_get_config"
|
|
# onboarding tests rpi_power component, for which we are lacking rpi_bad_power library
|
|
"test_onboarding_core_sets_up_rpi_power"
|
|
"test_onboarding_core_no_rpi_power"
|
|
# hue/test_sensor_base.py: Race condition when counting events
|
|
"test_hue_events"
|
|
];
|
|
|
|
preCheck = ''
|
|
export HOME="$TEMPDIR"
|
|
|
|
# the tests require the existance of a media dir
|
|
mkdir /build/media
|
|
|
|
# put ping binary into PATH, e.g. for wake_on_lan tests
|
|
export PATH=${inetutils}/bin:$PATH
|
|
|
|
# error out when component test directory is missing, otherwise hidden by xdist execution :(
|
|
for component in ${lib.concatStringsSep " " (map lib.escapeShellArg componentTests)}; do
|
|
test -d "tests/components/$component" || {
|
|
>2& echo "ERROR: Tests for component '$component' were enabled, but they do not exist!"
|
|
exit 1
|
|
}
|
|
done
|
|
'';
|
|
|
|
passthru = {
|
|
inherit availableComponents;
|
|
python = py;
|
|
tests = {
|
|
inherit (nixosTests) home-assistant;
|
|
};
|
|
};
|
|
|
|
meta = with lib; {
|
|
homepage = "https://home-assistant.io/";
|
|
description = "Open source home automation that puts local control and privacy first";
|
|
license = licenses.asl20;
|
|
maintainers = teams.home-assistant.members;
|
|
platforms = platforms.linux;
|
|
};
|
|
}
|