mirror of
https://github.com/home-assistant/core.git
synced 2025-06-25 01:21:51 +02:00
Remove duplicated subentry device update in Google Gen AI + add merge test (#147396)
* late comments on Google subentries * Add test that merges 2 config entries
This commit is contained in:
@ -267,11 +267,6 @@ async def async_migrate_integration(hass: HomeAssistant) -> None:
|
|||||||
add_config_entry_id=parent_entry.entry_id,
|
add_config_entry_id=parent_entry.entry_id,
|
||||||
)
|
)
|
||||||
if parent_entry.entry_id != entry.entry_id:
|
if parent_entry.entry_id != entry.entry_id:
|
||||||
device_registry.async_update_device(
|
|
||||||
device.id,
|
|
||||||
add_config_subentry_id=subentry.subentry_id,
|
|
||||||
add_config_entry_id=parent_entry.entry_id,
|
|
||||||
)
|
|
||||||
device_registry.async_update_device(
|
device_registry.async_update_device(
|
||||||
device.id,
|
device.id,
|
||||||
remove_config_entry_id=entry.entry_id,
|
remove_config_entry_id=entry.entry_id,
|
||||||
|
@ -601,3 +601,124 @@ async def test_migration_from_v1_to_v2_with_multiple_keys(
|
|||||||
identifiers={(DOMAIN, list(entry.subentries.values())[0].subentry_id)}
|
identifiers={(DOMAIN, list(entry.subentries.values())[0].subentry_id)}
|
||||||
)
|
)
|
||||||
assert dev is not None
|
assert dev is not None
|
||||||
|
|
||||||
|
|
||||||
|
async def test_migration_from_v1_to_v2_with_same_keys(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
device_registry: dr.DeviceRegistry,
|
||||||
|
entity_registry: er.EntityRegistry,
|
||||||
|
) -> None:
|
||||||
|
"""Test migration from version 1 to version 2 with same API keys."""
|
||||||
|
# Create v1 config entries with the same API key
|
||||||
|
options = {
|
||||||
|
"recommended": True,
|
||||||
|
"llm_hass_api": ["assist"],
|
||||||
|
"prompt": "You are a helpful assistant",
|
||||||
|
"chat_model": "models/gemini-2.0-flash",
|
||||||
|
}
|
||||||
|
mock_config_entry = MockConfigEntry(
|
||||||
|
domain=DOMAIN,
|
||||||
|
data={CONF_API_KEY: "1234"},
|
||||||
|
options=options,
|
||||||
|
version=1,
|
||||||
|
title="Google Generative AI",
|
||||||
|
)
|
||||||
|
mock_config_entry.add_to_hass(hass)
|
||||||
|
mock_config_entry_2 = MockConfigEntry(
|
||||||
|
domain=DOMAIN,
|
||||||
|
data={CONF_API_KEY: "1234"},
|
||||||
|
options=options,
|
||||||
|
version=1,
|
||||||
|
title="Google Generative AI 2",
|
||||||
|
)
|
||||||
|
mock_config_entry_2.add_to_hass(hass)
|
||||||
|
|
||||||
|
device_1 = device_registry.async_get_or_create(
|
||||||
|
config_entry_id=mock_config_entry.entry_id,
|
||||||
|
identifiers={(DOMAIN, mock_config_entry.entry_id)},
|
||||||
|
name=mock_config_entry.title,
|
||||||
|
manufacturer="Google",
|
||||||
|
model="Generative AI",
|
||||||
|
entry_type=dr.DeviceEntryType.SERVICE,
|
||||||
|
)
|
||||||
|
entity_registry.async_get_or_create(
|
||||||
|
"conversation",
|
||||||
|
DOMAIN,
|
||||||
|
mock_config_entry.entry_id,
|
||||||
|
config_entry=mock_config_entry,
|
||||||
|
device_id=device_1.id,
|
||||||
|
suggested_object_id="google_generative_ai_conversation",
|
||||||
|
)
|
||||||
|
|
||||||
|
device_2 = device_registry.async_get_or_create(
|
||||||
|
config_entry_id=mock_config_entry_2.entry_id,
|
||||||
|
identifiers={(DOMAIN, mock_config_entry_2.entry_id)},
|
||||||
|
name=mock_config_entry_2.title,
|
||||||
|
manufacturer="Google",
|
||||||
|
model="Generative AI",
|
||||||
|
entry_type=dr.DeviceEntryType.SERVICE,
|
||||||
|
)
|
||||||
|
entity_registry.async_get_or_create(
|
||||||
|
"conversation",
|
||||||
|
DOMAIN,
|
||||||
|
mock_config_entry_2.entry_id,
|
||||||
|
config_entry=mock_config_entry_2,
|
||||||
|
device_id=device_2.id,
|
||||||
|
suggested_object_id="google_generative_ai_conversation_2",
|
||||||
|
)
|
||||||
|
|
||||||
|
# Run migration
|
||||||
|
with patch(
|
||||||
|
"homeassistant.components.google_generative_ai_conversation.async_setup_entry",
|
||||||
|
return_value=True,
|
||||||
|
):
|
||||||
|
await hass.config_entries.async_setup(mock_config_entry.entry_id)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
entries = hass.config_entries.async_entries(DOMAIN)
|
||||||
|
assert len(entries) == 1
|
||||||
|
entry = entries[0]
|
||||||
|
assert entry.version == 2
|
||||||
|
assert not entry.options
|
||||||
|
assert len(entry.subentries) == 2
|
||||||
|
for subentry in entry.subentries.values():
|
||||||
|
assert subentry.subentry_type == "conversation"
|
||||||
|
assert subentry.data == options
|
||||||
|
assert "Google Generative AI" in subentry.title
|
||||||
|
|
||||||
|
subentry = list(entry.subentries.values())[0]
|
||||||
|
|
||||||
|
entity = entity_registry.async_get("conversation.google_generative_ai_conversation")
|
||||||
|
assert entity.unique_id == subentry.subentry_id
|
||||||
|
assert entity.config_subentry_id == subentry.subentry_id
|
||||||
|
assert entity.config_entry_id == entry.entry_id
|
||||||
|
|
||||||
|
assert not device_registry.async_get_device(
|
||||||
|
identifiers={(DOMAIN, mock_config_entry.entry_id)}
|
||||||
|
)
|
||||||
|
assert (
|
||||||
|
device := device_registry.async_get_device(
|
||||||
|
identifiers={(DOMAIN, subentry.subentry_id)}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
assert device.identifiers == {(DOMAIN, subentry.subentry_id)}
|
||||||
|
assert device.id == device_1.id
|
||||||
|
|
||||||
|
subentry = list(entry.subentries.values())[1]
|
||||||
|
|
||||||
|
entity = entity_registry.async_get(
|
||||||
|
"conversation.google_generative_ai_conversation_2"
|
||||||
|
)
|
||||||
|
assert entity.unique_id == subentry.subentry_id
|
||||||
|
assert entity.config_subentry_id == subentry.subentry_id
|
||||||
|
assert entity.config_entry_id == entry.entry_id
|
||||||
|
assert not device_registry.async_get_device(
|
||||||
|
identifiers={(DOMAIN, mock_config_entry_2.entry_id)}
|
||||||
|
)
|
||||||
|
assert (
|
||||||
|
device := device_registry.async_get_device(
|
||||||
|
identifiers={(DOMAIN, subentry.subentry_id)}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
assert device.identifiers == {(DOMAIN, subentry.subentry_id)}
|
||||||
|
assert device.id == device_2.id
|
||||||
|
Reference in New Issue
Block a user