Skip to content

Commit 4d9d28a

Browse files
author
Robert Jackson
committed
Add tests for settled using new API's.
1 parent 0a83ee3 commit 4d9d28a

File tree

1 file changed

+270
-0
lines changed

1 file changed

+270
-0
lines changed

tests/unit/settled-test.js

Lines changed: 270 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,270 @@
1+
import Ember from 'ember';
2+
import $ from 'jquery'; // FYI - not present in all scenarios
3+
import { later, run } from '@ember/runloop';
4+
import Component from '@ember/component';
5+
import {
6+
settled,
7+
setupContext,
8+
setupRenderingContext,
9+
teardownContext,
10+
teardownRenderingContext,
11+
} from 'ember-test-helpers';
12+
import hasEmberVersion from 'ember-test-helpers/has-ember-version';
13+
import { module, test, skip } from 'qunit';
14+
import hbs from 'htmlbars-inline-precompile';
15+
import Pretender from 'pretender';
16+
import { fireEvent } from '../helpers/events';
17+
import hasjQuery from '../helpers/has-jquery';
18+
import require from 'require';
19+
20+
function ajax(url) {
21+
if (hasjQuery()) {
22+
return $.ajax(url, { cache: false });
23+
} else {
24+
let fetch = require('fetch').default;
25+
return fetch(url).then(response => response.text());
26+
}
27+
}
28+
29+
module('settle', function(hooks) {
30+
if (!hasEmberVersion(2, 4)) {
31+
return;
32+
}
33+
34+
hooks.beforeEach(function() {
35+
setupContext(this);
36+
setupRenderingContext(this);
37+
38+
let { owner } = this;
39+
40+
owner.register(
41+
'component:x-test-1',
42+
Component.extend({
43+
internalValue: 'initial value',
44+
45+
init() {
46+
this._super.apply(this, arguments);
47+
48+
later(
49+
this,
50+
function() {
51+
this.set('internalValue', 'async value');
52+
},
53+
10
54+
);
55+
},
56+
})
57+
);
58+
59+
owner.register('template:components/x-test-1', hbs`{{internalValue}}`);
60+
61+
owner.register(
62+
'component:x-test-2',
63+
Component.extend({
64+
internalValue: 'initial value',
65+
66+
click() {
67+
later(
68+
this,
69+
function() {
70+
this.set('internalValue', 'async value');
71+
},
72+
10
73+
);
74+
},
75+
})
76+
);
77+
78+
owner.register('template:components/x-test-2', hbs`{{internalValue}}`);
79+
80+
owner.register(
81+
'component:x-test-3',
82+
Component.extend({
83+
internalValue: '',
84+
85+
click() {
86+
var component = this;
87+
88+
ajax('/whazzits').then(function(data) {
89+
var value = component.get('internalValue');
90+
91+
run(component, 'set', 'internalValue', value + data);
92+
});
93+
},
94+
})
95+
);
96+
97+
owner.register('template:components/x-test-3', hbs`{{internalValue}}`);
98+
99+
owner.register(
100+
'component:x-test-4',
101+
Component.extend({
102+
internalValue: '',
103+
104+
click() {
105+
var component = this;
106+
107+
later(function() {
108+
run(component, 'set', 'internalValue', 'Local Data!');
109+
}, 10);
110+
111+
ajax('/whazzits').then(function(data) {
112+
var value = component.get('internalValue');
113+
114+
run(component, 'set', 'internalValue', value + data);
115+
116+
later(function() {
117+
ajax('/whazzits').then(function(data) {
118+
if (component.isDestroyed) {
119+
return;
120+
}
121+
122+
var value = component.get('internalValue');
123+
124+
run(component, 'set', 'internalValue', value + data);
125+
});
126+
}, 15);
127+
});
128+
},
129+
})
130+
);
131+
132+
owner.register('template:components/x-test-4', hbs`{{internalValue}}`);
133+
134+
owner.register(
135+
'component:x-test-5',
136+
Component.extend({
137+
internalValue: 'initial value',
138+
139+
ready: false,
140+
141+
isReady() {
142+
return this.get('ready');
143+
},
144+
145+
init() {
146+
this._super.apply(this, arguments);
147+
// In Ember < 2.8 `registerWaiter` expected to be bound to
148+
// `Ember.Test` 😭
149+
//
150+
// Once we have dropped support for < 2.8 we should swap this to
151+
// use:
152+
//
153+
// import { registerWaiter } from '@ember/test';
154+
Ember.Test.registerWaiter(this, this.isReady);
155+
later(() => {
156+
this.setProperties({
157+
internalValue: 'async value',
158+
ready: true,
159+
});
160+
}, 25);
161+
},
162+
163+
willDestroy() {
164+
this._super.apply(this, arguments);
165+
// must be called with `Ember.Test` as context for Ember < 2.8
166+
Ember.Test.unregisterWaiter(this, this.isReady);
167+
},
168+
})
169+
);
170+
171+
owner.register('template:components/x-test-5', hbs`{{internalValue}}`);
172+
173+
this.server = new Pretender(function() {
174+
this.get(
175+
'/whazzits',
176+
function() {
177+
return [200, { 'Content-Type': 'text/plain' }, 'Remote Data!'];
178+
},
179+
25
180+
);
181+
});
182+
});
183+
184+
hooks.afterEach(async function() {
185+
this.server.shutdown();
186+
await settled();
187+
188+
teardownContext(this);
189+
teardownRenderingContext(this);
190+
});
191+
192+
test('it works when async exists in `init`', async function(assert) {
193+
await this.render(hbs`{{x-test-1}}`);
194+
195+
await settled();
196+
197+
assert.equal(this.element.textContent, 'async value');
198+
});
199+
200+
test('it works when async exists in an event/action', async function(assert) {
201+
await this.render(hbs`{{x-test-2}}`);
202+
203+
assert.equal(this.element.textContent, 'initial value');
204+
205+
fireEvent(this.element.querySelector('div'), 'click');
206+
207+
await settled();
208+
209+
assert.equal(this.element.textContent, 'async value');
210+
});
211+
212+
test('it waits for AJAX requests to finish', async function(assert) {
213+
await this.render(hbs`{{x-test-3}}`);
214+
215+
fireEvent(this.element.querySelector('div'), 'click');
216+
217+
await settled();
218+
219+
assert.equal(this.element.textContent, 'Remote Data!');
220+
});
221+
222+
test('it waits for interleaved AJAX and run loops to finish', async function(assert) {
223+
var testContext = this;
224+
225+
await this.render(hbs`{{x-test-4}}`);
226+
227+
fireEvent(this.element.querySelector('div'), 'click');
228+
229+
await settled();
230+
231+
assert.equal(testContext.element.textContent, 'Local Data!Remote Data!Remote Data!');
232+
});
233+
234+
test('it can wait only for AJAX', async function(assert) {
235+
var testContext = this;
236+
237+
await this.render(hbs`{{x-test-4}}`);
238+
239+
fireEvent(this.element.querySelector('div'), 'click');
240+
241+
await settled({ waitForTimers: false });
242+
243+
assert.equal(testContext.element.textContent, 'Local Data!Remote Data!');
244+
});
245+
246+
// in the wait utility we specific listen for artificial jQuery events
247+
// to start/stop waiting, but when using ember-fetch those events are not
248+
// emitted and instead test waiters are used
249+
//
250+
// therefore, this test is only valid when using jQuery.ajax
251+
(hasjQuery() ? test : skip)('it can wait only for timers', async function(assert) {
252+
var testContext = this;
253+
254+
await this.render(hbs`{{x-test-4}}`);
255+
256+
fireEvent(this.element.querySelector('div'), 'click');
257+
258+
await settled({ waitForAJAX: false });
259+
260+
assert.equal(testContext.element.textContent, 'Local Data!');
261+
});
262+
263+
test('it waits for Ember test waiters', async function(assert) {
264+
await this.render(hbs`{{x-test-5}}`);
265+
266+
await settled({ waitForTimers: false });
267+
268+
assert.equal(this.element.textContent, 'async value');
269+
});
270+
});

0 commit comments

Comments
 (0)