react-transclusion
Version:
Render arbitrary components into outlets for use in dynamic layouts.
144 lines (115 loc) • 3.63 kB
JavaScript
const jsdom = require('jsdom');
const React = require('react');
const { PropTypes } = React;
const { render, unmountComponentAtNode } = require('react-dom');
const UnboundOutlet = require('../Outlet');
const createOutletManager = require('../OutletManager');
const { drill } = require('react-drill');
const { assert } = require('chai');
describe('Outlet', function() {
let dom, window, document, container;
let outletManager;
const Outlet = React.createClass({
childContextTypes: {
outletManager: PropTypes.object
},
getChildContext() {
return { outletManager }
},
render() {
return <UnboundOutlet {...this.props} />
}
})
beforeEach(function setupDOMAndSubjects() {
dom = jsdom.jsdom();
window = dom.defaultView;
document = window.document;
container = document.createElement('div');
global.window = window;
global.document = document;
outletManager = createOutletManager({ strict: false });
});
afterEach(function() {
outletManager = null;
delete global.document;
delete global.window;
unmountComponentAtNode(container);
container.remove();
container = null;
document = null;
window = null;
dom = null;
});
it('renders elements', function() {
addToOutlet('foo', <div>Hello World!</div>);
const subject = render((
<Outlet name="foo" />
), container);
assert.equal(drill(subject).node.textContent, "Hello World!");
});
it('renders an empty tag if there are no elements and no children', function() {
const subject = render((
<Outlet name="foo" />
), container);
assert.equal(drill(subject).node.textContent, "");
});
it('renders children if there are no elements', function() {
const subject = render((
<Outlet name="foo">
<span>Hello World!</span>
</Outlet>
), container);
assert.equal(drill(subject).node.textContent, "Hello World!");
});
it('does not render children if there are any elements', function() {
addToOutlet('foo', <span>Hello!</span>);
const subject = render((
<Outlet name="foo">
<span> World!</span>
</Outlet>
), container);
assert.equal(drill(subject).node.textContent, "Hello!");
});
context('when @alwaysRenderChildren is truthy...', function() {
it('renders children even if there are elements', function() {
addToOutlet('foo', <span>Hello</span>);
const subject = render((
<Outlet name="foo" alwaysRenderChildren>
<span> World!</span>
</Outlet>
), container);
assert.equal(drill(subject).node.textContent, "Hello World!");
});
});
it('accepts a custom @tagName', function() {
const subject = render(<Outlet name="foo" tagName="ul" />, container);
assert.equal(drill(subject).node.tagName, "UL");
});
it('passes down custom outlet options', function() {
outletManager.add('foo', {
key: 'my-test-fu',
component: React.createClass({
propTypes: {
$outletOptions: React.PropTypes.shape({
foo: React.PropTypes.string
})
},
render() {
return <span>{this.props.$outletOptions.foo}</span>;
}
})
});
const subject = render(<Outlet name="foo" options={{ foo: 'bar' }} />, container);
assert.equal(drill(subject).node.textContent, "bar");
});
function addToOutlet(name, contents) {
outletManager.add(name, {
key: 'my-test-fu',
component: React.createClass({
render() {
return contents;
}
}),
});
}
});