/*
* Copyright 2013-2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.cloud.aws.messaging.core;
import com.amazonaws.services.sqs.AmazonSQSAsync;
import com.amazonaws.services.sqs.model.GetQueueUrlRequest;
import com.amazonaws.services.sqs.model.GetQueueUrlResult;
import com.amazonaws.services.sqs.model.ReceiveMessageRequest;
import com.amazonaws.services.sqs.model.ReceiveMessageResult;
import com.amazonaws.services.sqs.model.SendMessageRequest;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.springframework.cloud.aws.core.env.ResourceIdResolver;
import org.springframework.messaging.Message;
import org.springframework.messaging.converter.CompositeMessageConverter;
import org.springframework.messaging.converter.SimpleMessageConverter;
import org.springframework.messaging.core.DestinationResolutionException;
import org.springframework.messaging.core.DestinationResolver;
import org.springframework.messaging.support.MessageBuilder;
import java.util.Locale;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* @author Alain Sahli
*/
public class QueueMessagingTemplateTest {
@Test(expected = IllegalStateException.class)
public void send_withoutDefaultDestination_throwAnException() throws Exception {
AmazonSQSAsync amazonSqs = createAmazonSqs();
QueueMessagingTemplate queueMessagingTemplate = new QueueMessagingTemplate(amazonSqs);
Message<String> stringMessage = MessageBuilder.withPayload("message content").build();
queueMessagingTemplate.send(stringMessage);
}
@Test
public void send_withDefaultDestination_usesDefaultDestination() throws Exception {
AmazonSQSAsync amazonSqs = createAmazonSqs();
QueueMessagingTemplate queueMessagingTemplate = new QueueMessagingTemplate(amazonSqs);
queueMessagingTemplate.setDefaultDestinationName("my-queue");
Message<String> stringMessage = MessageBuilder.withPayload("message content").build();
queueMessagingTemplate.send(stringMessage);
ArgumentCaptor<SendMessageRequest> sendMessageRequestArgumentCaptor = ArgumentCaptor.forClass(SendMessageRequest.class);
verify(amazonSqs).sendMessage(sendMessageRequestArgumentCaptor.capture());
assertEquals("http://queue-url.com", sendMessageRequestArgumentCaptor.getValue().getQueueUrl());
}
@Test
public void send_withDestination_usesDestination() throws Exception {
AmazonSQSAsync amazonSqs = createAmazonSqs();
QueueMessagingTemplate queueMessagingTemplate = new QueueMessagingTemplate(amazonSqs);
Message<String> stringMessage = MessageBuilder.withPayload("message content").build();
queueMessagingTemplate.send("my-queue", stringMessage);
ArgumentCaptor<SendMessageRequest> sendMessageRequestArgumentCaptor = ArgumentCaptor.forClass(SendMessageRequest.class);
verify(amazonSqs).sendMessage(sendMessageRequestArgumentCaptor.capture());
assertEquals("http://queue-url.com", sendMessageRequestArgumentCaptor.getValue().getQueueUrl());
}
@Test
public void send_withCustomDestinationResolveAndDestination_usesDestination() throws Exception {
AmazonSQSAsync amazonSqs = createAmazonSqs();
QueueMessagingTemplate queueMessagingTemplate = new QueueMessagingTemplate(amazonSqs, new DestinationResolver<String>() {
@Override
public String resolveDestination(String name) throws DestinationResolutionException {
return name.toUpperCase(Locale.ENGLISH);
}
}, null);
Message<String> stringMessage = MessageBuilder.withPayload("message content").build();
queueMessagingTemplate.send("myqueue", stringMessage);
ArgumentCaptor<SendMessageRequest> sendMessageRequestArgumentCaptor = ArgumentCaptor.forClass(SendMessageRequest.class);
verify(amazonSqs).sendMessage(sendMessageRequestArgumentCaptor.capture());
assertEquals("MYQUEUE", sendMessageRequestArgumentCaptor.getValue().getQueueUrl());
}
@Test(expected = IllegalStateException.class)
public void receive_withoutDefaultDestination_throwsAnException() throws Exception {
AmazonSQSAsync amazonSqs = createAmazonSqs();
QueueMessagingTemplate queueMessagingTemplate = new QueueMessagingTemplate(amazonSqs);
queueMessagingTemplate.receive();
}
@Test
public void receive_withDefaultDestination_useDefaultDestination() throws Exception {
AmazonSQSAsync amazonSqs = createAmazonSqs();
QueueMessagingTemplate queueMessagingTemplate = new QueueMessagingTemplate(amazonSqs);
queueMessagingTemplate.setDefaultDestinationName("my-queue");
queueMessagingTemplate.receive();
ArgumentCaptor<ReceiveMessageRequest> sendMessageRequestArgumentCaptor = ArgumentCaptor.forClass(ReceiveMessageRequest.class);
verify(amazonSqs).receiveMessage(sendMessageRequestArgumentCaptor.capture());
assertEquals("http://queue-url.com", sendMessageRequestArgumentCaptor.getValue().getQueueUrl());
}
@Test
public void receive_withDestination_usesDestination() throws Exception {
AmazonSQSAsync amazonSqs = createAmazonSqs();
QueueMessagingTemplate queueMessagingTemplate = new QueueMessagingTemplate(amazonSqs);
queueMessagingTemplate.receive("my-queue");
ArgumentCaptor<ReceiveMessageRequest> sendMessageRequestArgumentCaptor = ArgumentCaptor.forClass(ReceiveMessageRequest.class);
verify(amazonSqs).receiveMessage(sendMessageRequestArgumentCaptor.capture());
assertEquals("http://queue-url.com", sendMessageRequestArgumentCaptor.getValue().getQueueUrl());
}
@Test(expected = IllegalStateException.class)
public void receiveAndConvert_withoutDefaultDestination_throwsAnException() throws Exception {
AmazonSQSAsync amazonSqs = createAmazonSqs();
QueueMessagingTemplate queueMessagingTemplate = new QueueMessagingTemplate(amazonSqs);
queueMessagingTemplate.receiveAndConvert(String.class);
}
@Test
public void receiveAndConvert_withDefaultDestination_usesDefaultDestinationAndConvertsMessage() throws Exception {
AmazonSQSAsync amazonSqs = createAmazonSqs();
QueueMessagingTemplate queueMessagingTemplate = new QueueMessagingTemplate(amazonSqs);
queueMessagingTemplate.setDefaultDestinationName("my-queue");
String message = queueMessagingTemplate.receiveAndConvert(String.class);
assertEquals("My message", message);
}
@Test
public void receiveAndConvert_withDestination_usesDestinationAndConvertsMessage() throws Exception {
AmazonSQSAsync amazonSqs = createAmazonSqs();
QueueMessagingTemplate queueMessagingTemplate = new QueueMessagingTemplate(amazonSqs);
String message = queueMessagingTemplate.receiveAndConvert("my-queue", String.class);
assertEquals("My message", message);
}
@Test
public void instantiation_withConverter_shouldAddItToTheCompositeConverter() throws Exception {
// Arrange
SimpleMessageConverter simpleMessageConverter = new SimpleMessageConverter();
// Act
QueueMessagingTemplate queueMessagingTemplate = new QueueMessagingTemplate(createAmazonSqs(), (ResourceIdResolver) null, simpleMessageConverter);
// Assert
assertEquals(2, ((CompositeMessageConverter) queueMessagingTemplate.getMessageConverter()).getConverters().size());
assertEquals(simpleMessageConverter, ((CompositeMessageConverter) queueMessagingTemplate.getMessageConverter()).getConverters().get(1));
}
private AmazonSQSAsync createAmazonSqs() {
AmazonSQSAsync amazonSqs = mock(AmazonSQSAsync.class);
GetQueueUrlResult queueUrl = new GetQueueUrlResult();
queueUrl.setQueueUrl("http://queue-url.com");
when(amazonSqs.getQueueUrl(any(GetQueueUrlRequest.class))).thenReturn(queueUrl);
ReceiveMessageResult receiveMessageResult = new ReceiveMessageResult();
com.amazonaws.services.sqs.model.Message message = new com.amazonaws.services.sqs.model.Message();
message.setBody("My message");
receiveMessageResult.withMessages(message);
when(amazonSqs.receiveMessage(any(ReceiveMessageRequest.class))).thenReturn(receiveMessageResult);
return amazonSqs;
}
}