@@ -12,107 +12,130 @@ describe('remote-input', function() {
1212 } )
1313
1414 describe ( 'after tree insertion' , function ( ) {
15+ let remoteInput
16+ let input
17+ let results
18+
1519 beforeEach ( function ( ) {
1620 document . body . innerHTML = `
1721 <remote-input aria-owns="results" src="/results">
1822 <input>
1923 </remote-input>
2024 <div id="results"></div>
2125 `
26+ remoteInput = document . querySelector ( 'remote-input' )
27+ input = remoteInput . querySelector ( 'input' )
28+ results = document . querySelector ( '#results' )
2229 } )
2330
2431 afterEach ( function ( ) {
2532 document . body . innerHTML = ''
33+ remoteInput = null
34+ input = null
35+ results = null
2636 } )
2737
28- it ( 'loads content' , function ( done ) {
29- const remoteInput = document . querySelector ( 'remote-input' )
30- const input = document . querySelector ( 'input' )
31- const results = document . querySelector ( '#results' )
38+ it ( 'emits network events in order' , async function ( ) {
39+ const events = [ ]
40+ const track = event => events . push ( event . type )
41+
42+ remoteInput . addEventListener ( 'loadstart' , track )
43+ remoteInput . addEventListener ( 'load' , track )
44+ remoteInput . addEventListener ( 'loadend' , track )
45+
46+ const completed = Promise . all ( [
47+ once ( remoteInput , 'loadstart' ) ,
48+ once ( remoteInput , 'load' ) ,
49+ once ( remoteInput , 'loadend' )
50+ ] )
51+ changeValue ( input , 'test' )
52+ await completed
53+
54+ assert . deepEqual ( [ 'loadstart' , 'load' , 'loadend' ] , events )
55+ } )
56+
57+ it ( 'loads content' , async function ( ) {
3258 assert . equal ( results . innerHTML , '' )
33- let successEvent = false
34- remoteInput . addEventListener ( 'remote-input-success' , function ( ) {
35- successEvent = true
36- } )
37- remoteInput . addEventListener ( 'loadend' , function ( ) {
38- assert . ok ( successEvent , 'success event happened' )
39- assert . equal ( results . querySelector ( 'ol' ) . getAttribute ( 'data-src' ) , '/results?q=test' )
40- done ( )
41- } )
42- input . value = 'test'
43- input . focus ( )
59+
60+ const success = once ( remoteInput , 'remote-input-success' )
61+ const loadend = once ( remoteInput , 'loadend' )
62+
63+ changeValue ( input , 'test' )
64+
65+ await success
66+ await loadend
67+ assert . equal ( results . querySelector ( 'ol' ) . getAttribute ( 'data-src' ) , '/results?q=test' )
4468 } )
4569
46- it ( 'handles not ok responses' , function ( done ) {
47- const remoteInput = document . querySelector ( 'remote-input' )
48- const input = document . querySelector ( 'input' )
49- const results = document . querySelector ( '#results' )
70+ it ( 'handles not ok responses' , async function ( ) {
5071 remoteInput . src = '/500'
5172 assert . equal ( results . innerHTML , '' )
52- let errorEvent = false
53- remoteInput . addEventListener ( 'remote-input-error' , function ( ) {
54- errorEvent = true
55- } )
56- remoteInput . addEventListener ( 'loadend' , function ( ) {
57- assert . ok ( errorEvent , 'error event happened' )
58- assert . equal ( results . innerHTML , '' , 'nothing was appended' )
59- done ( )
60- } )
61- input . value = 'test'
62- input . focus ( )
73+
74+ const error = once ( remoteInput , 'remote-input-error' )
75+ const loadend = once ( remoteInput , 'loadend' )
76+
77+ changeValue ( input , 'test' )
78+
79+ await loadend
80+ await error
81+
82+ assert . equal ( results . innerHTML , '' , 'nothing was appended' )
6383 } )
6484
65- it ( 'handles network error' , function ( done ) {
66- const remoteInput = document . querySelector ( 'remote-input' )
67- const input = document . querySelector ( 'input' )
68- const results = document . querySelector ( '#results' )
85+ it ( 'handles network error' , async function ( ) {
6986 remoteInput . src = '/network-error'
7087 assert . equal ( results . innerHTML , '' )
71- remoteInput . addEventListener ( 'error' , async function ( ) {
72- await Promise . resolve ( )
73- assert . equal ( results . innerHTML , '' , 'nothing was appended' )
74- assert . notOk ( remoteInput . hasAttribute ( 'loading' ) , 'loading attribute was removed' )
75- done ( )
76- } )
77- input . value = 'test'
78- input . focus ( )
79- assert . ok ( remoteInput . hasAttribute ( 'loading' ) , 'loading attribute was added' )
88+
89+ const result = once ( remoteInput , 'error' )
90+
91+ changeValue ( input , 'test' )
92+ assert . ok ( remoteInput . hasAttribute ( 'loading' ) , 'loading attribute should have been added' )
93+
94+ await result
95+ await nextTick ( )
96+ assert . equal ( results . innerHTML , '' , 'nothing was appended' )
97+ assert . notOk ( remoteInput . hasAttribute ( 'loading' ) , 'loading attribute should have been removed' )
8098 } )
8199
82- it ( 'repects param attribute' , function ( done ) {
83- const remoteInput = document . querySelector ( 'remote-input' )
84- const input = document . querySelector ( 'input' )
85- const results = document . querySelector ( '#results' )
100+ it ( 'repects param attribute' , async function ( ) {
86101 remoteInput . setAttribute ( 'param' , 'robot' )
87102 assert . equal ( results . innerHTML , '' )
88- remoteInput . addEventListener ( 'loadend' , function ( ) {
89- assert . equal ( results . querySelector ( 'ol' ) . getAttribute ( 'data-src' ) , '/results?robot=test' )
90- done ( )
91- } )
92- input . value = 'test'
93- input . focus ( )
103+
104+ const result = once ( remoteInput , 'remote-input-success' )
105+
106+ changeValue ( input , 'test' )
107+
108+ await result
109+ assert . equal ( results . querySelector ( 'ol' ) . getAttribute ( 'data-src' ) , '/results?robot=test' )
94110 } )
95111
96- it ( 'loads content again after src is changed' , function ( done ) {
97- const remoteInput = document . querySelector ( 'remote-input' )
98- const input = document . querySelector ( 'input' )
99- const results = document . querySelector ( '#results' )
100-
101- function listenOnce ( cb ) {
102- remoteInput . addEventListener ( 'loadend' , cb , { once : true } )
103- }
104- listenOnce ( function ( ) {
105- assert . equal ( results . querySelector ( 'ol' ) . getAttribute ( 'data-src' ) , '/results?q=test' )
106-
107- listenOnce ( function ( ) {
108- assert . equal ( results . querySelector ( 'ol' ) . getAttribute ( 'data-src' ) , '/srcChanged?q=test' )
109- done ( )
110- } )
111-
112- remoteInput . src = '/srcChanged'
113- } )
114- input . value = 'test'
115- input . focus ( )
112+ it ( 'loads content again after src is changed' , async function ( ) {
113+ const result1 = once ( remoteInput , 'remote-input-success' )
114+ changeValue ( input , 'test' )
115+
116+ await result1
117+ assert . equal ( results . querySelector ( 'ol' ) . getAttribute ( 'data-src' ) , '/results?q=test' )
118+
119+ const result2 = once ( remoteInput , 'remote-input-success' )
120+ remoteInput . src = '/srcChanged'
121+
122+ await result2
123+ assert . equal ( results . querySelector ( 'ol' ) . getAttribute ( 'data-src' ) , '/srcChanged?q=test' )
116124 } )
117125 } )
118126} )
127+
128+ function changeValue ( input , value ) {
129+ input . value = value
130+ input . dispatchEvent ( new Event ( 'change' ) )
131+ }
132+
133+ function nextTick ( ) {
134+ return Promise . resolve ( )
135+ }
136+
137+ function once ( element , eventName ) {
138+ return new Promise ( resolve => {
139+ element . addEventListener ( eventName , resolve , { once : true } )
140+ } )
141+ }
0 commit comments