Skip to content

Commit 1ae93b1

Browse files
committed
Rendering tests are best for testing reactivity
1 parent 3eb2ec1 commit 1ae93b1

File tree

3 files changed

+64
-35
lines changed

3 files changed

+64
-35
lines changed

reactiveweb/src/debounce.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,15 @@ export function debounce<Value = unknown>(ms: number, thunk: () => Value) {
6767

6868
lastValue = thunk();
6969

70-
on.cleanup(() => timer && clearTimeout(timer));
71-
timer = setTimeout(() => (state.value = lastValue), ms);
70+
on.cleanup(() => {
71+
if (timer) {
72+
clearTimeout(timer)
73+
}
74+
});
75+
76+
timer = setTimeout(() => {
77+
state.value = lastValue;
78+
}, ms);
7279

7380
return () => state.value;
7481
});

tests/test-app/tests/utils/debounce/js-test.ts

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -33,38 +33,5 @@ module('Utils | debounce | js', function (hooks) {
3333

3434
assert.strictEqual(test.debouncedValue, test.value, `Value is "${test.debouncedValue}" after ~100ms`);
3535
});
36-
37-
test('value is returned x ms after latest change', async function (assert) {
38-
class Test {
39-
@tracked value = 'initial';
40-
41-
@use debouncedValue = debounce(100, () => this.value);
42-
}
43-
44-
let test = new Test();
45-
46-
setOwner(test, this.owner);
47-
48-
assert.strictEqual(test.debouncedValue, undefined, 'Value is undefined at first');
49-
50-
await timeout(50);
51-
52-
assert.strictEqual(test.debouncedValue, undefined, 'Value is still undefined after ~50ms');
53-
54-
// Changing the value resets the debounce timer
55-
test.value = 'new';
56-
57-
await timeout(50);
58-
59-
assert.strictEqual(test.debouncedValue, undefined, `Value is still undefined after ~100ms (because we changed something at ~50ms)`);
60-
61-
await timeout(50);
62-
63-
assert.strictEqual(test.debouncedValue, test.value, `Value is "${test.value}" after ~150ms`);
64-
65-
await timeout(50);
66-
67-
assert.strictEqual(test.debouncedValue, test.value, `Value is "${test.value}" after ~200ms`);
68-
});
6936
});
7037
});
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { tracked } from '@glimmer/tracking';
2+
import { setOwner } from '@ember/application';
3+
import { render } from '@ember/test-helpers';
4+
import { module, test } from 'qunit';
5+
import { setupRenderingTest } from 'ember-qunit';
6+
7+
import { use } from 'ember-resources';
8+
import { debounce } from 'reactiveweb/debounce';
9+
10+
module('debounce | rendering', function (hooks) {
11+
setupRenderingTest(hooks);
12+
13+
const timeout = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
14+
15+
test('value is returned *after* delay has passed', async function(assert) {
16+
class Test {
17+
@tracked value = 'initial';
18+
19+
@use debouncedValue = debounce(100, () => this.value);
20+
}
21+
22+
let test = new Test();
23+
24+
setOwner(test, this.owner);
25+
26+
await render(<template><output>{{test.debouncedValue}}</output></template>);
27+
28+
assert.dom('output').hasNoText();
29+
assert.strictEqual(test.debouncedValue, undefined, 'Value is undefined at first');
30+
31+
await timeout(25);
32+
33+
assert.dom('output').hasNoText();
34+
assert.strictEqual(test.debouncedValue, undefined, 'Value is still undefined after ~25ms');
35+
36+
// Changing the value resets the debounce timer
37+
test.value = 'new';
38+
39+
// not quite enough
40+
await timeout(80);
41+
42+
assert.dom('output').hasNoText();
43+
assert.strictEqual(test.debouncedValue, undefined, `Value is still undefined after ~105ms (because we changed something at ~25ms)`);
44+
45+
await timeout(50);
46+
47+
assert.dom('output').hasText('new');
48+
assert.strictEqual(test.debouncedValue, test.value, `Value is "${test.value}" after ~155ms`);
49+
50+
await timeout(50);
51+
52+
assert.dom('output').hasText('new');
53+
assert.strictEqual(test.debouncedValue, test.value, `Value is "${test.value}" after ~205ms`);
54+
});
55+
})

0 commit comments

Comments
 (0)