@@ -51,11 +51,15 @@ void main() {
5151
5252 setUp (() async {
5353 mockServer = await HttpServer .bind ('localhost' , 0 );
54+ WebSocketChannel ? channel;
55+
5456 mockServer.transform (WebSocketTransformer ()).listen ((webSocket) {
55- final channel = IOWebSocketChannel (webSocket);
56- channel.stream.listen ((request) {
57- channel.sink.add (request);
57+ channel = IOWebSocketChannel (webSocket);
58+ channel! .stream.listen ((request) {
59+ channel! .sink.add (request);
5860 });
61+ }, onDone: () {
62+ channel? .sink.close ();
5963 });
6064 });
6165
@@ -170,11 +174,15 @@ void main() {
170174 socket.disconnect ();
171175 });
172176
173- test ('establishes websocket connection with endpoint' , () {
174- socket.connect ();
177+ test ('establishes websocket connection with endpoint' , () async {
178+ final connFuture = socket.connect ();
179+ expect (socket.connState, SocketStates .connecting);
175180
176181 final conn = socket.conn;
177182
183+ await connFuture;
184+ expect (socket.connState, SocketStates .open);
185+
178186 expect (conn, isA <IOWebSocketChannel >());
179187 //! Not verifying connection url
180188 });
@@ -239,9 +247,11 @@ void main() {
239247
240248 test ('removes existing connection' , () async {
241249 await socket.connect ();
250+
251+ expect (socket.conn, isNotNull);
242252 await socket.disconnect ();
243253
244- expect (socket.conn, null );
254+ expect (socket.conn, isNull );
245255 });
246256
247257 test ('calls callback' , () async {
@@ -284,6 +294,36 @@ void main() {
284294 ).called (1 );
285295 });
286296
297+ test ('disconnecting a closed connections stays closed' , () async {
298+ await socket.connect ();
299+ expect (socket.connState, SocketStates .open);
300+ await mockServer.close ();
301+ await Future .delayed (const Duration (milliseconds: 200 ));
302+ expect (socket.connState, SocketStates .closed);
303+ expect (socket.conn, isNotNull);
304+
305+ final disconnectFuture = socket.disconnect ();
306+
307+ // `connState` stays `closed` during disconnect
308+ expect (socket.connState, SocketStates .closed);
309+ await disconnectFuture;
310+ expect (socket.connState, SocketStates .closed);
311+ expect (socket.conn, isNull);
312+ });
313+
314+ test ('disconnecting an open connection' , () async {
315+ await socket.connect ();
316+ expect (socket.connState, SocketStates .open);
317+
318+ final disconnectFuture = socket.disconnect ();
319+
320+ // `connState` stays `closed` during disconnect
321+ expect (socket.connState, SocketStates .disconnecting);
322+ await disconnectFuture;
323+ expect (socket.connState, SocketStates .disconnected);
324+ expect (socket.conn, isNull);
325+ });
326+
287327 test ('does not throw when no connection' , () {
288328 expect (() => socket.disconnect (), returnsNormally);
289329 });
0 commit comments