34 lines
3.0 KiB
TypeScript
34 lines
3.0 KiB
TypeScript
/**
|
|
* 34-facetime: FaceTime Vue 组件化测试
|
|
*/
|
|
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'
|
|
import { h, render, nextTick } from 'vue'
|
|
import FaceTimeComponent from '../../src/apps/facetime/FaceTime.vue'
|
|
import { store } from '../../src/composables/useStore'
|
|
import { setupDOM } from '../helpers'
|
|
|
|
function makeMockWin() {
|
|
const el = document.createElement('div'); el.className = 'window'
|
|
document.getElementById('window-layer')?.appendChild(el)
|
|
const body = document.createElement('div'); body.className = 'win-body'
|
|
el.appendChild(body)
|
|
return { id: 'ft', appId: 'facetime', el, body, timers: [] as any[], data: {} }
|
|
}
|
|
|
|
describe('34-facetime — FaceTime Vue 组件化', () => {
|
|
let win: any
|
|
beforeEach(() => { setupDOM(); win = makeMockWin()
|
|
store.set('contacts', [{ id: '1', name: '测试人', phone: '123', email: 't@t.com', note: '' }])
|
|
})
|
|
afterEach(() => { render(null, win.body); win.el.remove() })
|
|
function mount() { const v = h(FaceTimeComponent, { win }); render(v, win.body) }
|
|
|
|
it('显示联系人选择界面', () => { mount(); expect(document.querySelector('.ft-grid')).toBeTruthy() })
|
|
it('联系人列表包含联系人', () => { mount(); expect(document.querySelectorAll('.ft-cell').length).toBeGreaterThanOrEqual(1) })
|
|
it('点击呼叫开始拨打', async () => { mount(); (document.querySelector('.btn.primary') as HTMLElement)?.dispatchEvent(new MouseEvent('click', { bubbles: true })); await nextTick(); expect(document.querySelector('.ft-status')?.textContent).toContain('正在呼叫') })
|
|
it('麦克风静音切换', async () => { mount(); (document.querySelector('.btn.primary') as HTMLElement)?.dispatchEvent(new MouseEvent('click', { bubbles: true })); await nextTick(); const micBtn = document.querySelector('.ft-ctl') as HTMLElement; micBtn?.dispatchEvent(new MouseEvent('click', { bubbles: true })); await nextTick(); expect(micBtn?.classList.contains('off')).toBe(true) })
|
|
it('视频关闭切换', async () => { mount(); (document.querySelector('.btn.primary') as HTMLElement)?.dispatchEvent(new MouseEvent('click', { bubbles: true })); await nextTick(); const camBtn = document.querySelectorAll('.ft-ctl')[1] as HTMLElement; camBtn?.dispatchEvent(new MouseEvent('click', { bubbles: true })); await nextTick(); expect(camBtn?.classList.contains('off')).toBe(true) })
|
|
it('结束通话回到空闲', async () => { vi.useFakeTimers(); mount(); (document.querySelector('.btn.primary') as HTMLElement)?.dispatchEvent(new MouseEvent('click', { bubbles: true })); await nextTick(); const endBtn = document.querySelector('.ft-ctl.end') as HTMLElement; endBtn?.dispatchEvent(new MouseEvent('click', { bubbles: true })); await nextTick(); expect(document.querySelector('.ft-status')?.textContent).toContain('通话已结束'); vi.advanceTimersByTime(1500); await nextTick(); expect(document.querySelector('.ft-grid')).toBeTruthy(); vi.useRealTimers() })
|
|
it('卸载', () => { mount(); render(null, win.body); expect(win.body.children.length).toBe(0) })
|
|
})
|