69 lines
2.5 KiB
TypeScript
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()
|
|
})
|
|
})
|