feat: Add support for templates in actions (#1891)

- Closes #1878
This commit is contained in:
Dermot Duffy
2025-02-14 07:23:19 -08:00
committed by GitHub
parent 8d3cf07b43
commit 7fb710d45d
18 changed files with 474 additions and 24 deletions
+93
View File
@@ -0,0 +1,93 @@
import { renderTemplate } from 'ha-nunjucks';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import { TemplateRenderer } from '../../src/card-controller/templates';
import { ConditionsEvaluationData, ConditionState } from '../../src/conditions/types';
import { createHASS } from '../test-utils';
// ha-nunjucks attempts to make websocket calls initially so mock it out.
vi.mock('ha-nunjucks');
describe('TemplateRenderer', () => {
beforeEach(() => {
vi.clearAllMocks();
});
it('should render data', () => {
const data = {
camera: '{{ acc.camera }}',
array: ['{{ acc.camera }}', '{{ acc.view }}'],
nested: {
camera: '{{ acc.camera }}',
},
number: 42,
};
vi.mocked(renderTemplate)
.mockReturnValueOnce('one')
.mockReturnValueOnce('two')
.mockReturnValueOnce('three')
.mockReturnValueOnce('four');
const renderer = new TemplateRenderer();
const hass = createHASS();
expect(renderer.renderRecursively(hass, data)).toEqual({
camera: 'one',
array: ['two', 'three'],
nested: {
camera: 'four',
},
number: 42,
});
});
it('should include triggers', () => {
const conditionState: ConditionState = {
camera: 'camera',
view: 'view',
};
const triggerData: ConditionsEvaluationData = {
camera: {
to: 'camera',
from: 'previous-camera',
},
};
const renderer = new TemplateRenderer();
const hass = createHASS();
renderer.renderRecursively(
hass,
{
key: 'value',
},
{
conditionState,
triggerData,
},
);
expect(renderTemplate).toHaveBeenCalledWith(hass, 'value', {
acc: {
camera: 'camera',
view: 'view',
trigger: {
camera: {
to: 'camera',
from: 'previous-camera',
},
},
},
advanced_camera_card: {
camera: 'camera',
view: 'view',
trigger: {
camera: {
to: 'camera',
from: 'previous-camera',
},
},
},
});
});
});