/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.test.module.extension;
import static java.nio.charset.Charset.availableCharsets;
import static java.nio.charset.Charset.defaultCharset;
import static java.nio.charset.StandardCharsets.ISO_8859_1;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.mule.runtime.core.util.SystemUtils.getDefaultEncoding;
import org.mule.functional.junit4.FlowRunner;
import org.mule.runtime.api.metadata.DataType;
import org.mule.runtime.api.metadata.MediaType;
import org.mule.runtime.core.api.Event;
import org.mule.tck.junit4.rule.SystemProperty;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
public class ContentTypeHandlingTestCase extends AbstractExtensionFunctionalTestCase {
private static Charset customEncoding;
@Rule
public SystemProperty customEncodingProperty = new SystemProperty("customEncoding", customEncoding.name());
@Override
protected String getConfigFile() {
return "content-type-handling-config.xml";
}
@Override
protected boolean isDisposeContextPerClass() {
return true;
}
@BeforeClass
public static void before() throws Exception {
customEncoding = defaultCharset().name().equals(UTF_8) ? ISO_8859_1 : UTF_8;
}
@Test
public void setsContentTypeOnXml() throws Exception {
Event response = runFlow("setsContentTypeOnXml");
DataType dataType = response.getMessage().getPayload().getDataType();
assertCustomEncoding(dataType);
assertThat(dataType.getMediaType().getPrimaryType(), is(MediaType.TEXT.getPrimaryType()));
assertThat(dataType.getMediaType().getSubType(), is(MediaType.TEXT.getSubType()));
}
@Test
public void onlySetEncodingOnXml() throws Exception {
Event response = runFlow("onlySetEncodingOnXml");
DataType dataType = response.getMessage().getPayload().getDataType();
assertCustomEncoding(dataType);
assertCustomMimeType(dataType);
}
@Test
public void onlySetMimeTypeOnXml() throws Exception {
Event response = runFlow("onlySetMimeTypeOnXml");
DataType dataType = response.getMessage().getPayload().getDataType();
assertDefaultEncoding(dataType);
assertCustomMimeType(dataType);
}
@Test
public void maintainsContentType() throws Exception {
Event response = flowRunner("defaultContentType").withPayload("").run();
final DataType responseDataType = response.getMessage().getPayload().getDataType();
assertDefaultEncoding(responseDataType);
assertDefaultMimeType(responseDataType);
}
@Test
public void setEncodingInMimeTypeAndParam() throws Exception {
Event response = runFlow("setEncodingInMimeTypeAndParam");
DataType dataType = response.getMessage().getPayload().getDataType();
assertThat(dataType.getMediaType().getPrimaryType(), is("application"));
assertThat(dataType.getMediaType().getSubType(), is("json"));
assertThat(dataType.getMediaType().getCharset().get(), is(StandardCharsets.UTF_16));
}
@Test
public void overridesContentType() throws Exception {
Charset lastSupportedEncoding = availableCharsets().values().stream().reduce((first, last) -> last).get();
Event response = runFlow("setsContentTypeProgrammatically");
final DataType dataType = response.getMessage().getPayload().getDataType();
assertCustomMimeType(dataType);
assertThat(dataType.getMediaType().getCharset().get(), is(lastSupportedEncoding));
}
private void assertCustomMimeType(DataType dataType) {
assertThat(dataType.getMediaType().getPrimaryType(), is("dead"));
assertThat(dataType.getMediaType().getSubType(), is("dead"));
}
private void assertCustomEncoding(DataType dataType) {
assertThat(dataType.getMediaType().getCharset().get(), is(customEncoding));
}
private void assertDefaultEncoding(DataType dataType) throws Exception {
assertThat(dataType.getMediaType().getCharset().get(), is(getDefaultEncoding(muleContext)));
}
private void assertDefaultMimeType(DataType dataType) throws Exception {
assertThat(dataType.getMediaType().getPrimaryType(), is(getDefaultDataType().getMediaType().getPrimaryType()));
assertThat(dataType.getMediaType().getSubType(), is(getDefaultDataType().getMediaType().getSubType()));
}
private DataType getDefaultDataType() {
FlowRunner runner = flowRunner("defaultContentType").withPayload("");
return runner.buildEvent().getMessage().getPayload().getDataType();
}
}