{"version":3,"file":"xhr.test.mjs","sources":["../../../src/upload/__test__/xhr.test.ts"],"sourcesContent":["import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';\nimport xhr from '../../_common/js/upload/xhr';\nimport { UploadFile } from '../../_common/js/upload/types';\n\n// jsdom 下的 XMLHttpRequest 无法真实触发 upload.onprogress，使用 Mock 替换，仅保留 xhr.ts 使用到的能力\n/* eslint-disable class-methods-use-this */\nclass MockXHR {\n  static instances: MockXHR[] = [];\n\n  upload: { onprogress?: (event: any) => void } = {};\n\n  onerror?: (...args: any[]) => void;\n\n  ontimeout?: (...args: any[]) => void;\n\n  onload?: (...args: any[]) => void;\n\n  status = 200;\n\n  responseText = '{}';\n\n  headers: Record<string, string> = {};\n\n  withCredentials = false;\n\n  constructor() {\n    MockXHR.instances.push(this);\n  }\n\n  open() {}\n\n  setRequestHeader(key: string, value: string) {\n    this.headers[key] = value;\n  }\n\n  send() {}\n\n  abort() {}\n}\n\nconst mockFile = () => new File([new ArrayBuffer(8)], 'big.bin');\n\nconst createFile = (): UploadFile => ({\n  name: 'big.bin',\n  status: 'progress',\n  percent: 0,\n  raw: mockFile(),\n});\n\nconst fireProgress = (loaded: number, total: number) => {\n  const ins = MockXHR.instances[MockXHR.instances.length - 1];\n  ins.upload.onprogress?.({ loaded, total });\n};\n\ndescribe('upload/xhr real progress', () => {\n  beforeEach(() => {\n    MockXHR.instances = [];\n    vi.stubGlobal('XMLHttpRequest', MockXHR as unknown as typeof XMLHttpRequest);\n  });\n\n  afterEach(() => {\n    vi.unstubAllGlobals();\n    vi.useRealTimers();\n  });\n\n  it('useMockProgress=false 时，真实上传进度应触发 onProgress(type=real)', () => {\n    const onProgress = vi.fn();\n    const toUploadFiles = [createFile()];\n    xhr({\n      action: 'https://example.com/api/upload',\n      withCredentials: false,\n      headers: {},\n      data: {},\n      name: 'file',\n      files: toUploadFiles,\n      useMockProgress: false,\n      onError: vi.fn(),\n      onSuccess: vi.fn(),\n      onProgress,\n    });\n\n    fireProgress(43, 100);\n    expect(onProgress).toHaveBeenCalledTimes(1);\n    expect(onProgress.mock.calls[0][0]).toMatchObject({ percent: 43, type: 'real' });\n\n    // 进度未变化时不重复触发\n    fireProgress(43, 100);\n    expect(onProgress).toHaveBeenCalledTimes(1);\n\n    // 进度递增时持续触发\n    fireProgress(66, 100);\n    fireProgress(100, 100);\n    expect(onProgress).toHaveBeenCalledTimes(3);\n    expect(onProgress.mock.calls[1][0]).toMatchObject({ percent: 66, type: 'real' });\n    expect(onProgress.mock.calls[2][0]).toMatchObject({ percent: 100, type: 'real' });\n    // 同步到文件对象，保证内部进度展示一致\n    expect(toUploadFiles[0].percent).toBe(100);\n    expect(onProgress.mock.calls[2][0].files[0].percent).toBe(100);\n  });\n\n  it('开启模拟进度时，真实进度落后于当前展示进度不触发，反超后以 real 触发', () => {\n    vi.useFakeTimers();\n    const onProgress = vi.fn();\n    const toUploadFiles = [createFile()];\n    xhr({\n      action: 'https://example.com/api/upload',\n      withCredentials: false,\n      headers: {},\n      data: {},\n      name: 'file',\n      files: toUploadFiles,\n      useMockProgress: true,\n      mockProgressDuration: 100,\n      onError: vi.fn(),\n      onSuccess: vi.fn(),\n      onProgress,\n    });\n\n    // 模拟进度计时开始，并将展示进度推进到 50\n    vi.advanceTimersByTime(100);\n    vi.advanceTimersByTime(500);\n    const mockCalls = onProgress.mock.calls.filter((call) => call[0].type === 'mock');\n    expect(mockCalls.length).toBeGreaterThan(0);\n    const mockPercent = mockCalls[mockCalls.length - 1][0].percent as number;\n    expect(mockPercent).toBe(50);\n\n    const realCountBefore = onProgress.mock.calls.filter((call) => call[0].type === 'real').length;\n    // 真实进度落后于当前展示进度，不触发（展示进度不回退）\n    fireProgress(mockPercent - 10, 100);\n    expect(onProgress.mock.calls.filter((call) => call[0].type === 'real')).toHaveLength(realCountBefore);\n\n    // 真实进度反超展示进度时，触发 real 回调\n    fireProgress(mockPercent + 10, 100);\n    const realCall = onProgress.mock.calls.filter((call) => call[0].type === 'real');\n    expect(realCall).toHaveLength(realCountBefore + 1);\n    expect(realCall[realCall.length - 1][0]).toMatchObject({ percent: mockPercent + 10, type: 'real' });\n  });\n});\n"],"names":["MockXHR","_classCallCheck","_defineProperty","instances","push","_createClass","key","value","open","setRequestHeader","headers","send","abort","mockFile","File","ArrayBuffer","createFile","name","status","percent","raw","fireProgress","loaded","total","_ins$upload$onprogres","_ins$upload","ins","length","upload","onprogress","call","describe","beforeEach","vi","stubGlobal","afterEach","unstubAllGlobals","useRealTimers","it","onProgress","fn","toUploadFiles","xhr","action","withCredentials","data","files","useMockProgress","onError","onSuccess","expect","toHaveBeenCalledTimes","mock","calls","toMatchObject","type","toBe","useFakeTimers","mockProgressDuration","advanceTimersByTime","mockCalls","filter","toBeGreaterThan","mockPercent","realCountBefore","toHaveLength","realCall"],"mappings":"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"}