drawer.spec.js 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. import { createVue, destroyVM, waitImmediate, wait } from '../util';
  2. const title = '我是测试 title';
  3. const content = 'content';
  4. describe('Drawer', () => {
  5. let vm;
  6. afterEach(() => {
  7. destroyVM(vm);
  8. });
  9. it('create', async() => {
  10. vm = createVue(
  11. {
  12. template: `
  13. <el-drawer :title='title' :visible='visible'></el-drawer>
  14. `,
  15. data() {
  16. return {
  17. title,
  18. visible: true
  19. };
  20. }
  21. },
  22. true
  23. );
  24. const drawer = vm.$children[0];
  25. await waitImmediate();
  26. expect(document.querySelector('.v-modal')).to.exist;
  27. expect(vm.$el.querySelector('.el-drawer__header').textContent).to.equal(
  28. title
  29. );
  30. expect(drawer.$el.style.display).to.not.equal('none');
  31. });
  32. it('render correct content', async() => {
  33. vm = createVue(
  34. {
  35. template: `
  36. <el-drawer :title='title' :visible='visible'>
  37. <span>这是一段信息</span>
  38. <el-button @click.native='dialogVisible = false'>取消</el-button>
  39. <el-button type='primary' @click.native='dialogVisible = false'>确定</el-button>
  40. </el-drawer>
  41. `,
  42. data() {
  43. return {
  44. title: 'drawer test',
  45. visible: true
  46. };
  47. }
  48. },
  49. true
  50. );
  51. await waitImmediate();
  52. expect(vm.$el.querySelector('.el-drawer__body span').textContent).to.equal(
  53. '这是一段信息'
  54. );
  55. const footerBtns = vm.$el.querySelectorAll('.el-button');
  56. expect(footerBtns.length).to.equal(2);
  57. expect(footerBtns[0].querySelector('span').textContent).to.equal('取消');
  58. expect(footerBtns[1].querySelector('span').textContent).to.equal('确定');
  59. });
  60. it('should append to body, when append-to-body flag is true', async() => {
  61. vm = createVue(
  62. {
  63. template: `
  64. <el-drawer :title='title' :visible='visible' :append-to-body='true'>
  65. <span> content </span>
  66. </el-drawer>
  67. `,
  68. data() {
  69. return {
  70. title,
  71. visible: true
  72. };
  73. }
  74. },
  75. true
  76. );
  77. await waitImmediate();
  78. expect(vm.$el.parentNode).to.equal(document.body);
  79. });
  80. it('should open and close drawer properly', async() => {
  81. vm = createVue({
  82. template: `
  83. <el-drawer :title='title' :visible='visible' ref='drawer'>
  84. <span>${content}</span>
  85. </el-drawer>
  86. `,
  87. data() {
  88. return {
  89. title,
  90. visible: false
  91. };
  92. }
  93. });
  94. let drawer = vm.$children[0].$el;
  95. expect(drawer.style.display).to.equal('none');
  96. vm.visible = true;
  97. await waitImmediate();
  98. expect(drawer.style.display).not.to.equal('none');
  99. vm.visible = false;
  100. await wait(400);
  101. expect(drawer.style.display).to.equal('none');
  102. });
  103. it('should destroy every child after drawer was closed when destroy-on-close flag is true', async() => {
  104. vm = createVue({
  105. template: `
  106. <el-drawer :title='title' :visible='visible' :append-to-body='true' :destroy-on-close='true' ref='drawer'>
  107. <span>${content}</span>
  108. </el-drawer>
  109. `,
  110. data() {
  111. return {
  112. title,
  113. visible: true
  114. };
  115. }
  116. });
  117. await waitImmediate();
  118. expect(vm.$el.querySelector('.el-drawer__body span').textContent).to.equal(
  119. content
  120. );
  121. vm.$refs.drawer.closeDrawer();
  122. await wait(400);
  123. expect(vm.$el.querySelector('.el-drawer__body')).not.to.exist;
  124. });
  125. it('should close dialog by clicking the close button', async() => {
  126. vm = createVue({
  127. template: `
  128. <el-drawer :title='title' :visible.sync='visible' :append-to-body='true' :destroy-on-close='true' ref='drawer'>
  129. <span>${content}</span>
  130. </el-drawer>
  131. `,
  132. data() {
  133. return {
  134. title,
  135. visible: true
  136. };
  137. }
  138. });
  139. await waitImmediate();
  140. vm.$children[0].$el.querySelector('.el-drawer__close-btn').click();
  141. expect(vm.visible).to.equal(false);
  142. });
  143. it('should invoke before-close', async() => {
  144. const beforeClose = sinon.spy();
  145. vm = createVue({
  146. template: `
  147. <el-drawer
  148. :before-close='beforeClose'
  149. :title='title'
  150. :visible.sync='visible'
  151. :append-to-body='true'
  152. :destroy-on-close='true'
  153. ref='drawer'
  154. >
  155. <span>${content}</span>
  156. </el-drawer>
  157. `,
  158. data() {
  159. return {
  160. title,
  161. visible: true,
  162. beforeClose
  163. };
  164. }
  165. });
  166. await waitImmediate();
  167. vm.$refs.drawer.closeDrawer();
  168. await waitImmediate();
  169. expect(beforeClose.called).to.be.true;
  170. });
  171. it('should not show close button when show-close flag is false', async() => {
  172. vm = createVue({
  173. template: `
  174. <el-drawer :title='title' :visible='visible' ref='drawer' :show-close='false'>
  175. <span>${content}</span>
  176. </el-drawer>
  177. `,
  178. data() {
  179. return {
  180. title,
  181. visible: false
  182. };
  183. }
  184. });
  185. expect(vm.$el.querySelector('.el-drawer__close-btn')).not.to.exist;
  186. });
  187. it('should have custom classes when custom classes were given', async() => {
  188. const classes = 'some-custom-class';
  189. vm = createVue({
  190. template: `
  191. <el-drawer :title='title' :visible='visible' ref='drawer' custom-class='${classes}'>
  192. <span>${content}</span>
  193. </el-drawer>
  194. `,
  195. data() {
  196. return {
  197. title,
  198. visible: false
  199. };
  200. }
  201. });
  202. expect(vm.$el.querySelector(`.${classes}`)).to.exist;
  203. });
  204. it('should not render header when withHeader attribute is false', () => {
  205. vm = createVue({
  206. template: `
  207. <el-drawer :title='title' :visible='visible' ref='drawer' :with-header='false'>
  208. <span>${content}</span>
  209. </el-drawer>
  210. `,
  211. data() {
  212. return {
  213. title,
  214. visible: true
  215. };
  216. }
  217. });
  218. expect(vm.$el.querySelector('.el-drawer__header')).to.not.exist;
  219. });
  220. describe('directions', () => {
  221. const renderer = direction => {
  222. return createVue({
  223. template: `
  224. <el-drawer :title='title' :visible='visible' direction='${direction}'>
  225. <span>${content}</span>
  226. </el-drawer>
  227. `,
  228. data: {
  229. visible: true,
  230. title
  231. }
  232. });
  233. };
  234. it('should render from left to right', async() => {
  235. vm = renderer('ltr');
  236. await waitImmediate();
  237. expect(vm.$el.querySelector('.ltr')).to.exist;
  238. });
  239. it('should render from right to left', async() => {
  240. vm = renderer('rtl');
  241. await waitImmediate();
  242. expect(vm.$el.querySelector('.rtl')).to.exist;
  243. });
  244. it('should render from top to bottom', async() => {
  245. vm = renderer('ttb');
  246. await waitImmediate();
  247. expect(vm.$el.querySelector('.ttb')).to.exist;
  248. });
  249. it('should render from bottom to top', async() => {
  250. vm = renderer('btt');
  251. await waitImmediate();
  252. expect(vm.$el.querySelector('.btt')).to.exist;
  253. });
  254. });
  255. it('events', async() => {
  256. const open = sinon.spy();
  257. const opened = sinon.spy();
  258. const close = sinon.spy();
  259. const closed = sinon.spy();
  260. vm = createVue({
  261. template: `
  262. <el-drawer
  263. :title='title'
  264. :visible='visible'
  265. ref="drawer"
  266. @open="open"
  267. @opened="opened"
  268. @close="close"
  269. @closed="closed">
  270. <span>${content}</span>
  271. </el-drawer>
  272. `,
  273. data() {
  274. return {
  275. content,
  276. visible: false,
  277. title
  278. };
  279. },
  280. methods: {
  281. close,
  282. closed,
  283. open,
  284. opened
  285. }
  286. });
  287. vm.visible = true;
  288. await wait(400);
  289. expect(open.called).to.be.true;
  290. expect(opened.called).to.be.true;
  291. expect(close.called).to.be.false;
  292. expect(closed.called).to.be.false;
  293. vm.visible = false;
  294. await wait(500);
  295. expect(close.called).to.be.true;
  296. expect(closed.called).to.be.true;
  297. });
  298. describe('size', () => {
  299. const renderer = (size, isVertical) =>
  300. createVue({
  301. template: `
  302. <el-drawer :title='title' :visible='visible' direction='${isVertical ? 'ltr' : 'ttb'}' size='${size}'>
  303. <span>${content}</span>
  304. </el-drawer>
  305. `,
  306. data: {
  307. visible: true,
  308. title
  309. }
  310. });
  311. it('should effect height when drawer is vertical', async() => {
  312. const size = '50%';
  313. vm = renderer(size, true);
  314. expect(vm.$el.querySelector('.el-drawer').style.width).to.equal('50%');
  315. });
  316. it('should effect width when drawer is horizontal', async() => {
  317. const size = '50%';
  318. vm = renderer(size, false);
  319. expect(vm.$el.querySelector('.el-drawer').style.height).to.equal('50%');
  320. });
  321. });
  322. });