element-plus/packages/components/scrollbar/__tests__/scrollbar.test.ts

265 lines
7.3 KiB
TypeScript
Raw Normal View History

import { nextTick } from 'vue'
2020-08-10 15:29:16 +08:00
import { mount } from '@vue/test-utils'
import { describe, expect, test } from 'vitest'
import makeScroll from '@element-plus/test-utils/make-scroll'
import defineGetter from '@element-plus/test-utils/define-getter'
import Scrollbar from '../src/scrollbar.vue'
2020-09-02 17:44:14 +08:00
const _mount = (template: string) =>
mount({
components: {
'el-scrollbar': Scrollbar,
},
template,
})
2020-08-10 15:29:16 +08:00
2020-08-11 15:59:25 +08:00
describe('ScrollBar', () => {
test('vertical', async () => {
const outerHeight = 204
2020-08-11 15:59:25 +08:00
const innerHeight = 500
const wrapper = _mount(`
2020-09-02 17:44:14 +08:00
<el-scrollbar style="height: ${outerHeight}px">
2020-08-11 15:59:25 +08:00
<div style="height: ${innerHeight}px;"></div>
</el-scrollbar>
2020-09-02 17:44:14 +08:00
`)
2020-08-11 15:59:25 +08:00
const scrollDom = wrapper.find('.el-scrollbar__wrap').element
2020-09-03 13:12:44 +08:00
const offsetHeightRestore = defineGetter(
scrollDom,
'offsetHeight',
outerHeight
)
const scrollHeightRestore = defineGetter(
scrollDom,
'scrollHeight',
innerHeight
)
2020-09-03 13:12:44 +08:00
2020-08-11 15:59:25 +08:00
await makeScroll(scrollDom, 'scrollTop', 100)
expect(wrapper.find('.is-vertical div').attributes('style')).toContain(
'height: 80px; transform: translateY(50%);'
)
2020-08-11 15:59:25 +08:00
await makeScroll(scrollDom, 'scrollTop', 300)
expect(wrapper.find('.is-vertical div').attributes('style')).toContain(
'height: 80px; transform: translateY(150%);'
)
offsetHeightRestore()
scrollHeightRestore()
2020-08-11 15:59:25 +08:00
})
2020-08-10 15:29:16 +08:00
2020-08-11 15:59:25 +08:00
test('horizontal', async () => {
const outerWidth = 204
2020-08-11 15:59:25 +08:00
const innerWidth = 500
const wrapper = _mount(`
2020-09-02 17:44:14 +08:00
<el-scrollbar style="height: 100px; width: ${outerWidth}px">
2020-08-11 15:59:25 +08:00
<div style="height:100px; width: ${innerWidth}px;"></div>
</el-scrollbar>
2020-09-02 17:44:14 +08:00
`)
2020-08-11 15:59:25 +08:00
const scrollDom = wrapper.find('.el-scrollbar__wrap').element
2020-09-03 13:12:44 +08:00
const offsetWidthRestore = defineGetter(
scrollDom,
'offsetWidth',
outerWidth
)
const scrollWidthRestore = defineGetter(
scrollDom,
'scrollWidth',
innerWidth
)
2020-09-03 13:12:44 +08:00
2020-08-11 15:59:25 +08:00
await makeScroll(scrollDom, 'scrollLeft', 100)
expect(wrapper.find('.is-horizontal div').attributes('style')).toContain(
'width: 80px; transform: translateX(50%);'
)
2020-08-11 15:59:25 +08:00
await makeScroll(scrollDom, 'scrollLeft', 300)
expect(wrapper.find('.is-horizontal div').attributes('style')).toContain(
'width: 80px; transform: translateX(150%);'
)
offsetWidthRestore()
scrollWidthRestore()
})
test('both vertical and horizontal', async () => {
const outerHeight = 204
const innerHeight = 500
const outerWidth = 204
const innerWidth = 500
const wrapper = _mount(`
<el-scrollbar style="height: ${outerHeight}px; width: ${outerWidth}px;">
<div style="height: ${innerHeight}px; width: ${innerWidth}px;"></div>
</el-scrollbar>
`)
const scrollDom = wrapper.find('.el-scrollbar__wrap').element
const offsetHeightRestore = defineGetter(
scrollDom,
'offsetHeight',
outerHeight
)
const scrollHeightRestore = defineGetter(
scrollDom,
'scrollHeight',
innerHeight
)
const offsetWidthRestore = defineGetter(
scrollDom,
'offsetWidth',
outerWidth
)
const scrollWidthRestore = defineGetter(
scrollDom,
'scrollWidth',
innerWidth
)
await makeScroll(scrollDom, 'scrollTop', 100)
await makeScroll(scrollDom, 'scrollLeft', 100)
expect(wrapper.find('.is-vertical div').attributes('style')).toContain(
'height: 80px; transform: translateY(50%);'
)
expect(wrapper.find('.is-horizontal div').attributes('style')).toContain(
'width: 80px; transform: translateX(50%);'
)
await makeScroll(scrollDom, 'scrollTop', 300)
await makeScroll(scrollDom, 'scrollLeft', 300)
expect(wrapper.find('.is-vertical div').attributes('style')).toContain(
'height: 80px; transform: translateY(150%);'
)
expect(wrapper.find('.is-horizontal div').attributes('style')).toContain(
'width: 80px; transform: translateX(150%);'
)
offsetHeightRestore()
scrollHeightRestore()
offsetWidthRestore()
scrollWidthRestore()
2020-08-10 15:29:16 +08:00
})
test('should render height props', async () => {
const outerHeight = 204
const innerHeight = 500
const wrapper = _mount(`
<el-scrollbar height="${outerHeight}px">
<div style="height: ${innerHeight}px;"></div>
</el-scrollbar>
`)
expect(wrapper.find('.el-scrollbar__wrap').attributes('style')).toContain(
'height: 204px;'
)
})
test('should render max-height props', async () => {
const outerHeight = 204
const innerHeight = 100
const wrapper = _mount(`
<el-scrollbar max-height="${outerHeight}px">
<div style="height: ${innerHeight}px;"></div>
</el-scrollbar>
`)
expect(wrapper.find('.el-scrollbar__wrap').attributes('style')).toContain(
'max-height: 204px;'
)
})
test('should render always props', async () => {
const outerHeight = 204
const innerHeight = 500
const wrapper = _mount(`
<el-scrollbar height="${outerHeight}px" always>
<div style="height: ${innerHeight}px;"></div>
</el-scrollbar>
`)
expect(wrapper.find('.el-scrollbar__bar').attributes('style')).toBeFalsy()
})
test('set scrollTop & scrollLeft', async () => {
const outerHeight = 204
const innerHeight = 500
const outerWidth = 204
const innerWidth = 500
const wrapper = _mount(`
<el-scrollbar ref="scrollbar" style="height: ${outerHeight}px; width: ${outerWidth}px;">
<div style="height: ${innerHeight}px; width: ${innerWidth}px;"></div>
</el-scrollbar>
`)
const scrollbar = wrapper.vm.$refs.scrollbar as any
const scrollDom = wrapper.find('.el-scrollbar__wrap').element
const offsetHeightRestore = defineGetter(
scrollDom,
'offsetHeight',
outerHeight
)
const scrollHeightRestore = defineGetter(
scrollDom,
'scrollHeight',
innerHeight
)
const offsetWidthRestore = defineGetter(
scrollDom,
'offsetWidth',
outerWidth
)
const scrollWidthRestore = defineGetter(
scrollDom,
'scrollWidth',
innerWidth
)
scrollbar.setScrollTop(100)
await nextTick()
scrollbar.setScrollLeft(100)
await nextTick()
expect(wrapper.find('.is-vertical div').attributes('style')).toContain(
'height: 80px; transform: translateY(0%);'
)
expect(wrapper.find('.is-horizontal div').attributes('style')).toContain(
'width: 80px; transform: translateX(0%);'
)
offsetHeightRestore()
scrollHeightRestore()
offsetWidthRestore()
scrollWidthRestore()
})
test('should render min-size props', async () => {
const outerHeight = 204
const innerHeight = 10000
const wrapper = _mount(`
<el-scrollbar style="height: ${outerHeight}px">
<div style="height: ${innerHeight}px;"></div>
</el-scrollbar>
`)
const scrollDom = wrapper.find('.el-scrollbar__wrap').element
const offsetHeightRestore = defineGetter(
scrollDom,
'offsetHeight',
outerHeight
)
const scrollHeightRestore = defineGetter(
scrollDom,
'scrollHeight',
innerHeight
)
await makeScroll(scrollDom, 'scrollTop', 0)
expect(wrapper.find('.is-vertical div').attributes('style')).toContain(
'height: 20px; transform: translateY(0%);'
)
offsetHeightRestore()
scrollHeightRestore()
})
2020-08-10 15:29:16 +08:00
})