mimedocument.spec.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. // Copyright (c) Jupyter Development Team.
  2. // Distributed under the terms of the Modified BSD License.
  3. import 'jest';
  4. import { Message } from '@lumino/messaging';
  5. import { BoxLayout } from '@lumino/widgets';
  6. import {
  7. DocumentRegistry,
  8. Context,
  9. MimeContent,
  10. MimeDocument,
  11. MimeDocumentFactory
  12. } from '@jupyterlab/docregistry';
  13. import { RenderedText, IRenderMime } from '@jupyterlab/rendermime';
  14. import { defaultRenderMime, testEmission } from '@jupyterlab/testutils';
  15. import * as Mock from '@jupyterlab/testutils/lib/mock';
  16. const RENDERMIME = defaultRenderMime();
  17. class LogRenderer extends MimeContent {
  18. methods: string[] = [];
  19. protected onAfterAttach(msg: Message): void {
  20. super.onAfterAttach(msg);
  21. this.methods.push('onAfterAttach');
  22. }
  23. protected onUpdateRequest(msg: Message): void {
  24. super.onUpdateRequest(msg);
  25. this.methods.push('onUpdateRequest');
  26. }
  27. }
  28. class FooText extends RenderedText {
  29. async render(model: IRenderMime.IMimeModel): Promise<void> {
  30. await super.render(model);
  31. model.setData({ data: { 'text/foo': 'bar' } });
  32. }
  33. }
  34. const fooFactory: IRenderMime.IRendererFactory = {
  35. mimeTypes: ['text/foo'],
  36. safe: true,
  37. createRenderer: options => new FooText(options)
  38. };
  39. describe('docregistry/mimedocument', () => {
  40. let dContext: Context<DocumentRegistry.IModel>;
  41. beforeEach(async () => {
  42. dContext = await Mock.createFileContext();
  43. });
  44. afterEach(() => {
  45. dContext.dispose();
  46. });
  47. describe('MimeDocumentFactory', () => {
  48. describe('#createNew()', () => {
  49. it('should require a context parameter', () => {
  50. const widgetFactory = new MimeDocumentFactory({
  51. name: 'markdown',
  52. fileTypes: ['markdown'],
  53. rendermime: RENDERMIME,
  54. primaryFileType: DocumentRegistry.defaultTextFileType
  55. });
  56. expect(widgetFactory.createNew(dContext)).toBeInstanceOf(MimeDocument);
  57. });
  58. });
  59. });
  60. describe('MimeContent', () => {
  61. describe('#constructor()', () => {
  62. it('should require options', () => {
  63. const renderer = RENDERMIME.createRenderer('text/markdown');
  64. const widget = new MimeContent({
  65. context: dContext,
  66. renderer,
  67. mimeType: 'text/markdown',
  68. renderTimeout: 1000,
  69. dataType: 'string'
  70. });
  71. expect(widget).toBeInstanceOf(MimeContent);
  72. });
  73. });
  74. describe('#ready', () => {
  75. it('should resolve when the widget is ready', async () => {
  76. const renderer = RENDERMIME.createRenderer('text/markdown');
  77. const widget = new LogRenderer({
  78. context: dContext,
  79. renderer,
  80. mimeType: 'text/markdown',
  81. renderTimeout: 1000,
  82. dataType: 'string'
  83. });
  84. await widget.ready;
  85. const layout = widget.layout as BoxLayout;
  86. expect(layout.widgets.length).toBe(1);
  87. });
  88. });
  89. describe('contents changed', () => {
  90. it('should change the document contents', async () => {
  91. RENDERMIME.addFactory(fooFactory);
  92. const emission = testEmission(dContext.model.contentChanged, {
  93. test: () => {
  94. expect(dContext.model.toString()).toBe('bar');
  95. }
  96. });
  97. const renderer = RENDERMIME.createRenderer('text/foo');
  98. const widget = new LogRenderer({
  99. context: dContext,
  100. renderer,
  101. mimeType: 'text/foo',
  102. renderTimeout: 1000,
  103. dataType: 'string'
  104. });
  105. await widget.ready;
  106. await emission;
  107. });
  108. });
  109. });
  110. });