diff options
author | Soreine <nicolas@gitbook.com> | 2016-05-03 16:02:58 +0200 |
---|---|---|
committer | Soreine <nicolas@gitbook.com> | 2016-05-03 16:02:58 +0200 |
commit | 3fc90554f5e7e6ff2fb4f023319799e1e8f81454 (patch) | |
tree | dc34d87ba50d004c9fac610a370432ae340ad498 /lib/modifiers | |
parent | 4ebe28faaebb8752107ef6cfa6253f7b6f8a2a86 (diff) | |
download | gitbook-3fc90554f5e7e6ff2fb4f023319799e1e8f81454.zip gitbook-3fc90554f5e7e6ff2fb4f023319799e1e8f81454.tar.gz gitbook-3fc90554f5e7e6ff2fb4f023319799e1e8f81454.tar.bz2 |
Add tests, and fixes.
Diffstat (limited to 'lib/modifiers')
-rw-r--r-- | lib/modifiers/summary/__tests__/mergeAtLevel.js | 45 | ||||
-rw-r--r-- | lib/modifiers/summary/__tests__/moveArticle.js | 68 | ||||
-rw-r--r-- | lib/modifiers/summary/editArticleTitle.js | 4 | ||||
-rw-r--r-- | lib/modifiers/summary/editPartTitle.js | 1 | ||||
-rw-r--r-- | lib/modifiers/summary/insertArticle.js | 22 | ||||
-rw-r--r-- | lib/modifiers/summary/mergeAtLevel.js (renamed from lib/modifiers/summary/editArticle.js) | 37 | ||||
-rw-r--r-- | lib/modifiers/summary/moveArticle.js | 4 | ||||
-rw-r--r-- | lib/modifiers/summary/removeArticle.js | 11 |
8 files changed, 158 insertions, 34 deletions
diff --git a/lib/modifiers/summary/__tests__/mergeAtLevel.js b/lib/modifiers/summary/__tests__/mergeAtLevel.js new file mode 100644 index 0000000..e2635ec --- /dev/null +++ b/lib/modifiers/summary/__tests__/mergeAtLevel.js @@ -0,0 +1,45 @@ +var Immutable = require('immutable'); +var Summary = require('../../../models/summary'); +var File = require('../../../models/file'); + +describe('mergeAtLevel', function() { + var mergeAtLevel = require('../mergeAtLevel'); + var summary = Summary.createFromParts(File(), [ + { + articles: [ + { + title: '1.1', + path: '1.1' + }, + { + title: '1.2', + path: '1.2' + } + ] + }, + { + title: 'Part I', + articles: [] + } + ]); + + it('should edit a part', function() { + var beforeChildren = summary.getByLevel('1').getArticles(); + var newSummary = mergeAtLevel(summary, '1', {title: 'Part O'}); + var edited = newSummary.getByLevel('1'); + + expect(edited.getTitle()).toBe('Part O'); + // Same children + expect(Immutable.is(beforeChildren, edited.getArticles())).toBe(true); + }); + + it('should edit a part', function() { + var beforePath = summary.getByLevel('1.2').getPath(); + var newSummary = mergeAtLevel(summary, '1.2', {title: 'Renamed article'}); + var edited = newSummary.getByLevel('1.2'); + + expect(edited.getTitle()).toBe('Renamed article'); + // Same children + expect(Immutable.is(beforePath, edited.getPath())).toBe(true); + }); +}); diff --git a/lib/modifiers/summary/__tests__/moveArticle.js b/lib/modifiers/summary/__tests__/moveArticle.js new file mode 100644 index 0000000..9a101f6 --- /dev/null +++ b/lib/modifiers/summary/__tests__/moveArticle.js @@ -0,0 +1,68 @@ +var Immutable = require('immutable'); +var Summary = require('../../../models/summary'); +var File = require('../../../models/file'); + +describe('moveArticle', function() { + var moveArticle = require('../moveArticle'); + var summary = Summary.createFromParts(File(), [ + { + articles: [ + { + title: '1.1', + path: '1.1' + }, + { + title: '1.2', + path: '1.2' + } + ] + }, + { + title: 'Part I', + articles: [ + { + title: '2.1', + path: '2.1', + articles: [ + { + title: '2.1.1', + path: '2.1.1' + }, + { + title: '2.1.2', + path: '2.1.2' + } + ] + }, + { + title: '2.2', + path: '2.2' + } + ] + } + ]); + + it('should move an article at in place', function() { + var newSummary = moveArticle(summary, '2.1', '2.1'); + + expect(Immutable.is(summary, newSummary)).toBe(true); + }); + + it('should move an article to an previous level', function() { + var newSummary = moveArticle(summary, '2.2', '2.1'); + var moved = newSummary.getByLevel('2.1'); + var other = newSummary.getByLevel('2.2'); + + expect(moved.getTitle()).toBe('2.2'); + expect(other.getTitle()).toBe('2.1'); + }); + + it('should move an article to a next level', function() { + var newSummary = moveArticle(summary, '2.1', '2.2'); + var moved = newSummary.getByLevel('2.1'); + var other = newSummary.getByLevel('2.2'); + + expect(moved.getTitle()).toBe('2.2'); + expect(other.getTitle()).toBe('2.1'); + }); +}); diff --git a/lib/modifiers/summary/editArticleTitle.js b/lib/modifiers/summary/editArticleTitle.js index bd9b6f2..4edee83 100644 --- a/lib/modifiers/summary/editArticleTitle.js +++ b/lib/modifiers/summary/editArticleTitle.js @@ -1,4 +1,4 @@ -var editArticle = require('./editArticle'); +var mergeAtLevel = require('./mergeAtLevel'); /** Edit title of an article @@ -9,7 +9,7 @@ var editArticle = require('./editArticle'); @return {Summary} */ function editArticleTitle(summary, level, newTitle) { - return editArticle(summary, level, { + return mergeAtLevel(summary, level, { title: newTitle }); } diff --git a/lib/modifiers/summary/editPartTitle.js b/lib/modifiers/summary/editPartTitle.js index 472399b..b79ac1e 100644 --- a/lib/modifiers/summary/editPartTitle.js +++ b/lib/modifiers/summary/editPartTitle.js @@ -1,4 +1,3 @@ - /** Edit title of a part in the summary diff --git a/lib/modifiers/summary/insertArticle.js b/lib/modifiers/summary/insertArticle.js index 0a010b4..849f39e 100644 --- a/lib/modifiers/summary/insertArticle.js +++ b/lib/modifiers/summary/insertArticle.js @@ -1,6 +1,6 @@ var is = require('is'); var SummaryArticle = require('../../models/summaryArticle'); -var editArticle = require('./editArticle'); +var mergeAtLevel = require('./mergeAtLevel'); var indexArticleLevels = require('./indexArticleLevels'); /** @@ -23,12 +23,7 @@ function insertArticle(summary, level, article) { // Find the index to insert at var articles = parent.getArticles(); - var index = articles.findIndex(function(art) { - return art.getLevel() === level; - }); - if (!index) { - return summary; - } + var index = getLeafIndex(level); // Insert the article at the right index articles = articles.insert(index, article); @@ -37,7 +32,18 @@ function insertArticle(summary, level, article) { parent = parent.set('articles', articles); parent = indexArticleLevels(parent); - return editArticle(summary, parent.getLevel(), parent); + return mergeAtLevel(summary, parent.getLevel(), parent); +} + +/** + @param {String} + @return {Number} The index of this level within its parent's children + */ +function getLeafIndex(level) { + var arr = level.split('.').map(function (char) { + return parseInt(char, 10); + }); + return arr[arr.length - 1] - 1; } module.exports = insertArticle; diff --git a/lib/modifiers/summary/editArticle.js b/lib/modifiers/summary/mergeAtLevel.js index 1625398..9a95ffc 100644 --- a/lib/modifiers/summary/editArticle.js +++ b/lib/modifiers/summary/mergeAtLevel.js @@ -11,16 +11,17 @@ function editArticleInList(articles, level, newArticle) { return articles.map(function(article) { var articleLevel = article.getLevel(); - if (articleLevel == level) { + if (articleLevel === level) { + // it is the article to edit return article.merge(newArticle); - } - - if (level.indexOf(articleLevel) === 0) { + } else if (level.indexOf(articleLevel) === 0) { + // it is a parent var articles = editArticleInList(article.getArticles(), level, newArticle); return article.set('articles', articles); + } else { + // This is not the article you are looking for + return article; } - - return article; }); } @@ -35,36 +36,40 @@ function editArticleInList(articles, level, newArticle) { */ function editArticleInPart(part, level, newArticle) { var articles = part.getArticles(); - articles = editArticleInList(articles); + articles = editArticleInList(articles, level, newArticle); return part.set('articles', articles); } /** - Edit an article in a summary + Edit an article, or a part, in a summary. Does a shallow merge. @param {Summary} summary @param {String} level - @param {Article} newArticle + @param {Article|Part} newValue @return {Summary} */ -function editArticle(summary, level, newArticle) { - var parts = summary.getParts(); - +function mergeAtLevel(summary, level, newValue) { var levelParts = level.split('.'); - var partIndex = Number(levelParts[0]); + var partIndex = Number(levelParts[0]) -1; + var parts = summary.getParts(); var part = parts.get(partIndex); if (!part) { return summary; } - part = editArticleInPart(part, level, newArticle); - parts = parts.set(partIndex, part); + var isEditingPart = levelParts.length < 2; + if (isEditingPart) { + part = part.merge(newValue); + } else { + part = editArticleInPart(part, level, newValue); + } + parts = parts.set(partIndex, part); return summary.set('parts', parts); } -module.exports = editArticle; +module.exports = mergeAtLevel; diff --git a/lib/modifiers/summary/moveArticle.js b/lib/modifiers/summary/moveArticle.js index 9819245..06d82ca 100644 --- a/lib/modifiers/summary/moveArticle.js +++ b/lib/modifiers/summary/moveArticle.js @@ -46,8 +46,8 @@ function shiftLevel(removedLevel, level) { var removedRoot = removedLevel[0]; var root = level[0]; - var removedRest = removedLevel.unshift(); - var rest = level.unshift(); + var removedRest = removedLevel.slice(1); + var rest = level.slice(1); if (removedRoot < root) { // It will shift levels at this point. The rest is unchanged. diff --git a/lib/modifiers/summary/removeArticle.js b/lib/modifiers/summary/removeArticle.js index 4cb848a..8a30d0a 100644 --- a/lib/modifiers/summary/removeArticle.js +++ b/lib/modifiers/summary/removeArticle.js @@ -1,5 +1,5 @@ var is = require('is'); -var editArticle = require('./editArticle'); +var mergeAtLevel = require('./mergeAtLevel'); var indexArticleLevels = require('./indexArticleLevels'); /** @@ -13,24 +13,25 @@ function removeArticle(summary, level) { // Coerce to level level = is.string(level)? level : level.getLevel(); - var parent = summary.getParent(summary, level); + var parent = summary.getParent(level); + var articles = parent.getArticles(); // Find the index to remove var index = articles.findIndex(function(art) { return art.getLevel() === level; }); - if (!index) { + if (index === -1) { return summary; } // Remove from children - var articles = parent.getArticles().remove(index); + articles = articles.remove(index); parent = parent.set('articles', articles); // Reindex the level from here parent = indexArticleLevels(parent); - return editArticle(summary, parent.getLevel(), parent); + return mergeAtLevel(summary, parent.getLevel(), parent); } module.exports = removeArticle; |