dialog.spec.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. // Copyright (c) Jupyter Development Team.
  2. // Distributed under the terms of the Modified BSD License.
  3. import expect = require('expect.js');
  4. import {
  5. Message
  6. } from 'phosphor/lib/core/messaging';
  7. import {
  8. Widget
  9. } from 'phosphor/lib/ui/widget';
  10. import {
  11. simulate
  12. } from 'simulate-event';
  13. import {
  14. showDialog, okButton
  15. } from '../../../lib/dialog';
  16. import {
  17. acceptDialog, dismissDialog
  18. } from '../utils';
  19. describe('dialog/index', () => {
  20. describe('showDialog()', () => {
  21. it('should accept zero arguments', (done) => {
  22. showDialog().then(result => {
  23. expect(result.text).to.be('CANCEL');
  24. done();
  25. });
  26. Promise.resolve().then(() => {
  27. let node = document.body.getElementsByClassName('jp-Dialog')[0];
  28. simulate(node as HTMLElement, 'keydown', { keyCode: 27 });
  29. });
  30. });
  31. it('should accept dialog options', (done) => {
  32. let node = document.createElement('div');
  33. document.body.appendChild(node);
  34. let options = {
  35. title: 'foo',
  36. body: 'Hello',
  37. host: node,
  38. buttons: [okButton],
  39. okText: 'Yep'
  40. };
  41. showDialog(options).then(result => {
  42. expect(result.text).to.be('CANCEL');
  43. done();
  44. });
  45. Promise.resolve().then(() => {
  46. let target = document.body.getElementsByClassName('jp-Dialog')[0];
  47. simulate(target as HTMLElement, 'keydown', { keyCode: 27 });
  48. });
  49. });
  50. it('should accept an html body', (done) => {
  51. let body = document.createElement('div');
  52. let input = document.createElement('input');
  53. let select = document.createElement('select');
  54. body.appendChild(input);
  55. body.appendChild(select);
  56. showDialog({ body, okText: 'CONFIRM' }).then(result => {
  57. expect(result.text).to.be('CONFIRM');
  58. done();
  59. });
  60. acceptDialog();
  61. });
  62. it('should accept an input body', (done) => {
  63. let body = document.createElement('input');
  64. showDialog({ body }).then(result => {
  65. expect(result.text).to.be('CANCEL');
  66. done();
  67. });
  68. dismissDialog();
  69. });
  70. it('should accept a select body', (done) => {
  71. let body = document.createElement('select');
  72. showDialog({ body }).then(result => {
  73. expect(result.text).to.be('OK');
  74. done();
  75. });
  76. acceptDialog();
  77. });
  78. it('should accept a widget body', (done) => {
  79. let body = new Widget({node: document.createElement('div')});
  80. showDialog({ body }).then(result => {
  81. expect(result.text).to.be('OK');
  82. done();
  83. });
  84. acceptDialog();
  85. });
  86. it('should apply an additional CSS class', (done) => {
  87. showDialog({ dialogClass: 'test-class' }).then(result => {
  88. expect(result.text).to.be('OK');
  89. done();
  90. });
  91. Promise.resolve().then(() => {
  92. let nodes = document.body.getElementsByClassName('test-class');
  93. expect(nodes.length).to.be(1);
  94. let node = nodes[0];
  95. expect(node.classList).to.eql(['jp-Dialog', 'test-class']);
  96. });
  97. acceptDialog();
  98. });
  99. it('should resolve with the clicked button result', (done) => {
  100. let button = {
  101. text: 'foo',
  102. className: 'bar',
  103. icon: 'baz'
  104. };
  105. showDialog({ buttons: [button] }).then(result => {
  106. expect(result.text).to.be('foo');
  107. done();
  108. });
  109. Promise.resolve().then(() => {
  110. let node = document.body.getElementsByClassName('bar')[0];
  111. (node as HTMLElement).click();
  112. });
  113. });
  114. it('should ignore context menu events', (done) => {
  115. let body = document.createElement('div');
  116. showDialog({ body }).then(result => {
  117. expect(result.text).to.be('CANCEL');
  118. done();
  119. });
  120. Promise.resolve().then(() => {
  121. let node = document.body.getElementsByClassName('jp-Dialog')[0];
  122. simulate(node as HTMLElement, 'contextmenu');
  123. simulate(node as HTMLElement, 'keydown', { keyCode: 27 });
  124. });
  125. });
  126. /**
  127. * Class to test that onAfterAttach is called
  128. */
  129. class TestWidget extends Widget {
  130. constructor(resolve: () => void) {
  131. super();
  132. this.resolve = resolve;
  133. }
  134. protected onAfterAttach(msg: Message): void {
  135. this.resolve();
  136. }
  137. resolve: () => void;
  138. }
  139. it('should fire onAfterAttach on widget body', (done) => {
  140. let promise = new Promise((resolve, reject) => {
  141. let body = new TestWidget(resolve);
  142. showDialog({ body });
  143. });
  144. promise.then(() => {
  145. dismissDialog();
  146. done();
  147. });
  148. });
  149. });
  150. });