Skip to content

token

ts
const TokenKey = 'mg-token'

/**
 * 获取存储在浏览器中的令牌。
 *
 * @returns {string | null} 如果存在令牌,则返回令牌字符串;否则返回null。
 */
export function getToken(): string | null {
  return sessionStorage.getItem(TokenKey) || localStorage.getItem(TokenKey)
}

/**
 * 设置令牌
 *
 * @param {string} token - 需要存储的令牌字符串。
 * @param {boolean} remember - 指示是否在会话结束后仍保留令牌的布尔值。
 */
export function setToken(token: string, remember: boolean): void {
  // 根据remember参数的值,选择使用localStorage或sessionStorage来存储token
  if (remember) {
    // 保存到 localStorage
    localStorage.setItem(TokenKey, token)
  } else {
    // 保存到 sessionStorage
    sessionStorage.setItem(TokenKey, token)
  }
}

/**
 * 从浏览器存储中移除令牌。
 */
export function removeToken(): void {
  sessionStorage.removeItem(TokenKey)
  localStorage.removeItem(TokenKey)
}
ts
import { describe, it, expect, beforeEach, afterEach } from 'vitest'
import { getToken, setToken, removeToken } from '../index'

/**
 * @vitest-environment jsdom
 */
describe('Token Functions', () => {
  beforeEach(() => {
    // 在每个测试前清空 storage
    sessionStorage.clear()
    localStorage.clear()
  })

  afterEach(() => {
    // 在每个测试后清空 storage
    sessionStorage.clear()
    localStorage.clear()
  })

  describe('getToken', () => {
    it('1. 应对 sessionStorage 和 localStorage 中都没有 token 时返回 null', () => {
      expect(getToken()).toBeNull()
    })

    it('2. 应对 sessionStorage 中有 token 时返回 token', () => {
      sessionStorage.setItem('mg-token', 'session-token')
      expect(getToken()).toBe('session-token')
    })

    it('3. 应对 localStorage 中有 token 时返回 token', () => {
      localStorage.setItem('mg-token', 'local-token')
      expect(getToken()).toBe('local-token')
    })

    it('4. 应对 sessionStorage 和 localStorage 中都有 token 时返回 sessionStorage 中的 token', () => {
      sessionStorage.setItem('mg-token', 'session-token')
      localStorage.setItem('mg-token', 'local-token')
      expect(getToken()).toBe('session-token')
    })
  })

  describe('setToken', () => {
    it('5. 应对 remember 为 true 时将 token 存入 localStorage', () => {
      setToken('local-token', true)
      expect(localStorage.getItem('mg-token')).toBe('local-token')
      expect(sessionStorage.getItem('mg-token')).toBeNull()
    })

    it('6. 应对 remember 为 false 时将 token 存入 sessionStorage', () => {
      setToken('session-token', false)
      expect(sessionStorage.getItem('mg-token')).toBe('session-token')
      expect(localStorage.getItem('mg-token')).toBeNull()
    })
  })

  describe('removeToken', () => {
    it('7. 应能成功移除 sessionStorage 和 localStorage 中的 token', () => {
      sessionStorage.setItem('mg-token', 'session-token')
      localStorage.setItem('mg-token', 'local-token')
      removeToken()
      expect(sessionStorage.getItem('mg-token')).toBeNull()
      expect(localStorage.getItem('mg-token')).toBeNull()
    })
  })
})