/ src / services / dreamnode-service.test.ts
dreamnode-service.test.ts
  1  import { describe, it, expect, beforeEach, vi } from 'vitest'
  2  import { DreamNodeService } from './dreamnode-service'
  3  import { createMockDreamNode } from '../../tests/utils/test-utils'
  4  
  5  // Mock the store
  6  const mockSetSelectedNode = vi.fn()
  7  const mockSetSearchResults = vi.fn()
  8  const mockSetSpatialLayout = vi.fn()
  9  
 10  vi.mock('../store/interbrain-store', () => ({
 11    useInterBrainStore: {
 12      getState: () => ({
 13        setSelectedNode: mockSetSelectedNode,
 14        setSearchResults: mockSetSearchResults,
 15        setSpatialLayout: mockSetSpatialLayout,
 16      }),
 17    },
 18  }))
 19  
 20  describe('DreamNodeService', () => {
 21    let service: DreamNodeService
 22  
 23    beforeEach(() => {
 24      service = new DreamNodeService()
 25      vi.clearAllMocks()
 26    })
 27  
 28    describe('getCurrentNode', () => {
 29      it('should return null when no node is set', () => {
 30        expect(service.getCurrentNode()).toBeNull()
 31      })
 32  
 33      it('should return the current node when set', () => {
 34        const mockNode = createMockDreamNode()
 35        service.setCurrentNode(mockNode)
 36        
 37        expect(service.getCurrentNode()).toBe(mockNode)
 38      })
 39    })
 40  
 41    describe('setCurrentNode', () => {
 42      it('should set the current node', () => {
 43        const mockNode = createMockDreamNode()
 44        service.setCurrentNode(mockNode)
 45        
 46        expect(service.getCurrentNode()).toBe(mockNode)
 47      })
 48  
 49      it('should clear the current node when set to null', () => {
 50        const mockNode = createMockDreamNode()
 51        service.setCurrentNode(mockNode)
 52        service.setCurrentNode(null)
 53        
 54        expect(service.getCurrentNode()).toBeNull()
 55      })
 56  
 57      it('should sync with Zustand store', () => {
 58        const mockNode = createMockDreamNode()
 59        service.setCurrentNode(mockNode)
 60        
 61        expect(mockSetSelectedNode).toHaveBeenCalledWith(mockNode)
 62      })
 63    })
 64  
 65    describe('selection management', () => {
 66      it('should toggle node selection', () => {
 67        const nodeId = 'test-node-123'
 68        
 69        expect(service.isSelected(nodeId)).toBe(false)
 70        
 71        service.toggleNodeSelection(nodeId)
 72        expect(service.isSelected(nodeId)).toBe(true)
 73        
 74        service.toggleNodeSelection(nodeId)
 75        expect(service.isSelected(nodeId)).toBe(false)
 76      })
 77  
 78      it('should clear all selections', () => {
 79        service.toggleNodeSelection('node-1')
 80        service.toggleNodeSelection('node-2')
 81        
 82        expect(service.isSelected('node-1')).toBe(true)
 83        expect(service.isSelected('node-2')).toBe(true)
 84        
 85        service.clearSelection()
 86        
 87        expect(service.isSelected('node-1')).toBe(false)
 88        expect(service.isSelected('node-2')).toBe(false)
 89      })
 90  
 91      it('should handle multiple selections', () => {
 92        service.toggleNodeSelection('node-1')
 93        service.toggleNodeSelection('node-2')
 94        service.toggleNodeSelection('node-3')
 95        
 96        expect(service.isSelected('node-1')).toBe(true)
 97        expect(service.isSelected('node-2')).toBe(true)
 98        expect(service.isSelected('node-3')).toBe(true)
 99      })
100    })
101  
102    describe('getSelectedNodes', () => {
103      it('should return empty array initially', () => {
104        const selectedNodes = service.getSelectedNodes()
105        expect(selectedNodes).toEqual([])
106      })
107  
108      it('should log selected node IDs', () => {
109        const consoleSpy = vi.spyOn(console, 'log')
110        
111        service.toggleNodeSelection('node-1')
112        service.toggleNodeSelection('node-2')
113        service.getSelectedNodes()
114        
115        expect(consoleSpy).toHaveBeenCalledWith('Selected node IDs:', ['node-1', 'node-2'])
116      })
117    })
118  })