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 })