diff --git a/frontend_tests/node_tests/zjquery.js b/frontend_tests/node_tests/zjquery.js index 84f41b676e..2b7912ca2d 100644 --- a/frontend_tests/node_tests/zjquery.js +++ b/frontend_tests/node_tests/zjquery.js @@ -210,3 +210,31 @@ run_test('extensions', () => { // But we also have area available from general extension. assert.equal(rect.area(), 35); }); + +run_test('closest', () => { + var widget = $('#my-widget'); + var parent; + var parentSelector; + + parentSelector = '#my-parent'; + parent = $(parentSelector); + widget.set_parent(parent); + assert.equal(widget.closest('#my-parent').selector, parentSelector); + + parentSelector = '
'; + parent = $(parentSelector); + widget.set_parent(parent); + assert.equal(widget.closest('#my-parent').selector, parentSelector); + + parentSelector = '
'; + parent = $(parentSelector); + widget.set_parent(parent); + assert.equal(widget.closest('.parent-class').selector, parentSelector); + + parentSelector = '#my-parent'; + parent = $(parentSelector); + widget.set_parents_result(parentSelector, parent); + assert.equal(widget.closest('#my-parent').selector, parentSelector); + + assert.equal(widget.closest('#bogus-parent').selector, undefined); +}); diff --git a/frontend_tests/zjsunit/zjquery.js b/frontend_tests/zjsunit/zjquery.js index d4dc20b838..f4e22c5406 100644 --- a/frontend_tests/zjsunit/zjquery.js +++ b/frontend_tests/zjsunit/zjquery.js @@ -163,6 +163,18 @@ exports.make_new_elem = function (selector, opts) { event_store.generic_event('click', arg); return self; }, + closest: function (selector) { + var elem = self; + var search = selector.startsWith('.') || selector.startsWith('#') ? selector.substring(1) : selector; + if (elem.selector.indexOf(search) > -1) { + return elem; + } else if (parents_result.get(selector)) { + return parents_result.get(selector); + } else if (!elem.parent()) { + return []; + } + return elem.parent().closest(selector); + }, data: noop, delay: function () { return self;