| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- import { describe, expect, it, vi } from 'vitest'
- import { RemoteError } from '@deepseek-ai/dsh-client-test-runtime'
- import type { RemoteResult } from '@deepseek-ai/dsh-api-remotes/client'
- import { SettingsDescribeMirror } from '@deepseek-ai/dsh-client-ui-settings/src/client/settings-mirror.ts'
- import { SettingsDocumentStore } from '../src/client/settings-document-store.ts'
- /** Store over a real mirror derived from the same scripted context. */
- function derivedDocumentStore(remote: object) {
- const ctx = { remote } as never
- return new SettingsDocumentStore(ctx, new SettingsDescribeMirror(ctx))
- }
- function response(hasDocument = false) {
- return { ok: true, value: { writable: true, hasDocument, namespaces: [] } }
- }
- function opened(): RemoteResult<{ opened: true }> {
- return { ok: true, value: { opened: true } }
- }
- function describeFailed(message: string) {
- return { ok: false as const, error: new RemoteError('gateway/internal', message, {}) }
- }
- describe('SettingsDocumentStore', () => {
- it('loads provider metadata and asks the settings domain to open its document', async () => {
- const describe = vi.fn(() => Promise.resolve(response(true)))
- const openDocument = vi.fn(() => Promise.resolve(opened()))
- const controller = derivedDocumentStore({ settings: { describe, openSettingsDocument: openDocument } })
- await controller.load()
- expect(controller.store.getSnapshot()).toEqual({
- status: 'ready', opening: false, error: null,
- })
- await controller.open()
- expect(openDocument).toHaveBeenCalledWith()
- })
- it('marks absent or failed metadata unavailable without opening anything', async () => {
- const openDocument = vi.fn(() => Promise.resolve(opened()))
- const absent = derivedDocumentStore({
- settings: { describe: () => Promise.resolve(response()), openSettingsDocument: openDocument },
- })
- await absent.load()
- await absent.open()
- expect(absent.store.getSnapshot().status).toBe('unavailable')
- expect(openDocument).not.toHaveBeenCalled()
- const failed = derivedDocumentStore({
- settings: { describe: () => Promise.reject(new Error('offline')), openSettingsDocument: openDocument },
- })
- await failed.load()
- expect(failed.store.getSnapshot()).toMatchObject({ status: 'unavailable', error: 'offline' })
- const rejected = derivedDocumentStore({
- settings: { describe: () => Promise.resolve(describeFailed('provider failed')), openSettingsDocument: openDocument },
- })
- await rejected.load()
- expect(rejected.store.getSnapshot()).toMatchObject({
- status: 'unavailable', error: 'provider failed',
- })
- })
- it('collapses concurrent open gestures and recovers after a failure', async () => {
- let resolveOpen!: (response: RemoteResult<{ opened: true }>) => void
- const openDocument = vi.fn(() => new Promise<RemoteResult<{ opened: true }>>((resolve) => { resolveOpen = resolve }))
- const controller = derivedDocumentStore({
- settings: { describe: () => Promise.resolve(response(true)), openSettingsDocument: openDocument },
- })
- await controller.load()
- const first = controller.open()
- const second = controller.open()
- expect(openDocument).toHaveBeenCalledOnce()
- resolveOpen({ ok: false, error: new RemoteError('gateway/internal', 'no default editor', {}) })
- await Promise.all([first, second])
- expect(controller.store.getSnapshot()).toMatchObject({
- status: 'ready', opening: false, error: 'no default editor',
- })
- })
- it('recovers availability via a mirror refresh after a failed first read', async () => {
- // A first read that failed leaves the action unavailable with the miss
- // recorded; the mirror's next refresh (a commit or reconnect) recovers it.
- const ctx = {
- remote: {
- settings: {
- describe: vi.fn()
- .mockRejectedValueOnce(new Error('offline'))
- .mockResolvedValueOnce(response(true)),
- openSettingsDocument: vi.fn(),
- },
- },
- } as never
- const mirror = new SettingsDescribeMirror(ctx)
- const caught = new SettingsDocumentStore(ctx, mirror)
- await caught.load()
- expect(caught.store.getSnapshot()).toMatchObject({ status: 'unavailable', error: 'offline' })
- await mirror.load()
- expect(caught.store.getSnapshot()).toMatchObject({ status: 'ready', error: null })
- })
- })
|