arkit
Version:
Visualises JavaScript, TypeScript and Flow codebases as meaningful and committable architecture diagrams
173 lines (151 loc) • 4.62 kB
JavaScript
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @emails react-core
*/
;
describe('ReactDOMOption', () => {
let React;
let ReactDOM;
let ReactTestUtils;
beforeEach(() => {
jest.resetModules();
React = require('react');
ReactDOM = require('react-dom');
ReactTestUtils = require('react-dom/test-utils');
});
it('should flatten children to a string', () => {
let stub = (
<option>
{1} {'foo'}
</option>
);
const node = ReactTestUtils.renderIntoDocument(stub);
expect(node.innerHTML).toBe('1 foo');
});
it('should ignore and warn invalid children types', () => {
const el = (
<option>
{1} <div /> {2}
</option>
);
let node;
expect(() => {
node = ReactTestUtils.renderIntoDocument(el);
}).toWarnDev(
'Only strings and numbers are supported as <option> children.\n' +
' in option (at **)',
);
expect(node.innerHTML).toBe('1 [object Object] 2');
ReactTestUtils.renderIntoDocument(el);
});
it('should ignore null/undefined/false children without warning', () => {
let stub = (
<option>
{1} {false}
{true}
{null}
{undefined} {2}
</option>
);
const node = ReactTestUtils.renderIntoDocument(stub);
expect(node.innerHTML).toBe('1 2');
});
it('should throw on object children', () => {
expect(() => {
ReactTestUtils.renderIntoDocument(<option>{{}}</option>);
}).toThrow('Objects are not valid as a React child');
expect(() => {
ReactTestUtils.renderIntoDocument(<option>{[{}]}</option>);
}).toThrow('Objects are not valid as a React child');
expect(() => {
ReactTestUtils.renderIntoDocument(
<option>
{{}}
<span />
</option>,
);
}).toThrow('Objects are not valid as a React child');
expect(() => {
ReactTestUtils.renderIntoDocument(
<option>
{'1'}
{{}}
{2}
</option>,
);
}).toThrow('Objects are not valid as a React child');
});
it('should support element-ish child', () => {
// This is similar to <fbt>.
// It's important that we toString it.
let obj = {
$$typeof: Symbol.for('react.element'),
type: props => props.content,
ref: null,
key: null,
props: {
content: 'hello',
},
toString() {
return this.props.content;
},
};
let node = ReactTestUtils.renderIntoDocument(<option>{obj}</option>);
expect(node.innerHTML).toBe('hello');
node = ReactTestUtils.renderIntoDocument(<option>{[obj]}</option>);
expect(node.innerHTML).toBe('hello');
expect(() => {
node = ReactTestUtils.renderIntoDocument(
<option>
{obj}
<span />
</option>,
);
}).toWarnDev(
'Only strings and numbers are supported as <option> children.',
);
expect(node.innerHTML).toBe('hello[object Object]');
node = ReactTestUtils.renderIntoDocument(
<option>
{'1'}
{obj}
{2}
</option>,
);
expect(node.innerHTML).toBe('1hello2');
});
it('should be able to use dangerouslySetInnerHTML on option', () => {
let stub = <option dangerouslySetInnerHTML={{__html: 'foobar'}} />;
const node = ReactTestUtils.renderIntoDocument(stub);
expect(node.innerHTML).toBe('foobar');
});
it('should set attribute for empty value', () => {
const container = document.createElement('div');
const option = ReactDOM.render(<option value="" />, container);
expect(option.hasAttribute('value')).toBe(true);
expect(option.getAttribute('value')).toBe('');
ReactDOM.render(<option value="lava" />, container);
expect(option.hasAttribute('value')).toBe(true);
expect(option.getAttribute('value')).toBe('lava');
});
it('should allow ignoring `value` on option', () => {
const a = 'a';
let stub = (
<select value="giraffe" onChange={() => {}}>
<option>monkey</option>
<option>gir{a}ffe</option>
<option>gorill{a}</option>
</select>
);
const options = stub.props.children;
const container = document.createElement('div');
const node = ReactDOM.render(stub, container);
expect(node.selectedIndex).toBe(1);
ReactDOM.render(<select value="gorilla">{options}</select>, container);
expect(node.selectedIndex).toEqual(2);
});
});