/**
* Copyright (c) 2009 - 2012 Red Hat, Inc.
*
* This software is licensed to you under the GNU General Public License,
* version 2 (GPLv2). There is NO WARRANTY for this software, express or
* implied, including the implied warranties of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
* along with this software; if not, see
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
*
* Red Hat trademarks are not licensed under GPLv2. No permission is
* granted to use or replicate Red Hat trademarks that are incorporated
* in this software or its documentation.
*/
package org.candlepin.common.resteasy.filter;
import static org.junit.Assert.*;
import static org.mockito.Mockito.when;
import org.candlepin.common.jackson.DynamicFilterData;
import org.jboss.resteasy.mock.MockHttpRequest;
import org.jboss.resteasy.spi.ResteasyProviderFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import java.net.URI;
import java.util.Arrays;
import javax.ws.rs.container.ContainerRequestContext;
/**
* DynamicJsonFilterTest
*/
@RunWith(MockitoJUnitRunner.class)
public class DynamicJsonFilterTest {
@Mock private MockHttpRequest mockReq;
@Mock private ContainerRequestContext mockRequestContext;
private DynamicJsonFilter interceptor;
@Before
public void init() {
this.interceptor = new DynamicJsonFilter();
ResteasyProviderFactory.popContextData(DynamicFilterData.class);
}
@After
public void tearDown() {
ResteasyProviderFactory.clearContextData();
}
@Test
public void testNoFilters() throws Exception {
mockReq = MockHttpRequest.create("GET",
new URI("/candlepin/status"),
new URI("http://localhost"));
when(mockRequestContext.getUriInfo()).thenReturn(mockReq.getUri());
interceptor.filter(mockRequestContext);
DynamicFilterData filterData = ResteasyProviderFactory.getContextData(DynamicFilterData.class);
assertNull(filterData);
}
@Test
public void testSimpleBlacklist() throws Exception {
mockReq = MockHttpRequest.create("GET",
new URI("/candlepin/status?exclude=a2"),
new URI("http://localhost"));
when(mockRequestContext.getUriInfo()).thenReturn(mockReq.getUri());
interceptor.filter(mockRequestContext);
DynamicFilterData filterData = ResteasyProviderFactory.getContextData(DynamicFilterData.class);
assertNotNull(filterData);
assertFalse(filterData.isAttributeExcluded("a1"));
assertFalse(filterData.isAttributeExcluded("a1.c1"));
assertFalse(filterData.isAttributeExcluded("a1.c2"));
assertTrue(filterData.isAttributeExcluded("a2"));
assertTrue(filterData.isAttributeExcluded("a2.c1"));
assertTrue(filterData.isAttributeExcluded("a2.c2"));
assertFalse(filterData.isAttributeExcluded("a3"));
assertFalse(filterData.isAttributeExcluded("a3.c1"));
assertFalse(filterData.isAttributeExcluded("a3.c2"));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a1")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a1", "c1")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a1", "c2")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a2")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a2", "c1")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a2", "c2")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a3")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a3", "c1")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a3", "c2")));
}
@Test
public void testSimpleMultiBlacklist() throws Exception {
mockReq = MockHttpRequest.create("GET",
new URI("/candlepin/status?exclude=a2&exclude=a3"),
new URI("http://localhost"));
when(mockRequestContext.getUriInfo()).thenReturn(mockReq.getUri());
interceptor.filter(mockRequestContext);
DynamicFilterData filterData = ResteasyProviderFactory.getContextData(DynamicFilterData.class);
assertNotNull(filterData);
assertFalse(filterData.isAttributeExcluded("a1"));
assertFalse(filterData.isAttributeExcluded("a1.c1"));
assertFalse(filterData.isAttributeExcluded("a1.c2"));
assertTrue(filterData.isAttributeExcluded("a2"));
assertTrue(filterData.isAttributeExcluded("a2.c1"));
assertTrue(filterData.isAttributeExcluded("a2.c2"));
assertTrue(filterData.isAttributeExcluded("a3"));
assertTrue(filterData.isAttributeExcluded("a3.c1"));
assertTrue(filterData.isAttributeExcluded("a3.c2"));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a1")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a1", "c1")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a1", "c2")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a2")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a2", "c1")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a2", "c2")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a3")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a3", "c1")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a3", "c2")));
}
@Test
public void testNestedAttributeBlacklist() throws Exception {
mockReq = MockHttpRequest.create("GET",
new URI("/candlepin/status?exclude=a2&exclude=a3.c1"),
new URI("http://localhost"));
when(mockRequestContext.getUriInfo()).thenReturn(mockReq.getUri());
interceptor.filter(mockRequestContext);
DynamicFilterData filterData = ResteasyProviderFactory.getContextData(DynamicFilterData.class);
assertNotNull(filterData);
assertFalse(filterData.isAttributeExcluded("a1"));
assertFalse(filterData.isAttributeExcluded("a1.c1"));
assertFalse(filterData.isAttributeExcluded("a1.c2"));
assertTrue(filterData.isAttributeExcluded("a2"));
assertTrue(filterData.isAttributeExcluded("a2.c1"));
assertTrue(filterData.isAttributeExcluded("a2.c2"));
assertFalse(filterData.isAttributeExcluded("a3"));
assertTrue(filterData.isAttributeExcluded("a3.c1"));
assertFalse(filterData.isAttributeExcluded("a3.c2"));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a1")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a1", "c1")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a1", "c2")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a2")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a2", "c1")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a2", "c2")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a3")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a3", "c1")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a3", "c2")));
}
@Test
public void testSimpleWhitelist() throws Exception {
mockReq = MockHttpRequest.create("GET",
new URI("/candlepin/status?include=a2"),
new URI("http://localhost"));
when(mockRequestContext.getUriInfo()).thenReturn(mockReq.getUri());
interceptor.filter(mockRequestContext);
DynamicFilterData filterData = ResteasyProviderFactory.getContextData(DynamicFilterData.class);
assertNotNull(filterData);
assertTrue(filterData.isAttributeExcluded("a1"));
assertTrue(filterData.isAttributeExcluded("a1.c1"));
assertTrue(filterData.isAttributeExcluded("a1.c2"));
assertFalse(filterData.isAttributeExcluded("a2"));
assertFalse(filterData.isAttributeExcluded("a2.c1"));
assertFalse(filterData.isAttributeExcluded("a2.c2"));
assertTrue(filterData.isAttributeExcluded("a3"));
assertTrue(filterData.isAttributeExcluded("a3.c1"));
assertTrue(filterData.isAttributeExcluded("a3.c2"));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a1")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a1", "c1")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a1", "c2")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a2")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a2", "c1")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a2", "c2")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a3")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a3", "c1")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a3", "c2")));
}
@Test
public void testSimpleMultiWhitelist() throws Exception {
mockReq = MockHttpRequest.create("GET",
new URI("/candlepin/status?include=a1&include=a3"),
new URI("http://localhost"));
when(mockRequestContext.getUriInfo()).thenReturn(mockReq.getUri());
interceptor.filter(mockRequestContext);
DynamicFilterData filterData = ResteasyProviderFactory.getContextData(DynamicFilterData.class);
assertNotNull(filterData);
assertFalse(filterData.isAttributeExcluded("a1"));
assertFalse(filterData.isAttributeExcluded("a1.c1"));
assertFalse(filterData.isAttributeExcluded("a1.c2"));
assertTrue(filterData.isAttributeExcluded("a2"));
assertTrue(filterData.isAttributeExcluded("a2.c1"));
assertTrue(filterData.isAttributeExcluded("a2.c2"));
assertFalse(filterData.isAttributeExcluded("a3"));
assertFalse(filterData.isAttributeExcluded("a3.c1"));
assertFalse(filterData.isAttributeExcluded("a3.c2"));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a1")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a1", "c1")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a1", "c2")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a2")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a2", "c1")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a2", "c2")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a3")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a3", "c1")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a3", "c2")));
}
@Test
public void testNestedAttributeWhitelist() throws Exception {
mockReq = MockHttpRequest.create("GET",
new URI("/candlepin/status?include=a2&include=a3.c1"),
new URI("http://localhost"));
when(mockRequestContext.getUriInfo()).thenReturn(mockReq.getUri());
interceptor.filter(mockRequestContext);
DynamicFilterData filterData = ResteasyProviderFactory.getContextData(DynamicFilterData.class);
assertNotNull(filterData);
assertTrue(filterData.isAttributeExcluded("a1"));
assertTrue(filterData.isAttributeExcluded("a1.c1"));
assertTrue(filterData.isAttributeExcluded("a1.c2"));
assertFalse(filterData.isAttributeExcluded("a2"));
assertFalse(filterData.isAttributeExcluded("a2.c1"));
assertFalse(filterData.isAttributeExcluded("a2.c2"));
assertFalse(filterData.isAttributeExcluded("a3"));
assertFalse(filterData.isAttributeExcluded("a3.c1"));
assertTrue(filterData.isAttributeExcluded("a3.c2"));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a1")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a1", "c1")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a1", "c2")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a2")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a2", "c1")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a2", "c2")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a3")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a3", "c1")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a3", "c2")));
}
@Test
public void testIncludesWithExcludes() throws Exception {
mockReq = MockHttpRequest.create("GET",
new URI("/candlepin/status?include=a.b1&exclude=a.b1.c2&exclude=a.b2&include=a.b2.d2"),
new URI("http://localhost"));
when(mockRequestContext.getUriInfo()).thenReturn(mockReq.getUri());
interceptor.filter(mockRequestContext);
DynamicFilterData filterData = ResteasyProviderFactory.getContextData(DynamicFilterData.class);
assertNotNull(filterData);
// a: { b1: { c1, c2, c3 }, b2: { d1, d2, d3 } }
assertFalse(filterData.isAttributeExcluded("a"));
assertFalse(filterData.isAttributeExcluded("a.b1"));
assertFalse(filterData.isAttributeExcluded("a.b1.c1"));
assertTrue(filterData.isAttributeExcluded("a.b1.c2"));
assertFalse(filterData.isAttributeExcluded("a.b1.c3"));
assertFalse(filterData.isAttributeExcluded("a.b2"));
assertTrue(filterData.isAttributeExcluded("a.b2.d1"));
assertFalse(filterData.isAttributeExcluded("a.b2.d2"));
assertTrue(filterData.isAttributeExcluded("a.b2.d3"));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a", "b1")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a", "b1", "c1")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a", "b1", "c2")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a", "b1", "c3")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a", "b2")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a", "b2", "d1")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a", "b2", "d2")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a", "b2", "d3")));
}
@Test
public void testIncludesWithExcludesUsingWhitelist() throws Exception {
mockReq = MockHttpRequest.create("GET",
new URI("/candlepin/status?include=a.b1&exclude=a.b1.c2&include=a.b2.d2&filtermode=whitelist"),
new URI("http://localhost"));
when(mockRequestContext.getUriInfo()).thenReturn(mockReq.getUri());
interceptor.filter(mockRequestContext);
DynamicFilterData filterData = ResteasyProviderFactory.getContextData(DynamicFilterData.class);
assertNotNull(filterData);
// a: { b1: { c1, c2, c3 }, b2: { d1, d2, d3 } }
assertFalse(filterData.isAttributeExcluded("a"));
assertFalse(filterData.isAttributeExcluded("a.b1"));
assertFalse(filterData.isAttributeExcluded("a.b1.c1"));
assertTrue(filterData.isAttributeExcluded("a.b1.c2"));
assertFalse(filterData.isAttributeExcluded("a.b1.c3"));
assertFalse(filterData.isAttributeExcluded("a.b2"));
assertTrue(filterData.isAttributeExcluded("a.b2.d1"));
assertFalse(filterData.isAttributeExcluded("a.b2.d2"));
assertTrue(filterData.isAttributeExcluded("a.b2.d3"));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a", "b1")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a", "b1", "c1")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a", "b1", "c2")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a", "b1", "c3")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a", "b2")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a", "b2", "d1")));
assertFalse(filterData.isAttributeExcluded(Arrays.asList("a", "b2", "d2")));
assertTrue(filterData.isAttributeExcluded(Arrays.asList("a", "b2", "d3")));
}
}