/ src / store / interbrain-store.test.ts
interbrain-store.test.ts
  1  import { describe, it, expect, beforeEach } from 'vitest'
  2  import { useInterBrainStore } from './interbrain-store'
  3  import { createMockDreamNode, createMockDreamerNode } from '../../tests/utils/test-utils'
  4  
  5  describe('InterBrainStore', () => {
  6    beforeEach(() => {
  7      // Reset store to initial state before each test
  8      const store = useInterBrainStore.getState()
  9      store.setSelectedNode(null)
 10      store.setSearchResults([])
 11      store.setSpatialLayout('constellation')
 12      store.setCreatorMode(false)
 13    })
 14  
 15    describe('initial state', () => {
 16      it('should have correct initial state', () => {
 17        const state = useInterBrainStore.getState()
 18        
 19        expect(state.selectedNode).toBeNull()
 20        expect(state.searchResults).toEqual([])
 21        expect(state.spatialLayout).toBe('constellation')
 22      })
 23    })
 24  
 25    describe('selectedNode', () => {
 26      it('should set selected node', () => {
 27        const mockNode = createMockDreamNode()
 28        
 29        useInterBrainStore.getState().setSelectedNode(mockNode)
 30        
 31        expect(useInterBrainStore.getState().selectedNode).toBe(mockNode)
 32      })
 33  
 34      it('should clear selected node when set to null', () => {
 35        const mockNode = createMockDreamNode()
 36        
 37        // First set a node
 38        useInterBrainStore.getState().setSelectedNode(mockNode)
 39        expect(useInterBrainStore.getState().selectedNode).toBe(mockNode)
 40        
 41        // Then clear it
 42        useInterBrainStore.getState().setSelectedNode(null)
 43        expect(useInterBrainStore.getState().selectedNode).toBeNull()
 44      })
 45  
 46      it('should handle different node types', () => {
 47        const dreamNode = createMockDreamNode()
 48        const dreamerNode = createMockDreamerNode()
 49        
 50        // Test dream node
 51        useInterBrainStore.getState().setSelectedNode(dreamNode)
 52        expect(useInterBrainStore.getState().selectedNode?.type).toBe('dream')
 53        
 54        // Test dreamer node
 55        useInterBrainStore.getState().setSelectedNode(dreamerNode)
 56        expect(useInterBrainStore.getState().selectedNode?.type).toBe('dreamer')
 57      })
 58    })
 59  
 60    describe('searchResults', () => {
 61      it('should set search results', () => {
 62        const mockResults = [
 63          createMockDreamNode({ id: '1', name: 'Result 1' }),
 64          createMockDreamNode({ id: '2', name: 'Result 2' }),
 65        ]
 66        
 67        useInterBrainStore.getState().setSearchResults(mockResults)
 68        
 69        expect(useInterBrainStore.getState().searchResults).toEqual(mockResults)
 70        expect(useInterBrainStore.getState().searchResults).toHaveLength(2)
 71      })
 72  
 73      it('should clear search results', () => {
 74        const mockResults = [createMockDreamNode()]
 75        
 76        // First set results
 77        useInterBrainStore.getState().setSearchResults(mockResults)
 78        expect(useInterBrainStore.getState().searchResults).toHaveLength(1)
 79        
 80        // Then clear them
 81        useInterBrainStore.getState().setSearchResults([])
 82        expect(useInterBrainStore.getState().searchResults).toEqual([])
 83      })
 84  
 85      it('should handle mixed node types in search results', () => {
 86        const mockResults = [
 87          createMockDreamNode({ id: '1', type: 'dream' }),
 88          createMockDreamerNode({ id: '2', type: 'dreamer' }),
 89        ]
 90        
 91        useInterBrainStore.getState().setSearchResults(mockResults)
 92        
 93        const results = useInterBrainStore.getState().searchResults
 94        expect(results[0].type).toBe('dream')
 95        expect(results[1].type).toBe('dreamer')
 96      })
 97    })
 98  
 99    describe('spatialLayout', () => {
100      it('should set spatial layout to constellation', () => {
101        useInterBrainStore.getState().setSpatialLayout('constellation')
102        
103        expect(useInterBrainStore.getState().spatialLayout).toBe('constellation')
104      })
105  
106      it('should set spatial layout to search', () => {
107        useInterBrainStore.getState().setSpatialLayout('search')
108        
109        expect(useInterBrainStore.getState().spatialLayout).toBe('search')
110      })
111  
112      it('should set spatial layout to liminal-web', () => {
113        useInterBrainStore.getState().setSpatialLayout('liminal-web')
114        
115        expect(useInterBrainStore.getState().spatialLayout).toBe('liminal-web')
116      })
117  
118      it('should transition between different layouts', () => {
119        // Start with constellation
120        expect(useInterBrainStore.getState().spatialLayout).toBe('constellation')
121        
122        // Change to search
123        useInterBrainStore.getState().setSpatialLayout('search')
124        expect(useInterBrainStore.getState().spatialLayout).toBe('search')
125        
126        // Change to liminal-web
127        useInterBrainStore.getState().setSpatialLayout('liminal-web')
128        expect(useInterBrainStore.getState().spatialLayout).toBe('liminal-web')
129        
130        // Back to constellation
131        useInterBrainStore.getState().setSpatialLayout('constellation')
132        expect(useInterBrainStore.getState().spatialLayout).toBe('constellation')
133      })
134    })
135  
136    describe('creatorMode', () => {
137      it('should set creator mode active state', () => {
138        const nodeId = 'test-node-123'
139        
140        // Activate creator mode
141        useInterBrainStore.getState().setCreatorMode(true, nodeId)
142        const state = useInterBrainStore.getState()
143        expect(state.creatorMode.isActive).toBe(true)
144        expect(state.creatorMode.nodeId).toBe(nodeId)
145      })
146      
147      it('should deactivate creator mode', () => {
148        const nodeId = 'test-node-123'
149        
150        // First activate
151        useInterBrainStore.getState().setCreatorMode(true, nodeId)
152        
153        // Then deactivate
154        useInterBrainStore.getState().setCreatorMode(false)
155        const state = useInterBrainStore.getState()
156        expect(state.creatorMode.isActive).toBe(false)
157        expect(state.creatorMode.nodeId).toBeNull()
158      })
159      
160      it('should handle switching between nodes in creator mode', () => {
161        const nodeId1 = 'test-node-1'
162        const nodeId2 = 'test-node-2'
163        
164        // Activate for first node
165        useInterBrainStore.getState().setCreatorMode(true, nodeId1)
166        expect(useInterBrainStore.getState().creatorMode.nodeId).toBe(nodeId1)
167        
168        // Switch to second node
169        useInterBrainStore.getState().setCreatorMode(true, nodeId2)
170        expect(useInterBrainStore.getState().creatorMode.nodeId).toBe(nodeId2)
171      })
172    })
173  
174    describe('store integration', () => {
175      it('should handle multiple state updates', () => {
176        const store = useInterBrainStore.getState()
177        const mockNode = createMockDreamNode()
178        const mockResults = [createMockDreamNode({ id: 'search-1' })]
179        
180        // Update multiple pieces of state
181        store.setSelectedNode(mockNode)
182        store.setSearchResults(mockResults)
183        store.setSpatialLayout('search')
184        
185        // Verify all state is updated correctly
186        const finalState = useInterBrainStore.getState()
187        expect(finalState.selectedNode).toBe(mockNode)
188        expect(finalState.searchResults).toEqual(mockResults)
189        expect(finalState.spatialLayout).toBe('search')
190      })
191  
192      it('should maintain independent state pieces', () => {
193        const mockNode = createMockDreamNode()
194        
195        // Set only selected node
196        useInterBrainStore.getState().setSelectedNode(mockNode)
197        
198        // Other state should remain unchanged
199        const finalState = useInterBrainStore.getState()
200        expect(finalState.selectedNode).toBe(mockNode)
201        expect(finalState.searchResults).toEqual([])
202        expect(finalState.spatialLayout).toBe('constellation')
203      })
204    })
205  
206    describe('store subscription', () => {
207      it('should notify subscribers of state changes', () => {
208        const store = useInterBrainStore
209        let stateUpdates = 0
210        
211        const unsubscribe = store.subscribe(() => {
212          stateUpdates++
213        })
214        
215        // Make some state changes
216        store.getState().setSelectedNode(createMockDreamNode())
217        store.getState().setSpatialLayout('search')
218        
219        expect(stateUpdates).toBe(2)
220        
221        unsubscribe()
222      })
223    })
224  })