From f0363675ef49818d09dae236453ce6b64ebd4f7e Mon Sep 17 00:00:00 2001 From: John Cowen Date: Mon, 15 Jan 2018 12:49:08 +0000 Subject: [PATCH 1/6] Move placement failures to a component, begin separate integration tests 1. Simple move of placement-failures template code to a component 2. Start adding integration tests - hit `inc` surprise --- ui/app/components/placement-failure.js | 5 ++ .../components/placement-failure.hbs | 40 ++++++++++ ui/app/templates/jobs/job/index.hbs | 40 +--------- ui/tests/integration/cleanWhitespace.js | 6 ++ ui/tests/integration/job-diff-test.js | 8 +- .../integration/placement-failure-test.js | 75 +++++++++++++++++++ 6 files changed, 128 insertions(+), 46 deletions(-) create mode 100644 ui/app/components/placement-failure.js create mode 100644 ui/app/templates/components/placement-failure.hbs create mode 100644 ui/tests/integration/cleanWhitespace.js create mode 100644 ui/tests/integration/placement-failure-test.js diff --git a/ui/app/components/placement-failure.js b/ui/app/components/placement-failure.js new file mode 100644 index 000000000..00d6fa37e --- /dev/null +++ b/ui/app/components/placement-failure.js @@ -0,0 +1,5 @@ +import Ember from 'ember'; + +const { Component } = Ember; + +export default Component.extend({}); diff --git a/ui/app/templates/components/placement-failure.hbs b/ui/app/templates/components/placement-failure.hbs new file mode 100644 index 000000000..5066f2d32 --- /dev/null +++ b/ui/app/templates/components/placement-failure.hbs @@ -0,0 +1,40 @@ +{{#if taskGroup.placementFailures}} + {{#with taskGroup.placementFailures as |failures|}} +

+ {{taskGroup.name}} + {{inc failures.coalescedFailures}} unplaced +

+ + {{/with}} +{{/if}} + diff --git a/ui/app/templates/jobs/job/index.hbs b/ui/app/templates/jobs/job/index.hbs index 8a0ac1c0d..347b7081a 100644 --- a/ui/app/templates/jobs/job/index.hbs +++ b/ui/app/templates/jobs/job/index.hbs @@ -56,45 +56,7 @@
{{#each model.taskGroups as |taskGroup|}} - {{#if taskGroup.placementFailures}} - {{#with taskGroup.placementFailures as |failures|}} -

- {{taskGroup.name}} - {{inc failures.coalescedFailures}} unplaced -

- - {{/with}} - {{/if}} + {{#placement-failure taskGroup=taskGroup}}{{/placement-failure}} {{/each}}
diff --git a/ui/tests/integration/cleanWhitespace.js b/ui/tests/integration/cleanWhitespace.js new file mode 100644 index 000000000..c589984b6 --- /dev/null +++ b/ui/tests/integration/cleanWhitespace.js @@ -0,0 +1,6 @@ +export default function cleanWhitespace(string) { + return string + .replace(/\n/g, '') + .replace(/ +/g, ' ') + .trim(); +} diff --git a/ui/tests/integration/job-diff-test.js b/ui/tests/integration/job-diff-test.js index d1821e452..f9fac114c 100644 --- a/ui/tests/integration/job-diff-test.js +++ b/ui/tests/integration/job-diff-test.js @@ -1,6 +1,7 @@ import { findAll, find } from 'ember-native-dom-helpers'; import { test, moduleForComponent } from 'ember-qunit'; import hbs from 'htmlbars-inline-precompile'; +import cleanWhitespace from './cleanWhitespace'; moduleForComponent('job-diff', 'Integration | Component | job diff', { integration: true, @@ -192,10 +193,3 @@ function field(name, type, newVal, oldVal) { Name: name, }; } - -function cleanWhitespace(string) { - return string - .replace(/\n/g, '') - .replace(/ +/g, ' ') - .trim(); -} diff --git a/ui/tests/integration/placement-failure-test.js b/ui/tests/integration/placement-failure-test.js new file mode 100644 index 000000000..712c60696 --- /dev/null +++ b/ui/tests/integration/placement-failure-test.js @@ -0,0 +1,75 @@ +import { find } from 'ember-native-dom-helpers'; +import { test, moduleForComponent } from 'ember-qunit'; +import hbs from 'htmlbars-inline-precompile'; +import cleanWhitespace from './cleanWhitespace'; + +moduleForComponent('placement-failure', 'Integration | Component | placement failure', { + integration: true, +}); + +const commonTemplate = hbs` +
+
+ {{#placement-failure taskGroup=taskGroup}}{{/placement-failure}} +
+
+`; + +const name = 'My Name'; +const failures = 10; + +test('placement failure report', function(assert) { + this.set('taskGroup', { + name: name, + placementFailures: createFailures(failures), + }); + this.render(commonTemplate); + assert.equal( + cleanWhitespace(find('.title').textContent), + `${name} ${failures} unplaced`, + 'Title is rendered correctly with a count of unplaced' + ); +}); + +function createFailures(count) { + return { + coalescedFailures: count, + nodesEvaluated: 0, + nodesAvailable: [ + { + datacenter: 0, + }, + ], + classFiltered: [ + { + filtered: 1, + }, + ], + constraintFiltered: [ + { + 'prop = val': 1, + }, + ], + nodesExhausted: 3, + classExhausted: [ + { + class: 3, + }, + ], + dimensionExhausted: [ + { + iops: 3, + }, + ], + quotaExhausted: [ + { + quota: 'dimension', + }, + ], + scores: [ + { + name: 3, + }, + ], + }; +} From 130797041288f97ccb5578699f0eb283acc72798 Mon Sep 17 00:00:00 2001 From: John Cowen Date: Thu, 18 Jan 2018 10:53:39 +0000 Subject: [PATCH 2/6] Move cleanWhitespace to utils, readd data-test attribute for PF's 1. cleanWhitespace > /test/utils/clean-whitespace.js 2. Missd the data-test attribute for placement failures in previous conflict --- ui/app/templates/components/placement-failure.hbs | 2 +- ui/tests/integration/job-diff-test.js | 2 +- ui/tests/integration/placement-failure-test.js | 2 +- .../cleanWhitespace.js => utils/clean-whitespace.js} | 2 ++ 4 files changed, 5 insertions(+), 3 deletions(-) rename ui/tests/{integration/cleanWhitespace.js => utils/clean-whitespace.js} (55%) diff --git a/ui/app/templates/components/placement-failure.hbs b/ui/app/templates/components/placement-failure.hbs index 5066f2d32..026700069 100644 --- a/ui/app/templates/components/placement-failure.hbs +++ b/ui/app/templates/components/placement-failure.hbs @@ -1,6 +1,6 @@ {{#if taskGroup.placementFailures}} {{#with taskGroup.placementFailures as |failures|}} -

+

{{taskGroup.name}} {{inc failures.coalescedFailures}} unplaced

diff --git a/ui/tests/integration/job-diff-test.js b/ui/tests/integration/job-diff-test.js index f9fac114c..d311ca4f2 100644 --- a/ui/tests/integration/job-diff-test.js +++ b/ui/tests/integration/job-diff-test.js @@ -1,7 +1,7 @@ import { findAll, find } from 'ember-native-dom-helpers'; import { test, moduleForComponent } from 'ember-qunit'; import hbs from 'htmlbars-inline-precompile'; -import cleanWhitespace from './cleanWhitespace'; +import cleanWhitespace from '../utils/clean-whitespace'; moduleForComponent('job-diff', 'Integration | Component | job diff', { integration: true, diff --git a/ui/tests/integration/placement-failure-test.js b/ui/tests/integration/placement-failure-test.js index 712c60696..ab655f02b 100644 --- a/ui/tests/integration/placement-failure-test.js +++ b/ui/tests/integration/placement-failure-test.js @@ -1,7 +1,7 @@ import { find } from 'ember-native-dom-helpers'; import { test, moduleForComponent } from 'ember-qunit'; import hbs from 'htmlbars-inline-precompile'; -import cleanWhitespace from './cleanWhitespace'; +import cleanWhitespace from '../utils/clean-whitespace'; moduleForComponent('placement-failure', 'Integration | Component | placement failure', { integration: true, diff --git a/ui/tests/integration/cleanWhitespace.js b/ui/tests/utils/clean-whitespace.js similarity index 55% rename from ui/tests/integration/cleanWhitespace.js rename to ui/tests/utils/clean-whitespace.js index c589984b6..cc3d5282e 100644 --- a/ui/tests/integration/cleanWhitespace.js +++ b/ui/tests/utils/clean-whitespace.js @@ -1,3 +1,5 @@ +// cleans whitespace from a string, for example for cleaning +// textContent in DOM nodes with indentation export default function cleanWhitespace(string) { return string .replace(/\n/g, '') From 2d1fd1e02e5e523dade061fc1577cfe151f3cb0d Mon Sep 17 00:00:00 2001 From: John Cowen Date: Thu, 18 Jan 2018 11:01:54 +0000 Subject: [PATCH 3/6] Pluralize test name for consistency (for filtering), inc test --- ui/tests/integration/placement-failure-test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/tests/integration/placement-failure-test.js b/ui/tests/integration/placement-failure-test.js index ab655f02b..0d70f0853 100644 --- a/ui/tests/integration/placement-failure-test.js +++ b/ui/tests/integration/placement-failure-test.js @@ -18,7 +18,7 @@ const commonTemplate = hbs` const name = 'My Name'; const failures = 10; -test('placement failure report', function(assert) { +test('placement failures report', function(assert) { this.set('taskGroup', { name: name, placementFailures: createFailures(failures), @@ -26,7 +26,7 @@ test('placement failure report', function(assert) { this.render(commonTemplate); assert.equal( cleanWhitespace(find('.title').textContent), - `${name} ${failures} unplaced`, + `${name} ${failures + 1} unplaced`, 'Title is rendered correctly with a count of unplaced' ); }); From 0a9faaa80589ecb0e1543abc39401b68e7345824 Mon Sep 17 00:00:00 2001 From: John Cowen Date: Thu, 18 Jan 2018 11:52:49 +0000 Subject: [PATCH 4/6] Add in data-test attrs to hook into, decide on test case granularity --- .../components/placement-failure.hbs | 20 +-- .../integration/placement-failure-test.js | 136 +++++++++++------- 2 files changed, 96 insertions(+), 60 deletions(-) diff --git a/ui/app/templates/components/placement-failure.hbs b/ui/app/templates/components/placement-failure.hbs index 026700069..16aa49a63 100644 --- a/ui/app/templates/components/placement-failure.hbs +++ b/ui/app/templates/components/placement-failure.hbs @@ -2,37 +2,37 @@ {{#with taskGroup.placementFailures as |failures|}}

{{taskGroup.name}} - {{inc failures.coalescedFailures}} unplaced + {{inc failures.coalescedFailures}} unplaced

    {{#if (eq failures.nodesEvaluated 0)}} -
  • No nodes were eligible for evaluation
  • +
  • No nodes were eligible for evaluation
  • {{/if}} {{#each-in failures.nodesAvailable as |datacenter available|}} {{#if (eq available 0)}} -
  • No nodes are available in datacenter {{datacenter}}
  • +
  • No nodes are available in datacenter {{datacenter}}
  • {{/if}} {{/each-in}} {{#each-in failures.classFiltered as |class count|}} -
  • Class {{class}} filtered {{count}} {{pluralize "node" count}}
  • +
  • Class {{class}} filtered {{count}} {{pluralize "node" count}}
  • {{/each-in}} {{#each-in failures.constraintFiltered as |constraint count|}} -
  • Constraint {{constraint}} filtered {{count}} {{pluralize "node" count}}
  • +
  • Constraint {{constraint}} filtered {{count}} {{pluralize "node" count}}
  • {{/each-in}} {{#if failures.nodesExhausted}} -
  • Resources exhausted on {{failures.nodesExhausted}} {{pluralize "node" failures.nodesExhausted}}
  • +
  • Resources exhausted on {{failures.nodesExhausted}} {{pluralize "node" failures.nodesExhausted}}
  • {{/if}} {{#each-in failures.classExhausted as |class count|}} -
  • Class {{class}} exhausted on {{count}} {{pluralize "node" count}}
  • +
  • Class {{class}} exhausted on {{count}} {{pluralize "node" count}}
  • {{/each-in}} {{#each-in failures.dimensionExhausted as |dimension count|}} -
  • Dimension {{dimension}} exhausted on {{count}} {{pluralize "node" count}}
  • +
  • Dimension {{dimension}} exhausted on {{count}} {{pluralize "node" count}}
  • {{/each-in}} {{#each-in failures.quotaExhausted as |quota dimension|}} -
  • Quota limit hit {{dimension}}
  • +
  • Quota limit hit {{dimension}}
  • {{/each-in}} {{#each-in failures.scores as |name score|}} -
  • Score {{name}} = {{score}}
  • +
  • Score {{name}} = {{score}}
  • {{/each-in}}
{{/with}} diff --git a/ui/tests/integration/placement-failure-test.js b/ui/tests/integration/placement-failure-test.js index 0d70f0853..c7612441f 100644 --- a/ui/tests/integration/placement-failure-test.js +++ b/ui/tests/integration/placement-failure-test.js @@ -1,9 +1,9 @@ -import { find } from 'ember-native-dom-helpers'; +import { find, findAll } from 'ember-native-dom-helpers'; import { test, moduleForComponent } from 'ember-qunit'; import hbs from 'htmlbars-inline-precompile'; import cleanWhitespace from '../utils/clean-whitespace'; -moduleForComponent('placement-failure', 'Integration | Component | placement failure', { +moduleForComponent('placement-failure', 'Integration | Component | placement failures', { integration: true, }); @@ -15,61 +15,97 @@ const commonTemplate = hbs` `; -const name = 'My Name'; -const failures = 10; -test('placement failures report', function(assert) { - this.set('taskGroup', { - name: name, - placementFailures: createFailures(failures), - }); +test('should render the placement failure (basic render)', function(assert) { + const name = 'Placement Failure'; + const failures = 11; + this.set( + 'taskGroup', + createFixture( + { + coalescedFailures: failures - 1 + }, + name + ) + ); this.render(commonTemplate); assert.equal( - cleanWhitespace(find('.title').textContent), - `${name} ${failures + 1} unplaced`, + cleanWhitespace(find('[data-test-placement-failure-task-group]').firstChild.wholeText), + name, + 'Title is rendered with the name of the placement failure' + ); + assert.equal( + parseInt(find('[data-test-placement-failure-coalesced-failures]').textContent), + failures, 'Title is rendered correctly with a count of unplaced' ); + assert.equal( + findAll('[data-test-placement-failure-no-evaluated-nodes]').length, + 0, + 'No evaluated nodes message shown' + ); +}); +test('should render correctly when a node is not evaluated', function(assert) { + this.set( + 'taskGroup', + createFixture( + { + nodesEvaluated: 0 + } + ) + ); + this.render(commonTemplate); + assert.equal( + findAll('[data-test-placement-failure-no-evaluated-nodes]').length, + 1, + 'No evaluated nodes message shown' + ); }); -function createFailures(count) { +function createFixture(obj = {}, name = "Placement Failure") { return { - coalescedFailures: count, - nodesEvaluated: 0, - nodesAvailable: [ - { - datacenter: 0, - }, - ], - classFiltered: [ - { - filtered: 1, - }, - ], - constraintFiltered: [ - { - 'prop = val': 1, - }, - ], - nodesExhausted: 3, - classExhausted: [ - { - class: 3, - }, - ], - dimensionExhausted: [ - { - iops: 3, - }, - ], - quotaExhausted: [ - { - quota: 'dimension', - }, - ], - scores: [ - { - name: 3, - }, - ], + name: name, + placementFailures: Object.assign({ + coalescedFailures: 10, + nodesEvaluated: 1, + nodesAvailable: [ + { + datacenter: 0, + }, + ], + classFiltered: [ + { + filtered: 1, + }, + ], + constraintFiltered: [ + { + 'prop = val': 1, + }, + ], + nodesExhausted: 3, + classExhausted: [ + { + class: 3, + }, + ], + dimensionExhausted: [ + { + iops: 3, + }, + ], + quotaExhausted: [ + { + quota: 'dimension', + }, + ], + scores: [ + { + name: 3, + }, + ], + }, + obj + ) }; } From 3ce79e933772fce81eb3c1d8f67f51501b514734 Mon Sep 17 00:00:00 2001 From: John Cowen Date: Thu, 18 Jan 2018 12:14:42 +0000 Subject: [PATCH 5/6] Add more assertions for basic message checking --- .../components/placement-failure.hbs | 14 +-- .../integration/placement-failure-test.js | 112 +++++++++++------- 2 files changed, 79 insertions(+), 47 deletions(-) diff --git a/ui/app/templates/components/placement-failure.hbs b/ui/app/templates/components/placement-failure.hbs index 16aa49a63..63f49a826 100644 --- a/ui/app/templates/components/placement-failure.hbs +++ b/ui/app/templates/components/placement-failure.hbs @@ -14,25 +14,25 @@ {{/if}} {{/each-in}} {{#each-in failures.classFiltered as |class count|}} -
  • Class {{class}} filtered {{count}} {{pluralize "node" count}}
  • +
  • Class {{class}} filtered {{count}} {{pluralize "node" count}}
  • {{/each-in}} {{#each-in failures.constraintFiltered as |constraint count|}} -
  • Constraint {{constraint}} filtered {{count}} {{pluralize "node" count}}
  • +
  • Constraint {{constraint}} filtered {{count}} {{pluralize "node" count}}
  • {{/each-in}} {{#if failures.nodesExhausted}} -
  • Resources exhausted on {{failures.nodesExhausted}} {{pluralize "node" failures.nodesExhausted}}
  • +
  • Resources exhausted on {{failures.nodesExhausted}} {{pluralize "node" failures.nodesExhausted}}
  • {{/if}} {{#each-in failures.classExhausted as |class count|}} -
  • Class {{class}} exhausted on {{count}} {{pluralize "node" count}}
  • +
  • Class {{class}} exhausted on {{count}} {{pluralize "node" count}}
  • {{/each-in}} {{#each-in failures.dimensionExhausted as |dimension count|}} -
  • Dimension {{dimension}} exhausted on {{count}} {{pluralize "node" count}}
  • +
  • Dimension {{dimension}} exhausted on {{count}} {{pluralize "node" count}}
  • {{/each-in}} {{#each-in failures.quotaExhausted as |quota dimension|}} -
  • Quota limit hit {{dimension}}
  • +
  • Quota limit hit {{dimension}}
  • {{/each-in}} {{#each-in failures.scores as |name score|}} -
  • Score {{name}} = {{score}}
  • +
  • Score {{name}} = {{score}}
  • {{/each-in}} {{/with}} diff --git a/ui/tests/integration/placement-failure-test.js b/ui/tests/integration/placement-failure-test.js index c7612441f..338b04cb3 100644 --- a/ui/tests/integration/placement-failure-test.js +++ b/ui/tests/integration/placement-failure-test.js @@ -41,69 +41,101 @@ test('should render the placement failure (basic render)', function(assert) { ); assert.equal( findAll('[data-test-placement-failure-no-evaluated-nodes]').length, - 0, + 1, 'No evaluated nodes message shown' ); + assert.equal( + findAll('[data-test-placement-failure-no-nodes-available]').length, + 1, + 'No nodes in datacenter message shown' + ); + assert.equal( + findAll('[data-test-placement-failure-class-filtered]').length, + 1, + 'Class filtered message shown' + ); + assert.equal( + findAll('[data-test-placement-failure-constraint-filtered]').length, + 1, + 'Constraint filtered message shown' + ); + assert.equal( + findAll('[data-test-placement-failure-nodes-exhausted]').length, + 1, + 'Node exhausted message shown' + ); + assert.equal( + findAll('[data-test-placement-failure-class-exhausted]').length, + 1, + 'Class exhausted message shown' + ); + assert.equal( + findAll('[data-test-placement-failure-dimension-exhausted]').length, + 1, + 'Dimension exhausted message shown' + ); + assert.equal( + findAll('[data-test-placement-failure-quota-exhausted]').length, + 1, + 'Quota exhausted message shown' + ); + assert.equal( + findAll('[data-test-placement-failure-scores]').length, + 1, + 'Scores message shown' + ); }); test('should render correctly when a node is not evaluated', function(assert) { this.set( 'taskGroup', createFixture( { - nodesEvaluated: 0 + nodesEvaluated: 1, + nodesExhausted: 0 } ) ); this.render(commonTemplate); assert.equal( findAll('[data-test-placement-failure-no-evaluated-nodes]').length, - 1, + 0, 'No evaluated nodes message shown' ); + assert.equal( + findAll('[data-test-placement-failure-nodes-exhausted]').length, + 0, + 'Nodes exhausted message NOT shown when there are no nodes exausted' + ); }); -function createFixture(obj = {}, name = "Placement Failure") { +function createFixture(obj = {}, name = 'Placement Failure') { return { name: name, placementFailures: Object.assign({ coalescedFailures: 10, - nodesEvaluated: 1, - nodesAvailable: [ - { - datacenter: 0, - }, - ], - classFiltered: [ - { - filtered: 1, - }, - ], - constraintFiltered: [ - { - 'prop = val': 1, - }, - ], + nodesEvaluated: 0, + nodesAvailable: { + datacenter: 0, + }, + classFiltered: { + filtered: 1, + }, + constraintFiltered: { + 'prop = val': 1, + }, nodesExhausted: 3, - classExhausted: [ - { - class: 3, - }, - ], - dimensionExhausted: [ - { - iops: 3, - }, - ], - quotaExhausted: [ - { - quota: 'dimension', - }, - ], - scores: [ - { - name: 3, - }, - ], + classExhausted: { + class: 3, + }, + dimensionExhausted: { + iops: 3, + }, + quotaExhausted: { + quota: 'dimension', + }, + scores: { + name: 3, + }, }, obj ) From 74b14d0856090703831305277b94d95120c72897 Mon Sep 17 00:00:00 2001 From: John Cowen Date: Fri, 19 Jan 2018 13:56:43 +0000 Subject: [PATCH 6/6] Address PR feedback 1. Extra whitespace 2. Remove redundant code 3. Remove redundant markup from test 4. placement-failure should be used as an inline component 5. Prefer `assign` polyfill 6. Use new `@ember' org style imports --- ui/app/components/placement-failure.js | 5 ----- ui/app/templates/jobs/job/index.hbs | 2 +- ui/tests/integration/placement-failure-test.js | 15 ++++++++------- 3 files changed, 9 insertions(+), 13 deletions(-) delete mode 100644 ui/app/components/placement-failure.js diff --git a/ui/app/components/placement-failure.js b/ui/app/components/placement-failure.js deleted file mode 100644 index 00d6fa37e..000000000 --- a/ui/app/components/placement-failure.js +++ /dev/null @@ -1,5 +0,0 @@ -import Ember from 'ember'; - -const { Component } = Ember; - -export default Component.extend({}); diff --git a/ui/app/templates/jobs/job/index.hbs b/ui/app/templates/jobs/job/index.hbs index 347b7081a..bc2e6b7ce 100644 --- a/ui/app/templates/jobs/job/index.hbs +++ b/ui/app/templates/jobs/job/index.hbs @@ -56,7 +56,7 @@
    {{#each model.taskGroups as |taskGroup|}} - {{#placement-failure taskGroup=taskGroup}}{{/placement-failure}} + {{placement-failure taskGroup=taskGroup}} {{/each}}
    diff --git a/ui/tests/integration/placement-failure-test.js b/ui/tests/integration/placement-failure-test.js index 338b04cb3..b43a1b553 100644 --- a/ui/tests/integration/placement-failure-test.js +++ b/ui/tests/integration/placement-failure-test.js @@ -1,5 +1,6 @@ import { find, findAll } from 'ember-native-dom-helpers'; import { test, moduleForComponent } from 'ember-qunit'; +import { assign } from '@ember/polyfills'; import hbs from 'htmlbars-inline-precompile'; import cleanWhitespace from '../utils/clean-whitespace'; @@ -8,14 +9,9 @@ moduleForComponent('placement-failure', 'Integration | Component | placement fai }); const commonTemplate = hbs` -
    -
    - {{#placement-failure taskGroup=taskGroup}}{{/placement-failure}} -
    -
    + {{placement-failure taskGroup=taskGroup}} `; - test('should render the placement failure (basic render)', function(assert) { const name = 'Placement Failure'; const failures = 11; @@ -28,7 +24,9 @@ test('should render the placement failure (basic render)', function(assert) { name ) ); + this.render(commonTemplate); + assert.equal( cleanWhitespace(find('[data-test-placement-failure-task-group]').firstChild.wholeText), name, @@ -85,6 +83,7 @@ test('should render the placement failure (basic render)', function(assert) { 'Scores message shown' ); }); + test('should render correctly when a node is not evaluated', function(assert) { this.set( 'taskGroup', @@ -95,7 +94,9 @@ test('should render correctly when a node is not evaluated', function(assert) { } ) ); + this.render(commonTemplate); + assert.equal( findAll('[data-test-placement-failure-no-evaluated-nodes]').length, 0, @@ -111,7 +112,7 @@ test('should render correctly when a node is not evaluated', function(assert) { function createFixture(obj = {}, name = 'Placement Failure') { return { name: name, - placementFailures: Object.assign({ + placementFailures: assign({ coalescedFailures: 10, nodesEvaluated: 0, nodesAvailable: {