11import Ember from 'ember' ;
22import { moduleForComponent , test } from 'ember-qunit' ;
33import hbs from 'htmlbars-inline-precompile' ;
4+ import afterRender from 'dummy/tests/helpers/after-render' ;
45
56moduleForComponent ( '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