1+ package io .sentrius .sso .service ;
2+
3+ import org .junit .jupiter .api .BeforeEach ;
4+ import org .junit .jupiter .api .Test ;
5+ import org .junit .jupiter .api .extension .ExtendWith ;
6+ import org .mockito .Mock ;
7+ import org .mockito .junit .jupiter .MockitoExtension ;
8+ import org .springframework .web .reactive .socket .WebSocketSession ;
9+ import org .springframework .web .reactive .socket .HandshakeInfo ;
10+
11+ import java .net .InetSocketAddress ;
12+ import java .sql .Timestamp ;
13+ import java .util .List ;
14+ import java .util .Map ;
15+
16+ import static org .junit .jupiter .api .Assertions .*;
17+ import static org .mockito .Mockito .*;
18+
19+ @ ExtendWith (MockitoExtension .class )
20+ class ActiveWebSocketSessionManagerTest {
21+
22+ @ Mock
23+ private WebSocketSession webSocketSession ;
24+
25+ @ Mock
26+ private HandshakeInfo handshakeInfo ;
27+
28+ private ActiveWebSocketSessionManager sessionManager ;
29+
30+ @ BeforeEach
31+ void setUp () {
32+ sessionManager = new ActiveWebSocketSessionManager ();
33+ }
34+
35+ @ Test
36+ void testRegisterAndUnregisterSession () {
37+ // Given
38+ String sessionId = "test-session-1" ;
39+ when (webSocketSession .getId ()).thenReturn (sessionId );
40+ when (webSocketSession .isOpen ()).thenReturn (true );
41+ when (webSocketSession .getHandshakeInfo ()).thenReturn (handshakeInfo );
42+ when (handshakeInfo .getRemoteAddress ()).thenReturn (new InetSocketAddress ("127.0.0.1" , 8080 ));
43+
44+ // When - register session
45+ sessionManager .register (sessionId , webSocketSession );
46+
47+ // Then - session should be active
48+ assertEquals (webSocketSession , sessionManager .get (sessionId ));
49+ assertEquals (1 , sessionManager .getActiveSessions ().size ());
50+ assertEquals (0 , sessionManager .getAgentSessionDurations ().size ());
51+
52+ // When - unregister session
53+ sessionManager .unregister (sessionId );
54+
55+ // Then - session should be removed and duration recorded
56+ assertNull (sessionManager .get (sessionId ));
57+ assertEquals (0 , sessionManager .getActiveSessions ().size ());
58+ assertEquals (1 , sessionManager .getAgentSessionDurations ().size ());
59+
60+ // Verify session duration data
61+ List <Map <String , Object >> completedSessions = sessionManager .getAgentSessionDurations ();
62+ Map <String , Object > sessionData = completedSessions .get (0 );
63+ assertEquals (sessionId , sessionData .get ("sessionId" ));
64+ assertEquals ("agent" , sessionData .get ("sessionType" ));
65+ assertNotNull (sessionData .get ("startTime" ));
66+ assertNotNull (sessionData .get ("endTime" ));
67+ assertNotNull (sessionData .get ("durationMinutes" ));
68+ assertTrue ((Long ) sessionData .get ("durationMinutes" ) >= 0 );
69+ }
70+
71+ @ Test
72+ void testGetActiveAgentSessionDurations () throws InterruptedException {
73+ // Given
74+ String sessionId = "active-session-1" ;
75+
76+ // When
77+ sessionManager .register (sessionId , webSocketSession );
78+
79+ // Wait a moment to ensure some time passes
80+ Thread .sleep (100 );
81+
82+ // Then
83+ List <Map <String , Object >> activeSessions = sessionManager .getActiveAgentSessionDurations ();
84+ assertEquals (1 , activeSessions .size ());
85+
86+ Map <String , Object > activeSession = activeSessions .get (0 );
87+ assertEquals (sessionId , activeSession .get ("sessionId" ));
88+ assertEquals ("agent" , activeSession .get ("sessionType" ));
89+ assertEquals (true , activeSession .get ("active" ));
90+ assertNotNull (activeSession .get ("startTime" ));
91+ assertNotNull (activeSession .get ("durationMinutes" ));
92+ assertTrue ((Long ) activeSession .get ("durationMinutes" ) >= 0 );
93+ }
94+
95+ @ Test
96+ void testMultipleSessionsHandling () {
97+ // Given
98+ String sessionId1 = "session-1" ;
99+ String sessionId2 = "session-2" ;
100+ WebSocketSession session1 = mock (WebSocketSession .class );
101+ WebSocketSession session2 = mock (WebSocketSession .class );
102+
103+ when (session1 .getId ()).thenReturn (sessionId1 );
104+ when (session1 .isOpen ()).thenReturn (true );
105+ when (session1 .getHandshakeInfo ()).thenReturn (handshakeInfo );
106+ when (session2 .getId ()).thenReturn (sessionId2 );
107+ when (session2 .isOpen ()).thenReturn (true );
108+ when (session2 .getHandshakeInfo ()).thenReturn (handshakeInfo );
109+ when (handshakeInfo .getRemoteAddress ()).thenReturn (new InetSocketAddress ("127.0.0.1" , 8080 ));
110+
111+ // When
112+ sessionManager .register (sessionId1 , session1 );
113+ sessionManager .register (sessionId2 , session2 );
114+
115+ // Then
116+ assertEquals (2 , sessionManager .getActiveSessions ().size ());
117+ assertEquals (2 , sessionManager .getActiveAgentSessionDurations ().size ());
118+
119+ // When - unregister one session
120+ sessionManager .unregister (sessionId1 );
121+
122+ // Then
123+ assertEquals (1 , sessionManager .getActiveSessions ().size ());
124+ assertEquals (1 , sessionManager .getActiveAgentSessionDurations ().size ());
125+ assertEquals (1 , sessionManager .getAgentSessionDurations ().size ());
126+ }
127+
128+ @ Test
129+ void testUnregisterNonExistentSession () {
130+ // Given
131+ String nonExistentSessionId = "non-existent" ;
132+
133+ // When
134+ sessionManager .unregister (nonExistentSessionId );
135+
136+ // Then - should not throw exception and should not affect other data
137+ assertEquals (0 , sessionManager .getActiveSessions ().size ());
138+ assertEquals (0 , sessionManager .getAgentSessionDurations ().size ());
139+ assertEquals (0 , sessionManager .getActiveAgentSessionDurations ().size ());
140+ }
141+ }
0 commit comments