Files
aiturk-hermes-ide/apps/desktop/src/app/settings/profile-scope.test.tsx
T

69 lines
2.5 KiB
TypeScript

// @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<unknown>(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(<SettingsProfileScope />)
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(<SettingsProfileScope />)
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(<SettingsProfileScope />)
fireEvent.click(screen.getByRole('button', { name: 'coder' }))
expect($settingsScopeOverride.get()).toBe('coder')
fireEvent.click(screen.getByRole('button', { name: 'default' }))
expect($settingsScopeOverride.get()).toBeNull()
})
})