From 1cf510ddd32b5b1f3c75630e31945b53955021d8 Mon Sep 17 00:00:00 2001 From: Aleksandr Terentev Date: Mon, 18 Mar 2019 19:29:39 +0300 Subject: [PATCH] [Fix] `shallow`/`mount`: `hasClass`: avoid a crash with a non-string argument --- .../test/ReactWrapper-spec.jsx | 18 ++++++++++++++++++ .../test/ShallowWrapper-spec.jsx | 18 ++++++++++++++++++ packages/enzyme/src/ReactWrapper.js | 2 +- packages/enzyme/src/ShallowWrapper.js | 2 +- 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/packages/enzyme-test-suite/test/ReactWrapper-spec.jsx b/packages/enzyme-test-suite/test/ReactWrapper-spec.jsx index ed423c517..fa91fc33c 100644 --- a/packages/enzyme-test-suite/test/ReactWrapper-spec.jsx +++ b/packages/enzyme-test-suite/test/ReactWrapper-spec.jsx @@ -4780,6 +4780,24 @@ describeWithDOM('mount', () => { expect(wrapper.hasClass('classB')).to.equal(false); expect(wrapper.hasClass(String(obj))).to.equal(true); }); + + it('allows hyphens', () => { + const wrapper = mount(
); + expect(wrapper.hasClass('foo-bar')).to.equal(true); + }); + + it('works if className has a function in toString property', () => { + function classes() {} + classes.toString = () => 'foo-bar'; + const wrapper = mount(
); + expect(wrapper.hasClass('foo-bar')).to.equal(true); + }); + + it('works if searching with a RegExp', () => { + const wrapper = mount(
); + expect(wrapper.hasClass(/(ComponentName)-(classname)-(\d+)/)).to.equal(true); + expect(wrapper.hasClass(/(ComponentName)-(other)-(\d+)/)).to.equal(false); + }); }); describe('.forEach(fn)', () => { diff --git a/packages/enzyme-test-suite/test/ShallowWrapper-spec.jsx b/packages/enzyme-test-suite/test/ShallowWrapper-spec.jsx index 560006e68..e66808fa1 100644 --- a/packages/enzyme-test-suite/test/ShallowWrapper-spec.jsx +++ b/packages/enzyme-test-suite/test/ShallowWrapper-spec.jsx @@ -4726,6 +4726,24 @@ describe('shallow', () => { expect(wrapper.hasClass('classB')).to.equal(false); expect(wrapper.hasClass(String(obj))).to.equal(true); }); + + it('allows hyphens', () => { + const wrapper = shallow(
); + expect(wrapper.hasClass('foo-bar')).to.equal(true); + }); + + it('works if className has a function in toString property', () => { + function classes() {} + classes.toString = () => 'foo-bar'; + const wrapper = shallow(
); + expect(wrapper.hasClass('foo-bar')).to.equal(true); + }); + + it('works if searching with a RegExp', () => { + const wrapper = shallow(
); + expect(wrapper.hasClass(/(ComponentName)-(classname)-(\d+)/)).to.equal(true); + expect(wrapper.hasClass(/(ComponentName)-(other)-(\d+)/)).to.equal(false); + }); }); describe('.forEach(fn)', () => { diff --git a/packages/enzyme/src/ReactWrapper.js b/packages/enzyme/src/ReactWrapper.js index d634200a9..4a2d60ed6 100644 --- a/packages/enzyme/src/ReactWrapper.js +++ b/packages/enzyme/src/ReactWrapper.js @@ -855,7 +855,7 @@ class ReactWrapper { * @returns {Boolean} */ hasClass(className) { - if (className && className.indexOf('.') !== -1) { + if (typeof className === 'string' && className.indexOf('.') !== -1) { // eslint-disable-next-line no-console console.warn('It looks like you\'re calling `ReactWrapper::hasClass()` with a CSS selector. hasClass() expects a class name, not a CSS selector.'); } diff --git a/packages/enzyme/src/ShallowWrapper.js b/packages/enzyme/src/ShallowWrapper.js index 7885e5d12..68fe38ffb 100644 --- a/packages/enzyme/src/ShallowWrapper.js +++ b/packages/enzyme/src/ShallowWrapper.js @@ -1253,7 +1253,7 @@ class ShallowWrapper { * @returns {Boolean} */ hasClass(className) { - if (className && className.indexOf('.') !== -1) { + if (typeof className === 'string' && className.indexOf('.') !== -1) { // eslint-disable-next-line no-console console.warn('It looks like you\'re calling `ShallowWrapper::hasClass()` with a CSS selector. hasClass() expects a class name, not a CSS selector.'); }