import { html } from 'lit'; import { describe, expect, it, vi } from 'vitest'; import { SectionController } from '../../../src/components-lib/editor/section-controller'; import { createLitElement } from '../../test-utils'; const OPTIONS = { cameras: [], folders: [] }; const INPUT = { config: {}, defaults: {}, options: OPTIONS }; const createController = () => { const host = createLitElement(); return { host, controller: new SectionController(host, () => html`doc`) }; }; // @vitest-environment jsdom describe('SectionController', () => { it('should register with the host', () => { const { host, controller } = createController(); expect(host.addController).toHaveBeenCalledWith(controller); controller.hostConnected(); }); it('should have no contexts before it is given a request', () => { const { controller } = createController(); expect(controller.getContexts()).toEqual([]); }); it('should build the forms of the requested section', () => { const { controller } = createController(); controller.setInput({ kind: 'full-section', name: 'menu' }, INPUT); const contexts = controller.getContexts(); expect(contexts.length).toBeGreaterThan(0); expect(contexts[0].form.basePath).toEqual(['menu']); }); it('should report an edit as an intent', () => { const { host, controller } = createController(); const listener = vi.fn(); host.addEventListener('advanced-camera-card:editor:intent', listener); controller.setInput({ kind: 'full-section', name: 'menu' }, INPUT); controller .getContexts()[0] .valueChanged( new CustomEvent('value-changed', { detail: { value: { style: 'outside' } } }), ); const event = listener.mock.lastCall?.[0]; expect(event).toBeInstanceOf(CustomEvent); if (event instanceof CustomEvent) { expect(event.detail).toEqual({ type: 'changes', changes: [{ path: ['menu', 'style'], type: 'set', value: 'outside' }], }); // The editor is the only thing that listens, and it sits outside this // section's shadow root. expect(event.bubbles).toBe(true); expect(event.composed).toBe(true); } }); describe('should track whether it is open', () => { it('should start closed and never opened', () => { const { controller } = createController(); expect(controller.isOpen()).toBe(false); expect(controller.wasEverOpened()).toBe(false); }); it('should open and request an update', () => { const { host, controller } = createController(); controller.setOpen(true); expect(controller.isOpen()).toBe(true); expect(controller.wasEverOpened()).toBe(true); expect(host.requestUpdate).toHaveBeenCalledTimes(1); }); it('should remember having been opened after it closes', () => { const { controller } = createController(); controller.setOpen(true); controller.setOpen(false); expect(controller.isOpen()).toBe(false); expect(controller.wasEverOpened()).toBe(true); }); it('should ignore a state it is already in', () => { const { host, controller } = createController(); controller.setOpen(true); controller.setOpen(true); expect(host.requestUpdate).toHaveBeenCalledTimes(1); }); }); });