@@ -12,107 +12,130 @@ describe('remote-input', function() {
12
12
} )
13
13
14
14
describe ( 'after tree insertion' , function ( ) {
15
+ let remoteInput
16
+ let input
17
+ let results
18
+
15
19
beforeEach ( function ( ) {
16
20
document . body . innerHTML = `
17
21
<remote-input aria-owns="results" src="/results">
18
22
<input>
19
23
</remote-input>
20
24
<div id="results"></div>
21
25
`
26
+ remoteInput = document . querySelector ( 'remote-input' )
27
+ input = remoteInput . querySelector ( 'input' )
28
+ results = document . querySelector ( '#results' )
22
29
} )
23
30
24
31
afterEach ( function ( ) {
25
32
document . body . innerHTML = ''
33
+ remoteInput = null
34
+ input = null
35
+ results = null
26
36
} )
27
37
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 ( ) {
32
58
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' )
44
68
} )
45
69
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 ( ) {
50
71
remoteInput . src = '/500'
51
72
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' )
63
83
} )
64
84
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 ( ) {
69
86
remoteInput . src = '/network-error'
70
87
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' )
80
98
} )
81
99
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 ( ) {
86
101
remoteInput . setAttribute ( 'param' , 'robot' )
87
102
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' )
94
110
} )
95
111
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' )
116
124
} )
117
125
} )
118
126
} )
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