|
|
@@ -1,7 +1,14 @@
|
|
|
import { describe, expect, it, vi } from 'vitest'
|
|
|
import type { RpcResponse } from '@deepseek-ai/dsh-api-remotes/client'
|
|
|
+import { SettingsDescribeMirror } from '@deepseek-ai/dsh-client-ui-settings/client'
|
|
|
import { SettingsDocumentStore } from '../src/client/settings-document-store.ts'
|
|
|
|
|
|
+/** Store over a real mirror derived from the same fake wire. */
|
|
|
+function derivedDocumentStore(api: object) {
|
|
|
+ const wire = api as never
|
|
|
+ return new SettingsDocumentStore(wire, new SettingsDescribeMirror(wire))
|
|
|
+}
|
|
|
+
|
|
|
function response(hasDocument = false): RpcResponse<{
|
|
|
writable: boolean
|
|
|
hasDocument: boolean
|
|
|
@@ -34,7 +41,7 @@ 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 = new SettingsDocumentStore({ settings: { describe, openDocument } } as never)
|
|
|
+ const controller = derivedDocumentStore({ settings: { describe, openDocument } } as never)
|
|
|
await controller.load()
|
|
|
expect(controller.store.getSnapshot()).toEqual({
|
|
|
status: 'ready', opening: false, error: null,
|
|
|
@@ -45,7 +52,7 @@ describe('SettingsDocumentStore', () => {
|
|
|
|
|
|
it('marks absent or failed metadata unavailable without opening anything', async () => {
|
|
|
const openDocument = vi.fn(() => Promise.resolve(opened()))
|
|
|
- const absent = new SettingsDocumentStore({
|
|
|
+ const absent = derivedDocumentStore({
|
|
|
settings: { describe: () => Promise.resolve(response()), openDocument },
|
|
|
} as never)
|
|
|
await absent.load()
|
|
|
@@ -53,13 +60,13 @@ describe('SettingsDocumentStore', () => {
|
|
|
expect(absent.store.getSnapshot().status).toBe('unavailable')
|
|
|
expect(openDocument).not.toHaveBeenCalled()
|
|
|
|
|
|
- const failed = new SettingsDocumentStore({
|
|
|
+ const failed = derivedDocumentStore({
|
|
|
settings: { describe: () => Promise.reject(new Error('offline')), openDocument },
|
|
|
} as never)
|
|
|
await failed.load()
|
|
|
expect(failed.store.getSnapshot()).toMatchObject({ status: 'unavailable', error: 'offline' })
|
|
|
|
|
|
- const rejected = new SettingsDocumentStore({
|
|
|
+ const rejected = derivedDocumentStore({
|
|
|
settings: { describe: () => Promise.resolve(describeFailed('provider failed')), openDocument },
|
|
|
} as never)
|
|
|
await rejected.load()
|
|
|
@@ -71,7 +78,7 @@ describe('SettingsDocumentStore', () => {
|
|
|
it('collapses concurrent open gestures and recovers after a failure', async () => {
|
|
|
let resolveOpen!: (response: RpcResponse<{ opened: true }>) => void
|
|
|
const openDocument = vi.fn(() => new Promise<RpcResponse<{ opened: true }>>((resolve) => { resolveOpen = resolve }))
|
|
|
- const controller = new SettingsDocumentStore({
|
|
|
+ const controller = derivedDocumentStore({
|
|
|
settings: { describe: () => Promise.resolve(response(true)), openDocument },
|
|
|
} as never)
|
|
|
await controller.load()
|
|
|
@@ -88,23 +95,15 @@ describe('SettingsDocumentStore', () => {
|
|
|
})
|
|
|
})
|
|
|
|
|
|
- it('ignores stale metadata completions and reports non-Error native failures', async () => {
|
|
|
- let resolveFirst!: (value: ReturnType<typeof response>) => void
|
|
|
- const first = new Promise<ReturnType<typeof response>>((resolve) => { resolveFirst = resolve })
|
|
|
- const describe = vi.fn()
|
|
|
- .mockReturnValueOnce(first)
|
|
|
- .mockResolvedValueOnce(response(true))
|
|
|
+ it('reports non-Error native failures and recovers availability via a mirror refresh', async () => {
|
|
|
let rejectOpen!: (reason?: unknown) => void
|
|
|
- const controller = new SettingsDocumentStore({
|
|
|
+ const controller = derivedDocumentStore({
|
|
|
settings: {
|
|
|
- describe,
|
|
|
+ describe: vi.fn(() => Promise.resolve(response(true))),
|
|
|
openDocument: () => new Promise((_, reject) => { rejectOpen = reject }),
|
|
|
},
|
|
|
} as never)
|
|
|
- const stale = controller.load()
|
|
|
await controller.load()
|
|
|
- resolveFirst(response())
|
|
|
- await stale
|
|
|
expect(controller.store.getSnapshot().status).toBe('ready')
|
|
|
const opening = controller.open()
|
|
|
rejectOpen('native unavailable')
|
|
|
@@ -113,20 +112,21 @@ describe('SettingsDocumentStore', () => {
|
|
|
status: 'ready', opening: false, error: 'native unavailable',
|
|
|
})
|
|
|
|
|
|
- let rejectFirst!: (error: Error) => void
|
|
|
- const rejectedFirst = new Promise<ReturnType<typeof response>>((_, reject) => { rejectFirst = reject })
|
|
|
- const caught = new SettingsDocumentStore({
|
|
|
+ // 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 wire = {
|
|
|
settings: {
|
|
|
describe: vi.fn()
|
|
|
- .mockReturnValueOnce(rejectedFirst)
|
|
|
+ .mockRejectedValueOnce(new Error('offline'))
|
|
|
.mockResolvedValueOnce(response(true)),
|
|
|
openDocument: vi.fn(),
|
|
|
},
|
|
|
- } as never)
|
|
|
- const staleRejection = caught.load()
|
|
|
+ } as never
|
|
|
+ const mirror = new SettingsDescribeMirror(wire)
|
|
|
+ const caught = new SettingsDocumentStore(wire, mirror)
|
|
|
await caught.load()
|
|
|
- rejectFirst(new Error('stale offline'))
|
|
|
- await staleRejection
|
|
|
+ expect(caught.store.getSnapshot()).toMatchObject({ status: 'unavailable', error: 'offline' })
|
|
|
+ await mirror.load()
|
|
|
expect(caught.store.getSnapshot()).toMatchObject({ status: 'ready', error: null })
|
|
|
})
|
|
|
})
|