Skip to content

Commit 02cf1bc

Browse files
authored
De-duplicating SQS messages in message viewer (#2160)
* De-duplicating SQS messages in message viewer * linting * separating out for readability.
1 parent 0ecbee9 commit 02cf1bc

File tree

2 files changed

+35
-13
lines changed

2 files changed

+35
-13
lines changed

jetbrains-core/src/software/aws/toolkits/jetbrains/services/sqs/toolwindow/PollMessagePane.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ class PollMessagePane(
7474
// Make poll a real peek by setting the visibility timout to 0, so messages can be
7575
// requested by other consumers of the queue immediately
7676
it.visibilityTimeout(0)
77-
}.messages()
77+
}.messages().distinctBy { it.messageId() }
7878

7979
polledMessages.forEach {
8080
messagesTable.tableModel.addRow(it)

jetbrains-core/tst/software/aws/toolkits/jetbrains/services/sqs/toolwindow/PollMessagePaneTest.kt

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,21 @@ import software.amazon.awssdk.services.sqs.model.MessageSystemAttributeName
1616
import software.amazon.awssdk.services.sqs.model.QueueAttributeName
1717
import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest
1818
import software.amazon.awssdk.services.sqs.model.ReceiveMessageResponse
19-
import software.aws.toolkits.core.region.AwsRegion
19+
import software.aws.toolkits.core.region.anAwsRegion
20+
import software.aws.toolkits.core.utils.test.aString
2021
import software.aws.toolkits.jetbrains.services.sqs.Queue
2122
import software.aws.toolkits.jetbrains.utils.BaseCoroutineTest
2223
import software.aws.toolkits.jetbrains.utils.waitForModelToBeAtLeast
2324
import software.aws.toolkits.jetbrains.utils.waitForTrue
2425
import software.aws.toolkits.resources.message
2526

2627
class PollMessagePaneTest : BaseCoroutineTest() {
27-
val queue = Queue("https://sqs.us-east-1.amazonaws.com/123456789012/test1", AwsRegion.GLOBAL)
28-
29-
private val message: Message = Message.builder()
30-
.body("ABC")
31-
.messageId("XYZ")
32-
.attributes(mapOf(Pair(MessageSystemAttributeName.SENDER_ID, "1234567890:test1"), Pair(MessageSystemAttributeName.SENT_TIMESTAMP, "111111111")))
33-
.build()
28+
val queue = Queue("https://sqs.us-east-1.amazonaws.com/123456789012/test1", anAwsRegion())
3429

3530
@Test
3631
fun `Message received`() {
3732
val client = mockClientManagerRule.create<SqsClient>()
33+
val message = aMessage()
3834
whenever(client.receiveMessage(Mockito.any<ReceiveMessageRequest>())).thenReturn(
3935
ReceiveMessageResponse.builder().messages(message).build()
4036
)
@@ -45,10 +41,30 @@ class PollMessagePaneTest : BaseCoroutineTest() {
4541
tableModel.waitForModelToBeAtLeast(1)
4642
}
4743

48-
assertThat(tableModel.items.first().messageId()).isEqualTo("XYZ")
49-
assertThat(tableModel.items.first().body()).isEqualTo("ABC")
50-
assertThat(tableModel.items.first().attributes().getValue(MessageSystemAttributeName.SENDER_ID)).isEqualTo("1234567890:test1")
51-
assertThat(tableModel.items.first().attributes().getValue(MessageSystemAttributeName.SENT_TIMESTAMP)).isEqualTo("111111111")
44+
assertThat(tableModel.items.first()).isEqualTo(message)
45+
}
46+
47+
@Test
48+
fun `Messages are de-duplicated by id`() {
49+
val client = mockClientManagerRule.create<SqsClient>()
50+
val message = aMessage()
51+
val anotherMessage = aMessage()
52+
whenever(client.receiveMessage(Mockito.any<ReceiveMessageRequest>())).thenReturn(
53+
ReceiveMessageResponse.builder().messages(
54+
message,
55+
message,
56+
anotherMessage
57+
).build()
58+
)
59+
val pane = PollMessagePane(projectRule.project, client, queue)
60+
val tableModel = pane.messagesTable.tableModel
61+
runBlocking {
62+
pane.requestMessages()
63+
tableModel.waitForModelToBeAtLeast(1)
64+
}
65+
66+
assertThat(tableModel.items).hasSize(2)
67+
assertThat(tableModel.items.map { it.messageId() }).contains(message.messageId(), anotherMessage.messageId())
5268
}
5369

5470
@Test
@@ -108,4 +124,10 @@ class PollMessagePaneTest : BaseCoroutineTest() {
108124

109125
assertThat(pane.messagesAvailableLabel.text).isEqualTo(message("sqs.failed_to_load_total"))
110126
}
127+
128+
private fun aMessage(): Message = Message.builder()
129+
.body(aString())
130+
.messageId(aString())
131+
.attributes(mapOf(Pair(MessageSystemAttributeName.SENDER_ID, "1234567890:test1"), Pair(MessageSystemAttributeName.SENT_TIMESTAMP, "111111111")))
132+
.build()
111133
}

0 commit comments

Comments
 (0)