element-plus/packages/components/notification/__tests__/notify.spec.ts
2022-03-25 15:35:56 +08:00

130 lines
3.6 KiB
TypeScript

import { h, nextTick } from 'vue'
import { rAF } from '@element-plus/test-utils/tick'
import Notification, { closeAll } from '../src/notify'
import { ElNotification } from '..'
import type { NotificationHandle } from '../src/notification'
const selector = '.el-notification'
describe('Notification on command', () => {
afterEach(() => {
closeAll()
})
test('it should get component handle', async () => {
const handle = Notification()
await rAF()
expect(document.querySelector(selector)).toBeDefined()
handle.close()
await rAF()
await nextTick()
expect(document.querySelector(selector)).toBeNull()
expect(
document.querySelector('[class^="container_notification"]')
).toBeNull()
})
test('it should be able to render vnode', async () => {
const testClassName = 'test-classname'
const { close } = Notification({
duration: 0,
message: h('div', { class: testClassName }, 'test-content'),
})
await rAF()
expect(document.querySelector(`.${testClassName}`)).toBeDefined()
close()
})
test('it should be able to close notification by manually close', async () => {
const { close } = Notification({
duration: 0,
})
await rAF()
const element = document.querySelector(selector)
expect(element).toBeDefined()
close()
await rAF()
await nextTick()
expect(document.querySelector(selector)).toBeNull()
})
test('it should close all notifications', async () => {
const notifications: NotificationHandle[] = []
const onClose = jest.fn()
for (let i = 0; i < 4; i++) {
notifications.push(
Notification({
onClose,
duration: 0,
})
)
}
// jest.runAllTicks()
await rAF()
expect(document.querySelectorAll(selector).length).toBe(4)
closeAll()
// jest.runAllTicks()
await rAF()
expect(onClose).toHaveBeenCalledTimes(notifications.length)
expect(document.querySelectorAll(selector).length).toBe(0)
})
test('it should be able to render all types notification', () => {
for (const type of ['success', 'warning', 'error', 'info'] as const) {
Notification[type]({})
expect(document.querySelector(`.el-icon-${type}`)).toBeDefined()
}
})
test('it should appendTo specified HTMLElement', async () => {
const htmlElement = document.createElement('div')
const handle = Notification({
appendTo: htmlElement,
})
await rAF()
expect(htmlElement.querySelector(selector)).toBeDefined()
handle.close()
await rAF()
await nextTick()
expect(htmlElement.querySelector(selector)).toBeNull()
})
test('it should appendTo specified selector', async () => {
const htmlElement = document.createElement('div')
htmlElement.classList.add('notification-manager')
document.body.appendChild(htmlElement)
const handle = Notification({
appendTo: '.notification-manager',
})
await rAF()
expect(htmlElement.querySelector(selector)).toBeDefined()
handle.close()
await rAF()
await nextTick()
expect(htmlElement.querySelector(selector)).toBeNull()
})
describe('context inheritance', () => {
it('should globally inherit context correctly', () => {
expect(ElNotification._context).toBe(null)
const testContext = {
config: {
globalProperties: {},
},
_context: {},
}
ElNotification.install?.(testContext as any)
expect(ElNotification._context).not.toBe(null)
expect(ElNotification._context).toBe(testContext._context)
// clean up
ElNotification._context = null
})
})
})