| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- import { beforeEach, describe, expect, it, vi } from 'vitest'
- import { createNavigationHandler } from './navigation'
- describe('createNavigationHandler', () => {
- let mockRouter: any
- let mockWindowOpen: any
- beforeEach(() => {
- vi.clearAllMocks()
- // Mock router with push method
- mockRouter = {
- push: vi.fn(),
- }
- // Mock window.open
- mockWindowOpen = vi.fn()
- global.window.open = mockWindowOpen
- })
- describe('keyboard navigation', () => {
- it('should call router.push when Enter key is pressed without modifiers', () => {
- const handler = createNavigationHandler('/test-url', mockRouter)
- const event = {
- key: 'Enter',
- metaKey: false,
- ctrlKey: false,
- preventDefault: vi.fn(),
- } as unknown as React.KeyboardEvent
- handler(event)
- expect(event.preventDefault).toHaveBeenCalled()
- expect(mockRouter.push).toHaveBeenCalledWith('/test-url')
- expect(mockWindowOpen).not.toHaveBeenCalled()
- })
- it('should call router.push when Space key is pressed without modifiers', () => {
- const handler = createNavigationHandler('/test-url', mockRouter)
- const event = {
- key: ' ',
- metaKey: false,
- ctrlKey: false,
- preventDefault: vi.fn(),
- } as unknown as React.KeyboardEvent
- handler(event)
- expect(event.preventDefault).toHaveBeenCalled()
- expect(mockRouter.push).toHaveBeenCalledWith('/test-url')
- expect(mockWindowOpen).not.toHaveBeenCalled()
- })
- it('should open new tab when Enter key is pressed with metaKey', () => {
- const handler = createNavigationHandler('/test-url', mockRouter)
- const event = {
- key: 'Enter',
- metaKey: true,
- ctrlKey: false,
- preventDefault: vi.fn(),
- } as unknown as React.KeyboardEvent
- handler(event)
- expect(event.preventDefault).toHaveBeenCalled()
- expect(mockWindowOpen).toHaveBeenCalledWith('/test-url', '_blank')
- expect(mockRouter.push).not.toHaveBeenCalled()
- })
- it('should open new tab when Enter key is pressed with ctrlKey', () => {
- const handler = createNavigationHandler('/test-url', mockRouter)
- const event = {
- key: 'Enter',
- metaKey: false,
- ctrlKey: true,
- preventDefault: vi.fn(),
- } as unknown as React.KeyboardEvent
- handler(event)
- expect(event.preventDefault).toHaveBeenCalled()
- expect(mockWindowOpen).toHaveBeenCalledWith('/test-url', '_blank')
- expect(mockRouter.push).not.toHaveBeenCalled()
- })
- it('should open new tab when Space key is pressed with metaKey', () => {
- const handler = createNavigationHandler('/test-url', mockRouter)
- const event = {
- key: ' ',
- metaKey: true,
- ctrlKey: false,
- preventDefault: vi.fn(),
- } as unknown as React.KeyboardEvent
- handler(event)
- expect(event.preventDefault).toHaveBeenCalled()
- expect(mockWindowOpen).toHaveBeenCalledWith('/test-url', '_blank')
- expect(mockRouter.push).not.toHaveBeenCalled()
- })
- it('should do nothing when other keys are pressed', () => {
- const handler = createNavigationHandler('/test-url', mockRouter)
- const event = {
- key: 'a',
- metaKey: false,
- ctrlKey: false,
- preventDefault: vi.fn(),
- } as unknown as React.KeyboardEvent
- handler(event)
- expect(event.preventDefault).not.toHaveBeenCalled()
- expect(mockRouter.push).not.toHaveBeenCalled()
- expect(mockWindowOpen).not.toHaveBeenCalled()
- })
- })
- describe('mouse navigation', () => {
- it('should call router.push on regular left click', () => {
- const handler = createNavigationHandler('/test-url', mockRouter)
- const event = {
- button: 0,
- metaKey: false,
- ctrlKey: false,
- preventDefault: vi.fn(),
- } as unknown as React.MouseEvent
- handler(event)
- expect(mockRouter.push).toHaveBeenCalledWith('/test-url')
- expect(mockWindowOpen).not.toHaveBeenCalled()
- })
- it('should open new tab on middle mouse button click', () => {
- const handler = createNavigationHandler('/test-url', mockRouter)
- const event = {
- button: 1, // Middle button
- metaKey: false,
- ctrlKey: false,
- preventDefault: vi.fn(),
- } as unknown as React.MouseEvent
- handler(event)
- expect(event.preventDefault).toHaveBeenCalled()
- expect(mockWindowOpen).toHaveBeenCalledWith('/test-url', '_blank')
- expect(mockRouter.push).not.toHaveBeenCalled()
- })
- it('should open new tab on Cmd + left click', () => {
- const handler = createNavigationHandler('/test-url', mockRouter)
- const event = {
- button: 0,
- metaKey: true,
- ctrlKey: false,
- preventDefault: vi.fn(),
- } as unknown as React.MouseEvent
- handler(event)
- expect(event.preventDefault).toHaveBeenCalled()
- expect(mockWindowOpen).toHaveBeenCalledWith('/test-url', '_blank')
- expect(mockRouter.push).not.toHaveBeenCalled()
- })
- it('should open new tab on Ctrl + left click', () => {
- const handler = createNavigationHandler('/test-url', mockRouter)
- const event = {
- button: 0,
- metaKey: false,
- ctrlKey: true,
- preventDefault: vi.fn(),
- } as unknown as React.MouseEvent
- handler(event)
- expect(event.preventDefault).toHaveBeenCalled()
- expect(mockWindowOpen).toHaveBeenCalledWith('/test-url', '_blank')
- expect(mockRouter.push).not.toHaveBeenCalled()
- })
- it('should handle right click without navigation', () => {
- const handler = createNavigationHandler('/test-url', mockRouter)
- const event = {
- button: 2, // Right button
- metaKey: false,
- ctrlKey: false,
- preventDefault: vi.fn(),
- } as unknown as React.MouseEvent
- handler(event)
- // Right click should trigger router.push (falls through to default case)
- expect(mockRouter.push).toHaveBeenCalledWith('/test-url')
- })
- })
- describe('URL handling', () => {
- it('should handle URLs with BASE_PATH correctly', () => {
- const handler = createNavigationHandler('/project/123/settings', mockRouter)
- const event = {
- button: 1, // Middle button to open in new tab
- metaKey: false,
- ctrlKey: false,
- preventDefault: vi.fn(),
- } as unknown as React.MouseEvent
- handler(event)
- // Should prepend BASE_PATH when opening new tab
- expect(mockWindowOpen).toHaveBeenCalledWith('/project/123/settings', '_blank')
- })
- it('should pass URL directly to router.push without BASE_PATH', () => {
- const handler = createNavigationHandler('/project/123/settings', mockRouter)
- const event = {
- button: 0,
- metaKey: false,
- ctrlKey: false,
- preventDefault: vi.fn(),
- } as unknown as React.MouseEvent
- handler(event)
- // router.push should receive URL without BASE_PATH
- expect(mockRouter.push).toHaveBeenCalledWith('/project/123/settings')
- })
- })
- })
|