UNPKG

react-room-occupancy-input

Version:

React.js component for specifying a hotel room occupancy: how many adults, how many kids, how old kids are

155 lines (124 loc) 5.08 kB
describe('OccupancyInput', function () { 'use strict'; var assert = require('assert'), sinon = require('sinon'), massert = require('./helpers/massert'), React = require('react'), TestUtils = require('react/addons').addons.TestUtils, OccupancyInput = require('../src/OccupancyInput'), AdultsCountInput = require('../src/AdultsCountInput'), ChildrenInput = require('../src/ChildrenInput'), intlMessages = require('../src/intlMessages'); ['value', 'onChange'].forEach(function (name) { it('declares the ' + name + ' property', function () { assert(OccupancyInput.propTypes[name]); }); }); it('defines the display name', function () { assert.strictEqual(typeof OccupancyInput.displayName, 'string'); }); describe('instance structure', function () { var component, element; beforeEach(function () { component = TestUtils.renderIntoDocument( React.createElement(OccupancyInput, { value: {adults: 1, children: []}, onChange: function () {}, messages: intlMessages().en }) ); element = component.getDOMNode(); }); it('has DIV as a top level tag', function () { assert.strictEqual(element.tagName, 'DIV'); }); it('has the top level class assigned', function () { massert.cssClass(element, 'room-occupancy'); }); it('aggregates an AdultsCountInput', function () { assert( TestUtils.isCompositeComponentWithType(component.refs.adults, AdultsCountInput) ); }); it('passes down the adults count', function () { assert.strictEqual(component.refs.adults.props.value, 1); }); it('provides the adults count change handler', function () { assert(component.handleAdultsChange); assert.strictEqual( component.refs.adults.props.onChange, component.handleAdultsChange ); }); it('aggregates a ChildrenInput', function () { assert( TestUtils.isCompositeComponentWithType(component.refs.children, ChildrenInput) ); }); it('passes down the children array', function () { assert.deepEqual(component.refs.children.props.value, []); }); it('provides the children change handler', function () { assert(component.handleChildrenChange); assert.strictEqual( component.refs.children.props.onChange, component.handleChildrenChange ); }); }); describe('instance', function () { var spy, component; beforeEach(function () { spy = sinon.spy(); component = TestUtils.renderIntoDocument( React.createElement(OccupancyInput, { value: {adults: 2, children: [{age: 1}]}, onChange: spy, messages: intlMessages().en }) ); }); describe('handleAdultsChange', function () { beforeEach(function () { component.handleAdultsChange(1); }); it('triggers onChange', function () { assert(spy.calledOnce); }); it('triggers onChange with the new room occupancy value', function () { assert.deepEqual(spy.args[0][0], {adults: 1, children: [{age: 1}]}); }); }); describe('handleChildrenChange', function () { beforeEach(function () { component.handleChildrenChange([]); }); it('triggers onChange', function () { assert(spy.calledOnce); }); it('triggers onChange with the new room occupancy value', function () { assert.deepEqual(spy.args[0][0], {adults: 2, children: []}); }); }); describe('child age alert', function () { var element; beforeEach(function () { element = component.getDOMNode(); }); it('gets displayed after an ChildrenInput/onInvalidAge', function () { component.refs.children.props.onInvalidAge(); massert.contains(element.querySelector('.alert-warning').textContent, '0 to 11'); }); it('isn\'t initially displayed', function () { assert(!element.querySelector('.alert-warning')); }); it('gets hidden after an ChildrenInput/onAgesBecomingValid', function () { component.refs.children.props.onInvalidAge(); component.refs.children.props.onAgesBecomingValid(); assert(!element.querySelector('.alert-warning')); }); }); }); });