Пример #1
0
 def _add_db_entries(opp: OpenPeerPower) -> None:
     with recorder.session_scope(opp=opp) as session:
         # Add states and state_changed events that should be purged
         for days in range(1, 4):
             timestamp = dt_util.utcnow() - timedelta(days=days)
             for event_id in range(1000, 1020):
                 _add_state_and_state_changed_event(
                     session,
                     "sensor.excluded",
                     "purgeme",
                     timestamp,
                     event_id * days,
                 )
         # Add events that should be keeped
         timestamp = dt_util.utcnow() - timedelta(days=1)
         for event_id in range(200, 210):
             session.add(
                 Events(
                     event_id=event_id,
                     event_type="EVENT_KEEP",
                     event_data="{}",
                     origin="LOCAL",
                     created=timestamp,
                     time_fired=timestamp,
                 )
             )
         # Add states with linked old_state_ids that need to be handled
         timestamp = dt_util.utcnow() - timedelta(days=0)
         state_1 = States(
             entity_id="sensor.linked_old_state_id",
             domain="sensor",
             state="keep",
             attributes="{}",
             last_changed=timestamp,
             last_updated=timestamp,
             created=timestamp,
             old_state_id=1,
         )
         timestamp = dt_util.utcnow() - timedelta(days=4)
         state_2 = States(
             entity_id="sensor.linked_old_state_id",
             domain="sensor",
             state="keep",
             attributes="{}",
             last_changed=timestamp,
             last_updated=timestamp,
             created=timestamp,
             old_state_id=2,
         )
         state_3 = States(
             entity_id="sensor.linked_old_state_id",
             domain="sensor",
             state="keep",
             attributes="{}",
             last_changed=timestamp,
             last_updated=timestamp,
             created=timestamp,
             old_state_id=62,  # keep
         )
         session.add_all((state_1, state_2, state_3))
Пример #2
0
def test_states_from_native_invalid_entity_id():
    """Test loading a state from an invalid entity ID."""
    event = States()
    event.entity_id = "test.invalid__id"
    event.attributes = "{}"
    state = event.to_native()
    assert state.entity_id == "test.invalid__id"
Пример #3
0
    def test_entity_ids(self):
        """Test if entity ids helper method works."""
        run = RecorderRuns(
            start=datetime(2016, 7, 9, 11, 0, 0, tzinfo=dt.UTC),
            end=datetime(2016, 7, 9, 23, 0, 0, tzinfo=dt.UTC),
            closed_incorrect=False,
            created=datetime(2016, 7, 9, 11, 0, 0, tzinfo=dt.UTC),
        )

        self.session.add(run)
        self.session.commit()

        before_run = datetime(2016, 7, 9, 8, 0, 0, tzinfo=dt.UTC)
        in_run = datetime(2016, 7, 9, 13, 0, 0, tzinfo=dt.UTC)
        in_run2 = datetime(2016, 7, 9, 15, 0, 0, tzinfo=dt.UTC)
        in_run3 = datetime(2016, 7, 9, 18, 0, 0, tzinfo=dt.UTC)
        after_run = datetime(2016, 7, 9, 23, 30, 0, tzinfo=dt.UTC)

        assert run.to_native() == run
        assert run.entity_ids() == []

        self.session.add(
            States(
                entity_id="sensor.temperature",
                state="20",
                last_changed=before_run,
                last_updated=before_run,
            ))
        self.session.add(
            States(
                entity_id="sensor.sound",
                state="10",
                last_changed=after_run,
                last_updated=after_run,
            ))

        self.session.add(
            States(
                entity_id="sensor.humidity",
                state="76",
                last_changed=in_run,
                last_updated=in_run,
            ))
        self.session.add(
            States(
                entity_id="sensor.lux",
                state="5",
                last_changed=in_run3,
                last_updated=in_run3,
            ))

        assert sorted(run.entity_ids()) == ["sensor.humidity", "sensor.lux"]
        assert run.entity_ids(in_run2) == ["sensor.humidity"]
Пример #4
0
    def _add_test_states(self):
        """Add multiple states to the db for testing."""
        now = datetime.now()
        five_days_ago = now - timedelta(days=5)
        eleven_days_ago = now - timedelta(days=11)
        attributes = {"test_attr": 5, "test_attr_10": "nice"}

        self.opp.block_till_done()
        self.opp.data[DATA_INSTANCE].block_till_done()

        with recorder.session_scope(opp=self.opp) as session:
            for event_id in range(6):
                if event_id < 2:
                    timestamp = eleven_days_ago
                    state = "autopurgeme"
                elif event_id < 4:
                    timestamp = five_days_ago
                    state = "purgeme"
                else:
                    timestamp = now
                    state = "dontpurgeme"

                session.add(
                    States(
                        entity_id="test.recorder2",
                        domain="sensor",
                        state=state,
                        attributes=json.dumps(attributes),
                        last_changed=timestamp,
                        last_updated=timestamp,
                        created=timestamp,
                        event_id=event_id + 1000,
                    ))
Пример #5
0
def _add_state_and_state_changed_event(
    session: Session,
    entity_id: str,
    state: str,
    timestamp: datetime,
    event_id: int,
) -> None:
    """Add state and state_changed event to database for testing."""
    session.add(
        States(
            entity_id=entity_id,
            domain="sensor",
            state=state,
            attributes="{}",
            last_changed=timestamp,
            last_updated=timestamp,
            created=timestamp,
            event_id=event_id,
        )
    )
    session.add(
        Events(
            event_id=event_id,
            event_type=EVENT_STATE_CHANGED,
            event_data="{}",
            origin="LOCAL",
            created=timestamp,
            time_fired=timestamp,
        )
    )
Пример #6
0
 def test_from_event(self):
     """Test converting event to db state."""
     state = op.State("sensor.temperature", "18")
     event = op.Event(
         EVENT_STATE_CHANGED,
         {
             "entity_id": "sensor.temperature",
             "old_state": None,
             "new_state": state
         },
         context=state.context,
     )
     assert state == States.from_event(event).to_native()
Пример #7
0
def test_states_from_native_invalid_entity_id():
    """Test loading a state from an invalid entity ID."""
    state = States()
    state.entity_id = "test.invalid__id"
    state.attributes = "{}"
    with pytest.raises(InvalidEntityFormatError):
        state = state.to_native()

    state = state.to_native(validate_entity_id=False)
    assert state.entity_id == "test.invalid__id"
Пример #8
0
def test_from_event_to_db_state():
    """Test converting event to db state."""
    state = ha.State("sensor.temperature", "18")
    event = ha.Event(
        EVENT_STATE_CHANGED,
        {
            "entity_id": "sensor.temperature",
            "old_state": None,
            "new_state": state
        },
        context=state.context,
    )
    # We don't restore context unless we need it by joining the
    # events table on the event_id for state_changed events
    state.context = ha.Context(id=None)
    assert state == States.from_event(event).to_native()
Пример #9
0
    def test_from_event_to_delete_state(self):
        """Test converting deleting state event to db state."""
        event = op.Event(
            EVENT_STATE_CHANGED,
            {
                "entity_id": "sensor.temperature",
                "old_state": op.State("sensor.temperature", "18"),
                "new_state": None,
            },
        )
        db_state = States.from_event(event)

        assert db_state.entity_id == "sensor.temperature"
        assert db_state.domain == "sensor"
        assert db_state.state == ""
        assert db_state.last_changed == event.time_fired
        assert db_state.last_updated == event.time_fired
Пример #10
0
async def _add_test_states(opp: OpenPeerPower, instance: recorder.Recorder):
    """Add multiple states to the db for testing."""
    utcnow = dt_util.utcnow()
    five_days_ago = utcnow - timedelta(days=5)
    eleven_days_ago = utcnow - timedelta(days=11)
    attributes = {"test_attr": 5, "test_attr_10": "nice"}

    await opp.async_block_till_done()
    await async_wait_recording_done(opp, instance)

    with recorder.session_scope(opp=opp) as session:
        old_state_id = None
        for event_id in range(6):
            if event_id < 2:
                timestamp = eleven_days_ago
                state = "autopurgeme"
            elif event_id < 4:
                timestamp = five_days_ago
                state = "purgeme"
            else:
                timestamp = utcnow
                state = "dontpurgeme"

            event = Events(
                event_type="state_changed",
                event_data="{}",
                origin="LOCAL",
                created=timestamp,
                time_fired=timestamp,
            )
            session.add(event)
            session.flush()
            state = States(
                entity_id="test.recorder2",
                domain="sensor",
                state=state,
                attributes=json.dumps(attributes),
                last_changed=timestamp,
                last_updated=timestamp,
                created=timestamp,
                event_id=event.event_id,
                old_state_id=old_state_id,
            )
            session.add(state)
            session.flush()
            old_state_id = state.state_id
Пример #11
0
 async def _add_db_entries(opp: OpenPeerPower, timestamp: datetime) -> None:
     with recorder.session_scope(opp=opp) as session:
         session.add(
             Events(
                 event_id=1001,
                 event_type="EVENT_TEST_PURGE",
                 event_data="{}",
                 origin="LOCAL",
                 created=timestamp,
                 time_fired=timestamp,
             )
         )
         session.add(
             States(
                 entity_id="test.recorder2",
                 domain="sensor",
                 state="purgeme",
                 attributes="{}",
                 last_changed=timestamp,
                 last_updated=timestamp,
                 created=timestamp,
                 event_id=1001,
             )
         )
Пример #12
0
def test_entity_ids():
    """Test if entity ids helper method works."""
    engine = create_engine("sqlite://")
    Base.metadata.create_all(engine)
    session_factory = sessionmaker(bind=engine)

    session = scoped_session(session_factory)
    session.query(Events).delete()
    session.query(States).delete()
    session.query(RecorderRuns).delete()

    run = RecorderRuns(
        start=datetime(2016, 7, 9, 11, 0, 0, tzinfo=dt.UTC),
        end=datetime(2016, 7, 9, 23, 0, 0, tzinfo=dt.UTC),
        closed_incorrect=False,
        created=datetime(2016, 7, 9, 11, 0, 0, tzinfo=dt.UTC),
    )

    session.add(run)
    session.commit()

    before_run = datetime(2016, 7, 9, 8, 0, 0, tzinfo=dt.UTC)
    in_run = datetime(2016, 7, 9, 13, 0, 0, tzinfo=dt.UTC)
    in_run2 = datetime(2016, 7, 9, 15, 0, 0, tzinfo=dt.UTC)
    in_run3 = datetime(2016, 7, 9, 18, 0, 0, tzinfo=dt.UTC)
    after_run = datetime(2016, 7, 9, 23, 30, 0, tzinfo=dt.UTC)

    assert run.to_native() == run
    assert run.entity_ids() == []

    session.add(
        States(
            entity_id="sensor.temperature",
            state="20",
            last_changed=before_run,
            last_updated=before_run,
        ))
    session.add(
        States(
            entity_id="sensor.sound",
            state="10",
            last_changed=after_run,
            last_updated=after_run,
        ))

    session.add(
        States(
            entity_id="sensor.humidity",
            state="76",
            last_changed=in_run,
            last_updated=in_run,
        ))
    session.add(
        States(
            entity_id="sensor.lux",
            state="5",
            last_changed=in_run3,
            last_updated=in_run3,
        ))

    assert sorted(run.entity_ids()) == ["sensor.humidity", "sensor.lux"]
    assert run.entity_ids(in_run2) == ["sensor.humidity"]