// @vitest-environment jsdom import { beforeEach, describe, expect, it, vi } from 'vitest' import { flushPromises, mount } from '@vue/test-utils' import { defineComponent } from 'vue' import ArcoVue from '@arco-design/web-vue' import { MAX_CHAT_INPUT_HEIGHT, MIN_CHAT_INPUT_HEIGHT } from '@/utils/chat-input-height' const mockSettingsStore = vi.hoisted(() => ({ display: { streaming: true, compact: false, show_reasoning: true, show_cost: false, inline_diffs: true, chat_input_height: 160, bell_on_complete: false, notify_on_complete: false, busy_input_mode: 'interrupt', }, saveSection: vi.fn(), })) vi.mock('@/stores/hermes/settings', () => ({ useSettingsStore: () => mockSettingsStore, })) vi.mock('@/composables/useTheme', () => ({ useTheme: () => ({ brightness: 'system', setBrightness: vi.fn(), }), })) vi.mock('vue-i18n', () => ({ useI18n: () => ({ t: (key: string) => key, }), })) vi.mock('@/composables/useMessage', () => ({ useMessage: () => ({ success: vi.fn(), error: vi.fn(), }), })) import DisplaySettings from '@/components/hermes/settings/DisplaySettings.vue' // Arco's InputNumber clamps through its own handlers; a plain number input keeps // the assertion on the component-level clamping in handleChatInputHeightChange. const AInputNumberStub = defineComponent({ name: 'InputNumber', inheritAttrs: false, props: { modelValue: { type: Number, default: undefined }, min: { type: Number, default: undefined }, max: { type: Number, default: undefined }, size: String, }, emits: ['update:modelValue'], template: ``, methods: { onInput(event: Event) { const raw = (event.target as HTMLInputElement).value this.$emit('update:modelValue', raw === '' ? undefined : Number(raw)) }, }, }) const arcoGlobal = { plugins: [ArcoVue], stubs: { SettingRow: { props: ['label', 'hint'], template: '