mirror of
https://github.com/home-assistant/core.git
synced 2025-12-24 12:59:34 +00:00
[recorder] Add tests for full schema migration (#5831)
* [recorder] Add tests for full schema migration * Remove leftover code * Fix duplicate creation of sqlalchemy Index object * It's that kind of day... * Improve models_original docstring
This commit is contained in:
committed by
Paulus Schoutsen
parent
4c5e6399e9
commit
be08bf0ef7
@@ -6,15 +6,18 @@ import unittest
|
||||
from unittest.mock import patch, call, MagicMock
|
||||
|
||||
import pytest
|
||||
from sqlalchemy import create_engine
|
||||
|
||||
from homeassistant.core import callback
|
||||
from homeassistant.const import MATCH_ALL
|
||||
from homeassistant.components import recorder
|
||||
from homeassistant.bootstrap import setup_component
|
||||
from tests.common import get_test_home_assistant
|
||||
from tests.components.recorder import models_original
|
||||
|
||||
|
||||
class TestRecorder(unittest.TestCase):
|
||||
"""Test the recorder module."""
|
||||
class BaseTestRecorder(unittest.TestCase):
|
||||
"""Base class for common recorder tests."""
|
||||
|
||||
def setUp(self): # pylint: disable=invalid-name
|
||||
"""Setup things to be run when tests are started."""
|
||||
@@ -87,6 +90,10 @@ class TestRecorder(unittest.TestCase):
|
||||
time_fired=timestamp,
|
||||
))
|
||||
|
||||
|
||||
class TestRecorder(BaseTestRecorder):
|
||||
"""Test the recorder module."""
|
||||
|
||||
def test_saving_state(self):
|
||||
"""Test saving and restoring a state."""
|
||||
entity_id = 'test.recorder'
|
||||
@@ -205,15 +212,48 @@ class TestRecorder(unittest.TestCase):
|
||||
with self.assertRaises(ValueError):
|
||||
recorder._INSTANCE._apply_update(-1)
|
||||
|
||||
|
||||
def create_engine_test(*args, **kwargs):
|
||||
"""Test version of create_engine that initializes with old schema.
|
||||
|
||||
This simulates an existing db with the old schema.
|
||||
"""
|
||||
engine = create_engine(*args, **kwargs)
|
||||
models_original.Base.metadata.create_all(engine)
|
||||
return engine
|
||||
|
||||
|
||||
class TestMigrateRecorder(BaseTestRecorder):
|
||||
"""Test recorder class that starts with an original schema db."""
|
||||
|
||||
@patch('sqlalchemy.create_engine', new=create_engine_test)
|
||||
@patch('homeassistant.components.recorder.Recorder._migrate_schema')
|
||||
def setUp(self, migrate): # pylint: disable=invalid-name
|
||||
"""Setup things to be run when tests are started.
|
||||
|
||||
create_engine is patched to create a db that starts with the old
|
||||
schema.
|
||||
|
||||
_migrate_schema is mocked to ensure it isn't run, so we can test it
|
||||
below.
|
||||
"""
|
||||
super().setUp()
|
||||
|
||||
def test_schema_update_calls(self): # pylint: disable=no-self-use
|
||||
"""Test that schema migrations occurr in correct order."""
|
||||
test_version = recorder.models.SchemaChanges(schema_version=0)
|
||||
with recorder.session_scope() as session:
|
||||
session.add(test_version)
|
||||
with patch.object(recorder._INSTANCE, '_apply_update') as update:
|
||||
recorder._INSTANCE._migrate_schema()
|
||||
update.assert_has_calls([call(version+1) for version in range(
|
||||
0, recorder.models.SCHEMA_VERSION)])
|
||||
with patch.object(recorder._INSTANCE, '_apply_update') as update:
|
||||
recorder._INSTANCE._migrate_schema()
|
||||
update.assert_has_calls([call(version+1) for version in range(
|
||||
0, recorder.models.SCHEMA_VERSION)])
|
||||
|
||||
def test_schema_migrate(self): # pylint: disable=no-self-use
|
||||
"""Test the full schema migration logic.
|
||||
|
||||
We're just testing that the logic can execute successfully here without
|
||||
throwing exceptions. Maintaining a set of assertions based on schema
|
||||
inspection could quickly become quite cumbersome.
|
||||
"""
|
||||
recorder._INSTANCE._migrate_schema()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
|
||||
Reference in New Issue
Block a user