mimedocument.spec.ts 3.5 KB

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