From 40a2ce39a18fb8a39ac12171f8142298111806aa Mon Sep 17 00:00:00 2001 From: David Godfrey Date: Sun, 17 Jun 2018 13:00:23 +0100 Subject: [PATCH] [Fix] `selectors`: fix descendant selector. (Selectors like '.foo div' should not match on `
`) --- .../enzyme-test-suite/test/selector-spec.jsx | 42 +++++++++++++++++-- packages/enzyme/src/selectors.js | 2 +- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/packages/enzyme-test-suite/test/selector-spec.jsx b/packages/enzyme-test-suite/test/selector-spec.jsx index 05f1f7c78..be14effdb 100644 --- a/packages/enzyme-test-suite/test/selector-spec.jsx +++ b/packages/enzyme-test-suite/test/selector-spec.jsx @@ -46,6 +46,7 @@ describe('selectors', () => { expect(wrapper.find('span')).to.have.lengthOf(2); expect(wrapper.find('.top-div span')).to.have.lengthOf(1); + expect(wrapper.find('div div')).to.have.lengthOf(2); }); it('nested descendent', () => { @@ -68,7 +69,7 @@ describe('selectors', () => { }); it('deep descendent', () => { - const wrapper = renderMethod(( + const htmlWrapper = renderMethod((
@@ -83,8 +84,43 @@ describe('selectors', () => {
)); - expect(wrapper.find('h1')).to.have.lengthOf(2); - expect(wrapper.find('div .inner span .way-inner h1')).to.have.lengthOf(1); + expect(htmlWrapper.find('h1')).to.have.lengthOf(2); + expect(htmlWrapper.find('div .inner span .way-inner h1')).to.have.lengthOf(1); + expect(htmlWrapper.find('div div div div')).to.have.lengthOf(1); + expect(htmlWrapper.find('div div div')).to.have.lengthOf(2); + expect(htmlWrapper.find('div span div')).to.have.lengthOf(1); + + class ExampleComponent extends React.Component { + render() { + return Hello world; + } + } + + const complexWrapper = renderMethod(( +
+
+ +
+ +
+ +
+ )); + + expect(complexWrapper.find('div ExampleComponent')).to.have.lengthOf(2); + expect(complexWrapper.find('div div ExampleComponent')).to.have.lengthOf(1); + if (name === 'shallow') { + expect(complexWrapper.find('div ExampleComponent nav')).to.have.lengthOf(1); + expect(complexWrapper.find('div ExampleComponent main')).to.have.lengthOf(2); + } else { // shallow does not render the contents of components + expect(complexWrapper.find('div ExampleComponent span')).to.have.lengthOf(2); + expect(complexWrapper.find('div div ExampleComponent span')).to.have.lengthOf(1); + expect(complexWrapper.find('div span')).to.have.lengthOf(2); + expect(complexWrapper.find('div div span')).to.have.lengthOf(1); + } }); it('direct descendent', () => { diff --git a/packages/enzyme/src/selectors.js b/packages/enzyme/src/selectors.js index 9f590e80c..dc239d221 100644 --- a/packages/enzyme/src/selectors.js +++ b/packages/enzyme/src/selectors.js @@ -343,7 +343,7 @@ function matchDirectChild(nodes, predicate) { function matchDescendant(nodes, predicate) { return uniqueReduce( (matches, node) => matches.concat(treeFilter(node, predicate)), - nodes, + flat(nodes.map(childrenOfNode)), ); }