From 69a93e4a4a6a3b8d82038fc1d68602078553bf65 Mon Sep 17 00:00:00 2001 From: Matthew Beale Date: Thu, 19 Nov 2015 12:26:37 -0500 Subject: [PATCH] Add versioning for Mobiledoc renderer, parser --- src/js/editor/editor.js | 8 +- src/js/models/post.js | 4 +- .../{mobiledoc.js => mobiledoc/0-2.js} | 4 +- src/js/parsers/mobiledoc/index.js | 17 ++ .../{mobiledoc.js => mobiledoc/0-2.js} | 6 +- src/js/renderers/mobiledoc/index.js | 16 ++ src/js/utils/paste-utils.js | 4 +- tests/helpers/mobiledoc.js | 15 +- tests/unit/editor/editor-test.js | 4 +- tests/unit/parsers/mobiledoc-test.js | 184 ++--------------- tests/unit/parsers/mobiledoc/0-2-test.js | 195 ++++++++++++++++++ tests/unit/renderers/mobiledoc-test.js | 188 +---------------- tests/unit/renderers/mobiledoc/0-2-test.js | 192 +++++++++++++++++ 13 files changed, 472 insertions(+), 365 deletions(-) rename src/js/parsers/{mobiledoc.js => mobiledoc/0-2.js} (96%) create mode 100644 src/js/parsers/mobiledoc/index.js rename src/js/renderers/{mobiledoc.js => mobiledoc/0-2.js} (95%) create mode 100644 src/js/renderers/mobiledoc/index.js create mode 100644 tests/unit/parsers/mobiledoc/0-2-test.js create mode 100644 tests/unit/renderers/mobiledoc/0-2-test.js diff --git a/src/js/editor/editor.js b/src/js/editor/editor.js index 5d3fa587c..93fe61f1e 100644 --- a/src/js/editor/editor.js +++ b/src/js/editor/editor.js @@ -6,12 +6,12 @@ import ImageCard from '../cards/image'; import Key from '../utils/key'; import EventEmitter from '../utils/event-emitter'; -import MobiledocParser from '../parsers/mobiledoc'; +import mobiledocParsers from '../parsers/mobiledoc'; import HTMLParser from '../parsers/html'; import DOMParser from '../parsers/dom'; import Renderer from 'mobiledoc-kit/renderers/editor-dom'; import RenderTree from 'mobiledoc-kit/models/render-tree'; -import MobiledocRenderer from '../renderers/mobiledoc'; +import mobiledocRenderers from '../renderers/mobiledoc'; import { mergeWithOptions } from 'content-kit-utils'; import { clearChildNodes, addClassName } from '../utils/dom-utils'; @@ -104,7 +104,7 @@ class Editor { loadPost() { if (this.mobiledoc) { - return new MobiledocParser(this.builder).parse(this.mobiledoc); + return mobiledocParsers.parse(this.builder, this.mobiledoc); } else if (this.html) { if (typeof this.html === 'string') { return new HTMLParser(this.builder).parse(this.html); @@ -366,7 +366,7 @@ class Editor { } serialize() { - return MobiledocRenderer.render(this.post); + return mobiledocRenderers.render(this.post); } removeAllViews() { diff --git a/src/js/models/post.js b/src/js/models/post.js index d9dec0fa5..766954640 100644 --- a/src/js/models/post.js +++ b/src/js/models/post.js @@ -2,7 +2,7 @@ import { POST_TYPE } from './types'; import LinkedList from 'mobiledoc-kit/utils/linked-list'; import { forEach, compact } from 'mobiledoc-kit/utils/array-utils'; import Set from 'mobiledoc-kit/utils/set'; -import MobiledocRenderer from 'mobiledoc-kit/renderers/mobiledoc'; +import mobiledocRenderers from 'mobiledoc-kit/renderers/mobiledoc'; export default class Post { constructor() { @@ -227,6 +227,6 @@ export default class Post { } post.sections.append(newSection); }); - return MobiledocRenderer.render(post); + return mobiledocRenderers.render(post); } } diff --git a/src/js/parsers/mobiledoc.js b/src/js/parsers/mobiledoc/0-2.js similarity index 96% rename from src/js/parsers/mobiledoc.js rename to src/js/parsers/mobiledoc/0-2.js index 53c247404..6c4d487a5 100644 --- a/src/js/parsers/mobiledoc.js +++ b/src/js/parsers/mobiledoc/0-2.js @@ -3,8 +3,8 @@ import { MOBILEDOC_IMAGE_SECTION_TYPE, MOBILEDOC_LIST_SECTION_TYPE, MOBILEDOC_CARD_SECTION_TYPE -} from '../renderers/mobiledoc'; -import { kvArrayToObject, filter } from "../utils/array-utils"; +} from 'mobiledoc-kit/renderers/mobiledoc/0-2'; +import { kvArrayToObject, filter } from "../../utils/array-utils"; /* * Parses from mobiledoc -> post diff --git a/src/js/parsers/mobiledoc/index.js b/src/js/parsers/mobiledoc/index.js new file mode 100644 index 000000000..a310bdf30 --- /dev/null +++ b/src/js/parsers/mobiledoc/index.js @@ -0,0 +1,17 @@ +import MobiledocParser_0_2 from './0-2'; + +function parseVersion(mobiledoc) { + return mobiledoc.version; +} + +export default { + parse(builder, mobiledoc) { + let version = parseVersion(mobiledoc); + switch (version) { + case '0.2.0': + return new MobiledocParser_0_2(builder).parse(mobiledoc); + default: + throw new Error(`Unknown version of mobiledoc parser requested: ${version}`); + } + } +}; diff --git a/src/js/renderers/mobiledoc.js b/src/js/renderers/mobiledoc/0-2.js similarity index 95% rename from src/js/renderers/mobiledoc.js rename to src/js/renderers/mobiledoc/0-2.js index 0cb963f2d..4afadce60 100644 --- a/src/js/renderers/mobiledoc.js +++ b/src/js/renderers/mobiledoc/0-2.js @@ -1,5 +1,5 @@ -import {visit, visitArray, compile} from '../utils/compiler'; -import { objectToSortedKVArray } from '../utils/array-utils'; +import {visit, visitArray, compile} from '../../utils/compiler'; +import { objectToSortedKVArray } from '../../utils/array-utils'; import { POST_TYPE, MARKUP_SECTION_TYPE, @@ -9,7 +9,7 @@ import { MARKUP_TYPE, IMAGE_SECTION_TYPE, CARD_TYPE -} from '../models/types'; +} from '../../models/types'; export const MOBILEDOC_VERSION = '0.2.0'; export const MOBILEDOC_MARKUP_SECTION_TYPE = 1; diff --git a/src/js/renderers/mobiledoc/index.js b/src/js/renderers/mobiledoc/index.js new file mode 100644 index 000000000..3fb6d925e --- /dev/null +++ b/src/js/renderers/mobiledoc/index.js @@ -0,0 +1,16 @@ +import MobiledocRenderer_0_2, { MOBILEDOC_VERSION } from './0-2'; + +export { MOBILEDOC_VERSION }; + +export default { + render(post, version) { + switch (version) { + case '0.2.0': + case undefined: + case null: + return MobiledocRenderer_0_2.render(post); + default: + throw new Error(`Unknown version of mobiledoc renderer requested: ${version}`); + } + } +}; diff --git a/src/js/utils/paste-utils.js b/src/js/utils/paste-utils.js index 46b21b907..b730201ea 100644 --- a/src/js/utils/paste-utils.js +++ b/src/js/utils/paste-utils.js @@ -1,5 +1,5 @@ /* global JSON */ -import MobiledocParser from '../parsers/mobiledoc'; +import mobiledocParsers from '../parsers/mobiledoc'; import HTMLParser from '../parsers/html'; import HTMLRenderer from 'mobiledoc-html-renderer'; import TextRenderer from 'mobiledoc-text-renderer'; @@ -31,7 +31,7 @@ export function parsePostFromPaste(pasteEvent, builder, cardParsers=[]) { if (mobiledocRegex.test(html)) { let mobiledocString = html.match(mobiledocRegex)[1]; mobiledoc = JSON.parse(mobiledocString); - post = new MobiledocParser(builder).parse(mobiledoc); + post = mobiledocParsers.parse(builder, mobiledoc); } else { post = new HTMLParser(builder, {cardParsers}).parse(html); } diff --git a/tests/helpers/mobiledoc.js b/tests/helpers/mobiledoc.js index 70e7ac812..929407bc7 100644 --- a/tests/helpers/mobiledoc.js +++ b/tests/helpers/mobiledoc.js @@ -1,5 +1,6 @@ import PostAbstractHelpers from './post-abstract'; -import MobiledocRenderer from 'mobiledoc-kit/renderers/mobiledoc'; +import mobiledocRenderers from 'mobiledoc-kit/renderers/mobiledoc'; +import MobiledocRenderer_0_2 from 'mobiledoc-kit/renderers/mobiledoc/0-2'; /* * usage: @@ -11,8 +12,16 @@ import MobiledocRenderer from 'mobiledoc-kit/renderers/mobiledoc'; * }) * ) */ -function build(treeFn) { - return MobiledocRenderer.render(PostAbstractHelpers.build(treeFn)); +function build(treeFn, version) { + switch (version) { + case '0.2.0': + return MobiledocRenderer_0_2.render(PostAbstractHelpers.build(treeFn)); + case undefined: + case null: + return mobiledocRenderers.render(PostAbstractHelpers.build(treeFn)); + default: + throw new Error(`Unknown version of mobiledoc renderer requested: ${version}`); + } } export default { diff --git a/tests/unit/editor/editor-test.js b/tests/unit/editor/editor-test.js index 4b402aa79..e40617146 100644 --- a/tests/unit/editor/editor-test.js +++ b/tests/unit/editor/editor-test.js @@ -236,11 +236,13 @@ test('useful error message when given invalid mobiledoc', (assert) => { assert.throws(() => { new Editor({mobiledoc: badMobiledoc}); // jshint ignore:line }, /unable to parse.*mobiledoc/i); +}); +test('useful error message when given bad version of mobiledoc', (assert) => { let verybadMobiledoc = "not mobiledoc"; assert.throws(() => { new Editor({mobiledoc: verybadMobiledoc}); // jshint ignore:line - }, /unable to parse.*mobiledoc/i); + }, /Unknown version of mobiledoc parser requested/i); }); test('activeSections of a rendered blank mobiledoc is an empty array', (assert) => { diff --git a/tests/unit/parsers/mobiledoc-test.js b/tests/unit/parsers/mobiledoc-test.js index b39cbdd0e..660f5b7e1 100644 --- a/tests/unit/parsers/mobiledoc-test.js +++ b/tests/unit/parsers/mobiledoc-test.js @@ -1,20 +1,22 @@ -import MobiledocParser from 'mobiledoc-kit/parsers/mobiledoc'; -import PostNodeBuilder from 'mobiledoc-kit/models/post-node-builder'; +import mobiledocParsers from 'mobiledoc-kit/parsers/mobiledoc'; import { MOBILEDOC_VERSION } from 'mobiledoc-kit/renderers/mobiledoc'; +import PostNodeBuilder from 'mobiledoc-kit/models/post-node-builder'; +import Helpers from '../../test-helpers'; -const DATA_URL = "data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs="; const { module, test } = window.QUnit; -let parser, builder, post; +let builder, post; + +function parse(mobiledoc) { + return mobiledocParsers.parse(builder, mobiledoc); +} module('Unit: Parsers: Mobiledoc', { beforeEach() { builder = new PostNodeBuilder(); - parser = new MobiledocParser(builder); post = builder.createPost(); }, afterEach() { - parser = null; builder = null; post = null; } @@ -26,170 +28,18 @@ test('#parse empty doc returns an empty post', (assert) => { sections: [[], []] }; - const parsed = parser.parse(mobiledoc); + const parsed = parse(mobiledoc); assert.equal(parsed.sections.length, 0, '0 sections'); }); -test('#parse empty markup section returns an empty post', (assert) => { - const mobiledoc = { - version: MOBILEDOC_VERSION, - sections: [[], [ - [1, 'p', []] - ]] - }; - - const section = builder.createMarkupSection('p'); - post.sections.append(section); - assert.deepEqual(parser.parse(mobiledoc), post); -}); - -test('#parse doc without marker types', (assert) => { - const mobiledoc = { - version: MOBILEDOC_VERSION, - sections: [ - [], - [[ - 1,'P', [[[], 0, 'hello world']] - ]] - ] - }; - const parsed = parser.parse(mobiledoc); - - let section = builder.createMarkupSection('P', [], false); - let marker = builder.createMarker('hello world'); - section.markers.append(marker); - post.sections.append(section); - - assert.deepEqual( - parsed, - post - ); -}); - -test('#parse doc with blank marker', (assert) => { - const mobiledoc = { - version: MOBILEDOC_VERSION, - sections: [ - [], - [[ - 1,'P', [[[], 0, '']] - ]] - ] - }; - const parsed = parser.parse(mobiledoc); - - let section = builder.createMarkupSection('P', [], false); - post.sections.append(section); - - assert.deepEqual( - parsed, - post - ); -}); - -test('#parse doc with marker type', (assert) => { - const mobiledoc = { - version: MOBILEDOC_VERSION, - sections: [ - [ - ['B'], - ['A', ['href', 'google.com']] - ], - [[ - 1,'P', [ - [[1], 0, 'hello'], // a tag open - [[0], 1, 'brave new'], // b tag open/close - [[], 1, 'world'] // a tag close - ] - ]] - ] - }; - const parsed = parser.parse(mobiledoc); - - let section = builder.createMarkupSection('P', [], false); - let aMarkerType = builder.createMarkup('A', {href:'google.com'}); - let bMarkerType = builder.createMarkup('B'); - - let markers = [ - builder.createMarker('hello', [aMarkerType]), - builder.createMarker('brave new', [aMarkerType, bMarkerType]), - builder.createMarker('world', [aMarkerType]) - ]; - markers.forEach(marker => section.markers.append(marker)); - post.sections.append(section); - - assert.deepEqual( - parsed, - post - ); -}); - -test('#parse doc with image section', (assert) => { - const mobiledoc = { - version: MOBILEDOC_VERSION, - sections: [ - [], - [ - [2, DATA_URL] - ] - ] - }; - - const parsed = parser.parse(mobiledoc); - - let section = builder.createImageSection(DATA_URL); - post.sections.append(section); - assert.deepEqual( - parsed, - post - ); -}); - -test('#parse doc with custom card type', (assert) => { - const mobiledoc = { - version: MOBILEDOC_VERSION, - sections: [ - [], - [ - [10, 'custom-card', {}] - ] - ] - }; - - const parsed = parser.parse(mobiledoc); - - let section = builder.createCardSection('custom-card'); - post.sections.append(section); - assert.deepEqual( - parsed, - post - ); -}); - -test('#parse a mobile doc with list-section and list-item', (assert) => { - const mobiledoc = { - version: MOBILEDOC_VERSION, - sections: [ - [], - [ - [3, 'ul', [ - [[[], 0, "first item"]], - [[[], 0, "second item"]] - ]] - ] - ] - }; - const parsed = parser.parse(mobiledoc); +test('#parse basic mobiledoc from renderer works', (assert) => { + const mobiledoc = Helpers.mobiledoc.build(({post, markupSection, marker}) => { + return post([markupSection('p', [ + marker('Howdy') + ])]); + }); - const items = [ - builder.createListItem([builder.createMarker('first item')]), - builder.createListItem([builder.createMarker('second item')]) - ]; - const section = builder.createListSection('ul', items); - post.sections.append(section); - assert.deepEqual( - parsed, - post - ); + const parsed = parse(mobiledoc); + assert.equal(parsed.sections.length, 1, '1 section'); }); diff --git a/tests/unit/parsers/mobiledoc/0-2-test.js b/tests/unit/parsers/mobiledoc/0-2-test.js new file mode 100644 index 000000000..9ec527bf7 --- /dev/null +++ b/tests/unit/parsers/mobiledoc/0-2-test.js @@ -0,0 +1,195 @@ +import MobiledocParser from 'mobiledoc-kit/parsers/mobiledoc/0-2'; +import { MOBILEDOC_VERSION } from 'mobiledoc-kit/renderers/mobiledoc/0-2'; +import PostNodeBuilder from 'mobiledoc-kit/models/post-node-builder'; + +const DATA_URL = "data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs="; +const { module, test } = window.QUnit; + +let parser, builder, post; + +module('Unit: Parsers: Mobiledoc 0.2', { + beforeEach() { + builder = new PostNodeBuilder(); + parser = new MobiledocParser(builder); + post = builder.createPost(); + }, + afterEach() { + parser = null; + builder = null; + post = null; + } +}); + +test('#parse empty doc returns an empty post', (assert) => { + const mobiledoc = { + version: MOBILEDOC_VERSION, + sections: [[], []] + }; + + const parsed = parser.parse(mobiledoc); + assert.equal(parsed.sections.length, 0, '0 sections'); +}); + +test('#parse empty markup section returns an empty post', (assert) => { + const mobiledoc = { + version: MOBILEDOC_VERSION, + sections: [[], [ + [1, 'p', []] + ]] + }; + + const section = builder.createMarkupSection('p'); + post.sections.append(section); + assert.deepEqual(parser.parse(mobiledoc), post); +}); + +test('#parse doc without marker types', (assert) => { + const mobiledoc = { + version: MOBILEDOC_VERSION, + sections: [ + [], + [[ + 1,'P', [[[], 0, 'hello world']] + ]] + ] + }; + const parsed = parser.parse(mobiledoc); + + let section = builder.createMarkupSection('P', [], false); + let marker = builder.createMarker('hello world'); + section.markers.append(marker); + post.sections.append(section); + + assert.deepEqual( + parsed, + post + ); +}); + +test('#parse doc with blank marker', (assert) => { + const mobiledoc = { + version: MOBILEDOC_VERSION, + sections: [ + [], + [[ + 1,'P', [[[], 0, '']] + ]] + ] + }; + const parsed = parser.parse(mobiledoc); + + let section = builder.createMarkupSection('P', [], false); + post.sections.append(section); + + assert.deepEqual( + parsed, + post + ); +}); + +test('#parse doc with marker type', (assert) => { + const mobiledoc = { + version: MOBILEDOC_VERSION, + sections: [ + [ + ['B'], + ['A', ['href', 'google.com']] + ], + [[ + 1,'P', [ + [[1], 0, 'hello'], // a tag open + [[0], 1, 'brave new'], // b tag open/close + [[], 1, 'world'] // a tag close + ] + ]] + ] + }; + const parsed = parser.parse(mobiledoc); + + let section = builder.createMarkupSection('P', [], false); + let aMarkerType = builder.createMarkup('A', {href:'google.com'}); + let bMarkerType = builder.createMarkup('B'); + + let markers = [ + builder.createMarker('hello', [aMarkerType]), + builder.createMarker('brave new', [aMarkerType, bMarkerType]), + builder.createMarker('world', [aMarkerType]) + ]; + markers.forEach(marker => section.markers.append(marker)); + post.sections.append(section); + + assert.deepEqual( + parsed, + post + ); +}); + +test('#parse doc with image section', (assert) => { + const mobiledoc = { + version: MOBILEDOC_VERSION, + sections: [ + [], + [ + [2, DATA_URL] + ] + ] + }; + + const parsed = parser.parse(mobiledoc); + + let section = builder.createImageSection(DATA_URL); + post.sections.append(section); + assert.deepEqual( + parsed, + post + ); +}); + +test('#parse doc with custom card type', (assert) => { + const mobiledoc = { + version: MOBILEDOC_VERSION, + sections: [ + [], + [ + [10, 'custom-card', {}] + ] + ] + }; + + const parsed = parser.parse(mobiledoc); + + let section = builder.createCardSection('custom-card'); + post.sections.append(section); + assert.deepEqual( + parsed, + post + ); +}); + +test('#parse a mobile doc with list-section and list-item', (assert) => { + const mobiledoc = { + version: MOBILEDOC_VERSION, + sections: [ + [], + [ + [3, 'ul', [ + [[[], 0, "first item"]], + [[[], 0, "second item"]] + ]] + ] + ] + }; + + const parsed = parser.parse(mobiledoc); + + const items = [ + builder.createListItem([builder.createMarker('first item')]), + builder.createListItem([builder.createMarker('second item')]) + ]; + const section = builder.createListSection('ul', items); + post.sections.append(section); + assert.deepEqual( + parsed, + post + ); +}); diff --git a/tests/unit/renderers/mobiledoc-test.js b/tests/unit/renderers/mobiledoc-test.js index de7fb8e5e..5ee7900fe 100644 --- a/tests/unit/renderers/mobiledoc-test.js +++ b/tests/unit/renderers/mobiledoc-test.js @@ -1,193 +1,19 @@ -import MobiledocRenderer from 'mobiledoc-kit/renderers/mobiledoc'; -import { - MOBILEDOC_VERSION -} from 'mobiledoc-kit/renderers/mobiledoc'; -import PostNodeBuilder from 'mobiledoc-kit/models/post-node-builder'; -import { normalizeTagName } from 'mobiledoc-kit/utils/dom-utils'; +import mobiledocRenderers, { MOBILEDOC_VERSION } from 'mobiledoc-kit/renderers/mobiledoc'; import Helpers from '../../test-helpers'; const { module, test } = Helpers; -const render = MobiledocRenderer.render; -let builder; -module('Unit: Mobiledoc Renderer', { - beforeEach() { - builder = new PostNodeBuilder(); - } -}); +function render(post) { + return mobiledocRenderers.render(post); +} + +module('Unit: Mobiledoc Renderer'); test('renders a blank post', (assert) => { - let post = builder.createPost(); + let post = Helpers.postAbstract.build(({post}) => post()); let mobiledoc = render(post); assert.deepEqual(mobiledoc, { version: MOBILEDOC_VERSION, sections: [[], []] }); }); - -test('renders a post with marker', (assert) => { - const post = Helpers.postAbstract.build(({post, markupSection, marker, markup}) => { - return post([ - markupSection('p', [marker('Hi', [markup('strong')])]) - ]); - }); - const mobiledoc = render(post); - assert.deepEqual(mobiledoc, { - version: MOBILEDOC_VERSION, - sections: [ - [['strong']], - [ - [1, normalizeTagName('P'), [[[0], 1, 'Hi']]] - ] - ] - }); -}); - -test('renders a post section with markers sharing a markup', (assert) => { - const post = Helpers.postAbstract.build(({post, markupSection, marker, markup}) => { - const strong = markup('strong'); - return post([ - markupSection('p', [marker('Hi', [strong]), marker(' Guy', [strong])]) - ]); - }); - let mobiledoc = render(post); - assert.deepEqual(mobiledoc, { - version: MOBILEDOC_VERSION, - sections: [ - [['strong']], - [ - [1, normalizeTagName('P'), [ - [[0], 0, 'Hi'], - [[], 1, ' Guy'] - ]] - ] - ] - }); -}); - -test('renders a post with markers with markers with complex attributes', (assert) => { - let link1,link2; - const post = Helpers.postAbstract.build(({post, markupSection, marker, markup}) => { - link1 = markup('a', {href:'bustle.com'}); - link2 = markup('a', {href:'other.com'}); - return post([ - markupSection('p', [ - marker('Hi', [link1]), - marker(' Guy', [link2]), - marker(' other guy', [link1]) - ]) - ]); - }); - let mobiledoc = render(post); - assert.deepEqual(mobiledoc, { - version: MOBILEDOC_VERSION, - sections: [ - [ - ['a', ['href', 'bustle.com']], - ['a', ['href', 'other.com']] - ], - [ - [1, normalizeTagName('P'), [ - [[0], 1, 'Hi'], - [[1], 1, ' Guy'], - [[0], 1, ' other guy'] - ]] - ] - ] - }); - -}); - - -test('renders a post with image', (assert) => { - let url = "data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs="; - let post = builder.createPost(); - let section = builder.createImageSection(url); - post.sections.append(section); - - let mobiledoc = render(post); - assert.deepEqual(mobiledoc, { - version: MOBILEDOC_VERSION, - sections: [ - [], - [ - [2, url] - ] - ] - }); -}); - -test('renders a post with image and null src', (assert) => { - let post = builder.createPost(); - let section = builder.createImageSection(); - post.sections.append(section); - - let mobiledoc = render(post); - assert.deepEqual(mobiledoc, { - version: MOBILEDOC_VERSION, - sections: [ - [], - [ - [2, null] - ] - ] - }); -}); - -test('renders a post with card', (assert) => { - let cardName = 'super-card'; - let payload = { bar: 'baz' }; - let post = builder.createPost(); - let section = builder.createCardSection(cardName, payload); - post.sections.append(section); - - let mobiledoc = render(post); - assert.deepEqual(mobiledoc, { - version: MOBILEDOC_VERSION, - sections: [ - [], - [ - [10, cardName, payload] - ] - ] - }); -}); - -test('renders a post with a list', (assert) => { - const items = [ - builder.createListItem([builder.createMarker('first item')]), - builder.createListItem([builder.createMarker('second item')]) - ]; - const section = builder.createListSection('ul', items); - const post = builder.createPost([section]); - - const mobiledoc = render(post); - assert.deepEqual(mobiledoc, { - version: MOBILEDOC_VERSION, - sections: [ - [], - [ - [3, 'ul', [ - [[[], 0, 'first item']], - [[[], 0, 'second item']] - ]] - ] - ] - }); -}); - -test('renders a pull-quote as markup section', (assert) => { - const post = Helpers.postAbstract.build(({post, markupSection, marker}) => { - return post([markupSection('pull-quote', [marker('abc')])]); - }); - const mobiledoc = render(post); - assert.deepEqual(mobiledoc, { - version: MOBILEDOC_VERSION, - sections: [ - [], - [ - [1, 'pull-quote', [[[], 0, 'abc']]] - ] - ] - }); -}); diff --git a/tests/unit/renderers/mobiledoc/0-2-test.js b/tests/unit/renderers/mobiledoc/0-2-test.js new file mode 100644 index 000000000..cfa06a272 --- /dev/null +++ b/tests/unit/renderers/mobiledoc/0-2-test.js @@ -0,0 +1,192 @@ +import MobiledocRenderer, { MOBILEDOC_VERSION } from 'mobiledoc-kit/renderers/mobiledoc/0-2'; +import PostNodeBuilder from 'mobiledoc-kit/models/post-node-builder'; +import { normalizeTagName } from 'mobiledoc-kit/utils/dom-utils'; +import Helpers from '../../../test-helpers'; + +const { module, test } = Helpers; +function render(post) { + return MobiledocRenderer.render(post); +} +let builder; + +module('Unit: Mobiledoc Renderer 0.2', { + beforeEach() { + builder = new PostNodeBuilder(); + } +}); + +test('renders a blank post', (assert) => { + let post = builder.createPost(); + let mobiledoc = render(post); + assert.deepEqual(mobiledoc, { + version: MOBILEDOC_VERSION, + sections: [[], []] + }); +}); + +test('renders a post with marker', (assert) => { + const post = Helpers.postAbstract.build(({post, markupSection, marker, markup}) => { + return post([ + markupSection('p', [marker('Hi', [markup('strong')])]) + ]); + }); + const mobiledoc = render(post); + assert.deepEqual(mobiledoc, { + version: MOBILEDOC_VERSION, + sections: [ + [['strong']], + [ + [1, normalizeTagName('P'), [[[0], 1, 'Hi']]] + ] + ] + }); +}); + +test('renders a post section with markers sharing a markup', (assert) => { + const post = Helpers.postAbstract.build(({post, markupSection, marker, markup}) => { + const strong = markup('strong'); + return post([ + markupSection('p', [marker('Hi', [strong]), marker(' Guy', [strong])]) + ]); + }); + let mobiledoc = render(post); + assert.deepEqual(mobiledoc, { + version: MOBILEDOC_VERSION, + sections: [ + [['strong']], + [ + [1, normalizeTagName('P'), [ + [[0], 0, 'Hi'], + [[], 1, ' Guy'] + ]] + ] + ] + }); +}); + +test('renders a post with markers with markers with complex attributes', (assert) => { + let link1,link2; + const post = Helpers.postAbstract.build(({post, markupSection, marker, markup}) => { + link1 = markup('a', {href:'bustle.com'}); + link2 = markup('a', {href:'other.com'}); + return post([ + markupSection('p', [ + marker('Hi', [link1]), + marker(' Guy', [link2]), + marker(' other guy', [link1]) + ]) + ]); + }); + let mobiledoc = render(post); + assert.deepEqual(mobiledoc, { + version: MOBILEDOC_VERSION, + sections: [ + [ + ['a', ['href', 'bustle.com']], + ['a', ['href', 'other.com']] + ], + [ + [1, normalizeTagName('P'), [ + [[0], 1, 'Hi'], + [[1], 1, ' Guy'], + [[0], 1, ' other guy'] + ]] + ] + ] + }); + +}); + + +test('renders a post with image', (assert) => { + let url = "data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs="; + let post = builder.createPost(); + let section = builder.createImageSection(url); + post.sections.append(section); + + let mobiledoc = render(post); + assert.deepEqual(mobiledoc, { + version: MOBILEDOC_VERSION, + sections: [ + [], + [ + [2, url] + ] + ] + }); +}); + +test('renders a post with image and null src', (assert) => { + let post = builder.createPost(); + let section = builder.createImageSection(); + post.sections.append(section); + + let mobiledoc = render(post); + assert.deepEqual(mobiledoc, { + version: MOBILEDOC_VERSION, + sections: [ + [], + [ + [2, null] + ] + ] + }); +}); + +test('renders a post with card', (assert) => { + let cardName = 'super-card'; + let payload = { bar: 'baz' }; + let post = builder.createPost(); + let section = builder.createCardSection(cardName, payload); + post.sections.append(section); + + let mobiledoc = render(post); + assert.deepEqual(mobiledoc, { + version: MOBILEDOC_VERSION, + sections: [ + [], + [ + [10, cardName, payload] + ] + ] + }); +}); + +test('renders a post with a list', (assert) => { + const items = [ + builder.createListItem([builder.createMarker('first item')]), + builder.createListItem([builder.createMarker('second item')]) + ]; + const section = builder.createListSection('ul', items); + const post = builder.createPost([section]); + + const mobiledoc = render(post); + assert.deepEqual(mobiledoc, { + version: MOBILEDOC_VERSION, + sections: [ + [], + [ + [3, 'ul', [ + [[[], 0, 'first item']], + [[[], 0, 'second item']] + ]] + ] + ] + }); +}); + +test('renders a pull-quote as markup section', (assert) => { + const post = Helpers.postAbstract.build(({post, markupSection, marker}) => { + return post([markupSection('pull-quote', [marker('abc')])]); + }); + const mobiledoc = render(post); + assert.deepEqual(mobiledoc, { + version: MOBILEDOC_VERSION, + sections: [ + [], + [ + [1, 'pull-quote', [[[], 0, 'abc']]] + ] + ] + }); +});