Let the screen list see the Screen language sensor, so a language update is confirmed and not offered again
The cached screen list only read the entities named in SCREEN_ENTITY_NAMES, which lacked the new sensor: the updater waited in vain after a language update, the live page kept offering it, and the nightly round would have rebuilt the screen every night. Found in the end-to-end test. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -200,7 +200,8 @@ NAME_DEVICE_NAME = ('Device name', 'Apparaatnaam')
|
|||||||
NAME_IP_ADDRESS = ('IP address', 'IP-adres')
|
NAME_IP_ADDRESS = ('IP address', 'IP-adres')
|
||||||
# The language a screen's firmware was built in (firmware 0.2.76+, app 0.2.90); older firmware speaks English.
|
# The language a screen's firmware was built in (firmware 0.2.76+, app 0.2.90); older firmware speaks English.
|
||||||
NAME_SCREEN_LANGUAGE = ('Screen language',)
|
NAME_SCREEN_LANGUAGE = ('Screen language',)
|
||||||
SCREEN_ENTITY_NAMES = frozenset(NAME_TILE_SETTINGS + NAME_SCREEN_FIRMWARE + NAME_GUITION_TYPE + NAME_DEVICE_NAME + NAME_IP_ADDRESS)
|
SCREEN_ENTITY_NAMES = frozenset(NAME_TILE_SETTINGS + NAME_SCREEN_FIRMWARE + NAME_GUITION_TYPE + NAME_DEVICE_NAME + NAME_IP_ADDRESS
|
||||||
|
+ NAME_SCREEN_LANGUAGE)
|
||||||
|
|
||||||
def parse_firmware(text):
|
def parse_firmware(text):
|
||||||
"""(major, minor, patch) of a screen firmware version such as "0.2.63"; None for anything else. Strict on purpose:
|
"""(major, minor, patch) of a screen firmware version such as "0.2.63"; None for anything else. Strict on purpose:
|
||||||
|
|||||||
@@ -198,6 +198,32 @@ class UpdaterTests(unittest.IsolatedAsyncioTestCase):
|
|||||||
self.assertIn(FIRMWARE_VERSION, m.updates.results['text.screen1']['message'])
|
self.assertIn(FIRMWARE_VERSION, m.updates.results['text.screen1']['message'])
|
||||||
m.firmware.run = original
|
m.firmware.run = original
|
||||||
|
|
||||||
|
async def test_language_update_is_verified_by_the_screen_language(self):
|
||||||
|
"""A screen on the current firmware that speaks another language than Settings -> Language & region gets an
|
||||||
|
update, and the update counts once its "Screen language" sensor says the new language (app 0.2.90). The cached
|
||||||
|
screen list must see that sensor: without it the check waited in vain and every night rebuilt the screen."""
|
||||||
|
with tempfile.TemporaryDirectory() as tmp:
|
||||||
|
m = self.setup_manager(tmp)
|
||||||
|
m.ha.registry = m.ha.registry + [{'entity_id': 'sensor.lang1', 'platform': 'esphome', 'original_name': 'Screen language',
|
||||||
|
'device_id': 'd1'}]
|
||||||
|
m.ha.states.update({'text.fw1': {'state': FIRMWARE_VERSION}, 'sensor.lang1': {'state': 'en'}})
|
||||||
|
m.ha.ha_language = 'nl'
|
||||||
|
first = m.screen('text.screen1')
|
||||||
|
self.assertEqual(first['language'], 'en')
|
||||||
|
self.assertEqual(m.updates.state_for(first)['language'], True)
|
||||||
|
self.assertIn('sensor.lang1', m.watched_entities())
|
||||||
|
self.assertEqual(m.updates.pending(), ['text.screen1'])
|
||||||
|
async def speaks_dutch(data):
|
||||||
|
await asyncio.sleep(0)
|
||||||
|
m.ha.states['sensor.lang1'] = {'state': 'nl'}
|
||||||
|
m.firmware.job['state'] = 'success'
|
||||||
|
m.firmware.run = speaks_dutch
|
||||||
|
m.updates.start('text.screen1')
|
||||||
|
await m.updates.task
|
||||||
|
self.assertEqual(m.updates.results['text.screen1']['state'], 'success')
|
||||||
|
self.assertEqual(m.screen('text.screen1')['language'], 'nl')
|
||||||
|
self.assertEqual(m.updates.pending(), [])
|
||||||
|
|
||||||
async def test_nightly_window_and_persistence(self):
|
async def test_nightly_window_and_persistence(self):
|
||||||
with tempfile.TemporaryDirectory() as tmp:
|
with tempfile.TemporaryDirectory() as tmp:
|
||||||
m = self.setup_manager(tmp)
|
m = self.setup_manager(tmp)
|
||||||
|
|||||||
Reference in New Issue
Block a user