widgetfactory.spec.ts 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. // Copyright (c) Jupyter Development Team.
  2. // Distributed under the terms of the Modified BSD License.
  3. import { ToolbarButton } from '@jupyterlab/apputils';
  4. import { Context } from '@jupyterlab/docregistry';
  5. import { initNotebookContext } from '@jupyterlab/testutils';
  6. import { JupyterServer } from '@jupyterlab/testutils/lib/start_jupyter_server';
  7. import { toArray } from '@lumino/algorithm';
  8. import { INotebookModel, NotebookPanel, NotebookWidgetFactory } from '..';
  9. import * as utils from './utils';
  10. const rendermime = utils.defaultRenderMime();
  11. const server = new JupyterServer();
  12. beforeAll(async () => {
  13. jest.setTimeout(20000);
  14. await server.start();
  15. });
  16. afterAll(async () => {
  17. await server.shutdown();
  18. });
  19. describe('@jupyterlab/notebook', () => {
  20. describe('NotebookWidgetFactory', () => {
  21. let context: Context<INotebookModel>;
  22. beforeEach(async () => {
  23. context = await initNotebookContext();
  24. });
  25. afterEach(() => {
  26. context.dispose();
  27. });
  28. describe('#constructor()', () => {
  29. it('should create a notebook widget factory', () => {
  30. const factory = utils.createNotebookWidgetFactory();
  31. expect(factory).toBeInstanceOf(NotebookWidgetFactory);
  32. });
  33. });
  34. describe('#isDisposed', () => {
  35. it('should get whether the factory has been disposed', () => {
  36. const factory = utils.createNotebookWidgetFactory();
  37. expect(factory.isDisposed).toBe(false);
  38. factory.dispose();
  39. expect(factory.isDisposed).toBe(true);
  40. });
  41. });
  42. describe('#dispose()', () => {
  43. it('should dispose of the resources held by the factory', () => {
  44. const factory = utils.createNotebookWidgetFactory();
  45. factory.dispose();
  46. expect(factory.isDisposed).toBe(true);
  47. });
  48. it('should be safe to call multiple times', () => {
  49. const factory = utils.createNotebookWidgetFactory();
  50. factory.dispose();
  51. factory.dispose();
  52. expect(factory.isDisposed).toBe(true);
  53. });
  54. });
  55. describe('#editorConfig', () => {
  56. it('should be the editor config passed into the constructor', () => {
  57. const factory = utils.createNotebookWidgetFactory();
  58. expect(factory.editorConfig).toBe(utils.defaultEditorConfig);
  59. });
  60. it('should be settable', () => {
  61. const factory = utils.createNotebookWidgetFactory();
  62. const newConfig = { ...utils.defaultEditorConfig };
  63. factory.editorConfig = newConfig;
  64. expect(factory.editorConfig).toBe(newConfig);
  65. });
  66. });
  67. describe('#createNew()', () => {
  68. it('should create a new `NotebookPanel` widget', () => {
  69. const factory = utils.createNotebookWidgetFactory();
  70. const panel = factory.createNew(context);
  71. expect(panel).toBeInstanceOf(NotebookPanel);
  72. });
  73. it('should create a clone of the rendermime', () => {
  74. const factory = utils.createNotebookWidgetFactory();
  75. const panel = factory.createNew(context);
  76. expect(panel.content.rendermime).not.toBe(rendermime);
  77. });
  78. it('should pass the editor config to the notebook', () => {
  79. const factory = utils.createNotebookWidgetFactory();
  80. const panel = factory.createNew(context);
  81. expect(panel.content.editorConfig).toBe(utils.defaultEditorConfig);
  82. });
  83. it('should populate the default toolbar items', () => {
  84. const factory = utils.createNotebookWidgetFactory();
  85. const panel = factory.createNew(context);
  86. const items = toArray(panel.toolbar.names());
  87. expect(items).toEqual(expect.arrayContaining(['save']));
  88. expect(items).toEqual(expect.arrayContaining(['restart']));
  89. });
  90. it('should populate the customized toolbar items', () => {
  91. const toolbarFactory = () => [
  92. { name: 'foo', widget: new ToolbarButton() },
  93. { name: 'bar', widget: new ToolbarButton() }
  94. ];
  95. const factory = utils.createNotebookWidgetFactory(toolbarFactory);
  96. const panel = factory.createNew(context);
  97. const panel2 = factory.createNew(context);
  98. expect(toArray(panel.toolbar.names())).toEqual([
  99. 'foo',
  100. 'bar',
  101. 'toolbar-popup-opener'
  102. ]);
  103. expect(toArray(panel2.toolbar.names())).toEqual([
  104. 'foo',
  105. 'bar',
  106. 'toolbar-popup-opener'
  107. ]);
  108. expect(toArray(panel.toolbar.children()).length).toBe(3);
  109. expect(toArray(panel2.toolbar.children()).length).toBe(3);
  110. });
  111. it('should clone from the optional source widget', () => {
  112. const factory = utils.createNotebookWidgetFactory();
  113. const panel = factory.createNew(context);
  114. const clone = factory.createNew(panel.context, panel);
  115. expect(clone).toBeInstanceOf(NotebookPanel);
  116. expect(clone.content.rendermime).toBe(panel.content.rendermime);
  117. expect(clone.content.editorConfig).toBe(panel.content.editorConfig);
  118. expect(clone.content.notebookConfig).toBe(panel.content.notebookConfig);
  119. });
  120. });
  121. });
  122. });