aboutsummaryrefslogtreecommitdiff
path: root/node_modules/react-dom/lib/reactComponentExpect.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/react-dom/lib/reactComponentExpect.js')
-rw-r--r--node_modules/react-dom/lib/reactComponentExpect.js216
1 files changed, 216 insertions, 0 deletions
diff --git a/node_modules/react-dom/lib/reactComponentExpect.js b/node_modules/react-dom/lib/reactComponentExpect.js
new file mode 100644
index 000000000..af3ba91cf
--- /dev/null
+++ b/node_modules/react-dom/lib/reactComponentExpect.js
@@ -0,0 +1,216 @@
+/**
+ * Copyright 2013-present, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * LICENSE file in the root directory of this source tree. An additional grant
+ * of patent rights can be found in the PATENTS file in the same directory.
+ *
+ */
+
+'use strict';
+
+var _prodInvariant = require('./reactProdInvariant'),
+ _assign = require('object-assign');
+
+var ReactInstanceMap = require('./ReactInstanceMap');
+var ReactTestUtils = require('./ReactTestUtils');
+
+var invariant = require('fbjs/lib/invariant');
+
+function reactComponentExpect(instance) {
+ if (instance instanceof reactComponentExpectInternal) {
+ return instance;
+ }
+
+ if (!(this instanceof reactComponentExpect)) {
+ return new reactComponentExpect(instance);
+ }
+
+ expect(instance).not.toBeNull();
+ expect(instance).not.toBeUndefined();
+
+ !ReactTestUtils.isCompositeComponent(instance) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'reactComponentExpect(...): instance must be a composite component') : _prodInvariant('15') : void 0;
+ var internalInstance = ReactInstanceMap.get(instance);
+
+ expect(typeof internalInstance).toBe('object');
+ expect(typeof internalInstance.constructor).toBe('function');
+ expect(ReactTestUtils.isElement(internalInstance)).toBe(false);
+
+ return new reactComponentExpectInternal(internalInstance);
+}
+
+function reactComponentExpectInternal(internalInstance) {
+ this._instance = internalInstance;
+}
+
+_assign(reactComponentExpectInternal.prototype, {
+ // Getters -------------------------------------------------------------------
+
+ /**
+ * @instance: Retrieves the backing instance.
+ */
+ instance: function () {
+ return this._instance.getPublicInstance();
+ },
+
+ /**
+ * There are two types of components in the world.
+ * - A component created via React.createClass() - Has a single child
+ * subComponent - the return value from the .render() function. This
+ * function @subComponent expects that this._instance is component created
+ * with React.createClass().
+ * - A primitive DOM component - which has many renderedChildren, each of
+ * which may have a name that is unique with respect to its siblings. This
+ * method will fail if this._instance is a primitive component.
+ *
+ * TL;DR: An instance may have a subComponent (this._renderedComponent) or
+ * renderedChildren, but never both. Neither will actually show up until you
+ * render the component (simply instantiating is not enough).
+ */
+ expectRenderedChild: function () {
+ this.toBeCompositeComponent();
+ var child = this._instance._renderedComponent;
+ // TODO: Hide ReactEmptyComponent instances here?
+ return new reactComponentExpectInternal(child);
+ },
+
+ /**
+ * The nth child of a DOMish component instance that is not falsy.
+ */
+ expectRenderedChildAt: function (childIndex) {
+ // Currently only dom components have arrays of children, but that will
+ // change soon.
+ this.toBeDOMComponent();
+ var renderedChildren = this._instance._renderedChildren || {};
+ for (var name in renderedChildren) {
+ if (!renderedChildren.hasOwnProperty(name)) {
+ continue;
+ }
+ if (renderedChildren[name]) {
+ if (renderedChildren[name]._mountIndex === childIndex) {
+ return new reactComponentExpectInternal(renderedChildren[name]);
+ }
+ }
+ }
+ throw new Error('Child:' + childIndex + ' is not found');
+ },
+
+ toBeDOMComponentWithChildCount: function (count) {
+ this.toBeDOMComponent();
+ var renderedChildren = this._instance._renderedChildren;
+ expect(renderedChildren).toBeTruthy();
+ expect(Object.keys(renderedChildren).length).toBe(count);
+ return this;
+ },
+
+ toBeDOMComponentWithNoChildren: function () {
+ this.toBeDOMComponent();
+ expect(this._instance._renderedChildren).toBeFalsy();
+ return this;
+ },
+
+ // Matchers ------------------------------------------------------------------
+
+ toBeComponentOfType: function (constructor) {
+ expect(this._instance._currentElement.type === constructor).toBe(true);
+ return this;
+ },
+
+ /**
+ * A component that is created with React.createClass. Just duck typing
+ * here.
+ */
+ toBeCompositeComponent: function () {
+ expect(typeof this.instance() === 'object' && typeof this.instance().render === 'function').toBe(true);
+ return this;
+ },
+
+ toBeCompositeComponentWithType: function (constructor) {
+ this.toBeCompositeComponent();
+ expect(this._instance._currentElement.type === constructor).toBe(true);
+ return this;
+ },
+
+ toBeTextComponentWithValue: function (val) {
+ var elementType = typeof this._instance._currentElement;
+ expect(elementType === 'string' || elementType === 'number').toBe(true);
+ expect(this._instance._stringText).toBe(val);
+ return this;
+ },
+
+ toBeEmptyComponent: function () {
+ var element = this._instance._currentElement;
+ return element === null || element === false;
+ },
+
+ toBePresent: function () {
+ expect(this.instance()).toBeTruthy();
+ return this;
+ },
+
+ /**
+ * A terminal type of component representing some virtual dom node. Just duck
+ * typing here.
+ */
+ toBeDOMComponent: function () {
+ expect(ReactTestUtils.isDOMComponent(this.instance())).toBe(true);
+ return this;
+ },
+
+ /**
+ * @deprecated
+ * @see toBeComponentOfType
+ */
+ toBeDOMComponentWithTag: function (tag) {
+ this.toBeDOMComponent();
+ expect(this.instance().tagName).toBe(tag.toUpperCase());
+ return this;
+ },
+
+ /**
+ * Check that internal state values are equal to a state of expected values.
+ */
+ scalarStateEqual: function (stateNameToExpectedValue) {
+ expect(this.instance()).toBeTruthy();
+ for (var stateName in stateNameToExpectedValue) {
+ if (!stateNameToExpectedValue.hasOwnProperty(stateName)) {
+ continue;
+ }
+ expect(this.instance().state[stateName]).toEqual(stateNameToExpectedValue[stateName]);
+ }
+ return this;
+ },
+
+ /**
+ * Check a set of props are equal to a set of expected values - only works
+ * with scalars.
+ */
+ scalarPropsEqual: function (propNameToExpectedValue) {
+ expect(this.instance()).toBeTruthy();
+ for (var propName in propNameToExpectedValue) {
+ if (!propNameToExpectedValue.hasOwnProperty(propName)) {
+ continue;
+ }
+ expect(this.instance().props[propName]).toEqual(propNameToExpectedValue[propName]);
+ }
+ return this;
+ },
+
+ /**
+ * Check a set of props are equal to a set of expected values - only works
+ * with scalars.
+ */
+ scalarContextEqual: function (contextNameToExpectedValue) {
+ expect(this.instance()).toBeTruthy();
+ for (var contextName in contextNameToExpectedValue) {
+ if (!contextNameToExpectedValue.hasOwnProperty(contextName)) {
+ continue;
+ }
+ expect(this.instance().context[contextName]).toEqual(contextNameToExpectedValue[contextName]);
+ }
+ return this;
+ }
+});
+
+module.exports = reactComponentExpect; \ No newline at end of file