/* Copyright 2026 Lotus Guild SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial Please see LICENSE in the repository root for full details. */ import { describe, expect, test } from "vitest"; import { LOTUS_TO_WIDGET_ACTIONS, LotusWidgetActions } from "./lotusActions"; describe("LotusWidgetActions", () => { test("every action value is namespaced under io.lotus.*", () => { for (const value of Object.values(LotusWidgetActions)) { expect(value).toMatch(/^io\.lotus\./); } }); test("LOTUS_TO_WIDGET_ACTIONS contains exactly the toWidget actions", () => { // CallState is the only fromWidget action (host <- widget); everything // else is toWidget (host -> widget) and must be allow-listed so // `initializeWidget` accepts it. const expectedToWidget = [ LotusWidgetActions.FocusParticipant, LotusWidgetActions.InjectAudio, LotusWidgetActions.SetQuality, LotusWidgetActions.Decorations, LotusWidgetActions.SetDeafen, ]; expect(new Set(LOTUS_TO_WIDGET_ACTIONS)).toEqual(new Set(expectedToWidget)); expect(LOTUS_TO_WIDGET_ACTIONS).toHaveLength(expectedToWidget.length); }); test("LOTUS_TO_WIDGET_ACTIONS excludes the fromWidget actions", () => { // CallState, RequestState and DenoiseState are all fromWidget (widget -> // host) per their doc comments in lotusActions.ts, so none of them should // ever be allow-listed as a toWidget action. expect(LOTUS_TO_WIDGET_ACTIONS).not.toContain(LotusWidgetActions.CallState); expect(LOTUS_TO_WIDGET_ACTIONS).not.toContain( LotusWidgetActions.RequestState, ); expect(LOTUS_TO_WIDGET_ACTIONS).not.toContain( LotusWidgetActions.DenoiseState, ); }); });