@@ -18,6 +18,7 @@ import com.amazon.connect.chat.sdk.provider.ConnectionDetailsProvider
18
18
import com.amazonaws.regions.Regions
19
19
import com.amazonaws.services.connectparticipant.model.DisconnectParticipantResult
20
20
import com.amazonaws.services.connectparticipant.model.GetTranscriptResult
21
+ import com.amazonaws.services.connectparticipant.model.Item
21
22
import com.amazonaws.services.connectparticipant.model.ScanDirection
22
23
import com.amazonaws.services.connectparticipant.model.SendEventResult
23
24
import com.amazonaws.services.connectparticipant.model.SendMessageResult
@@ -48,6 +49,12 @@ import org.robolectric.RobolectricTestRunner
48
49
import io.mockk.every
49
50
import io.mockk.mockkStatic
50
51
import io.mockk.unmockkStatic
52
+ import junit.framework.TestCase.fail
53
+ import kotlinx.coroutines.Dispatchers
54
+ import kotlinx.coroutines.test.StandardTestDispatcher
55
+ import kotlinx.coroutines.test.advanceUntilIdle
56
+ import kotlinx.coroutines.test.setMain
57
+ import org.mockito.kotlin.any
51
58
import java.util.UUID
52
59
import java.net.URL
53
60
@@ -76,18 +83,20 @@ class ChatServiceImplTest {
76
83
@Mock
77
84
private lateinit var messageReceiptsManager: MessageReceiptsManager
78
85
79
- private lateinit var chatService: ChatService
86
+ private lateinit var chatService: ChatServiceImpl
80
87
private lateinit var eventSharedFlow: MutableSharedFlow <ChatEvent >
81
88
private lateinit var transcriptSharedFlow: MutableSharedFlow <TranscriptItem >
82
89
private lateinit var chatSessionStateFlow: MutableStateFlow <Boolean >
83
90
private lateinit var transcriptListSharedFlow: MutableSharedFlow <List <TranscriptItem >>
84
91
private lateinit var newWsUrlFlow: MutableSharedFlow <Unit >
85
92
86
93
private val mockUri: Uri = Uri .parse(" https://example.com/dummy.pdf" )
94
+ private val testDispatcher = StandardTestDispatcher ()
87
95
88
96
@Before
89
97
fun setUp () {
90
98
MockitoAnnotations .openMocks(this )
99
+ Dispatchers .setMain(testDispatcher)
91
100
92
101
eventSharedFlow = MutableSharedFlow ()
93
102
transcriptSharedFlow = MutableSharedFlow ()
@@ -510,6 +519,48 @@ class ChatServiceImplTest {
510
519
verify(awsClient).getTranscript(anyOrNull())
511
520
}
512
521
522
+ private fun createMockItem (id : String , timestamp : String ): Item {
523
+ val item = Item ()
524
+ item.absoluteTime = timestamp
525
+ item.content = " test${id} "
526
+ item.contentType = " text/plain"
527
+ item.id = id
528
+ item.type = " MESSAGE"
529
+ item.participantId = id
530
+ item.displayName = " test${id} "
531
+ item.participantRole = " CUSTOMER"
532
+ return item
533
+ }
534
+
535
+ @Test
536
+ fun test_fetchReconnectedTranscript_success () = runTest {
537
+ val chatDetails = ChatDetails (participantToken = " token" )
538
+ val mockConnectionDetails = createMockConnectionDetails(" valid_token" )
539
+ `when `(connectionDetailsProvider.getConnectionDetails()).thenReturn(mockConnectionDetails)
540
+ chatService.createChatSession(chatDetails)
541
+ advanceUntilIdle()
542
+
543
+ // Create a mock GetTranscriptResult and configure it to return expected values
544
+ val mockGetTranscriptResult = mock<GetTranscriptResult >()
545
+
546
+ `when `(mockGetTranscriptResult.initialContactId).thenReturn(" " )
547
+ `when `(awsClient.getTranscript(anyOrNull())).thenReturn(Result .success(mockGetTranscriptResult))
548
+
549
+ // Add items to the internal transcript and emit reconnection event.
550
+ // This scenario should call getTranscript once since the empty transcript response.
551
+ `when `(mockGetTranscriptResult.transcript).thenReturn(listOf ())
552
+ `when `(mockGetTranscriptResult.nextToken).thenReturn(" nextToken1" )
553
+
554
+ val transcriptItem1 = Message (id = " 1" , timeStamp = " 2024-01-01T00:00:00Z" , participant = " user" , contentType = " text/plain" , text = " Hello" )
555
+ val transcriptItem2 = Message (id = " 2" , timeStamp = " 2025-01-01T00:01:00Z" , participant = " agent" , contentType = " text/plain" , text = " Hi" )
556
+ chatService.internalTranscript.add(transcriptItem1)
557
+ chatService.internalTranscript.add(transcriptItem2)
558
+ val chatEvent = ChatEvent .ConnectionReEstablished
559
+ eventSharedFlow.emit(chatEvent)
560
+ advanceUntilIdle()
561
+ verify(awsClient, times(1 )).getTranscript(anyOrNull())
562
+ }
563
+
513
564
@Test
514
565
fun test_sendMessageReceipt_success () = runTest {
515
566
val messageId = " messageId123"
@@ -615,15 +666,15 @@ class ChatServiceImplTest {
615
666
// Add message in internal transcript
616
667
val transcriptItem = Message (id = " 1" , timeStamp = " mockedTimestamp" , participant = " user" ,
617
668
contentType = " text/plain" , text = " Hello" )
618
- ( chatService as ChatServiceImpl ) .internalTranscript.add(0 , transcriptItem)
669
+ chatService.internalTranscript.add(0 , transcriptItem)
619
670
620
671
// Execute reset
621
672
chatService.reset()
622
673
623
674
// Validate that websocket disconnected, tokens are reset and internal transcript is deleted
624
675
verify(webSocketManager).disconnect(" Resetting ChatService" )
625
676
verify(connectionDetailsProvider).reset()
626
- assertEquals(0 , ( chatService as ChatServiceImpl ) .internalTranscript.size)
677
+ assertEquals(0 , chatService.internalTranscript.size)
627
678
}
628
679
629
680
private fun createMockConnectionDetails (token : String ): ConnectionDetails {
0 commit comments