/*
* Copyright 2006-2012 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 com.consol.citrus.dsl.definition;
import com.consol.citrus.actions.SendMessageAction;
import com.consol.citrus.container.SequenceAfterTest;
import com.consol.citrus.container.SequenceBeforeTest;
import com.consol.citrus.exceptions.CitrusRuntimeException;
import com.consol.citrus.message.*;
import com.consol.citrus.report.TestActionListeners;
import com.consol.citrus.report.TestListeners;
import com.consol.citrus.testng.AbstractTestNGUnitTest;
import com.consol.citrus.validation.builder.PayloadTemplateMessageBuilder;
import com.consol.citrus.ws.message.SoapAttachment;
import com.consol.citrus.ws.actions.SendSoapMessageAction;
import com.consol.citrus.ws.client.WebServiceClient;
import com.consol.citrus.ws.message.SoapMessageHeaders;
import org.easymock.EasyMock;
import org.springframework.context.ApplicationContext;
import org.springframework.core.io.Resource;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.HashMap;
import static org.easymock.EasyMock.*;
/**
* @author Christoph Deppisch
*/
public class SendSoapMessageDefinitionTest extends AbstractTestNGUnitTest {
private WebServiceClient soapClient = EasyMock.createMock(WebServiceClient.class);
private ApplicationContext applicationContextMock = EasyMock.createMock(ApplicationContext.class);
private Resource resource = EasyMock.createMock(Resource.class);
private SoapAttachment testAttachment = new SoapAttachment();
/**
* Setup test attachment.
*/
@BeforeClass
public void setup() {
testAttachment.setContentId("attachment01");
testAttachment.setContent("This is an attachment");
testAttachment.setContentType("text/plain");
testAttachment.setCharsetName("UTF-8");
}
@Test
public void testFork() {
MockBuilder builder = new MockBuilder(applicationContext) {
@Override
public void configure() {
send(soapClient)
.message(new DefaultMessage("Foo").setHeader("operation", "foo"));
send(soapClient)
.message(new DefaultMessage("Foo").setHeader("operation", "foo"))
.fork(true);
}
};
builder.execute();
Assert.assertEquals(builder.testCase().getActions().size(), 2);
Assert.assertEquals(builder.testCase().getActions().get(0).getClass(), SendSoapMessageAction.class);
Assert.assertEquals(builder.testCase().getActions().get(1).getClass(), SendSoapMessageAction.class);
SendSoapMessageAction action = ((SendSoapMessageAction)builder.testCase().getActions().get(0));
Assert.assertEquals(action.getName(), "send");
Assert.assertEquals(action.getEndpoint(), soapClient);
Assert.assertEquals(action.getMessageBuilder().getClass(), PayloadTemplateMessageBuilder.class);
PayloadTemplateMessageBuilder messageBuilder = (PayloadTemplateMessageBuilder) action.getMessageBuilder();
Assert.assertEquals(messageBuilder.getPayloadData(), "Foo");
Assert.assertEquals(messageBuilder.getMessageHeaders().size(), 1L);
Assert.assertEquals(messageBuilder.getMessageHeaders().get("operation"), "foo");
Assert.assertFalse(action.isForkMode());
action = ((SendSoapMessageAction)builder.testCase().getActions().get(1));
Assert.assertEquals(action.getName(), "send");
Assert.assertEquals(action.getEndpoint(), soapClient);
Assert.assertEquals(action.getMessageBuilder().getClass(), PayloadTemplateMessageBuilder.class);
Assert.assertTrue(action.isForkMode());
}
@Test
public void testSoapAction() {
MockBuilder builder = new MockBuilder(applicationContext) {
@Override
public void configure() {
send(soapClient)
.soap()
.soapAction("TestService/sayHello")
.payload("<TestRequest><Message>Hello World!</Message></TestRequest>");
}
};
builder.execute();
Assert.assertEquals(builder.testCase().getActions().size(), 1);
Assert.assertEquals(builder.testCase().getActions().get(0).getClass(), SendSoapMessageAction.class);
SendSoapMessageAction action = ((SendSoapMessageAction)builder.testCase().getActions().get(0));
Assert.assertEquals(action.getName(), "send");
Assert.assertEquals(action.getEndpoint(), soapClient);
Assert.assertEquals(action.getMessageBuilder().getClass(), PayloadTemplateMessageBuilder.class);
PayloadTemplateMessageBuilder messageBuilder = (PayloadTemplateMessageBuilder) action.getMessageBuilder();
Assert.assertEquals(messageBuilder.getPayloadData(), "<TestRequest><Message>Hello World!</Message></TestRequest>");
Assert.assertEquals(messageBuilder.getMessageHeaders().size(), 1L);
Assert.assertEquals(messageBuilder.getMessageHeaders().get(SoapMessageHeaders.SOAP_ACTION), "TestService/sayHello");
}
@Test
public void testSoapAttachment() {
MockBuilder builder = new MockBuilder(applicationContext) {
@Override
public void configure() {
send(soapClient)
.payload("<TestRequest><Message>Hello World!</Message></TestRequest>")
.attachment(testAttachment);
}
};
builder.execute();
Assert.assertEquals(builder.testCase().getActions().size(), 1);
Assert.assertEquals(builder.testCase().getActions().get(0).getClass(), SendSoapMessageAction.class);
SendSoapMessageAction action = ((SendSoapMessageAction)builder.testCase().getActions().get(0));
Assert.assertEquals(action.getName(), "send");
Assert.assertEquals(action.getEndpoint(), soapClient);
Assert.assertEquals(action.getMessageBuilder().getClass(), PayloadTemplateMessageBuilder.class);
PayloadTemplateMessageBuilder messageBuilder = (PayloadTemplateMessageBuilder) action.getMessageBuilder();
Assert.assertEquals(messageBuilder.getPayloadData(), "<TestRequest><Message>Hello World!</Message></TestRequest>");
Assert.assertEquals(messageBuilder.getMessageHeaders().size(), 0L);
Assert.assertEquals(action.getAttachments().size(), 1L);
Assert.assertNull(action.getAttachments().get(0).getContentResourcePath());
Assert.assertEquals(action.getAttachments().get(0).getContent(), testAttachment.getContent());
Assert.assertEquals(action.getAttachments().get(0).getContentId(), testAttachment.getContentId());
Assert.assertEquals(action.getAttachments().get(0).getContentType(), testAttachment.getContentType());
Assert.assertEquals(action.getAttachments().get(0).getCharsetName(), testAttachment.getCharsetName());
}
@Test
public void testSoapAttachmentData() {
MockBuilder builder = new MockBuilder(applicationContext) {
@Override
public void configure() {
send(soapClient)
.payload("<TestRequest><Message>Hello World!</Message></TestRequest>")
.attachment(testAttachment.getContentId(), testAttachment.getContentType(), testAttachment.getContent());
}
};
builder.execute();
Assert.assertEquals(builder.testCase().getActions().size(), 1);
Assert.assertEquals(builder.testCase().getActions().get(0).getClass(), SendSoapMessageAction.class);
SendSoapMessageAction action = ((SendSoapMessageAction)builder.testCase().getActions().get(0));
Assert.assertEquals(action.getName(), "send");
Assert.assertEquals(action.getEndpoint(), soapClient);
Assert.assertEquals(action.getMessageBuilder().getClass(), PayloadTemplateMessageBuilder.class);
PayloadTemplateMessageBuilder messageBuilder = (PayloadTemplateMessageBuilder) action.getMessageBuilder();
Assert.assertEquals(messageBuilder.getPayloadData(), "<TestRequest><Message>Hello World!</Message></TestRequest>");
Assert.assertEquals(messageBuilder.getMessageHeaders().size(), 0L);
Assert.assertEquals(action.getAttachments().size(), 1L);
Assert.assertNull(action.getAttachments().get(0).getContentResourcePath());
Assert.assertEquals(action.getAttachments().get(0).getContent(), testAttachment.getContent());
Assert.assertEquals(action.getAttachments().get(0).getContentId(), testAttachment.getContentId());
Assert.assertEquals(action.getAttachments().get(0).getContentType(), testAttachment.getContentType());
Assert.assertEquals(action.getAttachments().get(0).getCharsetName(), testAttachment.getCharsetName());
}
@Test
public void testMultipleSoapAttachmentData() {
MockBuilder builder = new MockBuilder(applicationContext) {
@Override
public void configure() {
send(soapClient)
.payload("<TestRequest><Message>Hello World!</Message></TestRequest>")
.attachment(testAttachment.getContentId() + 1, testAttachment.getContentType(), testAttachment.getContent() + 1)
.attachment(testAttachment.getContentId() + 2, testAttachment.getContentType(), testAttachment.getContent() + 2);
}
};
builder.execute();
Assert.assertEquals(builder.testCase().getActions().size(), 1);
Assert.assertEquals(builder.testCase().getActions().get(0).getClass(), SendSoapMessageAction.class);
SendSoapMessageAction action = ((SendSoapMessageAction)builder.testCase().getActions().get(0));
Assert.assertEquals(action.getName(), "send");
Assert.assertEquals(action.getEndpoint(), soapClient);
Assert.assertEquals(action.getMessageBuilder().getClass(), PayloadTemplateMessageBuilder.class);
PayloadTemplateMessageBuilder messageBuilder = (PayloadTemplateMessageBuilder) action.getMessageBuilder();
Assert.assertEquals(messageBuilder.getPayloadData(), "<TestRequest><Message>Hello World!</Message></TestRequest>");
Assert.assertEquals(messageBuilder.getMessageHeaders().size(), 0L);
Assert.assertEquals(action.getAttachments().size(), 2L);
Assert.assertNull(action.getAttachments().get(0).getContentResourcePath());
Assert.assertEquals(action.getAttachments().get(0).getContent(), testAttachment.getContent() + 1);
Assert.assertEquals(action.getAttachments().get(0).getContentId(), testAttachment.getContentId() + 1);
Assert.assertEquals(action.getAttachments().get(0).getContentType(), testAttachment.getContentType());
Assert.assertEquals(action.getAttachments().get(0).getCharsetName(), testAttachment.getCharsetName());
Assert.assertNull(action.getAttachments().get(1).getContentResourcePath());
Assert.assertEquals(action.getAttachments().get(1).getContent(), testAttachment.getContent() + 2);
Assert.assertEquals(action.getAttachments().get(1).getContentId(), testAttachment.getContentId() + 2);
Assert.assertEquals(action.getAttachments().get(1).getContentType(), testAttachment.getContentType());
Assert.assertEquals(action.getAttachments().get(1).getCharsetName(), testAttachment.getCharsetName());
}
@Test
public void testSoapAttachmentResource() throws IOException {
MockBuilder builder = new MockBuilder(applicationContext) {
@Override
public void configure() {
send(soapClient)
.payload("<TestRequest><Message>Hello World!</Message></TestRequest>")
.attachment(testAttachment.getContentId(), testAttachment.getContentType(), resource);
}
};
reset(resource);
expect(resource.getInputStream()).andReturn(new ByteArrayInputStream("someAttachmentData".getBytes())).once();
replay(resource);
builder.execute();
Assert.assertEquals(builder.testCase().getActions().size(), 1);
Assert.assertEquals(builder.testCase().getActions().get(0).getClass(), SendSoapMessageAction.class);
SendSoapMessageAction action = ((SendSoapMessageAction)builder.testCase().getActions().get(0));
Assert.assertEquals(action.getName(), "send");
Assert.assertEquals(action.getEndpoint(), soapClient);
Assert.assertEquals(action.getMessageBuilder().getClass(), PayloadTemplateMessageBuilder.class);
PayloadTemplateMessageBuilder messageBuilder = (PayloadTemplateMessageBuilder) action.getMessageBuilder();
Assert.assertEquals(messageBuilder.getPayloadData(), "<TestRequest><Message>Hello World!</Message></TestRequest>");
Assert.assertEquals(messageBuilder.getMessageHeaders().size(), 0L);
Assert.assertEquals(action.getAttachments().get(0).getContent(), "someAttachmentData");
Assert.assertEquals(action.getAttachments().get(0).getContentId(), testAttachment.getContentId());
Assert.assertEquals(action.getAttachments().get(0).getContentType(), testAttachment.getContentType());
Assert.assertEquals(action.getAttachments().get(0).getCharsetName(), testAttachment.getCharsetName());
verify(resource);
}
@Test
public void testSendBuilderWithEndpointName() {
reset(applicationContextMock);
expect(applicationContextMock.getBean(TestListeners.class)).andReturn(new TestListeners()).once();
expect(applicationContextMock.getBean(TestActionListeners.class)).andReturn(new TestActionListeners()).once();
expect(applicationContextMock.getBeansOfType(SequenceBeforeTest.class)).andReturn(new HashMap<String, SequenceBeforeTest>()).once();
expect(applicationContextMock.getBeansOfType(SequenceAfterTest.class)).andReturn(new HashMap<String, SequenceAfterTest>()).once();
replay(applicationContextMock);
MockBuilder builder = new MockBuilder(applicationContextMock) {
@Override
public void configure() {
send("soapClient")
.payload("<TestRequest><Message>Hello World!</Message></TestRequest>")
.header("operation", "soapOperation")
.soap()
.attachment(testAttachment);
send("otherClient")
.payload("<TestRequest><Message>Hello World!</Message></TestRequest>");
}
};
builder.execute();
Assert.assertEquals(builder.testCase().getActions().size(), 2);
Assert.assertEquals(builder.testCase().getActions().get(0).getClass(), SendSoapMessageAction.class);
Assert.assertEquals(builder.testCase().getActions().get(1).getClass(), SendMessageAction.class);
SendMessageAction action = ((SendSoapMessageAction)builder.testCase().getActions().get(0));
Assert.assertEquals(action.getName(), "send");
Assert.assertEquals(action.getEndpointUri(), "soapClient");
PayloadTemplateMessageBuilder messageBuilder = (PayloadTemplateMessageBuilder) action.getMessageBuilder();
Assert.assertEquals(messageBuilder.getPayloadData(), "<TestRequest><Message>Hello World!</Message></TestRequest>");
Assert.assertEquals(messageBuilder.getMessageHeaders().size(), 1L);
Assert.assertTrue(messageBuilder.getMessageHeaders().containsKey("operation"));
action = ((SendMessageAction)builder.testCase().getActions().get(1));
Assert.assertEquals(action.getName(), "send");
Assert.assertEquals(action.getEndpointUri(), "otherClient");
verify(applicationContextMock);
}
@Test(expectedExceptions = CitrusRuntimeException.class,
expectedExceptionsMessageRegExp = "Invalid use of http and soap action definition")
public void testSendBuilderWithSoapAndHttpMixed() {
reset(applicationContextMock);
expect(applicationContextMock.getBean(TestListeners.class)).andReturn(new TestListeners()).once();
expect(applicationContextMock.getBean(TestActionListeners.class)).andReturn(new TestActionListeners()).once();
expect(applicationContextMock.getBeansOfType(SequenceBeforeTest.class)).andReturn(new HashMap<String, SequenceBeforeTest>()).once();
expect(applicationContextMock.getBeansOfType(SequenceAfterTest.class)).andReturn(new HashMap<String, SequenceAfterTest>()).once();
replay(applicationContextMock);
MockBuilder builder = new MockBuilder(applicationContextMock) {
@Override
public void configure() {
send("soapClient")
.payload("<TestRequest><Message>Hello World!</Message></TestRequest>")
.header("operation", "soapOperation")
.soap()
.attachment(testAttachment)
.http();
}
};
builder.execute();
Assert.assertEquals(builder.testCase().getActions().size(), 1);
Assert.assertEquals(builder.testCase().getActions().get(0).getClass(), SendMessageAction.class);
SendMessageAction action = ((SendMessageAction)builder.testCase().getActions().get(0));
Assert.assertEquals(action.getName(), "send");
Assert.assertEquals(action.getEndpointUri(), "soapClient");
Assert.assertEquals(action.getMessageType(), MessageType.XML.name());
verify(applicationContextMock);
}
}