import { cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react' import { afterEach, expect, it, vi } from 'vitest' import { I18nProvider } from '@/i18n/context' import defaults from '../../../assets/codex-bridge/compression-defaults.json' import { CompressionSettingsView } from './compression-settings' afterEach(() => { cleanup(); delete (window as unknown as { hermesDesktop?: unknown }).hermesDesktop }) it('loads settings, excludes small fallback models, and saves the selected values', async () => { const state = { settings: defaults, modelsAvailable: true, models: [ { id: 'ide/small', name: 'Small', window: 32768, source: 'catalog' }, { id: 'ide/large', name: 'Large', window: 1000000, source: 'catalog' } ] } const save = vi.fn(async settings => ({ ...state, settings })) ;(window as unknown as { hermesDesktop: unknown }).hermesDesktop = { codexLink: { getCompression: async () => state, setCompression: save } } render() const keep = await screen.findByRole('spinbutton', { name: 'Korunan son mesajlaşma sayısı' }) expect((keep as HTMLInputElement).value).toBe('10') const fallback = screen.getByRole('combobox', { name: 'Yedek sıkıştırıcı (1M)' }) expect(fallback.textContent).not.toContain('Small') fireEvent.change(keep, { target: { value: '12' } }) fireEvent.change(fallback, { target: { value: 'ide/large' } }) fireEvent.click(screen.getByRole('button', { name: 'Kaydet' })) await waitFor(() => expect(save).toHaveBeenCalledWith(expect.objectContaining({ keepTurns: 12, fallbackModel: 'ide/large' }))) expect(await screen.findByText('Kaydedildi. Sonraki hazırlıkta uygulanacak.')).toBeTruthy() }) it('shows a failed save without claiming success', async () => { const save = vi.fn().mockRejectedValue(new Error('disk unavailable')) ;(window as unknown as { hermesDesktop: unknown }).hermesDesktop = { codexLink: { getCompression: async () => ({ settings: defaults, models: [], modelsAvailable: false }), setCompression: save } } render() fireEvent.click(await screen.findByRole('button', { name: 'Kaydet' })) expect((await screen.findByRole('alert')).textContent).toContain('Kaydedilemedi') })