/** * Copyright (c) 2013-present, Facebook, Inc. * * 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 */ 'use strict'; describe('ReactDOMSelect', () => { var React; var ReactDOM; var ReactDOMServer; var ReactTestUtils; var noop = function() {}; beforeEach(() => { jest.resetModules(); React = require('react'); ReactDOM = require('react-dom'); ReactDOMServer = require('react-dom/server'); ReactTestUtils = require('react-dom/test-utils'); }); it('should allow setting `defaultValue`', () => { var stub = ( ); var options = stub.props.children; var container = document.createElement('div'); stub = ReactDOM.render(stub, container); var node = ReactDOM.findDOMNode(stub); expect(node.value).toBe('giraffe'); // Changing `defaultValue` should do nothing. ReactDOM.render( , container, ); expect(node.value).toEqual('giraffe'); }); it('should not throw with `defaultValue` and without children', () => { var stub = ); var container = document.createElement('div'); var stub = ReactDOM.render(el, container); var node = ReactDOM.findDOMNode(stub); expect(node.value).toBe('giraffe'); node.value = 'monkey'; ReactDOM.render(el, container); // Uncontrolled selects shouldn't change the value after first mounting expect(node.value).toEqual('monkey'); }); it('should allow setting `defaultValue` with multiple', () => { var stub = ( ); var options = stub.props.children; var container = document.createElement('div'); stub = ReactDOM.render(stub, container); var node = ReactDOM.findDOMNode(stub); expect(node.options[0].selected).toBe(false); // monkey expect(node.options[1].selected).toBe(true); // giraffe expect(node.options[2].selected).toBe(true); // gorilla // Changing `defaultValue` should do nothing. ReactDOM.render( , container, ); expect(node.options[0].selected).toBe(false); // monkey expect(node.options[1].selected).toBe(true); // giraffe expect(node.options[2].selected).toBe(true); // gorilla }); it('should allow setting `value`', () => { var stub = ( ); var options = stub.props.children; var container = document.createElement('div'); stub = ReactDOM.render(stub, container); var node = ReactDOM.findDOMNode(stub); expect(node.value).toBe('giraffe'); // Changing the `value` prop should change the selected option. ReactDOM.render( , container, ); expect(node.value).toEqual('gorilla'); }); it('should default to the first non-disabled option', () => { var stub = ( ); var container = document.createElement('div'); stub = ReactDOM.render(stub, container); var node = ReactDOM.findDOMNode(stub); expect(node.options[0].selected).toBe(false); expect(node.options[2].selected).toBe(true); }); it('should allow setting `value` to __proto__', () => { var stub = ( ); var options = stub.props.children; var container = document.createElement('div'); stub = ReactDOM.render(stub, container); var node = ReactDOM.findDOMNode(stub); expect(node.value).toBe('__proto__'); // Changing the `value` prop should change the selected option. ReactDOM.render( , container, ); expect(node.value).toEqual('gorilla'); }); it('should not throw with `value` and without children', () => { var stub = ); var options = stub.props.children; var container = document.createElement('div'); stub = ReactDOM.render(stub, container); var node = ReactDOM.findDOMNode(stub); expect(node.options[0].selected).toBe(false); // monkey expect(node.options[1].selected).toBe(true); // giraffe expect(node.options[2].selected).toBe(true); // gorilla // Changing the `value` prop should change the selected options. ReactDOM.render( , container, ); expect(node.options[0].selected).toBe(true); // monkey expect(node.options[1].selected).toBe(false); // giraffe expect(node.options[2].selected).toBe(false); // gorilla }); it('should allow setting `value` to __proto__ with multiple', () => { var stub = ( ); var options = stub.props.children; var container = document.createElement('div'); stub = ReactDOM.render(stub, container); var node = ReactDOM.findDOMNode(stub); expect(node.options[0].selected).toBe(false); // monkey expect(node.options[1].selected).toBe(true); // __proto__ expect(node.options[2].selected).toBe(true); // gorilla // Changing the `value` prop should change the selected options. ReactDOM.render( , container, ); expect(node.options[0].selected).toBe(true); // monkey expect(node.options[1].selected).toBe(false); // __proto__ expect(node.options[2].selected).toBe(false); // gorilla }); it('should not select other options automatically', () => { var stub = ( ); stub = ReactTestUtils.renderIntoDocument(stub); var node = ReactDOM.findDOMNode(stub); expect(node.options[0].selected).toBe(false); // one expect(node.options[1].selected).toBe(false); // two expect(node.options[2].selected).toBe(true); // twelve }); it('should reset child options selected when they are changed and `value` is set', () => { var stub = , container, ); var node = ReactDOM.findDOMNode(stub); expect(node.options[0].selected).toBe(true); // a expect(node.options[1].selected).toBe(true); // b expect(node.options[2].selected).toBe(false); // c }); it('should allow setting `value` with `objectToString`', () => { var objectToString = { animal: 'giraffe', toString: function() { return this.animal; }, }; var el = ( ); var container = document.createElement('div'); var stub = ReactDOM.render(el, container); var node = ReactDOM.findDOMNode(stub); expect(node.options[0].selected).toBe(false); // monkey expect(node.options[1].selected).toBe(true); // giraffe expect(node.options[2].selected).toBe(false); // gorilla // Changing the `value` prop should change the selected options. objectToString.animal = 'monkey'; var el2 = ( ); ReactDOM.render(el2, container); expect(node.options[0].selected).toBe(true); // monkey expect(node.options[1].selected).toBe(false); // giraffe expect(node.options[2].selected).toBe(false); // gorilla }); it('should allow switching to multiple', () => { var stub = ( ); var options = stub.props.children; var container = document.createElement('div'); stub = ReactDOM.render(stub, container); var node = ReactDOM.findDOMNode(stub); expect(node.options[0].selected).toBe(false); // monkey expect(node.options[1].selected).toBe(true); // giraffe expect(node.options[2].selected).toBe(false); // gorilla // When making it multiple, giraffe and gorilla should be selected ReactDOM.render( , container, ); expect(node.options[0].selected).toBe(false); // monkey expect(node.options[1].selected).toBe(true); // giraffe expect(node.options[2].selected).toBe(true); // gorilla }); it('should allow switching from multiple', () => { var stub = ( ); var options = stub.props.children; var container = document.createElement('div'); stub = ReactDOM.render(stub, container); var node = ReactDOM.findDOMNode(stub); expect(node.options[0].selected).toBe(false); // monkey expect(node.options[1].selected).toBe(true); // giraffe expect(node.options[2].selected).toBe(true); // gorilla // When removing multiple, defaultValue is applied again, being omitted // means that "monkey" will be selected ReactDOM.render( , container, ); expect(node.options[0].selected).toBe(false); // monkey expect(node.options[1].selected).toBe(false); // giraffe expect(node.options[2].selected).toBe(true); // gorilla }); it('should remember value when switching to uncontrolled', () => { var stub = ( ); var options = stub.props.children; var container = document.createElement('div'); stub = ReactDOM.render(stub, container); var node = ReactDOM.findDOMNode(stub); expect(node.options[0].selected).toBe(false); // monkey expect(node.options[1].selected).toBe(true); // giraffe expect(node.options[2].selected).toBe(false); // gorilla ReactDOM.render(, container); expect(node.options[0].selected).toBe(false); // monkey expect(node.options[1].selected).toBe(true); // giraffe expect(node.options[2].selected).toBe(false); // gorilla }); it('should remember updated value when switching to uncontrolled', () => { var stub = ( ); var options = stub.props.children; var container = document.createElement('div'); stub = ReactDOM.render(stub, container); var node = ReactDOM.findDOMNode(stub); ReactDOM.render( , container, ); expect(node.options[0].selected).toBe(false); // monkey expect(node.options[1].selected).toBe(false); // giraffe expect(node.options[2].selected).toBe(true); // gorilla ReactDOM.render(, container); expect(node.options[0].selected).toBe(false); // monkey expect(node.options[1].selected).toBe(false); // giraffe expect(node.options[2].selected).toBe(true); // gorilla }); it('should support server-side rendering', () => { var stub = ( ); var markup = ReactDOMServer.renderToString(stub); expect(markup).toContain('