1- import { describe , expect , test } from "bun:test"
2- import { createRoot , getOwner } from "solid-js"
1+ import { beforeAll , describe , expect , mock , test } from "bun:test"
2+ import { createRoot , getOwner , type Owner } from "solid-js"
33import { createStore } from "solid-js/store"
4+ import type { NormalizedProviderListResponse } from "@opencode-ai/ui/context"
45import type { State } from "./types"
5- import { createChildStoreManager } from "./child-store"
6+ import type { QueryOptionsApi } from "../global-sync"
7+
8+ let createChildStoreManager : typeof import ( "./child-store" ) . createChildStoreManager
69
710const child = ( ) => createStore ( { } as State )
11+ const provider = { all : new Map ( ) , connected : [ ] , default : { } } satisfies NormalizedProviderListResponse
12+
13+ const queryOptionsApi = {
14+ globalConfig : ( ) => ( { queryKey : [ "globalConfig" ] , queryFn : async ( ) => ( { } ) } ) ,
15+ projects : ( ) => ( { queryKey : [ "projects" ] , queryFn : async ( ) => [ ] } ) ,
16+ providers : ( directory : string | null ) => ( { queryKey : [ directory , "providers" ] , queryFn : async ( ) => provider } ) ,
17+ path : ( directory : string | null ) => ( {
18+ queryKey : [ directory , "path" ] ,
19+ queryFn : async ( ) => ( {
20+ state : "" ,
21+ config : "" ,
22+ worktree : "" ,
23+ directory : directory ?? "" ,
24+ home : "" ,
25+ } ) ,
26+ } ) ,
27+ agents : ( directory : string ) => ( { queryKey : [ directory , "agents" ] , queryFn : async ( ) => [ ] } ) ,
28+ mcp : ( directory : string ) => ( { queryKey : [ directory , "mcp" ] , queryFn : async ( ) => ( { } ) } ) ,
29+ lsp : ( directory : string ) => ( { queryKey : [ directory , "lsp" ] , queryFn : async ( ) => [ ] } ) ,
30+ sessions : ( directory : string ) => ( { queryKey : [ directory , "loadSessions" ] as const } ) ,
31+ } as unknown as QueryOptionsApi
32+
33+ function createOwner ( callback : ( owner : Owner ) => void ) {
34+ return createRoot ( ( dispose ) => {
35+ const owner = getOwner ( )
36+ if ( ! owner ) throw new Error ( "owner required" )
37+ callback ( owner )
38+
39+ return dispose
40+ } )
41+ }
42+
43+ beforeAll ( async ( ) => {
44+ mock . module ( "@/utils/persist" , ( ) => ( {
45+ Persist : {
46+ workspace : ( ...parts : string [ ] ) => parts . join ( ":" ) ,
47+ } ,
48+ persisted : ( _target : string , store : unknown [ ] ) => [ store [ 0 ] , store [ 1 ] , null , ( ) => true ] ,
49+ } ) )
50+ mock . module ( "@tanstack/solid-query" , ( ) => ( {
51+ useQueries : ( ) => [
52+ { isLoading : false , data : { state : "" , config : "" , worktree : "" , directory : "" , home : "" } } ,
53+ { isLoading : false , data : { } } ,
54+ { isLoading : false , data : [ ] } ,
55+ { isLoading : false , data : provider } ,
56+ ] ,
57+ } ) )
58+
59+ createChildStoreManager = ( await import ( "./child-store" ) ) . createChildStoreManager
60+ } )
861
962describe ( "createChildStoreManager" , ( ) => {
1063 test ( "does not evict the active directory during mark" , ( ) => {
@@ -22,8 +75,8 @@ describe("createChildStoreManager", () => {
2275 onBootstrap ( ) { } ,
2376 onDispose ( ) { } ,
2477 translate : ( key ) => key ,
25- queryOptions : { } as any ,
26- global : { provider : null ! } ,
78+ queryOptions : queryOptionsApi ,
79+ global : { provider } ,
2780 } )
2881
2982 Array . from ( { length : 30 } , ( _ , index ) => `/pinned-${ index } ` ) . forEach ( ( directory ) => {
@@ -37,4 +90,35 @@ describe("createChildStoreManager", () => {
3790
3891 expect ( manager . children [ directory ] ) . toBeDefined ( )
3992 } )
93+
94+ test ( "starts new child stores as loading and bootstraps them on first access" , ( ) => {
95+ const bootstraps : string [ ] = [ ]
96+ let manager : ReturnType < typeof createChildStoreManager > | undefined
97+
98+ const dispose = createOwner ( ( owner ) => {
99+ manager = createChildStoreManager ( {
100+ owner,
101+ isBooting : ( ) => false ,
102+ isLoadingSessions : ( ) => false ,
103+ onBootstrap ( directory ) {
104+ bootstraps . push ( directory )
105+ } ,
106+ onDispose ( ) { } ,
107+ translate : ( key ) => key ,
108+ queryOptions : queryOptionsApi ,
109+ global : { provider } ,
110+ } )
111+ } )
112+
113+ try {
114+ if ( ! manager ) throw new Error ( "manager required" )
115+
116+ const [ store ] = manager . child ( "/project" )
117+
118+ expect ( store . status ) . toBe ( "loading" )
119+ expect ( bootstraps ) . toEqual ( [ "/project" ] )
120+ } finally {
121+ dispose ( )
122+ }
123+ } )
40124} )
0 commit comments