Skip to content

Commit 98ddd4b

Browse files
authored
Merge pull request #1660 from code-corps/remove-wait-helpers
Remove wait helpers and replace with async/await where needed
2 parents 74d25c9 + 2f7855f commit 98ddd4b

14 files changed

+205
-253
lines changed

app/components/signup-email-input.js

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,14 @@ import Component from '@ember/component';
22
import { not, empty, and, alias } from '@ember/object/computed';
33
import { inject as service } from '@ember/service';
44
import { once, debounce, cancel } from '@ember/runloop';
5-
import { set, observer, get, computed } from '@ember/object';
5+
import { set, get, computed } from '@ember/object';
6+
import Ember from 'ember';
7+
8+
const {
9+
testing
10+
} = Ember;
11+
12+
const DEBOUNCE_TIMER = testing ? 0 : 500;
613

714
export default Component.extend({
815
cachedEmail: '',
@@ -50,10 +57,6 @@ export default Component.extend({
5057
});
5158
},
5259

53-
emailChanged: observer('email', function() {
54-
once(this, '_check');
55-
}),
56-
5760
sendRequest(email) {
5861
return get(this, 'ajax').request('/users/email_available', {
5962
method: 'GET',
@@ -65,6 +68,7 @@ export default Component.extend({
6568

6669
actions: {
6770
keyDown() {
71+
once(this, '_check');
6872
if (get(this, 'isNotSameEmail')) {
6973
set(this, 'isChecking', true);
7074
}
@@ -78,7 +82,7 @@ export default Component.extend({
7882
cancel(get(this, 'timer'));
7983
let deferredAction = debounce(this, function() {
8084
this.checkAvailable();
81-
}, 500);
85+
}, DEBOUNCE_TIMER);
8286
set(this, 'timer', deferredAction);
8387
} else if (get(this, 'isSameEmail') && get(this, 'isNotEmpty')) {
8488
this.sendAction('emailValidated', get(this, 'canSubmit'));

app/components/signup-form.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,9 @@ export default Component.extend({
6161
};
6262

6363
let promise = get(this, 'user').save().then(() => {
64-
get(this, 'signIn')(credentials);
64+
return get(this, 'signIn')(credentials);
6565
}).catch((error) => {
66-
get(this, 'handleErrors')(error);
66+
return get(this, 'handleErrors')(error);
6767
});
6868

6969
yield promise;

app/components/signup-username-input.js

Lines changed: 31 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
11
import Component from '@ember/component';
2-
import { not, equal, empty, and, alias } from '@ember/object/computed';
2+
import { computed, get, set } from '@ember/object';
3+
import { alias, and, empty, not } from '@ember/object/computed';
34
import { inject as service } from '@ember/service';
4-
import { observer } from '@ember/object';
55
import { once, debounce, cancel } from '@ember/runloop';
6+
import Ember from 'ember';
7+
8+
const {
9+
testing
10+
} = Ember;
11+
12+
const DEBOUNCE_TIMER = testing ? 0 : 500;
613

714
/**
815
`signup-username-input` composes the username input on the signup page. It
@@ -173,15 +180,8 @@ export default Component.extend({
173180
@property isSameUsername
174181
@type Boolean
175182
*/
176-
isSameUsername: equal('cachedUsername', 'username'),
177-
178-
/**
179-
Checks the username whenever it is changed.
180-
181-
@method usernameChanged
182-
*/
183-
usernameChanged: observer('username', function() {
184-
once(this, '_check');
183+
isSameUsername: computed('cachedUsername', 'username', function() {
184+
return get(this, 'cachedUsername') === get(this, 'username');
185185
}),
186186

187187
/**
@@ -191,18 +191,18 @@ export default Component.extend({
191191
@method checkAvailable
192192
*/
193193
checkAvailable() {
194-
let username = this.get('username');
194+
let username = get(this, 'username');
195195
this.sendRequest(username).then((result) => {
196196
let { available, valid } = result;
197197
let validation = valid && available;
198198

199-
this.set('cachedUsername', this.get('username'));
200-
this.set('hasCheckedOnce', true);
201-
this.set('isChecking', false);
202-
this.set('isAvailableOnServer', available);
203-
this.set('isValid', valid);
199+
set(this, 'cachedUsername', get(this, 'username'));
200+
set(this, 'hasCheckedOnce', true);
201+
set(this, 'isChecking', false);
202+
set(this, 'isAvailableOnServer', available);
203+
set(this, 'isValid', valid);
204204

205-
this.set('canSubmit', validation);
205+
set(this, 'canSubmit', validation);
206206
this.sendAction('usernameValidated', validation);
207207
});
208208
},
@@ -214,7 +214,7 @@ export default Component.extend({
214214
@return Promise
215215
*/
216216
sendRequest(username) {
217-
return this.get('ajax').request('/users/username_available', {
217+
return get(this, 'ajax').request('/users/username_available', {
218218
method: 'GET',
219219
data: {
220220
username
@@ -231,27 +231,28 @@ export default Component.extend({
231231
@method keyDown
232232
*/
233233
keyDown() {
234-
if (this.get('isNotSameUsername')) {
235-
this.set('isChecking', true);
234+
once(this, '_check');
235+
if (get(this, 'isNotSameUsername')) {
236+
set(this, 'isChecking', true);
236237
}
237238
}
238239
},
239240

240241
_check() {
241-
this.set('isChecking', true);
242+
set(this, 'isChecking', true);
242243

243-
if (this.get('canCheck')) {
244-
cancel(this.get('timer'));
244+
if (get(this, 'canCheck')) {
245+
cancel(get(this, 'timer'));
245246
let deferredAction = debounce(this, function() {
246247
this.checkAvailable();
247-
}, 500);
248-
this.set('timer', deferredAction);
249-
} else if (this.get('isSameUsername') && this.get('isNotEmpty')) {
250-
this.sendAction('usernameValidated', this.get('canSubmit'));
251-
this.set('isChecking', false);
248+
}, DEBOUNCE_TIMER);
249+
set(this, 'timer', deferredAction);
250+
} else if (get(this, 'isSameUsername') && get(this, 'isNotEmpty')) {
251+
this.sendAction('usernameValidated', get(this, 'canSubmit'));
252+
set(this, 'isChecking', false);
252253
} else {
253254
this.sendAction('usernameValidated', false);
254-
this.set('isChecking', false);
255+
set(this, 'isChecking', false);
255256
}
256257
}
257258
});

tests/acceptance/project-checkout-test.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,11 @@ test('Allows signing up and donating', function(assert) {
148148

149149
andThen(() => {
150150
assert.equal(currentRouteName(), 'signup', 'User was redirected to signup.');
151+
signupPage.form.username('joeuser');
152+
signupPage.form.keydownUsername();
151153
signupPage.form.email(email);
154+
signupPage.form.keydownEmail();
152155
signupPage.form.password('password');
153-
signupPage.form.username('joeuser');
154156
signupPage.form.save();
155157
});
156158

tests/acceptance/project-donate-test.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,11 @@ test('Requires user to register before getting to checkout', function(assert) {
9595

9696
andThen(() => {
9797
assert.equal(currentRouteName(), 'signup', 'User was redirected to signup.');
98+
signupPage.form.username('joeuser');
99+
signupPage.form.keydownUsername();
98100
signupPage.form.email(email);
101+
signupPage.form.keydownEmail();
99102
signupPage.form.password('password');
100-
signupPage.form.username('joeuser');
101103
signupPage.form.save();
102104
});
103105

@@ -142,9 +144,11 @@ test('Requires user to register before getting to checkout, with custom amount',
142144

143145
andThen(() => {
144146
assert.equal(currentRouteName(), 'signup', 'User was redirected to signup.');
147+
signupPage.form.username('joeuser');
148+
signupPage.form.keydownUsername();
145149
signupPage.form.email(email);
150+
signupPage.form.keydownEmail();
146151
signupPage.form.password('password');
147-
signupPage.form.username('joeuser');
148152
signupPage.form.save();
149153
});
150154

tests/acceptance/signup-test.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,13 @@ test('Successful signup', function(assert) {
2626
signupPage.visit();
2727

2828
andThen(function() {
29-
signupPage.form.username('username').email('[email protected]').password('password').save();
29+
signupPage.form
30+
.username('username')
31+
.keydownUsername()
32+
33+
.keydownEmail()
34+
.password('password')
35+
.save();
3036
});
3137

3238
let signUpDone = assert.async();

tests/integration/components/category-item-test.js

Lines changed: 28 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { run } from '@ember/runloop';
44
import RSVP from 'rsvp';
55
import { moduleForComponent, test } from 'ember-qunit';
66
import hbs from 'htmlbars-inline-precompile';
7-
import wait from 'ember-test-helpers/wait';
87
import stubService from 'code-corps-ember/tests/helpers/stub-service';
98
import {
109
getFlashMessageCount,
@@ -96,9 +95,7 @@ let selectedCategory = {
9695
description: 'You want to help society.'
9796
};
9897

99-
test('it works for selecting unselected categories', function(assert) {
100-
let done = assert.async();
101-
98+
test('it works for selecting unselected categories', async function(assert) {
10299
assert.expect(5);
103100

104101
stubService(this, 'user-categories', mockUserCategoriesService);
@@ -111,17 +108,12 @@ test('it works for selecting unselected categories', function(assert) {
111108
assert.equal(page.description.text, 'You want to help technology.', 'Correct description is rendered.');
112109
assert.equal(page.button.text, 'Technology', 'Button text is rendered correctly');
113110

114-
page.button.click();
111+
await page.button.click();
115112

116-
wait().then(() => {
117-
assert.ok(page.icon.classContains('technology--selected'), 'is selected');
118-
done();
119-
});
113+
assert.ok(page.icon.classContains('technology--selected'), 'is selected');
120114
});
121115

122116
test('it works for removing selected categories', function(assert) {
123-
let done = assert.async();
124-
125117
assert.expect(3);
126118

127119
stubService(this, 'user-categories', mockUserCategoriesService);
@@ -134,15 +126,10 @@ test('it works for removing selected categories', function(assert) {
134126

135127
page.button.click();
136128

137-
wait().then(() => {
138-
assert.ok(page.icon.classContains('society'), 'is unselected');
139-
done();
140-
});
129+
assert.ok(page.icon.classContains('society'), 'is unselected');
141130
});
142131

143132
test('it creates a flash message on an error when adding', function(assert) {
144-
let done = assert.async();
145-
146133
assert.expect(4);
147134

148135
stubService(this, 'user-categories', mockUserCategoriesServiceForErrors);
@@ -152,25 +139,17 @@ test('it creates a flash message on an error when adding', function(assert) {
152139

153140
page.button.click();
154141

155-
wait().then(() => {
156-
assert.ok(page.button.unchecked, 'Operation failed. Button is rendered as unchecked.');
157-
158-
assert.equal(getFlashMessageCount(this), 1, 'One message is shown');
142+
assert.ok(page.button.unchecked, 'Operation failed. Button is rendered as unchecked.');
159143

160-
let flash = getFlashMessageAt(0, this);
161-
let actualOptions = getProperties(flash, 'fixed', 'sticky', 'timeout', 'type');
162-
let expectedOptions = { fixed: true, sticky: false, timeout: 5000, type: 'danger' };
163-
assert.deepEqual(actualOptions, expectedOptions, 'Proper message was set');
164-
165-
assert.ok(flash.message.indexOf(unselectedCategory.name) !== -1, 'Message text includes the category name');
166-
167-
done();
168-
});
144+
assert.equal(getFlashMessageCount(this), 1, 'One message is shown');
145+
let flash = getFlashMessageAt(0, this);
146+
let actualOptions = getProperties(flash, 'fixed', 'sticky', 'timeout', 'type');
147+
let expectedOptions = { fixed: true, sticky: false, timeout: 5000, type: 'danger' };
148+
assert.deepEqual(actualOptions, expectedOptions, 'Proper message was set');
149+
assert.ok(flash.message.indexOf(unselectedCategory.name) !== -1, 'Message text includes the category name');
169150
});
170151

171152
test('it creates a flash message on an error when removing', function(assert) {
172-
let done = assert.async();
173-
174153
assert.expect(4);
175154

176155
stubService(this, 'user-categories', mockUserCategoriesServiceForErrors);
@@ -180,58 +159,46 @@ test('it creates a flash message on an error when removing', function(assert) {
180159

181160
page.button.click();
182161

183-
wait().then(() => {
184-
assert.ok(page.button.checked, 'Operation failed. Button is rendered as checked.');
185-
186-
assert.equal(getFlashMessageCount(this), 1, 'One message is shown.');
162+
assert.ok(page.button.checked, 'Operation failed. Button is rendered as checked.');
187163

188-
let flash = getFlashMessageAt(0, this);
189-
let actualOptions = getProperties(flash, 'fixed', 'sticky', 'timeout', 'type');
190-
let expectedOptions = { fixed: true, sticky: false, timeout: 5000, type: 'danger' };
191-
assert.deepEqual(actualOptions, expectedOptions, 'Proper message was set');
192-
193-
assert.ok(flash.message.indexOf(selectedCategory.name) !== -1, 'Message text includes the category name');
194-
195-
done();
196-
});
164+
assert.equal(getFlashMessageCount(this), 1, 'One message is shown.');
165+
let flash = getFlashMessageAt(0, this);
166+
let actualOptions = getProperties(flash, 'fixed', 'sticky', 'timeout', 'type');
167+
let expectedOptions = { fixed: true, sticky: false, timeout: 5000, type: 'danger' };
168+
assert.deepEqual(actualOptions, expectedOptions, 'Proper message was set');
169+
assert.ok(flash.message.indexOf(selectedCategory.name) !== -1, 'Message text includes the category name');
197170
});
198171

199-
test('it sets and unsets loading state when adding', function(assert) {
200-
let done = assert.async();
201-
172+
test('it sets and unsets loading state when adding', async function(assert) {
202173
assert.expect(2);
203174

204175
stubService(this, 'user-categories', mockUserCategoriesService);
205176
this.set('category', unselectedCategory);
206177

207178
renderPage();
208179

209-
page.button.click();
180+
let result = page.button.click();
210181

211182
assert.ok(page.button.spinning, 'Button is rendering as busy.');
212183

213-
wait().then(() => {
214-
assert.ok(page.button.checked, 'Operation worked. Button is rendered as checked.');
215-
done();
216-
});
217-
});
184+
await result;
218185

219-
test('it sets and unsets loading state when removing', function(assert) {
220-
let done = assert.async();
186+
assert.ok(page.button.checked, 'Operation worked. Button is rendered as checked.');
187+
});
221188

189+
test('it sets and unsets loading state when removing', async function(assert) {
222190
assert.expect(2);
223191

224192
stubService(this, 'user-categories', mockUserCategoriesService);
225193
this.set('category', selectedCategory);
226194

227195
renderPage();
228196

229-
page.button.click();
197+
let result = page.button.click();
230198

231199
assert.ok(page.button.spinning, 'Button is rendering as busy.');
232200

233-
wait().then(() => {
234-
assert.ok(page.button.unchecked, 'Operation worked. Button is rendered as unchecked.');
235-
done();
236-
});
201+
await result;
202+
203+
assert.ok(page.button.unchecked, 'Operation worked. Button is rendered as unchecked.');
237204
});

0 commit comments

Comments
 (0)