mimedocument.spec.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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/messaging';
  7. import {
  8. BoxLayout
  9. } from '@phosphor/widgets';
  10. import {
  11. DocumentRegistry, Context,
  12. MimeContent, MimeDocument, MimeDocumentFactory
  13. } from '@jupyterlab/docregistry';
  14. import {
  15. RenderedText, IRenderMime
  16. } from '@jupyterlab/rendermime';
  17. import {
  18. createFileContext, defaultRenderMime
  19. } from '../../utils';
  20. const RENDERMIME = defaultRenderMime();
  21. class LogRenderer extends MimeContent {
  22. methods: string[] = [];
  23. protected onAfterAttach(msg: Message): void {
  24. super.onAfterAttach(msg);
  25. this.methods.push('onAfterAttach');
  26. }
  27. protected onUpdateRequest(msg: Message): void {
  28. super.onUpdateRequest(msg);
  29. this.methods.push('onUpdateRequest');
  30. }
  31. }
  32. class FooText extends RenderedText {
  33. render(model: IRenderMime.IMimeModel): Promise<void> {
  34. return super.render(model).then(() => {
  35. model.setData({ data: { 'text/foo': 'bar' }});
  36. });
  37. }
  38. }
  39. const fooFactory: IRenderMime.IRendererFactory = {
  40. mimeTypes: ['text/foo'],
  41. safe: true,
  42. createRenderer: options => new FooText(options)
  43. };
  44. describe('docregistry/mimedocument', () => {
  45. let dContext: Context<DocumentRegistry.IModel>;
  46. beforeEach(() => {
  47. dContext = createFileContext();
  48. });
  49. afterEach(() => {
  50. dContext.dispose();
  51. });
  52. describe('MimeDocumentFactory', () => {
  53. describe('#createNew()', () => {
  54. it('should require a context parameter', () => {
  55. let widgetFactory = new MimeDocumentFactory({
  56. name: 'markdown',
  57. fileTypes: ['markdown'],
  58. rendermime: RENDERMIME,
  59. primaryFileType: DocumentRegistry.defaultTextFileType
  60. });
  61. expect(widgetFactory.createNew(dContext)).to.be.a(MimeDocument);
  62. });
  63. });
  64. });
  65. describe('MimeContent', () => {
  66. describe('#constructor()', () => {
  67. it('should require options', () => {
  68. const renderer = RENDERMIME.createRenderer('text/markdown');
  69. let widget = new MimeContent({
  70. context: dContext,
  71. renderer,
  72. mimeType: 'text/markdown',
  73. renderTimeout: 1000,
  74. dataType: 'string'
  75. });
  76. expect(widget).to.be.a(MimeContent);
  77. });
  78. });
  79. describe('#ready', () => {
  80. it('should resolve when the widget is ready', () => {
  81. const renderer = RENDERMIME.createRenderer('text/markdown');
  82. let widget = new LogRenderer({
  83. context: dContext,
  84. renderer,
  85. mimeType: 'text/markdown',
  86. renderTimeout: 1000,
  87. dataType: 'string'
  88. });
  89. dContext.initialize(true);
  90. return widget.ready.then(() => {
  91. let layout = widget.layout as BoxLayout;
  92. expect(layout.widgets.length).to.be(1);
  93. });
  94. });
  95. });
  96. context('contents changed', () => {
  97. it('should change the document contents', (done) => {
  98. RENDERMIME.addFactory(fooFactory);
  99. dContext.initialize(true).then(() => {
  100. dContext.model.contentChanged.connect(() => {
  101. expect(dContext.model.toString()).to.be('bar');
  102. done();
  103. });
  104. const renderer = RENDERMIME.createRenderer('text/foo');
  105. let widget = new LogRenderer({
  106. context: dContext,
  107. renderer,
  108. mimeType: 'text/foo',
  109. renderTimeout: 1000,
  110. dataType: 'string'
  111. });
  112. return widget.ready;
  113. }).catch(done);
  114. });
  115. });
  116. });
  117. });