diff --git a/packages/enzyme-test-suite/test/ReactWrapper-spec.jsx b/packages/enzyme-test-suite/test/ReactWrapper-spec.jsx index aa639cb8d..2f32ade87 100644 --- a/packages/enzyme-test-suite/test/ReactWrapper-spec.jsx +++ b/packages/enzyme-test-suite/test/ReactWrapper-spec.jsx @@ -3529,6 +3529,51 @@ describeWithDOM('mount', () => { const formUp = input.parents('form'); expect(formUp).to.have.lengthOf(1); }); + + it('works when called sequentially on two sibling nodes', () => { + class Test extends React.Component { + render() { + return ( +
+
+
A child
+
+
+
B child
+
+
+ ); + } + } + + const wrapper = mount(); + + const aChild = wrapper.find({ children: 'A child' }); + expect(aChild.debug()).to.equal(`
+ A child +
`); + expect(aChild).to.have.lengthOf(1); + + const bChild = wrapper.find({ children: 'B child' }); + expect(bChild.debug()).to.equal(`
+ B child +
`); + expect(bChild).to.have.lengthOf(1); + + /* + const bChildParents = bChild.parents('.b'); + expect(bChildParents.debug(`
+
B child
+
`)); + expect(bChildParents).to.have.lengthOf(1); + */ + + const aChildParents = aChild.parents('.b'); + expect(aChildParents.debug(`
+
A child
+
`)); + expect(aChildParents).to.have.lengthOf(1); + }); }); describe('.parent()', () => { diff --git a/packages/enzyme-test-suite/test/ShallowWrapper-spec.jsx b/packages/enzyme-test-suite/test/ShallowWrapper-spec.jsx index 0f7dd2127..6cb29f764 100644 --- a/packages/enzyme-test-suite/test/ShallowWrapper-spec.jsx +++ b/packages/enzyme-test-suite/test/ShallowWrapper-spec.jsx @@ -3444,6 +3444,51 @@ describe('shallow', () => { expect(parents.at(0).hasClass('foo')).to.equal(true); expect(parents.at(1).hasClass('bax')).to.equal(true); }); + + it('works when called sequentially on two sibling nodes', () => { + class Test extends React.Component { + render() { + return ( +
+
+
A child
+
+
+
B child
+
+
+ ); + } + } + + const wrapper = shallow(); + + const aChild = wrapper.find({ children: 'A child' }); + expect(aChild.debug()).to.equal(`
+ A child +
`); + expect(aChild).to.have.lengthOf(1); + + const bChild = wrapper.find({ children: 'B child' }); + expect(bChild.debug()).to.equal(`
+ B child +
`); + expect(bChild).to.have.lengthOf(1); + + /* + const bChildParents = bChild.parents('.b'); + expect(bChildParents.debug(`
+
B child
+
`)); + expect(bChildParents).to.have.lengthOf(1); + */ + + const aChildParents = aChild.parents('.a'); + expect(aChildParents.debug(`
+
A child
+
`)); + expect(aChildParents).to.have.lengthOf(1); + }); }); describe('.parent()', () => { diff --git a/packages/enzyme/src/RSTTraversal.js b/packages/enzyme/src/RSTTraversal.js index ad2f7a7ab..f3389902e 100644 --- a/packages/enzyme/src/RSTTraversal.js +++ b/packages/enzyme/src/RSTTraversal.js @@ -106,7 +106,7 @@ export function pathToNode(node, root) { } export function parentsOfNode(node, root) { - return pathToNode(node, root).reverse(); + return (pathToNode(node, root) || []).reverse(); } export function nodeHasId(node, id) { diff --git a/packages/enzyme/src/ReactWrapper.js b/packages/enzyme/src/ReactWrapper.js index 015f1b6b0..407b28330 100644 --- a/packages/enzyme/src/ReactWrapper.js +++ b/packages/enzyme/src/ReactWrapper.js @@ -702,8 +702,10 @@ class ReactWrapper { * @returns {ReactWrapper} */ parents(selector) { - const allParents = this.wrap(this.single('parents', n => parentsOfNode(n, this[ROOT].getNodeInternal()))); - return selector ? allParents.filter(selector) : allParents; + return this.single('parents', (n) => { + const allParents = this.wrap(parentsOfNode(n, this[ROOT].getNodeInternal())); + return selector ? allParents.filter(selector) : allParents; + }); } /** diff --git a/packages/enzyme/src/ShallowWrapper.js b/packages/enzyme/src/ShallowWrapper.js index ecc29f220..25f9271fa 100644 --- a/packages/enzyme/src/ShallowWrapper.js +++ b/packages/enzyme/src/ShallowWrapper.js @@ -931,8 +931,10 @@ class ShallowWrapper { * @returns {ShallowWrapper} */ parents(selector) { - const allParents = this.wrap(this.single('parents', n => parentsOfNode(n, getRootNodeInternal(this)))); - return selector ? allParents.filter(selector) : allParents; + return this.single('parents', (n) => { + const allParents = this.wrap(parentsOfNode(n, getRootNodeInternal(this))); + return selector ? allParents.filter(selector) : allParents; + }); } /**