import { describe, expect, it } from "vitest"; import { COMPOSER_FOOTER_COMPACT_BREAKPOINT_PX, COMPOSER_FOOTER_WIDE_ACTIONS_COMPACT_BREAKPOINT_PX, COMPOSER_PRIMARY_ACTIONS_COMPACT_BREAKPOINT_PX, measureComposerFooterOverflowPx, resolveComposerFooterContentWidth, shouldForceCompactComposerFooterForFit, shouldUseCompactComposerPrimaryActions, shouldUseCompactComposerFooter, } from "./composerFooterLayout"; describe("shouldUseCompactComposerFooter", () => { it("stays expanded without a measured width", () => { expect(shouldUseCompactComposerFooter(null)).toBe(false); }); it("switches to compact mode below the breakpoint", () => { expect(shouldUseCompactComposerFooter(COMPOSER_FOOTER_COMPACT_BREAKPOINT_PX - 1)).toBe(true); }); it("stays expanded at and above the breakpoint", () => { expect(shouldUseCompactComposerFooter(COMPOSER_FOOTER_COMPACT_BREAKPOINT_PX)).toBe(false); expect(shouldUseCompactComposerFooter(COMPOSER_FOOTER_COMPACT_BREAKPOINT_PX + 48)).toBe(false); }); it("uses a higher breakpoint for wide action states", () => { expect( shouldUseCompactComposerFooter(COMPOSER_FOOTER_WIDE_ACTIONS_COMPACT_BREAKPOINT_PX - 1, { hasWideActions: true, }), ).toBe(true); expect( shouldUseCompactComposerFooter(COMPOSER_FOOTER_WIDE_ACTIONS_COMPACT_BREAKPOINT_PX, { hasWideActions: true, }), ).toBe(false); }); }); describe("shouldUseCompactComposerPrimaryActions", () => { it("matches the wide footer breakpoint", () => { expect(COMPOSER_PRIMARY_ACTIONS_COMPACT_BREAKPOINT_PX).toBe( COMPOSER_FOOTER_WIDE_ACTIONS_COMPACT_BREAKPOINT_PX, ); expect( shouldUseCompactComposerPrimaryActions(COMPOSER_PRIMARY_ACTIONS_COMPACT_BREAKPOINT_PX - 1, { hasWideActions: true, }), ).toBe(true); expect( shouldUseCompactComposerPrimaryActions(COMPOSER_PRIMARY_ACTIONS_COMPACT_BREAKPOINT_PX, { hasWideActions: true, }), ).toBe(false); }); }); describe("measureComposerFooterOverflowPx", () => { it("returns the overflow amount when content exceeds the footer width", () => { expect( measureComposerFooterOverflowPx({ footerContentWidth: 500, leadingContentWidth: 340, actionsWidth: 180, }), ).toBe(28); }); it("returns zero when content fits", () => { expect( measureComposerFooterOverflowPx({ footerContentWidth: 500, leadingContentWidth: 320, actionsWidth: 160, }), ).toBe(0); }); }); describe("shouldForceCompactComposerFooterForFit", () => { it("stays expanded when content widths fit within the footer", () => { expect( shouldForceCompactComposerFooterForFit({ footerContentWidth: 500, leadingContentWidth: 320, actionsWidth: 160, }), ).toBe(false); }); it("stays expanded when minor overflow can be recovered by compacting primary actions", () => { expect( shouldForceCompactComposerFooterForFit({ footerContentWidth: 500, leadingContentWidth: 340, actionsWidth: 180, }), ).toBe(false); }); it("forces footer compact mode when action compaction would not recover enough space", () => { expect( shouldForceCompactComposerFooterForFit({ footerContentWidth: 500, leadingContentWidth: 420, actionsWidth: 220, }), ).toBe(true); }); it("ignores incomplete measurements", () => { expect( shouldForceCompactComposerFooterForFit({ footerContentWidth: null, leadingContentWidth: 340, actionsWidth: 180, }), ).toBe(false); }); }); describe("resolveComposerFooterContentWidth", () => { it("subtracts horizontal padding from the measured footer width", () => { expect( resolveComposerFooterContentWidth({ footerWidth: 500, paddingLeft: 10, paddingRight: 10, }), ).toBe(480); }); it("clamps negative widths to zero", () => { expect( resolveComposerFooterContentWidth({ footerWidth: 10, paddingLeft: 8, paddingRight: 8, }), ).toBe(0); }); it("returns null when measurements are incomplete", () => { expect( resolveComposerFooterContentWidth({ footerWidth: null, paddingLeft: 8, paddingRight: 8, }), ).toBeNull(); }); });