Browse Source

Modernize rendermime tests

Steven Silvester 5 years ago
parent
commit
ef58f1d277

+ 1 - 0
packages/rendermime/package.json

@@ -61,6 +61,7 @@
     "@types/lodash.escape": "^4.0.6",
     "@types/marked": "^0.7.2",
     "jest": "^25.2.3",
+    "json2html": "^0.0.8",
     "rimraf": "~3.0.0",
     "ts-jest": "^25.2.1",
     "typedoc": "^0.15.4",

+ 7 - 13
packages/rendermime/test/factories.spec.ts

@@ -2,6 +2,8 @@
 
 import 'jest';
 
+const sampleData = require('../../../examples/filebrowser/sample.md');
+
 import { JSONObject, JSONValue } from '@lumino/coreutils';
 
 import { Widget } from '@lumino/widgets';
@@ -187,9 +189,7 @@ describe('rendermime/factories', () => {
         await w.renderModel(model);
         const imgEl = w.node.getElementsByTagName('img')[0];
         expect(imgEl).toBeTruthy();
-        expect(imgEl.src).toEqual(
-          expect.arrayContaining([encodeURIComponent(displaySource)])
-        );
+        expect(imgEl.src).toContain(encodeURIComponent(displaySource));
       });
     });
   });
@@ -229,25 +229,19 @@ describe('rendermime/factories', () => {
         expect(w.node.innerHTML).toBe(source);
       });
 
-      it('should add header anchors', async () => {
-        const source = require('../../../examples/filebrowser/sample.md')
-          .default as string;
+      it.only('should add header anchors', async () => {
         const f = markdownRendererFactory;
         const mimeType = 'text/markdown';
-        const model = createModel(mimeType, source);
+        const model = createModel(mimeType, sampleData);
         const w = f.createRenderer({ mimeType, ...defaultOptions });
         await w.renderModel(model);
         Widget.attach(w, document.body);
         const node = document.getElementById('Title-third-level')!;
         expect(node.localName).toBe('h3');
         const anchor = node.firstChild!.nextSibling as HTMLAnchorElement;
-        expect(anchor.href).toEqual(
-          expect.arrayContaining(['#Title-third-level'])
-        );
+        expect(anchor.href).toContain('#Title-third-level');
         expect(anchor.target).toBe('_self');
-        expect(anchor.className).toEqual(
-          expect.arrayContaining(['jp-InternalAnchorLink'])
-        );
+        expect(anchor.className).toContain('jp-InternalAnchorLink');
         expect(anchor.textContent).toBe('¶');
         Widget.detach(w);
       });

+ 8 - 0
packages/rendermime/test/json-to-html.d.ts

@@ -0,0 +1,8 @@
+// Type definitions for json2html v0.1.2
+// https://github.com/frozzare/json-to-html
+// Definitions by: Steven Silvester <https://github.com/blink1073>
+
+declare module 'json-to-html' {
+  function render(value: any): string;
+  export = render;
+}

+ 43 - 16
packages/rendermime/test/registry.spec.ts

@@ -2,6 +2,8 @@
 
 import 'jest';
 
+import json2html = require('json-to-html');
+
 import { UUID, JSONObject } from '@lumino/coreutils';
 
 import { Contents, Drive, ServiceManager, Session } from '@jupyterlab/services';
@@ -20,13 +22,36 @@ import {
   MimeModel,
   IRenderMime,
   RenderedText,
-  RenderMimeRegistry
+  RenderMimeRegistry,
+  RenderedHTML,
+  standardRendererFactories
 } from '../src';
 
-import { defaultRenderMime } from '@jupyterlab/testutils';
-
 import * as Mock from '@jupyterlab/testutils/lib/mock';
 
+class JSONRenderer extends RenderedHTML {
+  mimeType = 'text/html';
+
+  renderModel(model: IRenderMime.IMimeModel): Promise<void> {
+    const source = model.data['application/json'];
+    model.setData({ data: { 'text/html': json2html(source) } });
+    return super.renderModel(model);
+  }
+}
+
+const jsonRendererFactory = {
+  mimeTypes: ['application/json'],
+  safe: true,
+  createRenderer(options: IRenderMime.IRendererOptions): IRenderMime.IRenderer {
+    return new JSONRenderer(options);
+  }
+};
+
+const defaultRenderMime = new RenderMimeRegistry({
+  initialFactories: standardRendererFactories
+});
+defaultRenderMime.addFactory(jsonRendererFactory, 10);
+
 function createModel(data: JSONObject): IRenderMime.IMimeModel {
   return new MimeModel({ data });
 }
@@ -54,7 +79,7 @@ describe('rendermime/registry', () => {
   });
 
   beforeEach(() => {
-    r = defaultRenderMime();
+    r = defaultRenderMime.clone();
   });
 
   describe('RenderMimeRegistry', () => {
@@ -159,7 +184,7 @@ describe('rendermime/registry', () => {
           resolver: RESOLVER,
           linkHandler: {
             handleLink: (node: HTMLElement, url: string) => {
-              expect(url).toBe('foo/bar.txt');
+              expect(url).toContain('foo/bar.txt');
               called = true;
             }
           }
@@ -178,7 +203,7 @@ describe('rendermime/registry', () => {
           resolver: RESOLVER,
           linkHandler: {
             handleLink: (node: HTMLElement, path: string) => {
-              expect(path).toBe('foo%20/bår.txt');
+              expect(path).toContain('foo%20/bår.txt');
               called = true;
             }
           }
@@ -361,7 +386,7 @@ describe('rendermime/registry', () => {
             contents: manager.contents,
             path: '/some/path/file.txt'
           });
-          expect(await resolver.resolveUrl('./foo')).toBe('some/path/foo');
+          expect(await resolver.resolveUrl('./foo')).toContain('some/path/foo');
         });
 
         it('should fall back to the session path if only the session is given', () => {
@@ -379,22 +404,24 @@ describe('rendermime/registry', () => {
             contents: manager.contents
           });
           resolver.path = '/some/path/file.txt';
-          expect(await resolver.resolveUrl('./foo')).toBe('some/path/foo');
+          expect(await resolver.resolveUrl('./foo')).toContain('some/path/foo');
           const resolver2 = new RenderMimeRegistry.UrlResolver({
             path: '/some/path/file.txt',
             contents: manager.contents
           });
           resolver2.path = '/other/path/file.txt';
-          expect(await resolver2.resolveUrl('./foo')).toBe('other/path/foo');
+          expect(await resolver2.resolveUrl('./foo')).toContain(
+            'other/path/foo'
+          );
         });
       });
 
       describe('#resolveUrl()', () => {
         it('should resolve a relative url', async () => {
-          expect(await resolverSession.resolveUrl('./foo')).toBe(
+          expect(await resolverSession.resolveUrl('./foo')).toContain(
             urlParent + '/foo'
           );
-          expect(await resolverPath.resolveUrl('./foo')).toBe(
+          expect(await resolverPath.resolveUrl('./foo')).toContain(
             urlParent + '/foo'
           );
         });
@@ -410,23 +437,23 @@ describe('rendermime/registry', () => {
             contents: manager.contents
           });
           const path = await resolver.resolveUrl('./foo');
-          expect(path).toBe(urlParent + '/foo');
+          expect(path).toContain(urlParent + '/foo');
         });
 
         it('should ignore urls that have a protocol', async () => {
-          expect(await resolverSession.resolveUrl('http://foo')).toBe(
+          expect(await resolverSession.resolveUrl('http://foo')).toContain(
             'http://foo'
           );
-          expect(await resolverPath.resolveUrl('http://foo')).toBe(
+          expect(await resolverPath.resolveUrl('http://foo')).toContain(
             'http://foo'
           );
         });
 
         it('should resolve URLs with escapes', async () => {
-          expect(await resolverSession.resolveUrl('has%20space')).toBe(
+          expect(await resolverSession.resolveUrl('has%20space')).toContain(
             urlParent + '/has%20space'
           );
-          expect(await resolverPath.resolveUrl('has%20space')).toBe(
+          expect(await resolverPath.resolveUrl('has%20space')).toContain(
             urlParent + '/has%20space'
           );
         });

+ 1 - 0
testutils/package.json

@@ -50,6 +50,7 @@
     "jest": "^25.2.3",
     "jest-raw-loader": "^1.0.1",
     "json-to-html": "~0.1.2",
+    "markdown-loader-jest": "^0.1.1",
     "node-fetch": "^2.6.0",
     "path": "~0.12.7",
     "simulate-event": "~1.4.0",

+ 2 - 1
testutils/src/jest-config-new.ts

@@ -8,7 +8,8 @@ module.exports = function(baseDir: string) {
       '\\.(gif|ttf|eot)$': '@jupyterlab/testutils/lib/jest-file-mock.js'
     },
     transform: {
-      '\\.svg$': 'jest-raw-loader'
+      '\\.svg$': 'jest-raw-loader',
+      '^.+\\.md?$': 'markdown-loader-jest'
     },
     setupFiles: ['@jupyterlab/testutils/lib/jest-shim.js'],
     testPathIgnorePatterns: ['/lib/', '/node_modules/'],

+ 6 - 0
testutils/src/mock.ts

@@ -532,6 +532,12 @@ export const ContentsManagerMock = jest.fn<Contents.IManager, []>(() => {
       });
       return Promise.resolve(files.get(path)!);
     }),
+    getDownloadUrl: jest.fn(path => {
+      return dummy.getDownloadUrl(path);
+    }),
+    addDrive: jest.fn(drive => {
+      dummy.addDrive(drive);
+    }),
     dispose: jest.fn()
   };
 

+ 34 - 1
yarn.lock

@@ -9230,7 +9230,7 @@ html-escaper@^2.0.0:
   resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
   integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
 
-html-loader@~0.5.5:
+html-loader@^0.5.1, html-loader@~0.5.5:
   version "0.5.5"
   resolved "https://registry.yarnpkg.com/html-loader/-/html-loader-0.5.5.tgz#6356dbeb0c49756d8ebd5ca327f16ff06ab5faea"
   integrity sha512-7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog==
@@ -10946,6 +10946,13 @@ json-to-html@~0.1.2:
   resolved "https://registry.yarnpkg.com/json-to-html/-/json-to-html-0.1.2.tgz#7a095ae4a34b33534aad0970ca4b7417b2c11ee3"
   integrity sha1-egla5KNLM1NKrQlwykt0F7LBHuM=
 
+json2html@^0.0.8:
+  version "0.0.8"
+  resolved "https://registry.yarnpkg.com/json2html/-/json2html-0.0.8.tgz#6c64ee08259744fd28a49fb97d7746b29ae0501d"
+  integrity sha1-bGTuCCWXRP0opJ+5fXdGsprgUB0=
+  dependencies:
+    underscore ">=1.3.1"
+
 json3@^3.3.2:
   version "3.3.3"
   resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81"
@@ -11809,6 +11816,22 @@ map-visit@^1.0.0:
   dependencies:
     object-visit "^1.0.0"
 
+markdown-loader-jest@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/markdown-loader-jest/-/markdown-loader-jest-0.1.1.tgz#7de45f7e6c8644805bd02ca126dfb54a55cf8255"
+  integrity sha512-osdgJgjxP/9C+vcIkTxU5p91C3+IkD2yY+SvG4GcFOOfAK0mixqepDSkNdMIsCf10KK9DfHjPUslnzKLH1tktg==
+  dependencies:
+    html-loader "^0.5.1"
+    markdown-loader "^2.0.1"
+
+markdown-loader@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/markdown-loader/-/markdown-loader-2.0.2.tgz#1cdcf11307658cd611046d7db34c2fe80542af7c"
+  integrity sha512-v/ej7DflZbb6t//3Yu9vg0T+sun+Q9EoqggifeyABKfvFROqPwwwpv+hd1NKT2QxTRg6VCFk10IIJcMI13yCoQ==
+  dependencies:
+    loader-utils "^1.1.0"
+    marked "^0.3.9"
+
 markdown-to-jsx@^6.9.1, markdown-to-jsx@^6.9.3:
   version "6.10.3"
   resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-6.10.3.tgz#7f0946684acd321125ff2de7fd258a9b9c7c40b7"
@@ -11817,6 +11840,11 @@ markdown-to-jsx@^6.9.1, markdown-to-jsx@^6.9.3:
     prop-types "^15.6.2"
     unquote "^1.1.0"
 
+marked@^0.3.9:
+  version "0.3.19"
+  resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790"
+  integrity sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==
+
 marked@^0.7.0:
   version "0.7.0"
   resolved "https://registry.yarnpkg.com/marked/-/marked-0.7.0.tgz#b64201f051d271b1edc10a04d1ae9b74bb8e5c0e"
@@ -16444,6 +16472,11 @@ umask@^1.1.0:
   resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d"
   integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=
 
+underscore@>=1.3.1:
+  version "1.10.2"
+  resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.10.2.tgz#73d6aa3668f3188e4adb0f1943bd12cfd7efaaaf"
+  integrity sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg==
+
 underscore@>=1.8.3, underscore@^1.9.1:
   version "1.9.1"
   resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961"