// @vitest-environment jsdom import { cleanup, fireEvent, render, screen } from '@testing-library/react' import { atom } from 'nanostores' import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import type { ProfileInfo } from '@/types/hermes' // Keep store/profile's side-effecting imports inert — same seam as // store/profile.test.ts / profile-tag.test.tsx. vi.mock('@/store/gateway', () => ({ $gateway: atom(null), ensureGatewayForAgent: vi.fn(async () => undefined), ensureGatewayForProfile: vi.fn(async () => undefined), openGatewayForProfile: vi.fn(async () => undefined) })) vi.mock('@/hermes', () => ({ getProfiles: vi.fn(async () => ({ profiles: [] })), setApiRequestProfile: vi.fn() })) vi.mock('@/lib/query-client', () => ({ invalidateProfileScopedQueries: vi.fn() })) vi.mock('@/store/starmap', () => ({ resetStarmapGraph: vi.fn() })) const { $activeGatewayProfile, $profiles } = await import('@/store/profile') const { $settingsScopeOverride } = await import('@/store/settings-scope') const { SettingsProfileScope } = await import('./profile-scope') const profile = (name: string, isDefault = false): ProfileInfo => ({ has_env: false, is_default: isDefault, model: null, name }) as unknown as ProfileInfo beforeEach(() => { $activeGatewayProfile.set('default') $settingsScopeOverride.set(null) $profiles.set([]) }) afterEach(cleanup) describe('SettingsProfileScope', () => { it('renders nothing with fewer than two profiles', () => { $profiles.set([profile('default', true)]) const { container } = render() expect(container.textContent).toBe('') }) it('shows one chip per profile with the active profile selected by default', () => { $profiles.set([profile('default', true), profile('coder')]) render() expect(screen.getByRole('button', { name: 'default' })).toBeTruthy() expect(screen.getByRole('button', { name: 'coder' })).toBeTruthy() // Following the active profile → no override, no "applies to X" note. expect($settingsScopeOverride.get()).toBeNull() }) it('selecting another profile sets the shared override; re-selecting the active clears it', () => { $profiles.set([profile('default', true), profile('coder')]) render() fireEvent.click(screen.getByRole('button', { name: 'coder' })) expect($settingsScopeOverride.get()).toBe('coder') fireEvent.click(screen.getByRole('button', { name: 'default' })) expect($settingsScopeOverride.get()).toBeNull() }) })