92 lines
2.9 KiB
TypeScript
92 lines
2.9 KiB
TypeScript
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 "momentary" 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('momentary');
|
|
});
|
|
|
|
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 "momentary" 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('momentary');
|
|
});
|
|
|
|
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();
|
|
},
|
|
);
|
|
});
|
|
});
|