Use snapshots for ConfigEntry migration tests (#136093)

* Add snapshots for migration

* Reduce fixtures specific to migration

* Explicitly test versions of migrated entries
This commit is contained in:
Andre Lengwenus 2025-02-07 11:32:47 +01:00 committed by GitHub
parent bdc847c7ac
commit d9726ab08c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 148 additions and 404 deletions

View File

@ -13,13 +13,6 @@
"hardware_serial": -1,
"software_serial": -1,
"hardware_type": -1
},
{
"address": [0, 5, true],
"name": "TestGroup",
"hardware_serial": -1,
"software_serial": -1,
"hardware_type": -1
}
],
"entities": [
@ -33,216 +26,6 @@
"dimmable": true,
"transition": 5000.0
}
},
{
"address": [0, 7, false],
"name": "Light_Output2",
"resource": "output2",
"domain": "light",
"domain_data": {
"output": "OUTPUT2",
"dimmable": false,
"transition": 0
}
},
{
"address": [0, 7, false],
"name": "Light_Relay1",
"resource": "relay1",
"domain": "light",
"domain_data": {
"output": "RELAY1",
"dimmable": false,
"transition": 0.0
}
},
{
"address": [0, 7, false],
"name": "Switch_Output1",
"resource": "output1",
"domain": "switch",
"domain_data": {
"output": "OUTPUT1"
}
},
{
"address": [0, 7, false],
"name": "Switch_Output2",
"resource": "output2",
"domain": "switch",
"domain_data": {
"output": "OUTPUT2"
}
},
{
"address": [0, 7, false],
"name": "Switch_Relay1",
"resource": "relay1",
"domain": "switch",
"domain_data": {
"output": "RELAY1"
}
},
{
"address": [0, 7, false],
"name": "Switch_Relay2",
"resource": "relay2",
"domain": "switch",
"domain_data": {
"output": "RELAY2"
}
},
{
"address": [0, 7, false],
"name": "Switch_Regulator1",
"resource": "r1varsetpoint",
"domain": "switch",
"domain_data": {
"output": "R1VARSETPOINT"
}
},
{
"address": [0, 7, false],
"name": "Switch_KeyLock1",
"resource": "a1",
"domain": "switch",
"domain_data": {
"output": "A1"
}
},
{
"address": [0, 5, true],
"name": "Switch_Group5",
"resource": "relay1",
"domain": "switch",
"domain_data": {
"output": "RELAY1"
}
},
{
"address": [0, 7, false],
"name": "Cover_Outputs",
"resource": "outputs",
"domain": "cover",
"domain_data": {
"motor": "OUTPUTS",
"reverse_time": "RT1200"
}
},
{
"address": [0, 7, false],
"name": "Cover_Relays",
"resource": "motor1",
"domain": "cover",
"domain_data": {
"motor": "MOTOR1",
"reverse_time": "RT1200"
}
},
{
"address": [0, 7, false],
"name": "Climate1",
"resource": "var1.r1varsetpoint",
"domain": "climate",
"domain_data": {
"source": "VAR1",
"setpoint": "R1VARSETPOINT",
"lockable": true,
"min_temp": 0.0,
"max_temp": 40.0,
"unit_of_measurement": "°C"
}
},
{
"address": [0, 7, false],
"name": "Romantic",
"resource": "0.0",
"domain": "scene",
"domain_data": {
"register": 0,
"scene": 0,
"outputs": ["OUTPUT1", "OUTPUT2", "RELAY1"],
"transition": null
}
},
{
"address": [0, 7, false],
"name": "Romantic Transition",
"resource": "0.1",
"domain": "scene",
"domain_data": {
"register": 0,
"scene": 1,
"outputs": ["OUTPUT1", "OUTPUT2", "RELAY1"],
"transition": 10000
}
},
{
"address": [0, 7, false],
"name": "Sensor_LockRegulator1",
"resource": "r1varsetpoint",
"domain": "binary_sensor",
"domain_data": {
"source": "R1VARSETPOINT"
}
},
{
"address": [0, 7, false],
"name": "Binary_Sensor1",
"resource": "binsensor1",
"domain": "binary_sensor",
"domain_data": {
"source": "BINSENSOR1"
}
},
{
"address": [0, 7, false],
"name": "Sensor_KeyLock",
"resource": "a5",
"domain": "binary_sensor",
"domain_data": {
"source": "A5"
}
},
{
"address": [0, 7, false],
"name": "Sensor_Var1",
"resource": "var1",
"domain": "sensor",
"domain_data": {
"source": "VAR1",
"unit_of_measurement": "°C"
}
},
{
"address": [0, 7, false],
"name": "Sensor_Setpoint1",
"resource": "r1varsetpoint",
"domain": "sensor",
"domain_data": {
"source": "R1VARSETPOINT",
"unit_of_measurement": "°C"
}
},
{
"address": [0, 7, false],
"name": "Sensor_Led6",
"resource": "led6",
"domain": "sensor",
"domain_data": {
"source": "LED6",
"unit_of_measurement": "NATIVE"
}
},
{
"address": [0, 7, false],
"name": "Sensor_LogicOp1",
"resource": "logicop1",
"domain": "sensor",
"domain_data": {
"source": "LOGICOP1",
"unit_of_measurement": "NATIVE"
}
}
]
}

View File

@ -14,13 +14,6 @@
"hardware_serial": -1,
"software_serial": -1,
"hardware_type": -1
},
{
"address": [0, 5, true],
"name": "TestGroup",
"hardware_serial": -1,
"software_serial": -1,
"hardware_type": -1
}
],
"entities": [
@ -43,115 +36,7 @@
"domain_data": {
"output": "OUTPUT2",
"dimmable": false,
"transition": 0
}
},
{
"address": [0, 7, false],
"name": "Light_Relay1",
"resource": "relay1",
"domain": "light",
"domain_data": {
"output": "RELAY1",
"dimmable": false,
"transition": 0.0
}
},
{
"address": [0, 7, false],
"name": "Switch_Output1",
"resource": "output1",
"domain": "switch",
"domain_data": {
"output": "OUTPUT1"
}
},
{
"address": [0, 7, false],
"name": "Switch_Output2",
"resource": "output2",
"domain": "switch",
"domain_data": {
"output": "OUTPUT2"
}
},
{
"address": [0, 7, false],
"name": "Switch_Relay1",
"resource": "relay1",
"domain": "switch",
"domain_data": {
"output": "RELAY1"
}
},
{
"address": [0, 7, false],
"name": "Switch_Relay2",
"resource": "relay2",
"domain": "switch",
"domain_data": {
"output": "RELAY2"
}
},
{
"address": [0, 7, false],
"name": "Switch_Regulator1",
"resource": "r1varsetpoint",
"domain": "switch",
"domain_data": {
"output": "R1VARSETPOINT"
}
},
{
"address": [0, 7, false],
"name": "Switch_KeyLock1",
"resource": "a1",
"domain": "switch",
"domain_data": {
"output": "A1"
}
},
{
"address": [0, 5, true],
"name": "Switch_Group5",
"resource": "relay1",
"domain": "switch",
"domain_data": {
"output": "RELAY1"
}
},
{
"address": [0, 7, false],
"name": "Cover_Outputs",
"resource": "outputs",
"domain": "cover",
"domain_data": {
"motor": "OUTPUTS",
"reverse_time": "RT1200"
}
},
{
"address": [0, 7, false],
"name": "Cover_Relays",
"resource": "motor1",
"domain": "cover",
"domain_data": {
"motor": "MOTOR1",
"reverse_time": "RT1200"
}
},
{
"address": [0, 7, false],
"name": "Climate1",
"resource": "var1.r1varsetpoint",
"domain": "climate",
"domain_data": {
"source": "VAR1",
"setpoint": "R1VARSETPOINT",
"lockable": true,
"min_temp": 0.0,
"max_temp": 40.0,
"unit_of_measurement": "°C"
"transition": null
}
},
{
@ -177,73 +62,6 @@
"outputs": ["OUTPUT1", "OUTPUT2", "RELAY1"],
"transition": 10000
}
},
{
"address": [0, 7, false],
"name": "Sensor_LockRegulator1",
"resource": "r1varsetpoint",
"domain": "binary_sensor",
"domain_data": {
"source": "R1VARSETPOINT"
}
},
{
"address": [0, 7, false],
"name": "Binary_Sensor1",
"resource": "binsensor1",
"domain": "binary_sensor",
"domain_data": {
"source": "BINSENSOR1"
}
},
{
"address": [0, 7, false],
"name": "Sensor_KeyLock",
"resource": "a5",
"domain": "binary_sensor",
"domain_data": {
"source": "A5"
}
},
{
"address": [0, 7, false],
"name": "Sensor_Var1",
"resource": "var1",
"domain": "sensor",
"domain_data": {
"source": "VAR1",
"unit_of_measurement": "°C"
}
},
{
"address": [0, 7, false],
"name": "Sensor_Setpoint1",
"resource": "r1varsetpoint",
"domain": "sensor",
"domain_data": {
"source": "R1VARSETPOINT",
"unit_of_measurement": "°C"
}
},
{
"address": [0, 7, false],
"name": "Sensor_Led6",
"resource": "led6",
"domain": "sensor",
"domain_data": {
"source": "LED6",
"unit_of_measurement": "NATIVE"
}
},
{
"address": [0, 7, false],
"name": "Sensor_LogicOp1",
"resource": "logicop1",
"domain": "sensor",
"domain_data": {
"source": "LOGICOP1",
"unit_of_measurement": "NATIVE"
}
}
]
}

View File

@ -0,0 +1,140 @@
# serializer version: 1
# name: test_migrate_1_1
dict({
'acknowledge': False,
'devices': list([
dict({
'address': tuple(
0,
7,
False,
),
'hardware_serial': -1,
'hardware_type': -1,
'name': 'TestModule',
'software_serial': -1,
}),
]),
'dim_mode': 'STEPS200',
'entities': list([
dict({
'address': tuple(
0,
7,
False,
),
'domain': 'light',
'domain_data': dict({
'dimmable': True,
'output': 'OUTPUT1',
'transition': 5.0,
}),
'name': 'Light_Output1',
'resource': 'output1',
}),
]),
'host': 'pchk',
'ip_address': '192.168.2.41',
'password': 'lcn',
'port': 4114,
'sk_num_tries': 0,
'username': 'lcn',
})
# ---
# name: test_migrate_1_2
dict({
'acknowledge': False,
'devices': list([
dict({
'address': tuple(
0,
7,
False,
),
'hardware_serial': -1,
'hardware_type': -1,
'name': 'TestModule',
'software_serial': -1,
}),
]),
'dim_mode': 'STEPS200',
'entities': list([
dict({
'address': tuple(
0,
7,
False,
),
'domain': 'light',
'domain_data': dict({
'dimmable': True,
'output': 'OUTPUT1',
'transition': 5.0,
}),
'name': 'Light_Output1',
'resource': 'output1',
}),
dict({
'address': tuple(
0,
7,
False,
),
'domain': 'light',
'domain_data': dict({
'dimmable': False,
'output': 'OUTPUT2',
'transition': 0.0,
}),
'name': 'Light_Output2',
'resource': 'output2',
}),
dict({
'address': tuple(
0,
7,
False,
),
'domain': 'scene',
'domain_data': dict({
'outputs': list([
'OUTPUT1',
'OUTPUT2',
'RELAY1',
]),
'register': 0,
'scene': 0,
'transition': 0.0,
}),
'name': 'Romantic',
'resource': '0.0',
}),
dict({
'address': tuple(
0,
7,
False,
),
'domain': 'scene',
'domain_data': dict({
'outputs': list([
'OUTPUT1',
'OUTPUT2',
'RELAY1',
]),
'register': 0,
'scene': 1,
'transition': 10.0,
}),
'name': 'Romantic Transition',
'resource': '0.1',
}),
]),
'host': 'pchk',
'ip_address': '192.168.2.41',
'password': 'lcn',
'port': 4114,
'sk_num_tries': 0,
'username': 'lcn',
})
# ---

View File

@ -11,6 +11,7 @@ from pypck.connection import (
)
from pypck.lcn_defs import LcnEvent
import pytest
from syrupy.assertion import SnapshotAssertion
from homeassistant import config_entries
from homeassistant.components.lcn.const import DOMAIN
@ -134,7 +135,7 @@ async def test_async_entry_reload_on_host_event_received(
@patch("homeassistant.components.lcn.PchkConnectionManager", MockPchkConnectionManager)
async def test_migrate_1_1(hass: HomeAssistant, entry) -> None:
async def test_migrate_1_1(hass: HomeAssistant, snapshot: SnapshotAssertion) -> None:
"""Test migration config entry."""
entry_v1_1 = create_config_entry("pchk_v1_1", version=(1, 1))
entry_v1_1.add_to_hass(hass)
@ -143,14 +144,15 @@ async def test_migrate_1_1(hass: HomeAssistant, entry) -> None:
await hass.async_block_till_done()
entry_migrated = hass.config_entries.async_get_entry(entry_v1_1.entry_id)
assert entry_migrated.state is ConfigEntryState.LOADED
assert entry_migrated.version == 2
assert entry_migrated.minor_version == 1
assert entry_migrated.data == entry.data
assert entry_migrated.data == snapshot
@patch("homeassistant.components.lcn.PchkConnectionManager", MockPchkConnectionManager)
async def test_migrate_1_2(hass: HomeAssistant, entry) -> None:
async def test_migrate_1_2(hass: HomeAssistant, snapshot: SnapshotAssertion) -> None:
"""Test migration config entry."""
entry_v1_2 = create_config_entry("pchk_v1_2", version=(1, 2))
entry_v1_2.add_to_hass(hass)
@ -159,7 +161,8 @@ async def test_migrate_1_2(hass: HomeAssistant, entry) -> None:
await hass.async_block_till_done()
entry_migrated = hass.config_entries.async_get_entry(entry_v1_2.entry_id)
assert entry_migrated.state is ConfigEntryState.LOADED
assert entry_migrated.version == 2
assert entry_migrated.minor_version == 1
assert entry_migrated.data == entry.data
assert entry_migrated.data == snapshot