From be4fff557c09aa77b81cd47bfdab6778fd13a5a4 Mon Sep 17 00:00:00 2001 From: Nick Vigilante Date: Sun, 23 Aug 2026 01:57:44 -0400 Subject: [PATCH 1/5] Add Midea window AC (0x118C/0x2022) to Matter dry mode device list (#179780) --- homeassistant/components/matter/climate.py | 1 + 1 file changed, 1 insertion(+) diff --git a/homeassistant/components/matter/climate.py b/homeassistant/components/matter/climate.py index c24af835fbd0e0..7d677b5374dc7e 100644 --- a/homeassistant/components/matter/climate.py +++ b/homeassistant/components/matter/climate.py @@ -100,6 +100,7 @@ (0x0001, 0x0108), (0x0001, 0x010A), (0x0001, 0x013F), + (0x118C, 0x2022), (0x1209, 0x8000), (0x1209, 0x8001), (0x1209, 0x8002), From 54b7802f1f7814a6b1b4e762a1ebfe6c731476be Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 23 Aug 2026 09:12:25 +0200 Subject: [PATCH 2/5] Mock the go2rtc rest client in the setup error test (#179867) --- tests/components/go2rtc/test_init.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/components/go2rtc/test_init.py b/tests/components/go2rtc/test_init.py index 97e1ed3b275328..e24c3770b977cd 100644 --- a/tests/components/go2rtc/test_init.py +++ b/tests/components/go2rtc/test_init.py @@ -799,8 +799,11 @@ async def test_setup_with_setup_error( caplog: pytest.LogCaptureFixture, has_go2rtc_entry: bool, expected_log_message: str, + rest_client: AsyncMock, ) -> None: """Test setup integration fails.""" + # The cases that get as far as starting the server expect it to fail + rest_client.validate_server_version.side_effect = Go2RtcClientError() assert not await async_setup_component(hass, DOMAIN, config) await hass.async_block_till_done(wait_background_tasks=True) From 33036f498fa85958b753ad46d759c5615be9cab4 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 23 Aug 2026 09:12:56 +0200 Subject: [PATCH 3/5] Mock the iCloud response release() as a sync call (#179860) --- tests/components/icloud/test_media_source.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/components/icloud/test_media_source.py b/tests/components/icloud/test_media_source.py index 4c647ce913c6d5..96baff986c7dc5 100644 --- a/tests/components/icloud/test_media_source.py +++ b/tests/components/icloud/test_media_source.py @@ -3,7 +3,7 @@ from base64 import b64encode from http import HTTPStatus from types import SimpleNamespace -from unittest.mock import PropertyMock, patch +from unittest.mock import MagicMock, PropertyMock, patch import urllib.parse from aiohttp import hdrs @@ -793,7 +793,7 @@ async def iter_chunked(self, _size: int): hdrs.CONTENT_LENGTH: "6", } upstream_resp.content = _Content() - upstream_resp.release.return_value = None + upstream_resp.release = MagicMock(return_value=None) mock_session = AsyncMock() mock_session.get.return_value = upstream_resp @@ -855,7 +855,7 @@ async def iter_chunked(self, _size: int): hdrs.CONTENT_LENGTH: "6", } upstream_resp.content = _Content() - upstream_resp.release.return_value = None + upstream_resp.release = MagicMock(return_value=None) mock_session = AsyncMock() mock_session.get.return_value = upstream_resp @@ -931,7 +931,7 @@ def mock_get(url, *args, **kwargs): upstream_resp.content = _Content( int(upstream_resp.headers[hdrs.CONTENT_LENGTH]) ) - upstream_resp.release.return_value = None + upstream_resp.release = MagicMock(return_value=None) return upstream_resp mock_session = AsyncMock() From 916c5e5272b966646063f321dc2e2f32095a04d7 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 23 Aug 2026 10:07:47 +0200 Subject: [PATCH 4/5] Mock the API while setting up forked_daapd in the browse tests (#179858) --- .../forked_daapd/test_browse_media.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/tests/components/forked_daapd/test_browse_media.py b/tests/components/forked_daapd/test_browse_media.py index 7a58aa86d901a6..fdf607941ac0e3 100644 --- a/tests/components/forked_daapd/test_browse_media.py +++ b/tests/components/forked_daapd/test_browse_media.py @@ -273,8 +273,13 @@ async def test_async_browse_spotify( assert await async_setup_component(hass, spotify.DOMAIN, {}) await hass.async_block_till_done() config_entry.add_to_hass(hass) - await hass.config_entries.async_setup(config_entry.entry_id) - await hass.async_block_till_done() + with patch( + "homeassistant.components.forked_daapd.ForkedDaapdAPI", + autospec=True, + ) as mock_api: + mock_api.return_value.get_request.return_value = {"websocket_port": 2} + await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() with patch( "homeassistant.components.forked_daapd.media_player.spotify_async_browse_media" ) as mock_spotify_browse: @@ -325,8 +330,13 @@ async def test_async_browse_media_source( """Test browsing media_source.""" config_entry.add_to_hass(hass) - await hass.config_entries.async_setup(config_entry.entry_id) - await hass.async_block_till_done() + with patch( + "homeassistant.components.forked_daapd.ForkedDaapdAPI", + autospec=True, + ) as mock_api: + mock_api.return_value.get_request.return_value = {"websocket_port": 2} + await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() with patch( "homeassistant.components.forked_daapd.media_player.media_source.async_browse_media" ) as mock_media_source_browse: From 6241f9a9b573558787eac71803a5930fb3610289 Mon Sep 17 00:00:00 2001 From: Amy Jeanes Date: Sun, 23 Aug 2026 09:22:13 +0100 Subject: [PATCH 5/5] Fix PS4 title data fetch crash (#179884) --- homeassistant/components/ps4/media_player.py | 2 +- tests/components/ps4/test_media_player.py | 29 ++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/ps4/media_player.py b/homeassistant/components/ps4/media_player.py index cd5dd5de3e3f70..cf5520f339db86 100644 --- a/homeassistant/components/ps4/media_player.py +++ b/homeassistant/components/ps4/media_player.py @@ -186,7 +186,7 @@ def _parse_status(self) -> None: self._attr_source = self._attr_media_title self._attr_media_content_type = None # Get data from PS Store. - self.hass.async_create_background_task( + self.hass.create_task( self.async_get_title_data(title_id, name), "ps4.media_player-get_title_data", ) diff --git a/tests/components/ps4/test_media_player.py b/tests/components/ps4/test_media_player.py index a45406a2ebb027..39c1ae57dc66c4 100644 --- a/tests/components/ps4/test_media_player.py +++ b/tests/components/ps4/test_media_player.py @@ -574,3 +574,32 @@ async def test_entry_is_unloaded(hass: HomeAssistant) -> None: assert not hass.data[PS4_DATA].protocol.callbacks assert hass.states.get(mock_entity_id) is None + + +async def test_title_data_fetched_from_poll( + hass: HomeAssistant, patch_get_status: MagicMock +) -> None: + """Test title data is fetched when parsing status in an executor thread.""" + patch_get_status.return_value = MOCK_STATUS_PLAYING + + mock_result = MagicMock() + mock_result.name = MOCK_TITLE_NAME + mock_result.cover_art = MOCK_TITLE_ART_URL + mock_result.game_type = "not_an_app" + + mock_func = ( + "homeassistant.components.ps4.media_player" + ".pyps4.Ps4Async.async_get_ps_store_data" + ) + with patch(mock_func, return_value=mock_result) as mock_fetch: + mock_entity_id = await setup_mock_component(hass) + await hass.async_block_till_done(wait_background_tasks=True) + + assert len(mock_fetch.mock_calls) == 1 + + mock_state = hass.states.get(mock_entity_id) + mock_attrs = dict(mock_state.attributes) + + assert mock_state.state == STATE_PLAYING + assert mock_attrs.get(ATTR_MEDIA_TITLE) == MOCK_TITLE_NAME + assert mock_attrs.get(ATTR_MEDIA_CONTENT_TYPE) == MOCK_TITLE_TYPE