import { describe, expect, it, vi, beforeEach, afterEach } from 'vitest'

import { config } from './config'

describe('config', () => {
  const originalEnv = { ...import.meta.env }

  beforeEach(() => {
    vi.resetModules()
  })

  afterEach(() => {
    vi.restoreAllMocks()
    // 恢复原始环境变量
    Object.assign(import.meta.env, originalEnv)
  })

  describe('apiBaseUrl', () => {
    it('should return default API URL when VITE_API_BASE_URL is not set', () => {
      // 默认值测试
      expect(config.apiBaseUrl).toBeDefined()
      expect(typeof config.apiBaseUrl).toBe('string')
    })

    it('should use VITE_API_BASE_URL from environment when set', async () => {
      // 模拟环境变量设置
      vi.stubEnv('VITE_API_BASE_URL', 'https://api.example.com/v2')

      // 重新导入模块以获取新的环境变量值
      const { config: newConfig } = await import('./config?_=' + Date.now())

      // 注意：由于 Vite 的 import.meta.env 在构建时注入，运行时修改可能不生效
      // 这里主要测试 config 对象的结构
      expect(newConfig.apiBaseUrl).toBeDefined()
    })

    it('should fallback to /api/v1 when env is empty string', () => {
      // 测试默认值逻辑
      const defaultUrl = import.meta.env.VITE_API_BASE_URL || '/api/v1'
      expect(defaultUrl).toBeTruthy()
    })
  })

  describe('config object', () => {
    it('should be defined as const (readonly semantic)', () => {
      // config 使用 as const 声明，TypeScript 语义上是只读的
      // 运行时 JavaScript 不强制只读，但 TypeScript 类型系统保护
      expect(config.apiBaseUrl).toBeDefined()
      expect(typeof config.apiBaseUrl).toBe('string')
    })

    it('should have all expected properties', () => {
      expect(config).toHaveProperty('apiBaseUrl')
      expect(Object.keys(config)).toContain('apiBaseUrl')
    })
  })
})
