package org.jboss.resteasy.test.response;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.container.test.api.RunAsClient;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.resteasy.plugins.delegates.LocaleDelegate;
import org.jboss.resteasy.test.response.resource.VariantComplexResource;
import org.jboss.resteasy.test.response.resource.VariantEncodingResource;
import org.jboss.resteasy.test.response.resource.VariantLanguageResource;
import org.jboss.resteasy.util.HttpHeaderNames;
import org.jboss.resteasy.util.HttpResponseCodes;
import org.jboss.resteasy.utils.TestUtil;
import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.Assert;
import org.junit.runner.RunWith;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.MediaType;
import java.util.List;
import org.jboss.resteasy.utils.PortProviderUtil;
/**
* @tpSubChapter Response
* @tpChapter Integration tests
* @tpTestCaseDetails Tests that correct variant headers are returned in the response
* @tpSince RESTEasy 3.0.16
*/
@RunWith(Arquillian.class)
@RunAsClient
public class VariantsTest {
protected static final Logger logger = LogManager.getLogger(VariantsTest.class.getName());
static Client client;
@Deployment
public static Archive<?> deploy() {
WebArchive war = TestUtil.prepareArchive(VariantsTest.class.getSimpleName());
war.addClass(VariantsTest.class);
return TestUtil.finishContainerPrepare(war, null, VariantLanguageResource.class, VariantComplexResource.class, VariantEncodingResource.class);
}
@Before
public void init() {
client = ClientBuilder.newClient();
}
@After
public void after() throws Exception {
client.close();
}
private String generateURL(String path) {
return PortProviderUtil.generateURL(path, VariantsTest.class.getSimpleName());
}
/**
* @tpTestDetails Simple http GET conditional request
* @tpSince RESTEasy 3.0.16
*/
@Test
public void evaluatePreconditionsTagNullAndSimpleGetTest() {
client = ClientBuilder.newClient();
logger.info(generateURL("/preconditionsSimpleGet"));
Response response = client.target(generateURL("/preconditionsSimpleGet")).request()
.get();
Assert.assertEquals(200, response.getStatus());
response.close();
client.close();
}
/**
* @tpTestDetails PUT request is send, request selects best variant from the list od empty variants,
* IllegalArgumentException is thrown
* @tpSince RESTEasy 3.0.16
*/
@Test
public void selectVariantPutRequestTest() {
Response response = client.target(generateURL("/SelectVariantTestPut")).request()
.put(null);
Assert.assertEquals(200, response.getStatus());
Assert.assertEquals("PASSED", response.readEntity(String.class));
response.close();
}
/**
* @tpTestDetails GET request is send, test that variant is selected and response contains proper headers
* @tpSince RESTEasy 3.0.16
*/
@Test
public void selectVariantResponseVaryTest() {
Response response = client.target(generateURL("/SelectVariantTestResponse")).request()
.accept("application/json")
.acceptEncoding("*").get();
Assert.assertEquals(200, response.getStatus());
List<String> headers = response.getStringHeaders().get("Vary");
Assert.assertEquals(1, headers.size());
String vary = headers.get(0);
logger.info(vary);
Assert.assertTrue(vary.contains("Accept-Language"));
Assert.assertTrue(vary.contains("Accept-Encoding"));
Assert.assertTrue(vary.matches(".*Accept.*Accept.*Accept.*"));
response.close();
}
/**
* @tpTestDetails Tests that variant preferred by client request by Accept-Language is selected
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testGetLanguageEn() throws Exception {
Response response = client.target(generateURL("/")).request().acceptLanguage("en").get();
Assert.assertEquals(HttpResponseCodes.SC_OK, response.getStatus());
Assert.assertEquals("en", response.readEntity(String.class));
Assert.assertEquals("en", response.getLanguage().toString());
response.close();
}
/**
* @tpTestDetails Tests that given wildcard client request by Accept-Language header returns some concrete language
* header in the response.
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testGetLanguageWildcard() throws Exception {
Response response = client.target(generateURL("/")).request().acceptLanguage("*").get();
Assert.assertEquals(HttpResponseCodes.SC_OK, response.getStatus());
Assert.assertNotNull(response.getLanguage());
response.close();
}
/**
* @tpTestDetails Tests that variant preferred by client request by Accept-Language is selected. Variant defined with
* Locale("pt", "BR")
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testGetLanguageSubLocal() throws Exception {
Response response = client.target(generateURL("/brazil")).request()
.acceptLanguage("pt").get();
Assert.assertEquals(HttpResponseCodes.SC_OK, response.getStatus());
Assert.assertNotNull(response.getLanguage());
response.close();
}
/**
* @tpTestDetails Test that language variant which has 0 preference is not returned
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testGetLanguageZero() throws Exception {
Response response = client.target(generateURL("/")).request()
.acceptLanguage("*", "zh;q=0", "en;q=0", "fr;q=0").get();
Assert.assertEquals(HttpResponseCodes.SC_NOT_ACCEPTABLE, response.getStatus());
response.close();
}
/**
* @tpTestDetails Simple Get for with Accept-Language "zh". Lanfuage "zh" in the response is returned
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testGetLanguageZh() throws Exception {
Response response = client.target(generateURL("/")).request().acceptLanguage("zh").get();
Assert.assertEquals(HttpResponseCodes.SC_OK, response.getStatus());
Assert.assertEquals("zh", response.readEntity(String.class));
Assert.assertEquals("zh", response.getLanguage().toString());
response.close();
}
/**
* @tpTestDetails Tests client request with multiple Accept-language preferences, check the most preferred language
* is returned in the response
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testGetLanguageMultiple() throws Exception {
Response response = client.target(generateURL("/")).request()
.acceptLanguage("en;q=0.3", "zh;q=0.4", "fr").get();
Assert.assertEquals(HttpResponseCodes.SC_OK, response.getStatus());
Assert.assertEquals("fr", response.readEntity(String.class));
Assert.assertEquals("fr", response.getLanguage().toString());
response.close();
}
/**
* @tpTestDetails Verifies that a more specific media type is preferred.
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testGetComplexAcceptLanguageEn() throws Exception {
Response response = client.target(generateURL("/complex")).request()
.accept("text/xml", "application/xml", "application/xhtml+xml", "image/png", "text/html;q=0.9", "text/plain;q=0.8", "*/*;q=0.5")
.acceptLanguage("en-us", "en;q=0.5").get();
Assert.assertEquals(HttpResponseCodes.SC_OK, response.getStatus());
Assert.assertEquals("GET", response.readEntity(String.class));
Assert.assertEquals(MediaType.APPLICATION_XML_TYPE.withCharset("UTF-8"), response.getMediaType());
Assert.assertEquals("en-us", new LocaleDelegate().toString(response.getLanguage()));
response.close();
}
/**
* @tpTestDetails Verifies that a more specific media type is preferred.
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testGetComplexAcceptLanguageEnUs() throws Exception {
Response response = client.target(generateURL("/complex")).request()
.accept("text/xml", "application/xml", "application/xhtml+xml", "image/png", "text/html;q=0.9", "text/plain;q=0.8", "*/*;q=0.5")
.acceptLanguage("en", "en-us").get();
Assert.assertEquals(HttpResponseCodes.SC_OK, response.getStatus());
Assert.assertEquals("GET", response.readEntity(String.class));
Assert.assertEquals(MediaType.APPLICATION_XML_TYPE.withCharset("UTF-8"), response.getMediaType());
Assert.assertEquals("en-us", new LocaleDelegate().toString(response.getLanguage()));
response.close();
}
/**
* @tpTestDetails Test that expected variants are selected from list of multiple weighted content and language type.
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testGetComplexShuffleAcceptMedia() throws Exception {
Response response = client.target(generateURL("/complex")).request()
.accept("application/xml", "text/xml", "application/xhtml+xml", "image/png", "text/html;q=0.9", "text/plain;q=0.8", "*/*;q=0.5")
.acceptLanguage("en-us", "en;q=0.5").get();
Assert.assertEquals(HttpResponseCodes.SC_OK, response.getStatus());
Assert.assertEquals("GET", response.readEntity(String.class));
Assert.assertEquals(MediaType.APPLICATION_XML_TYPE.withCharset("UTF-8"), response.getMediaType());
Assert.assertEquals("en-us", new LocaleDelegate().toString(response.getLanguage()));
response.close();
}
/**
* @tpTestDetails Test that expected variants are selected from list of multiple weighted content and language type.
* en-us with preference
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testGetComplexAcceptLanguageEnUsWithPreference() throws Exception {
Response response = client.target(generateURL("/complex")).request()
.accept("application/xml", "text/xml", "application/xhtml+xml", "image/png", "text/html;q=0.9", "text/plain;q=0.8", "*/*;q=0.5")
.acceptLanguage("en", "en-us;q=0.5").get();
Assert.assertEquals(HttpResponseCodes.SC_OK, response.getStatus());
Assert.assertEquals("GET", response.readEntity(String.class));
Assert.assertEquals("en", response.getLanguage().toString());
Assert.assertEquals(MediaType.TEXT_XML_TYPE.withCharset("UTF-8"), response.getMediaType());
response.close();
}
/**
* @tpTestDetails Tests client request which has accept header which cannot be served by server.
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testGetComplexNotAcceptable() throws Exception {
{
Response response = client.target(generateURL("/complex")).request()
.accept("application/atom+xml")
.acceptLanguage("en-us", "en").get();
Assert.assertEquals(406, response.getStatus());
String vary = response.getHeaderString(HttpHeaderNames.VARY);
Assert.assertNotNull(vary);
logger.info("vary: " + vary);
Assert.assertTrue(contains(vary, "Accept"));
Assert.assertTrue(contains(vary, "Accept-Language"));
response.close();
}
{
Response response = client.target(generateURL("/complex")).request()
.accept("application/xml")
.acceptLanguage("fr").get();
Assert.assertEquals(406, response.getStatus());
String vary = response.getHeaderString(HttpHeaderNames.VARY);
Assert.assertNotNull(vary);
logger.info("vary: " + vary);
Assert.assertTrue(contains(vary, "Accept"));
Assert.assertTrue(contains(vary, "Accept-Language"));
response.close();
}
}
/**
* @tpTestDetails Tests client request with custom Accept-encoding
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testGetEncodingCustomEnc1() throws Exception {
Response response = client.target(generateURL("/encoding")).request()
.acceptEncoding("enc1").get();
Assert.assertEquals(HttpResponseCodes.SC_OK, response.getStatus());
Assert.assertEquals("enc1", response.readEntity(String.class));
Assert.assertEquals("enc1", response.getHeaderString(HttpHeaderNames.CONTENT_ENCODING));
response.close();
}
/**
* @tpTestDetails Tests client request with custom Accept-encoding
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testGetEncodingCustomEnc2() throws Exception {
Response response = client.target(generateURL("/encoding")).request()
.acceptEncoding("enc2").get();
Assert.assertEquals(HttpResponseCodes.SC_OK, response.getStatus());
Assert.assertEquals("enc2", response.readEntity(String.class));
Assert.assertEquals("enc2", response.getHeaderString(HttpHeaderNames.CONTENT_ENCODING));
response.close();
}
/**
* @tpTestDetails Tests client request with custom Accept-encoding
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testGetEncodingCustomEnc3() throws Exception {
Response response = client.target(generateURL("/encoding")).request()
.acceptEncoding("enc3").get();
Assert.assertEquals(HttpResponseCodes.SC_OK, response.getStatus());
Assert.assertEquals("enc3", response.readEntity(String.class));
Assert.assertEquals("enc3", response.getHeaderString(HttpHeaderNames.CONTENT_ENCODING));
response.close();
}
/**
* @tpTestDetails Tests client request with custom Accept-encoding with preference specified
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testGetEncodingCustomPreference() throws Exception {
Response response = client.target(generateURL("/encoding")).request()
.acceptEncoding("enc1;q=0.5", "enc2;q=0.9").get();
Assert.assertEquals(HttpResponseCodes.SC_OK, response.getStatus());
Assert.assertEquals("enc2", response.readEntity(String.class));
Assert.assertEquals("enc2", response.getHeaderString(HttpHeaderNames.CONTENT_ENCODING));
response.close();
}
/**
* @tpTestDetails Tests client request with custom Accept-encoding with preference specified
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testGetEncodingCustomPreferenceZero() throws Exception {
Response response = client.target(generateURL("/encoding")).request()
.acceptEncoding("enc1;q=0", "enc2;q=0.888", "enc3;q=0.889").get();
Assert.assertEquals(HttpResponseCodes.SC_OK, response.getStatus());
Assert.assertEquals("enc3", response.readEntity(String.class));
Assert.assertEquals("enc3", response.getHeaderString(HttpHeaderNames.CONTENT_ENCODING));
response.close();
}
private boolean contains(String all, String one) {
String[] allSplit = all.split(",");
for (String s : allSplit) {
s = s.trim();
if (s.equalsIgnoreCase(one)) {
return true;
}
}
return false;
}
}