drawer.spec.js 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  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 destroy every child by visible change when destroy-on-close flag is true', async() => {
  126. vm = createVue({
  127. template: `
  128. <el-drawer :title='title' :visible='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. expect(vm.$el.querySelector('.el-drawer__body span').textContent).to.equal(
  141. content
  142. );
  143. vm.visible = false;
  144. await wait(400);
  145. expect(vm.$el.querySelector('.el-drawer__body')).not.to.exist;
  146. });
  147. it('should close dialog by clicking the close button', async() => {
  148. vm = createVue({
  149. template: `
  150. <el-drawer :title='title' :visible.sync='visible' :append-to-body='true' :destroy-on-close='true' ref='drawer'>
  151. <span>${content}</span>
  152. </el-drawer>
  153. `,
  154. data() {
  155. return {
  156. title,
  157. visible: true
  158. };
  159. }
  160. });
  161. await waitImmediate();
  162. vm.$children[0].$el.querySelector('.el-drawer__close-btn').click();
  163. expect(vm.visible).to.equal(false);
  164. });
  165. it('should invoke before-close', async() => {
  166. const beforeClose = sinon.spy();
  167. vm = createVue({
  168. template: `
  169. <el-drawer
  170. :before-close='beforeClose'
  171. :title='title'
  172. :visible.sync='visible'
  173. :append-to-body='true'
  174. :destroy-on-close='true'
  175. ref='drawer'
  176. >
  177. <span>${content}</span>
  178. </el-drawer>
  179. `,
  180. data() {
  181. return {
  182. title,
  183. visible: true,
  184. beforeClose
  185. };
  186. }
  187. });
  188. await waitImmediate();
  189. vm.$refs.drawer.closeDrawer();
  190. await waitImmediate();
  191. expect(beforeClose.called).to.be.true;
  192. });
  193. it('should not show close button when show-close flag is false', async() => {
  194. vm = createVue({
  195. template: `
  196. <el-drawer :title='title' :visible='visible' ref='drawer' :show-close='false'>
  197. <span>${content}</span>
  198. </el-drawer>
  199. `,
  200. data() {
  201. return {
  202. title,
  203. visible: false
  204. };
  205. }
  206. });
  207. expect(vm.$el.querySelector('.el-drawer__close-btn')).not.to.exist;
  208. });
  209. it('should have custom classes when custom classes were given', async() => {
  210. const classes = 'some-custom-class';
  211. vm = createVue({
  212. template: `
  213. <el-drawer :title='title' :visible='visible' ref='drawer' custom-class='${classes}'>
  214. <span>${content}</span>
  215. </el-drawer>
  216. `,
  217. data() {
  218. return {
  219. title,
  220. visible: false
  221. };
  222. }
  223. });
  224. expect(vm.$el.querySelector(`.${classes}`)).to.exist;
  225. });
  226. it('should not render header when withHeader attribute is false', () => {
  227. vm = createVue({
  228. template: `
  229. <el-drawer :title='title' :visible='visible' ref='drawer' :with-header='false'>
  230. <span>${content}</span>
  231. </el-drawer>
  232. `,
  233. data() {
  234. return {
  235. title,
  236. visible: true
  237. };
  238. }
  239. });
  240. expect(vm.$el.querySelector('.el-drawer__header')).to.not.exist;
  241. });
  242. describe('directions', () => {
  243. const renderer = direction => {
  244. return createVue({
  245. template: `
  246. <el-drawer :title='title' :visible='visible' direction='${direction}'>
  247. <span>${content}</span>
  248. </el-drawer>
  249. `,
  250. data: {
  251. visible: true,
  252. title
  253. }
  254. });
  255. };
  256. it('should render from left to right', async() => {
  257. vm = renderer('ltr');
  258. await waitImmediate();
  259. expect(vm.$el.querySelector('.ltr')).to.exist;
  260. });
  261. it('should render from right to left', async() => {
  262. vm = renderer('rtl');
  263. await waitImmediate();
  264. expect(vm.$el.querySelector('.rtl')).to.exist;
  265. });
  266. it('should render from top to bottom', async() => {
  267. vm = renderer('ttb');
  268. await waitImmediate();
  269. expect(vm.$el.querySelector('.ttb')).to.exist;
  270. });
  271. it('should render from bottom to top', async() => {
  272. vm = renderer('btt');
  273. await waitImmediate();
  274. expect(vm.$el.querySelector('.btt')).to.exist;
  275. });
  276. });
  277. it('events', async() => {
  278. const open = sinon.spy();
  279. const opened = sinon.spy();
  280. const close = sinon.spy();
  281. const closed = sinon.spy();
  282. vm = createVue({
  283. template: `
  284. <el-drawer
  285. :title='title'
  286. :visible='visible'
  287. ref="drawer"
  288. @open="open"
  289. @opened="opened"
  290. @close="close"
  291. @closed="closed">
  292. <span>${content}</span>
  293. </el-drawer>
  294. `,
  295. data() {
  296. return {
  297. content,
  298. visible: false,
  299. title
  300. };
  301. },
  302. methods: {
  303. close,
  304. closed,
  305. open,
  306. opened
  307. }
  308. });
  309. vm.visible = true;
  310. await wait(400);
  311. expect(open.called).to.be.true;
  312. expect(opened.called).to.be.true;
  313. expect(close.called).to.be.false;
  314. expect(closed.called).to.be.false;
  315. vm.visible = false;
  316. await wait(500);
  317. expect(close.called).to.be.true;
  318. expect(closed.called).to.be.true;
  319. });
  320. describe('size', () => {
  321. const renderer = (size, isVertical) =>
  322. createVue({
  323. template: `
  324. <el-drawer :title='title' :visible='visible' direction='${isVertical ? 'ltr' : 'ttb'}' size='${size}'>
  325. <span>${content}</span>
  326. </el-drawer>
  327. `,
  328. data: {
  329. visible: true,
  330. title
  331. }
  332. });
  333. it('should effect height when drawer is vertical', async() => {
  334. const size = '50%';
  335. vm = renderer(size, true);
  336. expect(vm.$el.querySelector('.el-drawer').style.width).to.equal('50%');
  337. });
  338. it('should effect width when drawer is horizontal', async() => {
  339. const size = '50%';
  340. vm = renderer(size, false);
  341. expect(vm.$el.querySelector('.el-drawer').style.height).to.equal('50%');
  342. });
  343. });
  344. });