feat: Support HA event entities as triggers (#2506)
This commit is contained in:
committed by
dermotduffy
parent
f1fad59a89
commit
4b72fcd629
@@ -0,0 +1,91 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import { getTriggerEventType } from '../../src/ha/get-trigger-event-type';
|
||||
import { createStateEntity } from '../test-utils';
|
||||
|
||||
describe('getTriggerEventType', () => {
|
||||
describe('for non-event entities', () => {
|
||||
it.each([['on'], ['open'], ['unlocked']])(
|
||||
'returns "new" when the new state is %s',
|
||||
(state: string) => {
|
||||
expect(
|
||||
getTriggerEventType({
|
||||
entityID: 'binary_sensor.motion',
|
||||
oldState: createStateEntity({ state: 'off' }),
|
||||
newState: createStateEntity({ state }),
|
||||
}),
|
||||
).toBe('new');
|
||||
},
|
||||
);
|
||||
|
||||
it.each([
|
||||
['off'],
|
||||
['closed'],
|
||||
['locked'],
|
||||
['unavailable'],
|
||||
['unknown'],
|
||||
['anything-else'],
|
||||
])('returns "end" when the new state is %s', (state: string) => {
|
||||
expect(
|
||||
getTriggerEventType({
|
||||
entityID: 'binary_sensor.motion',
|
||||
oldState: createStateEntity({ state: 'on' }),
|
||||
newState: createStateEntity({ state }),
|
||||
}),
|
||||
).toBe('end');
|
||||
});
|
||||
});
|
||||
|
||||
describe('for event entities', () => {
|
||||
it('returns "signal" for a transition between two real timestamps', () => {
|
||||
expect(
|
||||
getTriggerEventType({
|
||||
entityID: 'event.front_door_doorbell',
|
||||
oldState: createStateEntity({ state: '2026-05-24T12:00:00.000+00:00' }),
|
||||
newState: createStateEntity({ state: '2026-05-24T12:00:05.123+00:00' }),
|
||||
}),
|
||||
).toBe('signal');
|
||||
});
|
||||
|
||||
it('returns null when there is no old state', () => {
|
||||
expect(
|
||||
getTriggerEventType({
|
||||
entityID: 'event.front_door_doorbell',
|
||||
newState: createStateEntity({ state: '2026-05-24T12:00:05.123+00:00' }),
|
||||
}),
|
||||
).toBeNull();
|
||||
});
|
||||
|
||||
it('returns null when the old state is unavailable (entity reconnecting)', () => {
|
||||
expect(
|
||||
getTriggerEventType({
|
||||
entityID: 'event.front_door_doorbell',
|
||||
oldState: createStateEntity({ state: 'unavailable' }),
|
||||
newState: createStateEntity({ state: '2026-05-24T12:00:05.123+00:00' }),
|
||||
}),
|
||||
).toBeNull();
|
||||
});
|
||||
|
||||
it('returns "signal" when the old state is unknown (first fire after startup)', () => {
|
||||
expect(
|
||||
getTriggerEventType({
|
||||
entityID: 'event.front_door_doorbell',
|
||||
oldState: createStateEntity({ state: 'unknown' }),
|
||||
newState: createStateEntity({ state: '2026-05-24T12:00:05.123+00:00' }),
|
||||
}),
|
||||
).toBe('signal');
|
||||
});
|
||||
|
||||
it.each([['unavailable'], ['unknown']])(
|
||||
'returns null when the new state is %s',
|
||||
(state: string) => {
|
||||
expect(
|
||||
getTriggerEventType({
|
||||
entityID: 'event.front_door_doorbell',
|
||||
oldState: createStateEntity({ state: '2026-05-24T12:00:00.000+00:00' }),
|
||||
newState: createStateEntity({ state }),
|
||||
}),
|
||||
).toBeNull();
|
||||
},
|
||||
);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user