tabsSlice.test.ts 2.65 KB
import { describe, it, expect } from 'vitest'
import tabsReducer, {
  openTab, closeTab, activateTab, updateTabPath,
  type Tab
} from '../store/slices/tabsSlice'

const mainTab: Tab = { id: 'main', title: '主页', path: '/', closable: false }
const listTab: Tab = { id: 'userlist', title: '用户列表', path: '/usr/users', closable: true }
const detailTab: Tab = { id: 'userdetail', title: '用户信息单据', path: '/usr/users/new', closable: true }

describe('tabsSlice', () => {
  it('initialState_hasMainTab', () => {
    const state = tabsReducer(undefined, { type: '' })
    expect(state.tabs).toHaveLength(1)
    expect(state.tabs[0].id).toBe('main')
    expect(state.activeId).toBe('main')
  })

  it('openTab_addsNewTabAndActivates', () => {
    const state = tabsReducer(undefined, openTab(listTab))
    expect(state.tabs).toHaveLength(2)
    expect(state.tabs[1].id).toBe('userlist')
    expect(state.activeId).toBe('userlist')
  })

  it('openTab_existingId_updatesPathAndActivates', () => {
    let state = tabsReducer(undefined, openTab(listTab))
    const updated: Tab = { ...listTab, path: '/usr/users?queryValue=alice' }
    state = tabsReducer(state, openTab(updated))
    expect(state.tabs).toHaveLength(2)
    expect(state.tabs[1].path).toBe('/usr/users?queryValue=alice')
    expect(state.activeId).toBe('userlist')
  })

  it('closeTab_removesTabAndActivatesPrevious', () => {
    let state = tabsReducer(undefined, openTab(listTab))
    state = tabsReducer(state, closeTab('userlist'))
    expect(state.tabs).toHaveLength(1)
    expect(state.activeId).toBe('main')
  })

  it('closeTab_middleTab_activatesTabToLeft', () => {
    let state = tabsReducer(undefined, openTab(listTab))
    state = tabsReducer(state, openTab(detailTab))
    state = tabsReducer(state, closeTab('userdetail'))
    expect(state.activeId).toBe('userlist')
  })

  it('closeTab_nonExistentId_doesNothing', () => {
    const state = tabsReducer(undefined, closeTab('nonexistent'))
    expect(state.tabs).toHaveLength(1)
    expect(state.activeId).toBe('main')
  })

  it('activateTab_setsActiveId', () => {
    let state = tabsReducer(undefined, openTab(listTab))
    state = tabsReducer(state, activateTab('main'))
    expect(state.activeId).toBe('main')
  })

  it('updateTabPath_updatesPath', () => {
    let state = tabsReducer(undefined, openTab(listTab))
    state = tabsReducer(state, updateTabPath({ id: 'userlist', path: '/usr/users?q=alice' }))
    expect(state.tabs[1].path).toBe('/usr/users?q=alice')
  })

  it('updateTabPath_nonExistentId_doesNothing', () => {
    const state = tabsReducer(undefined, updateTabPath({ id: 'nope', path: '/x' }))
    expect(state.tabs[0].path).toBe('/')
  })
})