|
1 | 1 | import type { SNSClient } from '@aws-sdk/client-sns'
|
2 |
| -import type { SQSClient } from '@aws-sdk/client-sqs' |
| 2 | +import { ListQueueTagsCommand, type SQSClient } from '@aws-sdk/client-sqs' |
3 | 3 | import { waitAndRetry } from '@lokalise/node-core'
|
4 | 4 | import {
|
5 | 5 | type SQSMessage,
|
@@ -54,75 +54,149 @@ describe('SnsSqsPermissionConsumer - dead letter queue', () => {
|
54 | 54 | })
|
55 | 55 |
|
56 | 56 | describe('init', () => {
|
| 57 | + const topicName = 'sometopic' |
| 58 | + const queueName = 'myQueue' |
| 59 | + const deadLetterQueueName = 'deadLetterQueue' |
| 60 | + |
| 61 | + beforeEach(async () => { |
| 62 | + await deleteQueue(sqsClient, queueName) |
| 63 | + await deleteQueue(sqsClient, deadLetterQueueName) |
| 64 | + await deleteTopic(snsClient, topicName) |
| 65 | + }) |
| 66 | + |
57 | 67 | it('creates a new dead letter queue', async () => {
|
58 | 68 | const newConsumer = new SnsSqsPermissionConsumer(diContainer.cradle, {
|
59 | 69 | creationConfig: {
|
60 |
| - topic: { Name: 'sometopic' }, |
61 |
| - queue: { QueueName: 'existingQueue' }, |
| 70 | + topic: { Name: topicName }, |
| 71 | + queue: { QueueName: queueName }, |
62 | 72 | updateAttributesIfExists: true,
|
63 | 73 | },
|
64 | 74 | deadLetterQueue: {
|
65 | 75 | redrivePolicy: { maxReceiveCount: 3 },
|
66 | 76 | creationConfig: {
|
67 |
| - queue: { QueueName: 'deadLetterQueue' }, |
| 77 | + queue: { QueueName: deadLetterQueueName }, |
68 | 78 | },
|
69 | 79 | },
|
70 | 80 | })
|
71 | 81 |
|
72 | 82 | await newConsumer.init()
|
73 | 83 | expect(newConsumer.subscriptionProps.queueUrl).toBe(
|
74 |
| - 'http://sqs.eu-west-1.localstack:4566/000000000000/existingQueue', |
| 84 | + `http://sqs.eu-west-1.localstack:4566/000000000000/${queueName}`, |
75 | 85 | )
|
76 | 86 | expect(newConsumer.subscriptionProps.deadLetterQueueUrl).toBe(
|
77 |
| - 'http://sqs.eu-west-1.localstack:4566/000000000000/deadLetterQueue', |
| 87 | + `http://sqs.eu-west-1.localstack:4566/000000000000/${deadLetterQueueName}`, |
78 | 88 | )
|
79 | 89 |
|
80 | 90 | const attributes = await getQueueAttributes(sqsClient, newConsumer.subscriptionProps.queueUrl)
|
81 | 91 |
|
82 | 92 | expect(attributes.result?.attributes).toMatchObject({
|
83 | 93 | RedrivePolicy: JSON.stringify({
|
84 |
| - deadLetterTargetArn: `arn:aws:sqs:eu-west-1:000000000000:deadLetterQueue`, |
| 94 | + deadLetterTargetArn: `arn:aws:sqs:eu-west-1:000000000000:${deadLetterQueueName}`, |
85 | 95 | maxReceiveCount: 3,
|
86 | 96 | }),
|
87 | 97 | })
|
88 | 98 | })
|
89 | 99 |
|
90 | 100 | it('using existing dead letter queue', async () => {
|
91 | 101 | await assertQueue(sqsClient, {
|
92 |
| - QueueName: 'deadLetterQueue', |
| 102 | + QueueName: deadLetterQueueName, |
93 | 103 | })
|
94 | 104 |
|
95 | 105 | const newConsumer = new SnsSqsPermissionConsumer(diContainer.cradle, {
|
96 | 106 | creationConfig: {
|
97 |
| - topic: { Name: 'sometopic' }, |
98 |
| - queue: { QueueName: 'existingQueue' }, |
| 107 | + topic: { Name: topicName }, |
| 108 | + queue: { QueueName: queueName }, |
99 | 109 | updateAttributesIfExists: true,
|
100 | 110 | },
|
101 | 111 | deadLetterQueue: {
|
102 | 112 | redrivePolicy: { maxReceiveCount: 3 },
|
103 | 113 | locatorConfig: {
|
104 |
| - queueUrl: 'http://sqs.eu-west-1.localstack:4566/000000000000/deadLetterQueue', |
| 114 | + queueUrl: `http://sqs.eu-west-1.localstack:4566/000000000000/${deadLetterQueueName}`, |
105 | 115 | },
|
106 | 116 | },
|
107 | 117 | })
|
108 | 118 |
|
109 | 119 | await newConsumer.init()
|
110 | 120 | expect(newConsumer.subscriptionProps.queueUrl).toBe(
|
111 |
| - 'http://sqs.eu-west-1.localstack:4566/000000000000/existingQueue', |
| 121 | + `http://sqs.eu-west-1.localstack:4566/000000000000/${queueName}`, |
112 | 122 | )
|
113 | 123 | expect(newConsumer.subscriptionProps.deadLetterQueueUrl).toBe(
|
114 |
| - 'http://sqs.eu-west-1.localstack:4566/000000000000/deadLetterQueue', |
| 124 | + `http://sqs.eu-west-1.localstack:4566/000000000000/${deadLetterQueueName}`, |
115 | 125 | )
|
116 | 126 |
|
117 | 127 | const attributes = await getQueueAttributes(sqsClient, newConsumer.subscriptionProps.queueUrl)
|
118 | 128 |
|
119 | 129 | expect(attributes.result?.attributes).toMatchObject({
|
120 | 130 | RedrivePolicy: JSON.stringify({
|
121 |
| - deadLetterTargetArn: `arn:aws:sqs:eu-west-1:000000000000:deadLetterQueue`, |
| 131 | + deadLetterTargetArn: `arn:aws:sqs:eu-west-1:000000000000:${deadLetterQueueName}`, |
122 | 132 | maxReceiveCount: 3,
|
123 | 133 | }),
|
124 | 134 | })
|
125 | 135 | })
|
| 136 | + |
| 137 | + it('should update attributes and tags', async () => { |
| 138 | + await assertQueue(sqsClient, { |
| 139 | + QueueName: deadLetterQueueName, |
| 140 | + Attributes: { KmsMasterKeyId: 'old' }, |
| 141 | + tags: { tag: 'old' }, |
| 142 | + }) |
| 143 | + |
| 144 | + const newConsumer = new SnsSqsPermissionConsumer(diContainer.cradle, { |
| 145 | + creationConfig: { |
| 146 | + topic: { Name: topicName }, |
| 147 | + queue: { QueueName: queueName }, |
| 148 | + updateAttributesIfExists: true, |
| 149 | + }, |
| 150 | + deadLetterQueue: { |
| 151 | + redrivePolicy: { maxReceiveCount: 3 }, |
| 152 | + creationConfig: { |
| 153 | + forceTagUpdate: true, |
| 154 | + updateAttributesIfExists: true, |
| 155 | + queue: { |
| 156 | + QueueName: deadLetterQueueName, |
| 157 | + Attributes: { KmsMasterKeyId: 'new' }, |
| 158 | + tags: { tag: 'new' }, |
| 159 | + }, |
| 160 | + }, |
| 161 | + }, |
| 162 | + }) |
| 163 | + |
| 164 | + await newConsumer.init() |
| 165 | + expect(newConsumer.subscriptionProps.queueUrl).toBe( |
| 166 | + `http://sqs.eu-west-1.localstack:4566/000000000000/${queueName}`, |
| 167 | + ) |
| 168 | + expect(newConsumer.subscriptionProps.deadLetterQueueUrl).toBe( |
| 169 | + `http://sqs.eu-west-1.localstack:4566/000000000000/${deadLetterQueueName}`, |
| 170 | + ) |
| 171 | + |
| 172 | + const mainQueueAttributes = await getQueueAttributes( |
| 173 | + sqsClient, |
| 174 | + newConsumer.subscriptionProps.queueUrl, |
| 175 | + ) |
| 176 | + expect(mainQueueAttributes.result?.attributes).toMatchObject({ |
| 177 | + RedrivePolicy: JSON.stringify({ |
| 178 | + deadLetterTargetArn: `arn:aws:sqs:eu-west-1:000000000000:${deadLetterQueueName}`, |
| 179 | + maxReceiveCount: 3, |
| 180 | + }), |
| 181 | + }) |
| 182 | + |
| 183 | + const dlqAttributes = await getQueueAttributes( |
| 184 | + sqsClient, |
| 185 | + newConsumer.subscriptionProps.deadLetterQueueUrl!, |
| 186 | + ) |
| 187 | + expect(dlqAttributes.result?.attributes).toMatchObject({ |
| 188 | + KmsMasterKeyId: 'new', |
| 189 | + }) |
| 190 | + |
| 191 | + const tags = await sqsClient.send( |
| 192 | + new ListQueueTagsCommand({ QueueUrl: newConsumer.subscriptionProps.deadLetterQueueUrl }), |
| 193 | + ) |
| 194 | + expect(tags.Tags).toMatchInlineSnapshot(` |
| 195 | + { |
| 196 | + "tag": "new", |
| 197 | + } |
| 198 | + `) |
| 199 | + }) |
126 | 200 | })
|
127 | 201 |
|
128 | 202 | describe('messages are sent to DLQ', () => {
|
|
0 commit comments