Avoid nesting sessions in recorder purge tests (#122581)
This commit is contained in:
parent
c12a79ecba
commit
1f2c54f112
2 changed files with 485 additions and 293 deletions
|
@ -85,8 +85,8 @@ async def test_purge_big_database(hass: HomeAssistant, recorder_mock: Recorder)
|
|||
with (
|
||||
patch.object(recorder_mock, "max_bind_vars", 72),
|
||||
patch.object(recorder_mock.database_engine, "max_bind_vars", 72),
|
||||
session_scope(hass=hass) as session,
|
||||
):
|
||||
with session_scope(hass=hass) as session:
|
||||
states = session.query(States)
|
||||
state_attributes = session.query(StateAttributes)
|
||||
assert states.count() == 72
|
||||
|
@ -102,6 +102,10 @@ async def test_purge_big_database(hass: HomeAssistant, recorder_mock: Recorder)
|
|||
repack=False,
|
||||
)
|
||||
assert not finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
states = session.query(States)
|
||||
state_attributes = session.query(StateAttributes)
|
||||
assert states.count() == 24
|
||||
assert state_attributes.count() == 1
|
||||
|
||||
|
@ -122,6 +126,7 @@ async def test_purge_old_states(hass: HomeAssistant, recorder_mock: Recorder) ->
|
|||
|
||||
events = session.query(Events).filter(Events.event_type == "state_changed")
|
||||
assert events.count() == 0
|
||||
|
||||
assert "test.recorder2" in recorder_mock.states_manager._last_committed_id
|
||||
|
||||
purge_before = dt_util.utcnow() - timedelta(days=4)
|
||||
|
@ -135,11 +140,16 @@ async def test_purge_old_states(hass: HomeAssistant, recorder_mock: Recorder) ->
|
|||
repack=False,
|
||||
)
|
||||
assert not finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
states = session.query(States)
|
||||
state_attributes = session.query(StateAttributes)
|
||||
assert states.count() == 2
|
||||
assert state_attributes.count() == 1
|
||||
|
||||
assert "test.recorder2" in recorder_mock.states_manager._last_committed_id
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
states_after_purge = list(session.query(States))
|
||||
# Since these states are deleted in batches, we can't guarantee the order
|
||||
# but we can look them up by state
|
||||
|
@ -152,6 +162,10 @@ async def test_purge_old_states(hass: HomeAssistant, recorder_mock: Recorder) ->
|
|||
|
||||
finished = purge_old_data(recorder_mock, purge_before, repack=False)
|
||||
assert finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
states = session.query(States)
|
||||
state_attributes = session.query(StateAttributes)
|
||||
assert states.count() == 2
|
||||
assert state_attributes.count() == 1
|
||||
|
||||
|
@ -167,6 +181,8 @@ async def test_purge_old_states(hass: HomeAssistant, recorder_mock: Recorder) ->
|
|||
repack=False,
|
||||
)
|
||||
assert not finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
assert states.count() == 0
|
||||
assert state_attributes.count() == 0
|
||||
|
||||
|
@ -301,6 +317,11 @@ async def test_purge_old_events(hass: HomeAssistant, recorder_mock: Recorder) ->
|
|||
states_batch_size=1,
|
||||
)
|
||||
assert not finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
events = session.query(Events).filter(
|
||||
Events.event_type_id.in_(select_event_type_ids(TEST_EVENT_TYPES))
|
||||
)
|
||||
all_events = events.all()
|
||||
assert events.count() == 2, f"Should have 2 events left: {all_events}"
|
||||
|
||||
|
@ -313,6 +334,11 @@ async def test_purge_old_events(hass: HomeAssistant, recorder_mock: Recorder) ->
|
|||
states_batch_size=1,
|
||||
)
|
||||
assert finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
events = session.query(Events).filter(
|
||||
Events.event_type_id.in_(select_event_type_ids(TEST_EVENT_TYPES))
|
||||
)
|
||||
assert events.count() == 2
|
||||
|
||||
|
||||
|
@ -347,6 +373,9 @@ async def test_purge_old_recorder_runs(
|
|||
states_batch_size=1,
|
||||
)
|
||||
assert finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
recorder_runs = session.query(RecorderRuns)
|
||||
assert recorder_runs.count() == 1
|
||||
|
||||
|
||||
|
@ -369,6 +398,9 @@ async def test_purge_old_statistics_runs(
|
|||
|
||||
finished = purge_old_data(recorder_mock, purge_before, repack=False)
|
||||
assert finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
statistics_runs = session.query(StatisticsRuns)
|
||||
assert statistics_runs.count() == 1
|
||||
|
||||
|
||||
|
@ -1666,6 +1698,11 @@ async def test_purge_many_old_events(
|
|||
events_batch_size=3,
|
||||
)
|
||||
assert not finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
events = session.query(Events).filter(
|
||||
Events.event_type_id.in_(select_event_type_ids(TEST_EVENT_TYPES))
|
||||
)
|
||||
assert events.count() == old_events_count * 3
|
||||
|
||||
# we should only have 2 groups of events left
|
||||
|
@ -1677,6 +1714,11 @@ async def test_purge_many_old_events(
|
|||
events_batch_size=3,
|
||||
)
|
||||
assert finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
events = session.query(Events).filter(
|
||||
Events.event_type_id.in_(select_event_type_ids(TEST_EVENT_TYPES))
|
||||
)
|
||||
assert events.count() == old_events_count * 2
|
||||
|
||||
# we should now purge everything
|
||||
|
@ -1688,6 +1730,11 @@ async def test_purge_many_old_events(
|
|||
events_batch_size=20,
|
||||
)
|
||||
assert finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
events = session.query(Events).filter(
|
||||
Events.event_type_id.in_(select_event_type_ids(TEST_EVENT_TYPES))
|
||||
)
|
||||
assert events.count() == 0
|
||||
|
||||
|
||||
|
@ -1769,6 +1816,14 @@ async def test_purge_old_events_purges_the_event_type_ids(
|
|||
repack=False,
|
||||
)
|
||||
assert finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
events = session.query(Events).where(
|
||||
Events.event_type_id.in_(test_event_type_ids)
|
||||
)
|
||||
event_types = session.query(EventTypes).where(
|
||||
EventTypes.event_type_id.in_(test_event_type_ids)
|
||||
)
|
||||
assert events.count() == 30
|
||||
# We should remove the unused event type
|
||||
assert event_types.count() == 3
|
||||
|
@ -1783,6 +1838,14 @@ async def test_purge_old_events_purges_the_event_type_ids(
|
|||
repack=False,
|
||||
)
|
||||
assert finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
events = session.query(Events).where(
|
||||
Events.event_type_id.in_(test_event_type_ids)
|
||||
)
|
||||
event_types = session.query(EventTypes).where(
|
||||
EventTypes.event_type_id.in_(test_event_type_ids)
|
||||
)
|
||||
assert events.count() == 10
|
||||
assert event_types.count() == 1
|
||||
|
||||
|
@ -1793,6 +1856,14 @@ async def test_purge_old_events_purges_the_event_type_ids(
|
|||
repack=False,
|
||||
)
|
||||
assert finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
events = session.query(Events).where(
|
||||
Events.event_type_id.in_(test_event_type_ids)
|
||||
)
|
||||
event_types = session.query(EventTypes).where(
|
||||
EventTypes.event_type_id.in_(test_event_type_ids)
|
||||
)
|
||||
assert events.count() == 0
|
||||
assert event_types.count() == 0
|
||||
|
||||
|
@ -1871,6 +1942,12 @@ async def test_purge_old_states_purges_the_state_metadata_ids(
|
|||
repack=False,
|
||||
)
|
||||
assert finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
states = session.query(States).where(States.metadata_id.in_(test_metadata_ids))
|
||||
states_meta = session.query(StatesMeta).where(
|
||||
StatesMeta.metadata_id.in_(test_metadata_ids)
|
||||
)
|
||||
assert states.count() == 30
|
||||
# We should remove the unused entity_id
|
||||
assert states_meta.count() == 3
|
||||
|
@ -1885,6 +1962,12 @@ async def test_purge_old_states_purges_the_state_metadata_ids(
|
|||
repack=False,
|
||||
)
|
||||
assert finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
states = session.query(States).where(States.metadata_id.in_(test_metadata_ids))
|
||||
states_meta = session.query(StatesMeta).where(
|
||||
StatesMeta.metadata_id.in_(test_metadata_ids)
|
||||
)
|
||||
assert states.count() == 10
|
||||
assert states_meta.count() == 1
|
||||
|
||||
|
@ -1895,6 +1978,12 @@ async def test_purge_old_states_purges_the_state_metadata_ids(
|
|||
repack=False,
|
||||
)
|
||||
assert finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
states = session.query(States).where(States.metadata_id.in_(test_metadata_ids))
|
||||
states_meta = session.query(StatesMeta).where(
|
||||
StatesMeta.metadata_id.in_(test_metadata_ids)
|
||||
)
|
||||
assert states.count() == 0
|
||||
assert states_meta.count() == 0
|
||||
|
||||
|
|
|
@ -107,6 +107,10 @@ async def test_purge_old_states(hass: HomeAssistant, recorder_mock: Recorder) ->
|
|||
repack=False,
|
||||
)
|
||||
assert not finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
states = session.query(States)
|
||||
state_attributes = session.query(StateAttributes)
|
||||
assert states.count() == 2
|
||||
assert state_attributes.count() == 1
|
||||
|
||||
|
@ -124,6 +128,10 @@ async def test_purge_old_states(hass: HomeAssistant, recorder_mock: Recorder) ->
|
|||
|
||||
finished = purge_old_data(recorder_mock, purge_before, repack=False)
|
||||
assert finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
states = session.query(States)
|
||||
state_attributes = session.query(StateAttributes)
|
||||
assert states.count() == 2
|
||||
assert state_attributes.count() == 1
|
||||
|
||||
|
@ -139,6 +147,10 @@ async def test_purge_old_states(hass: HomeAssistant, recorder_mock: Recorder) ->
|
|||
repack=False,
|
||||
)
|
||||
assert not finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
states = session.query(States)
|
||||
state_attributes = session.query(StateAttributes)
|
||||
assert states.count() == 0
|
||||
assert state_attributes.count() == 0
|
||||
|
||||
|
@ -279,6 +291,9 @@ async def test_purge_old_events(hass: HomeAssistant, recorder_mock: Recorder) ->
|
|||
states_batch_size=1,
|
||||
)
|
||||
assert not finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
events = session.query(Events).filter(Events.event_type.like("EVENT_TEST%"))
|
||||
assert events.count() == 2
|
||||
|
||||
# we should only have 2 events left
|
||||
|
@ -290,6 +305,9 @@ async def test_purge_old_events(hass: HomeAssistant, recorder_mock: Recorder) ->
|
|||
states_batch_size=1,
|
||||
)
|
||||
assert finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
events = session.query(Events).filter(Events.event_type.like("EVENT_TEST%"))
|
||||
assert events.count() == 2
|
||||
|
||||
|
||||
|
@ -326,6 +344,9 @@ async def test_purge_old_recorder_runs(
|
|||
states_batch_size=1,
|
||||
)
|
||||
assert finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
recorder_runs = session.query(RecorderRuns)
|
||||
assert recorder_runs.count() == 1
|
||||
|
||||
|
||||
|
@ -350,6 +371,9 @@ async def test_purge_old_statistics_runs(
|
|||
|
||||
finished = purge_old_data(recorder_mock, purge_before, repack=False)
|
||||
assert finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
statistics_runs = session.query(StatisticsRuns)
|
||||
assert statistics_runs.count() == 1
|
||||
|
||||
|
||||
|
@ -956,6 +980,9 @@ async def test_purge_many_old_events(
|
|||
events_batch_size=3,
|
||||
)
|
||||
assert not finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
events = session.query(Events).filter(Events.event_type.like("EVENT_TEST%"))
|
||||
assert events.count() == old_events_count * 3
|
||||
|
||||
# we should only have 2 groups of events left
|
||||
|
@ -967,6 +994,9 @@ async def test_purge_many_old_events(
|
|||
events_batch_size=3,
|
||||
)
|
||||
assert finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
events = session.query(Events).filter(Events.event_type.like("EVENT_TEST%"))
|
||||
assert events.count() == old_events_count * 2
|
||||
|
||||
# we should now purge everything
|
||||
|
@ -978,6 +1008,9 @@ async def test_purge_many_old_events(
|
|||
events_batch_size=20,
|
||||
)
|
||||
assert finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
events = session.query(Events).filter(Events.event_type.like("EVENT_TEST%"))
|
||||
assert events.count() == 0
|
||||
|
||||
|
||||
|
@ -1045,8 +1078,17 @@ async def test_purge_can_mix_legacy_and_new_format(
|
|||
repack=False,
|
||||
)
|
||||
assert not finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
states_with_event_id = session.query(States).filter(
|
||||
States.event_id.is_not(None)
|
||||
)
|
||||
states_without_event_id = session.query(States).filter(
|
||||
States.event_id.is_(None)
|
||||
)
|
||||
assert states_with_event_id.count() == 0
|
||||
assert states_without_event_id.count() == 51
|
||||
|
||||
# At this point all the legacy states are gone
|
||||
# and we switch methods
|
||||
purge_before = dt_util.utcnow() - timedelta(days=4)
|
||||
|
@ -1061,8 +1103,17 @@ async def test_purge_can_mix_legacy_and_new_format(
|
|||
# check if we are finished this loop similar
|
||||
# to the legacy method
|
||||
assert not finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
states_with_event_id = session.query(States).filter(
|
||||
States.event_id.is_not(None)
|
||||
)
|
||||
states_without_event_id = session.query(States).filter(
|
||||
States.event_id.is_(None)
|
||||
)
|
||||
assert states_with_event_id.count() == 0
|
||||
assert states_without_event_id.count() == 1
|
||||
|
||||
finished = purge_old_data(
|
||||
recorder_mock,
|
||||
purge_before,
|
||||
|
@ -1071,6 +1122,14 @@ async def test_purge_can_mix_legacy_and_new_format(
|
|||
states_batch_size=100,
|
||||
)
|
||||
assert finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
states_with_event_id = session.query(States).filter(
|
||||
States.event_id.is_not(None)
|
||||
)
|
||||
states_without_event_id = session.query(States).filter(
|
||||
States.event_id.is_(None)
|
||||
)
|
||||
assert states_with_event_id.count() == 0
|
||||
assert states_without_event_id.count() == 1
|
||||
_add_state_without_event_linkage(
|
||||
|
@ -1078,12 +1137,21 @@ async def test_purge_can_mix_legacy_and_new_format(
|
|||
)
|
||||
assert states_with_event_id.count() == 0
|
||||
assert states_without_event_id.count() == 2
|
||||
|
||||
finished = purge_old_data(
|
||||
recorder_mock,
|
||||
purge_before,
|
||||
repack=False,
|
||||
)
|
||||
assert finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
states_with_event_id = session.query(States).filter(
|
||||
States.event_id.is_not(None)
|
||||
)
|
||||
states_without_event_id = session.query(States).filter(
|
||||
States.event_id.is_(None)
|
||||
)
|
||||
# The broken state without a timestamp
|
||||
# does not prevent future purges. Its ignored.
|
||||
assert states_with_event_id.count() == 0
|
||||
|
@ -1192,8 +1260,17 @@ async def test_purge_can_mix_legacy_and_new_format_with_detached_state(
|
|||
repack=False,
|
||||
)
|
||||
assert not finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
states_with_event_id = session.query(States).filter(
|
||||
States.event_id.is_not(None)
|
||||
)
|
||||
states_without_event_id = session.query(States).filter(
|
||||
States.event_id.is_(None)
|
||||
)
|
||||
assert states_with_event_id.count() == 0
|
||||
assert states_without_event_id.count() == 51
|
||||
|
||||
# At this point all the legacy states are gone
|
||||
# and we switch methods
|
||||
purge_before = dt_util.utcnow() - timedelta(days=4)
|
||||
|
@ -1208,8 +1285,17 @@ async def test_purge_can_mix_legacy_and_new_format_with_detached_state(
|
|||
# check if we are finished this loop similar
|
||||
# to the legacy method
|
||||
assert not finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
states_with_event_id = session.query(States).filter(
|
||||
States.event_id.is_not(None)
|
||||
)
|
||||
states_without_event_id = session.query(States).filter(
|
||||
States.event_id.is_(None)
|
||||
)
|
||||
assert states_with_event_id.count() == 0
|
||||
assert states_without_event_id.count() == 1
|
||||
|
||||
finished = purge_old_data(
|
||||
recorder_mock,
|
||||
purge_before,
|
||||
|
@ -1218,6 +1304,14 @@ async def test_purge_can_mix_legacy_and_new_format_with_detached_state(
|
|||
states_batch_size=100,
|
||||
)
|
||||
assert finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
states_with_event_id = session.query(States).filter(
|
||||
States.event_id.is_not(None)
|
||||
)
|
||||
states_without_event_id = session.query(States).filter(
|
||||
States.event_id.is_(None)
|
||||
)
|
||||
assert states_with_event_id.count() == 0
|
||||
assert states_without_event_id.count() == 1
|
||||
_add_state_without_event_linkage(
|
||||
|
@ -1225,12 +1319,21 @@ async def test_purge_can_mix_legacy_and_new_format_with_detached_state(
|
|||
)
|
||||
assert states_with_event_id.count() == 0
|
||||
assert states_without_event_id.count() == 2
|
||||
|
||||
finished = purge_old_data(
|
||||
recorder_mock,
|
||||
purge_before,
|
||||
repack=False,
|
||||
)
|
||||
assert finished
|
||||
|
||||
with session_scope(hass=hass) as session:
|
||||
states_with_event_id = session.query(States).filter(
|
||||
States.event_id.is_not(None)
|
||||
)
|
||||
states_without_event_id = session.query(States).filter(
|
||||
States.event_id.is_(None)
|
||||
)
|
||||
# The broken state without a timestamp
|
||||
# does not prevent future purges. Its ignored.
|
||||
assert states_with_event_id.count() == 0
|
||||
|
|
Loading…
Add table
Reference in a new issue