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 (
+
+ );
+ }
+ }
+
+ 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(``));
+ expect(bChildParents).to.have.lengthOf(1);
+ */
+
+ const aChildParents = aChild.parents('.b');
+ expect(aChildParents.debug(``));
+ 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 (
+
+ );
+ }
+ }
+
+ 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(``));
+ expect(bChildParents).to.have.lengthOf(1);
+ */
+
+ const aChildParents = aChild.parents('.a');
+ expect(aChildParents.debug(``));
+ 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;
+ });
}
/**