/*jshint newcap: false */ /*global describe, it, before */ 'use strict'; var expect = require('expect.js'), React = require('react'), ReactDOMServer = require('react-dom/server'), createReactClass = require('create-react-class'), DocumentTitle = require('../'); describe('DocumentTitle', function () { before(function () { DocumentTitle.canUseDOM = false; }); it('has a displayName', function () { var el = React.createElement(DocumentTitle); expect(el.type.displayName).to.be.a('string'); expect(el.type.displayName).not.to.be.empty(); expect(el.type.displayName).to.equal('SideEffect(DocumentTitle)'); }); it('hides itself from the DOM', function () { var Component = createReactClass({ render: function () { return React.createElement(DocumentTitle, {title: 'irrelevant'}, React.createElement('div', null, 'hello') ); } }); var markup = ReactDOMServer.renderToStaticMarkup(React.createElement(Component)); expect(markup).to.equal('
hello
'); }); it('throws an error if it has multiple children', function (done) { var Component = createReactClass({ render: function () { return React.createElement(DocumentTitle, {title: 'irrelevant'}, React.createElement('div', null, 'hello'), React.createElement('div', null, 'world') ); } }); expect(function () { ReactDOMServer.renderToStaticMarkup(React.createElement(Component)); }).to.throwException(function (e) { expect(e.message).to.match(/React.Children.only expected/); done(); }); }); it('works with complex children', function () { var Component1 = createReactClass({ render: function() { return React.createElement('p', null, React.createElement('span', null, 'c'), React.createElement('span', null, 'd') ); } }); var Component2 = createReactClass({ render: function () { return React.createElement(DocumentTitle, {title: 'irrelevant'}, React.createElement('div', null, React.createElement('div', null, 'a'), React.createElement('div', null, 'b'), React.createElement('div', null, React.createElement(Component1)) ) ); } }); var markup = ReactDOMServer.renderToStaticMarkup(React.createElement(Component2)); expect(markup).to.equal( '
' + '
a
' + '
b
' + '
' + '

' + 'c' + 'd' + '

' + '
' + '
' ); }); }); describe('DocumentTitle.rewind', function () { it('clears the mounted instances', function () { ReactDOMServer.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); }); it('returns the latest document title', function () { var title = 'cheese'; ReactDOMServer.renderToStaticMarkup( React.createElement(DocumentTitle, {title: 'a'}, React.createElement(DocumentTitle, {title: 'b'}, React.createElement(DocumentTitle, {title: title})) ) ); expect(DocumentTitle.rewind()).to.equal(title); }); it('returns undefined if no mounted instances exist', function () { ReactDOMServer.renderToStaticMarkup( React.createElement(DocumentTitle, {title: 'a'}, React.createElement(DocumentTitle, {title: 'b'}, React.createElement(DocumentTitle, {title: 'c'})) ) ); DocumentTitle.rewind(); expect(DocumentTitle.peek()).to.equal(undefined); }); });