From 13e422a907a77d7c2f076ee4963141923edb2e7d Mon Sep 17 00:00:00 2001 From: Jarek Radosz Date: Wed, 29 May 2019 13:30:59 +0200 Subject: [PATCH] Add test for non-interactive `on` modifier lifecycle hooks --- .../tests/integration/modifiers/on-test.js | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/packages/@ember/-internals/glimmer/tests/integration/modifiers/on-test.js b/packages/@ember/-internals/glimmer/tests/integration/modifiers/on-test.js index 5901ca24ff7..02d9db9b365 100644 --- a/packages/@ember/-internals/glimmer/tests/integration/modifiers/on-test.js +++ b/packages/@ember/-internals/glimmer/tests/integration/modifiers/on-test.js @@ -4,6 +4,8 @@ import { isChrome, isFirefox } from '@ember/-internals/browser-environment'; import { privatize as P } from '@ember/-internals/container'; import { HAS_NATIVE_PROXY } from '@ember/-internals/utils'; +import { Component } from '../../utils/helpers'; + const isIE11 = !window.ActiveXObject && 'ActiveXObject' in window; if (EMBER_GLIMMER_ON_MODIFIER) { @@ -379,4 +381,63 @@ if (EMBER_GLIMMER_ON_MODIFIER) { } } ); + + moduleFor( + 'Rendering test: non-interactive `on` modifier', + class extends RenderingTestCase { + getBootOptions() { + return { isInteractive: false }; + } + + beforeEach() { + // might error if getOnManagerInstance fails + this.startingCounters = this.getOnManagerInstance().counters; + } + + getOnManagerInstance() { + // leveraging private APIs, this can be deleted if these APIs change + // but it has been useful to verify some internal details + let templateCompiler = this.owner.lookup(P`template-compiler:main`); + + return templateCompiler.resolver.resolver.builtInModifiers.on.manager; + } + + assertCounts(expected) { + let { counters } = this.getOnManagerInstance(); + + this.assert.deepEqual( + counters, + { + adds: expected.adds + this.startingCounters.adds, + removes: expected.removes + this.startingCounters.removes, + }, + `counters have incremented by ${JSON.stringify(expected)}` + ); + } + + [`@test doesn't trigger lifecycle hooks when non-interactive`](assert) { + this.registerComponent('foo-bar2', { + ComponentClass: Component.extend({ + tagName: '', + fire() { + assert.ok(false); + }, + }), + template: ``, + }); + + this.render('{{#if this.showButton}}{{/if}}', { + showButton: true, + }); + this.assertHTML(''); + this.assertCounts({ adds: 0, removes: 0 }); + + this.$('button').click(); + + runTask(() => this.context.set('showButton', false)); + + this.assertCounts({ adds: 0, removes: 0 }); + } + } + ); }