useCheckin.test.js 3.01 KB
import { describe, expect, it, vi, beforeEach } from 'vitest'

vi.mock('vue-router', () => {
    return {
        useRoute: () => ({
            query: {}
        }),
        useRouter: () => ({
            push: vi.fn()
        })
    }
})

vi.mock('vant', () => {
    return {
        showToast: vi.fn(),
        showLoadingToast: vi.fn(() => ({ close: vi.fn() }))
    }
})

vi.mock('@/api/common', () => {
    return {
        qiniuTokenAPI: vi.fn(),
        qiniuUploadAPI: vi.fn(),
        saveFileAPI: vi.fn()
    }
})

vi.mock('@/api/checkin', () => {
    return {
        addUploadTaskAPI: vi.fn(),
        getUploadTaskInfoAPI: vi.fn(),
        editUploadTaskInfoAPI: vi.fn()
    }
})

vi.mock('@/utils/qiniuFileHash', () => {
    return {
        qiniuFileHash: vi.fn(async () => 'hash')
    }
})

vi.mock('@/contexts/auth', async () => {
    const { ref } = await import('vue')
    return {
        useAuth: () => ({
            currentUser: ref({ mobile: '18800001111' })
        })
    }
})

import { useCheckin } from '../useCheckin'
import { showToast } from 'vant'

describe('useCheckin 上传大小限制', () => {
    beforeEach(() => {
        vi.clearAllMocks()
    })

    it('setMaxFileSizeMbMap 能更新并保留其他类型默认值', () => {
        const { activeType, maxFileSizeMb, setMaxFileSizeMbMap } = useCheckin()

        activeType.value = 'image'
        expect(maxFileSizeMb.value).toBe(20)

        setMaxFileSizeMbMap({ image: 500 })
        expect(maxFileSizeMb.value).toBe(500)

        activeType.value = 'video'
        expect(maxFileSizeMb.value).toBe(20)
    })

    it('setMaxFileSizeMbMap 会忽略非法值', () => {
        const { activeType, maxFileSizeMb, setMaxFileSizeMbMap } = useCheckin()

        activeType.value = 'audio'
        setMaxFileSizeMbMap({ audio: 0 })
        expect(maxFileSizeMb.value).toBe(20)

        setMaxFileSizeMbMap({ audio: -10 })
        expect(maxFileSizeMb.value).toBe(20)

        setMaxFileSizeMbMap({ audio: 'not_a_number' })
        expect(maxFileSizeMb.value).toBe(20)

        setMaxFileSizeMbMap({ audio: 300 })
        expect(maxFileSizeMb.value).toBe(300)
    })

    it('beforeRead 超过动态大小会拦截并提示', () => {
        const { activeType, beforeRead, setMaxFileSizeMbMap } = useCheckin()

        activeType.value = 'image'
        setMaxFileSizeMbMap({ image: 1 })

        const ok = beforeRead({
            type: 'image/jpeg',
            size: 2 * 1024 * 1024
        })

        expect(ok).toBe(false)
        expect(showToast).toHaveBeenCalled()
        expect(String(showToast.mock.calls[0][0])).toContain('最大文件体积为1MB')
    })

    it('beforeRead 图片类型校验失败会拦截', () => {
        const { activeType, beforeRead, setMaxFileSizeMbMap } = useCheckin()

        activeType.value = 'image'
        setMaxFileSizeMbMap({ image: 10 })

        const ok = beforeRead({
            type: 'application/pdf',
            size: 1 * 1024 * 1024
        })

        expect(ok).toBe(false)
        expect(showToast).toHaveBeenCalled()
    })
})