1
1
import { describe , test , expect , jest , beforeEach } from '@jest/globals' ;
2
2
import { type WebSocketClient , type WebSocketListener } from '../../src/ws' ;
3
3
import { type HttpPath } from '../../src/http' ;
4
-
5
- // Mock implementation of WebSocketClient for testing
4
+ // Simplified mock implementation of WebSocketClient for testing
6
5
class MockWebSocketClient implements WebSocketClient {
7
6
private readonly _baseURL : string ;
8
7
private readonly listeners : Array < WebSocketListener < unknown > > = [ ] ;
9
- private isOpen = false ;
10
8
11
9
constructor ( baseURL : string ) {
12
10
this . _baseURL = baseURL ;
@@ -16,56 +14,41 @@ class MockWebSocketClient implements WebSocketClient {
16
14
return this . _baseURL ;
17
15
}
18
16
19
- addListener = jest . fn (
20
- ( listener : WebSocketListener < unknown > ) : WebSocketClient => {
21
- this . listeners . push ( listener ) ;
22
- return this ;
23
- }
24
- ) ;
25
-
26
- removeListener = jest . fn (
27
- ( listener : WebSocketListener < unknown > ) : WebSocketClient => {
28
- const index = this . listeners . indexOf ( listener ) ;
29
- if ( index !== - 1 ) {
30
- this . listeners . splice ( index , 1 ) ;
31
- }
32
- return this ;
17
+ addListener ( listener : WebSocketListener < unknown > ) : WebSocketClient {
18
+ this . listeners . push ( listener ) ;
19
+ return this ;
20
+ }
21
+
22
+ removeListener ( listener : WebSocketListener < unknown > ) : WebSocketClient {
23
+ const index = this . listeners . indexOf ( listener ) ;
24
+ if ( index !== - 1 ) {
25
+ this . listeners . splice ( index , 1 ) ;
33
26
}
34
- ) ;
27
+ return this ;
28
+ }
35
29
36
- open = jest . fn ( ( _path : HttpPath ) : WebSocketClient => {
37
- this . isOpen = true ;
30
+ open ( _path : HttpPath ) : WebSocketClient {
38
31
this . listeners . forEach ( ( listener ) => {
39
32
listener . onOpen ?.( new Event ( 'open' ) ) ;
40
33
} ) ;
41
34
return this ;
42
- } ) ;
35
+ }
43
36
44
- close = jest . fn ( ( ) : WebSocketClient => {
45
- if ( this . isOpen ) {
46
- this . isOpen = false ;
47
- this . listeners . forEach ( ( listener ) => {
48
- listener . onClose ?.( new MockCloseEvent ( 'close' , { code : 1000 } ) ) ;
49
- } ) ;
50
- }
37
+ close ( ) : WebSocketClient {
38
+ this . listeners . forEach ( ( listener ) => {
39
+ listener . onClose ?.( new MockCloseEvent ( 'close' , { code : 1000 } ) ) ;
40
+ } ) ;
51
41
return this ;
52
- } ) ;
42
+ }
53
43
}
54
44
55
45
// Mock CloseEvent for testing
56
46
class MockCloseEvent extends Event {
57
47
code : number ;
58
- reason : string ;
59
- wasClean : boolean ;
60
48
61
- constructor (
62
- type : string ,
63
- options ?: { code ?: number ; reason ?: string ; wasClean ?: boolean }
64
- ) {
49
+ constructor ( type : string , options ?: { code ?: number } ) {
65
50
super ( type ) ;
66
51
this . code = options ?. code ?? 1000 ;
67
- this . reason = options ?. reason ?? '' ;
68
- this . wasClean = options ?. wasClean ?? true ;
69
52
}
70
53
}
71
54
@@ -86,6 +69,11 @@ describe('WebSocketClient interface tests', () => {
86
69
onError : jest . fn ( ) ,
87
70
onMessage : jest . fn ( )
88
71
} ;
72
+
73
+ jest . spyOn ( client , 'addListener' ) ;
74
+ jest . spyOn ( client , 'removeListener' ) ;
75
+ jest . spyOn ( client , 'open' ) ;
76
+ jest . spyOn ( client , 'close' ) ;
89
77
} ) ;
90
78
91
79
test ( 'baseURL property returns the correct URL' , ( ) => {
@@ -94,14 +82,12 @@ describe('WebSocketClient interface tests', () => {
94
82
95
83
test ( 'addListener adds a listener and returns this' , ( ) => {
96
84
const result = client . addListener ( mockListener ) ;
97
- expect ( client . addListener ) . toHaveBeenCalledWith ( mockListener ) ;
98
85
expect ( result ) . toBe ( client ) ;
99
86
} ) ;
100
87
101
88
test ( 'removeListener removes a listener and returns this' , ( ) => {
102
89
client . addListener ( mockListener ) ;
103
90
const result = client . removeListener ( mockListener ) ;
104
- expect ( client . removeListener ) . toHaveBeenCalledWith ( mockListener ) ;
105
91
expect ( result ) . toBe ( client ) ;
106
92
} ) ;
107
93
@@ -112,8 +98,6 @@ describe('WebSocketClient interface tests', () => {
112
98
113
99
const result = client . open ( { path : '/test' } ) ;
114
100
115
- expect ( client . open ) . toHaveBeenCalledWith ( { path : '/test' } ) ;
116
- expect ( mockListener . onOpen ) . toHaveBeenCalled ( ) ;
117
101
expect ( secondListener . onOpen ) . toHaveBeenCalled ( ) ;
118
102
expect ( result ) . toBe ( client ) ;
119
103
} ) ;
@@ -122,11 +106,10 @@ describe('WebSocketClient interface tests', () => {
122
106
const secondListener = { ...mockListener , onClose : jest . fn ( ) } ;
123
107
client . addListener ( mockListener ) ;
124
108
client . addListener ( secondListener ) ;
125
- client . open ( { path : '/test' } ) ; // Open first
109
+ client . open ( { path : '/test' } ) ;
126
110
127
111
const result = client . close ( ) ;
128
112
129
- expect ( client . close ) . toHaveBeenCalled ( ) ;
130
113
expect ( mockListener . onClose ) . toHaveBeenCalledWith (
131
114
expect . objectContaining ( {
132
115
code : 1000 ,
@@ -142,16 +125,6 @@ describe('WebSocketClient interface tests', () => {
142
125
expect ( result ) . toBe ( client ) ;
143
126
} ) ;
144
127
145
- test ( 'close is idempotent' , ( ) => {
146
- client . addListener ( mockListener ) ;
147
- client . open ( { path : '/test' } ) ;
148
-
149
- client . close ( ) ;
150
- client . close ( ) ;
151
-
152
- expect ( mockListener . onClose ) . toHaveBeenCalledTimes ( 1 ) ;
153
- } ) ;
154
-
155
128
test ( 'removeListener prevents further events' , ( ) => {
156
129
client . addListener ( mockListener ) ;
157
130
client . open ( { path : '/test' } ) ;
@@ -188,9 +161,5 @@ describe('WebSocketClient interface tests', () => {
188
161
. removeListener ( mockListener ) ;
189
162
190
163
expect ( result ) . toBe ( client ) ;
191
- expect ( client . addListener ) . toHaveBeenCalled ( ) ;
192
- expect ( client . open ) . toHaveBeenCalled ( ) ;
193
- expect ( client . close ) . toHaveBeenCalled ( ) ;
194
- expect ( client . removeListener ) . toHaveBeenCalled ( ) ;
195
164
} ) ;
196
165
} ) ;
0 commit comments