From 0ef951dc5e11f83ddc951980299585970cb4c0dd Mon Sep 17 00:00:00 2001 From: Josh Minzner Date: Wed, 2 Jan 2019 16:48:14 -0500 Subject: [PATCH] [New] `Utils`: add `isCustomComponent` --- .../enzyme-test-suite/test/Utils-spec.jsx | 40 +++++++++++++++++++ packages/enzyme/src/Utils.js | 9 +++++ 2 files changed, 49 insertions(+) diff --git a/packages/enzyme-test-suite/test/Utils-spec.jsx b/packages/enzyme-test-suite/test/Utils-spec.jsx index b11a2237d..600bd33e5 100644 --- a/packages/enzyme-test-suite/test/Utils-spec.jsx +++ b/packages/enzyme-test-suite/test/Utils-spec.jsx @@ -13,8 +13,10 @@ import { makeOptions, isEmptyValue, renderedDive, + isCustomComponent, } from 'enzyme/build/Utils'; import getAdapter from 'enzyme/build/getAdapter'; +import EnzymeAdapter from 'enzyme/build/EnzymeAdapter'; import { flatten, mapNativeEventNames, @@ -1035,4 +1037,42 @@ describe('Utils', () => { }); }); }); + + describe('isCustomComponent', () => { + class TestAdapter extends EnzymeAdapter { + isCustomComponent() {} + } + + it('delegates to the adapter has method', () => { + const component = {}; + const result = {}; + const adapter = new TestAdapter(); + sinon.stub(adapter, 'isCustomComponent').returns(result); + + const actual = isCustomComponent(component, adapter); + + expect(actual).to.equal(!!result); + + expect(adapter.isCustomComponent).to.have.property('callCount', 1); + const [args] = adapter.isCustomComponent.args; + expect(args).to.eql([component]); + }); + + it('returns "is a function" when adapter lacks method', () => { + const component = {}; + const result = {}; + const adapter = new TestAdapter(); + adapter.isCustomComponent = null; + + expect(isCustomComponent({}, adapter)).to.equal(false); + expect(isCustomComponent(() => {}, adapter)).to.equal(true); + }); + + it('throws without a valid adapter', () => { + expect(() => isCustomComponent({})).to.throw(Error); + expect(() => isCustomComponent({}, null)).to.throw(Error); + expect(() => isCustomComponent({}, false)).to.throw(Error); + expect(() => isCustomComponent({}, {})).to.throw(Error); + }); + }); }); diff --git a/packages/enzyme/src/Utils.js b/packages/enzyme/src/Utils.js index 54f1e3674..2198905cf 100644 --- a/packages/enzyme/src/Utils.js +++ b/packages/enzyme/src/Utils.js @@ -10,6 +10,7 @@ import trim from 'string.prototype.trim'; import { get } from './configuration'; import { childrenOfNode } from './RSTTraversal'; import realGetAdapter from './getAdapter'; +import validateAdapter from './validateAdapter'; export const ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; @@ -49,6 +50,14 @@ export function makeOptions(options) { }; } +export function isCustomComponent(component, adapter) { + validateAdapter(adapter); + if (adapter.isCustomComponent) { + return !!adapter.isCustomComponent(component); + } + return typeof component === 'function'; +} + export function isCustomComponentElement(inst, adapter) { if (adapter.isCustomComponentElement) { return !!adapter.isCustomComponentElement(inst);