/*
* Copyright 2010 Proofpoint, Inc.
*
* 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 io.airlift.jaxrs.testing;
import com.google.common.collect.ImmutableList;
import io.airlift.jaxrs.testing.MockRequest.ConditionalRequestBuilder;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import javax.ws.rs.core.EntityTag;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.Variant;
import java.util.Date;
import java.util.Locale;
import static io.airlift.jaxrs.testing.MockRequest.delete;
import static io.airlift.jaxrs.testing.MockRequest.get;
import static io.airlift.jaxrs.testing.MockRequest.head;
import static io.airlift.jaxrs.testing.MockRequest.post;
import static io.airlift.jaxrs.testing.MockRequest.put;
import static java.util.Locale.US;
import static javax.ws.rs.core.MediaType.TEXT_PLAIN_TYPE;
import static javax.ws.rs.core.MediaType.TEXT_XML_TYPE;
public class TestMockRequest
{
@DataProvider(name = "requestBuilders")
private Object[][] getRequestBuilders()
{
return new Object[][]{
{head(), "HEAD", null},
{get(), "GET", null},
{post(), "POST", null},
{put(), "PUT", null},
{delete(), "DELETE", null},
{head(VARIANT), "HEAD", VARIANT},
{get(VARIANT), "GET", VARIANT},
{post(VARIANT), "POST", VARIANT},
{put(VARIANT), "PUT", VARIANT},
{delete(VARIANT), "DELETE", VARIANT},
};
}
public static final EntityTag UNKNOWN_TAG = new EntityTag("unknown");
public static final EntityTag EXPECTED_TAG = new EntityTag("tag");
public static final Date BEFORE = new Date(1111);
public static final Date AFTER = new Date(9999);
public static final Variant VARIANT = new Variant(TEXT_PLAIN_TYPE, Locale.UK, "UTF-8");
public static final ImmutableList<Variant> VARIANTS = ImmutableList.of(new Variant(TEXT_XML_TYPE, US, "UTF-8"));
@Test(dataProvider = "requestBuilders")
public void testMethod(ConditionalRequestBuilder request, String method, Variant variant)
{
Assert.assertEquals(request.unconditionally().getMethod(), method);
}
@Test(dataProvider = "requestBuilders")
public void testSelectVariant(ConditionalRequestBuilder request, String method, Variant variant)
{
Assert.assertEquals(request.unconditionally().selectVariant(VARIANTS), variant);
}
@Test(dataProvider = "requestBuilders")
public void testDefaultPreconditions(ConditionalRequestBuilder request, String method, Variant variant)
{
assertPreconditionsMet(request.unconditionally().evaluatePreconditions());
assertPreconditionsMet(request.unconditionally().evaluatePreconditions(BEFORE));
assertPreconditionsMet(request.unconditionally().evaluatePreconditions(UNKNOWN_TAG));
assertPreconditionsMet(request.unconditionally().evaluatePreconditions(BEFORE, UNKNOWN_TAG));
}
@Test(dataProvider = "requestBuilders")
public void testIfMatch(ConditionalRequestBuilder requestBuilder, String method, Variant variant)
{
assertPreconditionsFailed(requestBuilder.ifMatch(EXPECTED_TAG).evaluatePreconditions());
assertPreconditionsMet(requestBuilder.ifMatch(EXPECTED_TAG).evaluatePreconditions(BEFORE));
assertPreconditionsMet(requestBuilder.ifMatch(EXPECTED_TAG).evaluatePreconditions(EXPECTED_TAG));
assertPreconditionsFailed(requestBuilder.ifMatch(EXPECTED_TAG).evaluatePreconditions(UNKNOWN_TAG));
assertPreconditionsMet(requestBuilder.ifMatch(EXPECTED_TAG).evaluatePreconditions(BEFORE, EXPECTED_TAG));
assertPreconditionsFailed(requestBuilder.ifMatch(EXPECTED_TAG).evaluatePreconditions(BEFORE, UNKNOWN_TAG));
}
@Test(dataProvider = "requestBuilders")
public void testIfNoneMatch(ConditionalRequestBuilder requestBuilder, String method, Variant variant)
{
assertPreconditionsMet(requestBuilder.ifNoneMatch(EXPECTED_TAG).evaluatePreconditions());
assertPreconditionsMet(requestBuilder.ifNoneMatch(EXPECTED_TAG).evaluatePreconditions(BEFORE));
assertIfNoneMatchFailed(method, requestBuilder.ifNoneMatch(EXPECTED_TAG).evaluatePreconditions(EXPECTED_TAG));
assertPreconditionsMet(requestBuilder.ifNoneMatch(EXPECTED_TAG).evaluatePreconditions(UNKNOWN_TAG));
assertIfNoneMatchFailed(method, requestBuilder.ifNoneMatch(EXPECTED_TAG).evaluatePreconditions(BEFORE, EXPECTED_TAG));
assertPreconditionsMet(requestBuilder.ifNoneMatch(EXPECTED_TAG).evaluatePreconditions(BEFORE, UNKNOWN_TAG));
}
@Test(dataProvider = "requestBuilders")
public void testIfModifiedSince(ConditionalRequestBuilder requestBuilder, String method, Variant variant)
{
assertPreconditionsMet(requestBuilder.ifModifiedSince(BEFORE).evaluatePreconditions());
assertIfModifiedSinceFailed(method, requestBuilder.ifModifiedSince(AFTER).evaluatePreconditions(BEFORE));
assertPreconditionsMet(requestBuilder.ifModifiedSince(BEFORE).evaluatePreconditions(AFTER));
assertPreconditionsMet(requestBuilder.ifModifiedSince(BEFORE).evaluatePreconditions(EXPECTED_TAG));
assertIfModifiedSinceFailed(method, requestBuilder.ifModifiedSince(AFTER).evaluatePreconditions(BEFORE, EXPECTED_TAG));
assertPreconditionsMet(requestBuilder.ifModifiedSince(BEFORE).evaluatePreconditions(AFTER, EXPECTED_TAG));
}
@Test(dataProvider = "requestBuilders")
public void testIfUnmodifiedSince(ConditionalRequestBuilder requestBuilder, String method, Variant variant)
{
assertPreconditionsMet(requestBuilder.ifUnmodifiedSince(BEFORE).evaluatePreconditions());
assertPreconditionsFailed(requestBuilder.ifUnmodifiedSince(BEFORE).evaluatePreconditions(AFTER));
assertPreconditionsMet(requestBuilder.ifUnmodifiedSince(AFTER).evaluatePreconditions(BEFORE));
assertPreconditionsMet(requestBuilder.ifUnmodifiedSince(AFTER).evaluatePreconditions(EXPECTED_TAG));
assertPreconditionsFailed(requestBuilder.ifUnmodifiedSince(BEFORE).evaluatePreconditions(AFTER, EXPECTED_TAG));
assertPreconditionsMet(requestBuilder.ifUnmodifiedSince(AFTER).evaluatePreconditions(BEFORE, EXPECTED_TAG));
}
private void assertPreconditionsMet(ResponseBuilder responseBuilder)
{
Assert.assertNull(responseBuilder, "Expected null response builder");
}
private void assertPreconditionsFailed(ResponseBuilder responseBuilder)
{
Assert.assertNotNull(responseBuilder, "Expected a response builder");
Response response = responseBuilder.build();
Assert.assertEquals(response.getStatus(), Status.PRECONDITION_FAILED.getStatusCode());
}
private void assertIfNoneMatchFailed(String method, ResponseBuilder responseBuilder)
{
Assert.assertNotNull(responseBuilder, "Expected a response builder");
Response response = responseBuilder.build();
// not modified only applies to GET and HEAD; otherwise it is a precondition failed
if ("GET".equalsIgnoreCase(method) || "HEAD".equalsIgnoreCase(method)) {
Assert.assertEquals(response.getStatus(), Status.NOT_MODIFIED.getStatusCode());
}
else {
Assert.assertEquals(response.getStatus(), Status.PRECONDITION_FAILED.getStatusCode());
}
}
private void assertIfModifiedSinceFailed(String method, ResponseBuilder responseBuilder)
{
// if modified since only applies to GET and HEAD; otherwise it process request
if (!("GET".equalsIgnoreCase(method) || "HEAD".equalsIgnoreCase(method))) {
Assert.assertNull(responseBuilder, "Did NOT expect a response builder");
}
else {
Assert.assertNotNull(responseBuilder, "Expected a response builder");
Response response = responseBuilder.build();
Assert.assertEquals(response.getStatus(), Status.NOT_MODIFIED.getStatusCode());
}
}
}