Skip to content

Commit 4a0502f

Browse files
committed
Adding ember promise tests
1 parent 4a04398 commit 4a0502f

File tree

3 files changed

+275
-4
lines changed

3 files changed

+275
-4
lines changed

addon/components/ui-dropdown.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,7 @@ export default Ember.Component.extend(Base, PromiseResolver, {
6060
if (!this.get('objectMap').hasOwnProperty(guid)) {
6161
this.get('objectMap')[guid] = object;
6262
}
63-
// If selected is already resolved and we have a value now,
64-
// Select it after render
65-
// TODO: HERE
63+
Ember.run.scheduleOnce('afterRender', this, this._inspectSelected);
6664
return guid;
6765
}
6866
},

addon/components/ui-radio.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ export default Ember.Component.extend(Checkbox, PromiseResolver, {
4242
// Or wait for them to resolve
4343
if (isPromise(value) || isPromise(current)) {
4444

45+
// This code is probably overkill, but i wanted to ensure that
46+
// if the promises are resolved we render as soon as possible instead of waiting
47+
// for the hash to resolve each time
4548
if (isPromise(value)) {
4649
if (!isFulfilled(value)) {
4750
return this.resolvePromise(Ember.RSVP.hash({ value, current }), this._checkValueAndCurrent);

tests/integration/components/ui-dropdown-test.js

Lines changed: 271 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import Ember from 'ember';
22
import { moduleForComponent, test } from 'ember-qunit';
33
import hbs from 'htmlbars-inline-precompile';
4+
import afterRender from 'dummy/tests/helpers/after-render';
45

56
moduleForComponent('ui-dropdown', 'Integration | Component | ui dropdown', {
67
integration: true
@@ -845,4 +846,273 @@ test('The correct number of items get selected when array bindings is modified',
845846
assert.ok(this.$('.item[data-id=4]').hasClass('active'));
846847
assert.equal(this.get('selected').join(','), [numbers[1], numbers[3]].join(','));
847848
assert.equal(count, 0, 'onChange should not have been called');
848-
});
849+
});
850+
851+
// Add selected deferred test
852+
test('it renders and selects the correct item after promise resolves', function(assert) {
853+
assert.expect(5);
854+
855+
let count = 0;
856+
this.set('changed', (value) => {
857+
this.set('selected', value);
858+
count++;
859+
});
860+
861+
let deferred = Ember.RSVP.defer();
862+
863+
this.set('selected', deferred.promise);
864+
865+
this.set('people', [ "Sherlock Homes", "Patrick Bateman" ]);
866+
this.render(hbs`
867+
{{#ui-dropdown selected=selected onChange=(action changed)}}
868+
<div class='menu'>
869+
{{#each people as |person|}}
870+
<div class='item' data-value={{person}}>{{person}}</div>
871+
{{/each}}
872+
</div>
873+
{{/ui-dropdown}}
874+
`);
875+
876+
assert.equal(this.$('.item').length, 2);
877+
assert.equal(this.$('.item.active').length, 0);
878+
879+
deferred.resolve('Patrick Bateman');
880+
881+
return afterRender(deferred.promise).then(() => {
882+
assert.equal(this.$('.item.active').length, 1);
883+
assert.equal(this.$('.item.active').text(), 'Patrick Bateman');
884+
assert.equal(count, 0, 'onChange should not have been called');
885+
});
886+
});
887+
888+
// Add selected deferred test
889+
test('it renders and selects the correct item from resolved promise', function(assert) {
890+
assert.expect(4);
891+
892+
let count = 0;
893+
this.set('changed', (value) => {
894+
this.set('selected', value);
895+
count++;
896+
});
897+
898+
let deferred = Ember.RSVP.defer();
899+
900+
deferred.resolve('Patrick Bateman');
901+
902+
this.set('selected', deferred.promise);
903+
904+
this.set('people', [ "Sherlock Homes", "Patrick Bateman" ]);
905+
this.render(hbs`
906+
{{#ui-dropdown selected=selected onChange=(action changed)}}
907+
<div class='menu'>
908+
{{#each people as |person|}}
909+
<div class='item' data-value={{person}}>{{person}}</div>
910+
{{/each}}
911+
</div>
912+
{{/ui-dropdown}}
913+
`);
914+
915+
assert.equal(this.$('.item').length, 2);
916+
assert.equal(this.$('.item.active').length, 1);
917+
assert.equal(this.$('.item.active').text(), 'Patrick Bateman');
918+
assert.equal(count, 0, 'onChange should not have been called');
919+
});
920+
921+
// Add map-value promise deferred binding test
922+
test('it renders from a mapper with a promise', function(assert) {
923+
assert.expect(5);
924+
925+
let count = 0;
926+
this.set('changed', (value) => {
927+
this.set('selected', value);
928+
count++;
929+
});
930+
931+
let deferred = Ember.RSVP.defer();
932+
933+
let ObjectPromiseProxy = Ember.ObjectProxy.extend(Ember.PromiseProxyMixin);
934+
let proxy = ObjectPromiseProxy.create({
935+
promise: deferred.promise
936+
});
937+
938+
this.set('people', Ember.A([
939+
{ id: 1, name: "Sherlock Homes" },
940+
proxy
941+
]));
942+
943+
this.set('selected', 'Patrick Bateman');
944+
945+
this.render(hbs`
946+
{{#ui-dropdown selected=selected onChange=(action changed) as |execute mapper|}}
947+
<div class='menu'>
948+
{{#each people as |person|}}
949+
<div class='item' data-value={{map-value mapper person}} data-id={{person.id}}>{{person.name}}</div>
950+
{{/each}}
951+
</div>
952+
{{/ui-dropdown}}
953+
`);
954+
955+
assert.equal(this.$('.item').length, 2, "Right number of items");
956+
assert.equal(this.$('.item.active').length, 0, "Right number of items active");
957+
958+
let deferredValue = { id: 2, name: "Patrick Bateman" };
959+
deferred.resolve(deferredValue);
960+
961+
return afterRender(deferred.promise).then(() => {
962+
assert.equal(this.$('.item.active').length, 1);
963+
assert.equal(this.$('.item.active').text(), 'Patrick Bateman');
964+
assert.equal(count, 0, 'onChange should not have been called');
965+
});
966+
});
967+
968+
test('it renders from a mapper with a promise already completed', function(assert) {
969+
assert.expect(4);
970+
971+
let count = 0;
972+
this.set('changed', (value) => {
973+
this.set('selected', value);
974+
count++;
975+
});
976+
977+
let deferred = Ember.RSVP.defer();
978+
979+
let ObjectPromiseProxy = Ember.ObjectProxy.extend(Ember.PromiseProxyMixin);
980+
let proxy = ObjectPromiseProxy.create({
981+
promise: deferred.promise
982+
});
983+
984+
let deferredValue = { id: 2, name: "Patrick Bateman" };
985+
deferred.resolve(deferredValue);
986+
987+
this.set('people', Ember.A([
988+
{ id: 1, name: "Sherlock Homes" },
989+
proxy
990+
]));
991+
992+
this.set('selected', 'Patrick Bateman');
993+
994+
this.render(hbs`
995+
{{#ui-dropdown selected=selected onChange=(action changed) as |execute mapper|}}
996+
<div class='menu'>
997+
{{#each people as |person|}}
998+
<div class='item' data-value={{map-value mapper person}} data-id={{person.id}}>{{person.name}}</div>
999+
{{/each}}
1000+
</div>
1001+
{{/ui-dropdown}}
1002+
`);
1003+
1004+
assert.equal(this.$('.item').length, 2, "Right number of items");
1005+
return afterRender(deferred.promise).then(() => {
1006+
assert.equal(this.$('.item.active').length, 1, "Right number of items active");
1007+
assert.equal(this.$('.item.active').text(), 'Patrick Bateman');
1008+
assert.equal(count, 0, 'onChange should not have been called');
1009+
});
1010+
});
1011+
1012+
test('it renders from a mapper with a promise and select with a promise, select resolving first', function(assert) {
1013+
assert.expect(6);
1014+
1015+
let count = 0;
1016+
this.set('changed', (value) => {
1017+
this.set('selected', value);
1018+
count++;
1019+
});
1020+
1021+
let deferredMap = Ember.RSVP.defer();
1022+
let deferredSelect = Ember.RSVP.defer();
1023+
1024+
let ObjectPromiseProxy = Ember.ObjectProxy.extend(Ember.PromiseProxyMixin);
1025+
let proxy = ObjectPromiseProxy.create({
1026+
promise: deferredMap.promise
1027+
});
1028+
1029+
this.set('people', Ember.A([
1030+
{ id: 1, name: "Sherlock Homes" },
1031+
proxy
1032+
]));
1033+
1034+
this.set('selected', deferredSelect.promise);
1035+
1036+
this.render(hbs`
1037+
{{#ui-dropdown selected=selected onChange=(action changed) as |execute mapper|}}
1038+
<div class='menu'>
1039+
{{#each people as |person|}}
1040+
<div class='item' data-value={{map-value mapper person}} data-id={{person.id}}>{{person.name}}</div>
1041+
{{/each}}
1042+
</div>
1043+
{{/ui-dropdown}}
1044+
`);
1045+
1046+
assert.equal(this.$('.item').length, 2, "Right number of items");
1047+
assert.equal(this.$('.item.active').length, 0, "Right number of items active");
1048+
1049+
deferredSelect.resolve('Patrick Bateman');
1050+
1051+
return afterRender(deferredSelect.promise).then(() => {
1052+
assert.equal(this.$('.item.active').length, 0, "Right number of items active");
1053+
1054+
let deferredValue = { id: 2, name: "Patrick Bateman" };
1055+
deferredMap.resolve(deferredValue);
1056+
1057+
return afterRender(deferredMap.promise);
1058+
}).then(() => {
1059+
assert.equal(this.$('.item.active').length, 1, "Right number of items active");
1060+
assert.equal(this.$('.item.active').text(), 'Patrick Bateman');
1061+
assert.equal(count, 0, 'onChange should not have been called');
1062+
});
1063+
});
1064+
1065+
test('it renders from a mapper with a promise and select with a promise, mapper resolving first', function(assert) {
1066+
assert.expect(6);
1067+
1068+
let count = 0;
1069+
this.set('changed', (value) => {
1070+
this.set('selected', value);
1071+
count++;
1072+
});
1073+
1074+
let deferredMap = Ember.RSVP.defer();
1075+
let deferredSelect = Ember.RSVP.defer();
1076+
1077+
let ObjectPromiseProxy = Ember.ObjectProxy.extend(Ember.PromiseProxyMixin);
1078+
let proxy = ObjectPromiseProxy.create({
1079+
promise: deferredMap.promise
1080+
});
1081+
1082+
this.set('people', Ember.A([
1083+
{ id: 1, name: "Sherlock Homes" },
1084+
proxy
1085+
]));
1086+
1087+
this.set('selected', deferredSelect.promise);
1088+
1089+
this.render(hbs`
1090+
{{#ui-dropdown selected=selected onChange=(action changed) as |execute mapper|}}
1091+
<div class='menu'>
1092+
{{#each people as |person|}}
1093+
<div class='item' data-value={{map-value mapper person}} data-id={{person.id}}>{{person.name}}</div>
1094+
{{/each}}
1095+
</div>
1096+
{{/ui-dropdown}}
1097+
`);
1098+
1099+
assert.equal(this.$('.item').length, 2, "Right number of items");
1100+
assert.equal(this.$('.item.active').length, 0, "Right number of items active");
1101+
1102+
let deferredValue = { id: 2, name: "Patrick Bateman" };
1103+
deferredMap.resolve(deferredValue);
1104+
1105+
return afterRender(deferredMap.promise).then(() => {
1106+
assert.equal(this.$('.item.active').length, 0, "Right number of items active");
1107+
1108+
deferredSelect.resolve('Patrick Bateman');
1109+
1110+
return afterRender(deferredSelect.promise);
1111+
}).then(() => {
1112+
assert.equal(this.$('.item.active').length, 1, "Right number of items active");
1113+
assert.equal(this.$('.item.active').text(), 'Patrick Bateman');
1114+
assert.equal(count, 0, 'onChange should not have been called');
1115+
});
1116+
});
1117+
1118+

0 commit comments

Comments
 (0)