From f2840103ca23dedd458524ad4e01609069ce28cb Mon Sep 17 00:00:00 2001 From: Avital Oliver Date: Mon, 26 Jan 2015 16:41:18 -0800 Subject: [PATCH] Tests for `Template.currentData` and `Template.parentData` A recent change fixed the behavior of `Template.currentData` and `Template.parentData` in event handlers and helpers. These are tests for the new, correct behavior. (The old behavior read the data of the template instance. The new behavior read the data context around the DOM node where the event or helper ran) --- packages/spacebars-tests/template_tests.html | 8 +++ packages/spacebars-tests/template_tests.js | 52 ++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/packages/spacebars-tests/template_tests.html b/packages/spacebars-tests/template_tests.html index c8ed3068aa..3231ac29b0 100644 --- a/packages/spacebars-tests/template_tests.html +++ b/packages/spacebars-tests/template_tests.html @@ -1027,3 +1027,11 @@ Hi there! + + diff --git a/packages/spacebars-tests/template_tests.js b/packages/spacebars-tests/template_tests.js index 76cafdf73e..e409fc0a3c 100644 --- a/packages/spacebars-tests/template_tests.js +++ b/packages/spacebars-tests/template_tests.js @@ -10,7 +10,20 @@ var nodesToArray = function (array) { return _.map(array, _.identity); }; +var inDocument = function (elem) { + while ((elem = elem.parentNode)) { + if (elem == document) { + return true; + } + } + return false; +}; + + var clickIt = function (elem) { + if (!inDocument(elem)) + throw new Error("Can't click on elements without first adding them to the document"); + // jQuery's bubbling change event polyfill for IE 8 seems // to require that the element in question have focus when // it receives a simulated click. @@ -3084,3 +3097,42 @@ Tinytest.add("spacebars-tests - template_tests - custom block helper doesn't bre var div = renderToDiv(tmpl); test.equal(canonicalizeHtml(div.innerHTML), "hello hello"); }); + +Tinytest.add( + "spacebars-tests - template_tests - currentData and parentData in event handlers", + function (test) { + var tmpl = Template.spacebars_template_test_currentData_and_parentData_in_events; + + var clicked = false; + var currentInEvent; + var parentInEvent; + var currentInHelper; + var parentInHelper; + + tmpl.events({ + 'click button': function () { + currentInEvent = Template.currentData(); + parentInEvent = Template.parentData(1); + } + }); + + tmpl.helpers({ + label: function () { + currentInHelper = Template.currentData(); + parentInHelper = Template.parentData(1); + } + }); + + var div = renderToDiv(tmpl); + var button = div.querySelector('button'); + document.body.appendChild(div); + + clickIt(button); + + test.equal(currentInEvent, {y: 2}); + test.equal(parentInEvent, {x: 1}); + test.equal(currentInHelper, {y: 2}); + test.equal(parentInHelper, {x: 1}); + + document.body.removeChild(div); + });