From c8810486d07cc417879e2ff449a13f35c586b667 Mon Sep 17 00:00:00 2001 From: "Chris J. Shull" Date: Mon, 13 Mar 2017 18:00:19 -0700 Subject: [PATCH 1/2] Increase flexibility --- index.js | 19 ++++++++++--------- test/browser.js | 16 +++++++++++----- test/common.js | 35 +++++++++++++++++++---------------- 3 files changed, 40 insertions(+), 30 deletions(-) diff --git a/index.js b/index.js index 857a506..4dd5bd0 100644 --- a/index.js +++ b/index.js @@ -1,13 +1,10 @@ 'use strict'; -var React = require('react'), - withSideEffect = require('react-side-effect'); +var React = require('react'); +var withSideEffect = require('react-side-effect'); function reducePropsToState(propsList) { - var innermostProps = propsList[propsList.length - 1]; - if (innermostProps) { - return innermostProps.title; - } + return DocumentTitle.join(propsList.map(e => e.title)); } function handleStateChangeOnClient(title) { @@ -17,7 +14,7 @@ function handleStateChangeOnClient(title) { } } -var DocumentTitle = React.createClass({ +var DocumentTitleBase = React.createClass({ displayName: 'DocumentTitle', propTypes: { @@ -33,7 +30,11 @@ var DocumentTitle = React.createClass({ } }); -module.exports = withSideEffect( +var DocumentTitle = module.exports = withSideEffect( reducePropsToState, handleStateChangeOnClient -)(DocumentTitle); +)(DocumentTitleBase); + +DocumentTitle.join = function (tokens) { + return tokens.pop(); +}; diff --git a/test/browser.js b/test/browser.js index 5c4aa7e..2ea48d3 100644 --- a/test/browser.js +++ b/test/browser.js @@ -6,10 +6,6 @@ var expect = require('expect.js'), DocumentTitle = require('../'); describe('DocumentTitle (in a browser)', function () { - afterEach(function () { - React.unmountComponentAtNode(global.document.body); - delete global.document.title; - }); before(function () { // Prepare the globals React expects in a browser global.window = require('global/window'); @@ -18,13 +14,23 @@ describe('DocumentTitle (in a browser)', function () { global.window.location = {}; global.window.navigator = {userAgent: 'Chrome'}; console.debug = console.log; - DocumentTitle.canUseDOM = true; }); after(function () { delete global.window; delete global.document; delete console.debug; }); + + beforeEach(function () { + DocumentTitle.canUseDOM = true; + }); + afterEach(function () { + React.unmountComponentAtNode(global.document.body); + delete global.document.title; + DocumentTitle.canUseDOM = false; + DocumentTitle.rewind(); + }); + it('changes the document title on mount', function (done) { var title = 'hello world'; var Component = React.createClass({ diff --git a/test/common.js b/test/common.js index e3ec319..9594146 100644 --- a/test/common.js +++ b/test/common.js @@ -10,6 +10,10 @@ describe('DocumentTitle', function () { DocumentTitle.canUseDOM = false; }); + after(function () { + DocumentTitle.rewind(); + }); + it('has a displayName', function () { var el = React.createElement(DocumentTitle); expect(el.type.displayName).to.be.a('string'); @@ -79,33 +83,32 @@ describe('DocumentTitle', function () { }); }); -describe('DocumentTitle.rewind', function () { - it('clears the mounted instances', function () { - React.renderToStaticMarkup( - React.createElement(DocumentTitle, {title: 'a'}, - React.createElement(DocumentTitle, {title: 'b'}, React.createElement(DocumentTitle, {title: 'c'})) - ) - ); - expect(DocumentTitle.peek()).to.equal('c'); - DocumentTitle.rewind(); - expect(DocumentTitle.peek()).to.equal(undefined); +describe('DocumentTitle.join', function () { // tested via DocumentTitle.rewind + var origJoin = DocumentTitle.join; + afterEach(function () { + DocumentTitle.join = origJoin; }); - it('returns the latest document title', function () { + + it('returns the last document title by default', function () { var title = 'cheese'; React.renderToStaticMarkup( React.createElement(DocumentTitle, {title: 'a'}, React.createElement(DocumentTitle, {title: 'b'}, React.createElement(DocumentTitle, {title: title})) ) ); - expect(DocumentTitle.rewind()).to.equal(title); + expect(DocumentTitle.rewind()).to.equal('cheese'); }); - it('returns undefined if no mounted instances exist', function () { + + it('can be overriden for custom behavior, using all the tokens', function () { + var title = 'cheese'; + DocumentTitle.join = function (tokens) { + return tokens.join(' | '); + }; React.renderToStaticMarkup( React.createElement(DocumentTitle, {title: 'a'}, - React.createElement(DocumentTitle, {title: 'b'}, React.createElement(DocumentTitle, {title: 'c'})) + React.createElement(DocumentTitle, {title: 'b'}, React.createElement(DocumentTitle, {title: title})) ) ); - DocumentTitle.rewind(); - expect(DocumentTitle.peek()).to.equal(undefined); + expect(DocumentTitle.rewind()).to.equal('a | b | cheese'); }); }); From 05d019220478cd7d4eee95a382f7760846e8ef20 Mon Sep 17 00:00:00 2001 From: chrisjshull Date: Wed, 15 Mar 2017 19:57:55 -0700 Subject: [PATCH 2/2] ES5-ify --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 4dd5bd0..f51d7a0 100644 --- a/index.js +++ b/index.js @@ -4,7 +4,7 @@ var React = require('react'); var withSideEffect = require('react-side-effect'); function reducePropsToState(propsList) { - return DocumentTitle.join(propsList.map(e => e.title)); + return DocumentTitle.join(propsList.map(function (e) { return e.title; })); } function handleStateChangeOnClient(title) {