You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by yh...@apache.org on 2016/05/18 13:03:58 UTC

[2/5] incubator-atlas git commit: ATLAS-491 Business Catalog / Taxonomy (jspeidel via yhemanth)

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/aaf2971a/catalog/src/test/java/org/apache/atlas/catalog/InstanceRequestTest.java
----------------------------------------------------------------------
diff --git a/catalog/src/test/java/org/apache/atlas/catalog/InstanceRequestTest.java b/catalog/src/test/java/org/apache/atlas/catalog/InstanceRequestTest.java
new file mode 100644
index 0000000..5ccec02
--- /dev/null
+++ b/catalog/src/test/java/org/apache/atlas/catalog/InstanceRequestTest.java
@@ -0,0 +1,67 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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 org.apache.atlas.catalog;
+
+import org.testng.annotations.Test;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+/**
+ * Unit tests for InstanceRequest.
+ */
+public class InstanceRequestTest {
+    @Test
+    public void testRequestProperties() {
+        Map<String, Object> properties = new HashMap<>();
+        properties.put("foo", "fooValue");
+        properties.put("someBoolean", true);
+        Request request = new InstanceRequest(properties);
+
+        assertEquals(Request.Cardinality.INSTANCE, request.getCardinality());
+        assertEquals(properties, request.getProperties());
+        assertEquals("fooValue", request.getProperty("foo"));
+        assertTrue(request.<Boolean>getProperty("someBoolean"));
+        assertNull(request.getProperty("other"));
+        assertTrue(request.getAdditionalSelectProperties().isEmpty());
+    }
+
+    @Test
+    public void testSelectProperties() {
+        Map<String, Object> properties = new HashMap<>();
+        properties.put("foo", "fooValue");
+        properties.put("someBoolean", true);
+        Request request = new InstanceRequest(properties);
+
+        Collection<String> additionalSelectProps = new ArrayList<>();
+        additionalSelectProps.add("prop1");
+        additionalSelectProps.add("prop2");
+        request.addAdditionalSelectProperties(additionalSelectProps);
+        Collection<String> requestAdditionalSelectProps = request.getAdditionalSelectProperties();
+        assertEquals(2, requestAdditionalSelectProps.size());
+        assertTrue(requestAdditionalSelectProps.contains("prop1"));
+        assertTrue(requestAdditionalSelectProps.contains("prop2"));
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/aaf2971a/catalog/src/test/java/org/apache/atlas/catalog/JsonSerializerTest.java
----------------------------------------------------------------------
diff --git a/catalog/src/test/java/org/apache/atlas/catalog/JsonSerializerTest.java b/catalog/src/test/java/org/apache/atlas/catalog/JsonSerializerTest.java
new file mode 100644
index 0000000..60cc210
--- /dev/null
+++ b/catalog/src/test/java/org/apache/atlas/catalog/JsonSerializerTest.java
@@ -0,0 +1,120 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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 org.apache.atlas.catalog;
+
+import org.testng.annotations.Test;
+
+import javax.ws.rs.core.UriInfo;
+
+import java.net.URI;
+import java.util.*;
+
+import static org.easymock.EasyMock.createStrictMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.testng.Assert.assertEquals;
+
+/**
+ * Unit tests for JsonSerializer.
+ */
+public class JsonSerializerTest {
+    @Test
+    public void testSerialize() throws Exception {
+        UriInfo uriInfo = createStrictMock(UriInfo.class);
+        URI uri = new URI("http://test.com:8080/");
+        expect(uriInfo.getBaseUri()).andReturn(uri);
+
+        replay(uriInfo);
+
+        Collection<Map<String, Object>> resultMaps = new ArrayList<>();
+        // result map 1
+        ResourceComparator resourceComparator = new ResourceComparator();
+        Map<String, Object> resultMap1 = new TreeMap<>(resourceComparator);
+        resultMaps.add(resultMap1);
+
+        resultMap1.put("prop1", "property 1 value");
+        resultMap1.put("booleanProp", true);
+        resultMap1.put("numberProp", 100);
+        resultMap1.put("href", "v1/testResources/foo");
+
+        ArrayList<String> listProp = new ArrayList<>();
+        listProp.add("one");
+        listProp.add("two");
+        resultMap1.put("listProp", listProp);
+
+        Map<String, Object> mapProp = new TreeMap<>(resourceComparator);
+        mapProp.put("mapProp1", "mapProp1Value");
+        ArrayList<String> mapListProp = new ArrayList<>();
+        mapListProp.add("mapListOne");
+        mapListProp.add("mapListTwo");
+        mapProp.put("mapListProp", mapListProp);
+        mapProp.put("href", "v1/testResources/foobar");
+        resultMap1.put("mapProp", mapProp);
+
+        // result map 2
+        Map<String, Object> resultMap2 = new TreeMap<>(resourceComparator);
+        resultMaps.add(resultMap2);
+
+        resultMap2.put("nullProp", null);
+        resultMap2.put("href", "v1/testResources/bar");
+
+        ArrayList<Map<String, Object>> listProp2 = new ArrayList<>();
+        listProp2.add(Collections.<String, Object>singletonMap("listMapProp", "listMapPropValue"));
+        resultMap2.put("listProp", listProp2);
+
+        Result result = new Result(resultMaps);
+
+        JsonSerializer serializer = new JsonSerializer();
+        String resultJson = serializer.serialize(result, uriInfo);
+
+        assertEquals(resultJson, EXPECTED_JSON);
+    }
+
+    private static final String EXPECTED_JSON =
+            "[\n" +
+            "    {\n" +
+            "        \"href\": \"http://test.com:8080/v1/testResources/foo\",\n" +
+            "        \"booleanProp\": true,\n" +
+            "        \"numberProp\": 100,\n" +
+            "        \"prop1\": \"property 1 value\",\n" +
+            "        \"listProp\": [\n" +
+            "            \"one\",\n" +
+            "            \"two\"\n" +
+            "        ],\n" +
+            "        \"mapProp\": {\n" +
+            "            \"href\": \"http://test.com:8080/v1/testResources/foobar\",\n" +
+            "            \"mapProp1\": \"mapProp1Value\",\n" +
+            "            \"mapListProp\": [\n" +
+            "                \"mapListOne\",\n" +
+            "                \"mapListTwo\"\n" +
+            "            ]\n" +
+            "        }\n" +
+            "    },\n" +
+            "    {\n" +
+            "        \"href\": \"http://test.com:8080/v1/testResources/bar\",\n" +
+            "        \"nullProp\": null,\n" +
+            "        \"listProp\": [\n" +
+            "            {\n" +
+            "                \"listMapProp\": \"listMapPropValue\"\n" +
+            "            }\n" +
+            "        ]\n" +
+            "    }\n" +
+            "]";
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/aaf2971a/catalog/src/test/java/org/apache/atlas/catalog/ResourceComparatorTest.java
----------------------------------------------------------------------
diff --git a/catalog/src/test/java/org/apache/atlas/catalog/ResourceComparatorTest.java b/catalog/src/test/java/org/apache/atlas/catalog/ResourceComparatorTest.java
new file mode 100644
index 0000000..146ca0c
--- /dev/null
+++ b/catalog/src/test/java/org/apache/atlas/catalog/ResourceComparatorTest.java
@@ -0,0 +1,61 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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 org.apache.atlas.catalog;
+
+import org.testng.annotations.Test;
+
+import java.util.*;
+
+import static org.testng.Assert.assertEquals;
+
+/**
+ * Unit tests for ResourceComparator.
+ */
+public class ResourceComparatorTest {
+    @Test
+    public void testCompare() {
+        Map<String, Object> map = new TreeMap<>(new ResourceComparator());
+        map.put("a", "zzzzz");
+        map.put("name", 1);
+        map.put("z", "fdsfdsds");
+        map.put("d", new ArrayList<>());
+        map.put("id", 1);
+        map.put("e", false);
+        map.put("c", 1);
+        map.put("href", "dfdfgdf");
+        map.put("b", new HashMap<>());
+        map.put("description", 1);
+        map.put("f", 20);
+        map.put("type", 1);
+
+        Iterator<String> iter = map.keySet().iterator();
+        assertEquals(iter.next(), "href");
+        assertEquals(iter.next(), "name");
+        assertEquals(iter.next(), "id");
+        assertEquals(iter.next(), "description");
+        assertEquals(iter.next(), "type");
+        assertEquals(iter.next(), "a");
+        assertEquals(iter.next(), "b");
+        assertEquals(iter.next(), "c");
+        assertEquals(iter.next(), "d");
+        assertEquals(iter.next(), "e");
+        assertEquals(iter.next(), "f");
+        assertEquals(iter.next(), "z");
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/aaf2971a/catalog/src/test/java/org/apache/atlas/catalog/TaxonomyResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/catalog/src/test/java/org/apache/atlas/catalog/TaxonomyResourceProviderTest.java b/catalog/src/test/java/org/apache/atlas/catalog/TaxonomyResourceProviderTest.java
new file mode 100644
index 0000000..9cf3d12
--- /dev/null
+++ b/catalog/src/test/java/org/apache/atlas/catalog/TaxonomyResourceProviderTest.java
@@ -0,0 +1,287 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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 org.apache.atlas.catalog;
+
+import org.apache.atlas.catalog.definition.ResourceDefinition;
+import org.apache.atlas.catalog.definition.TaxonomyResourceDefinition;
+import org.apache.atlas.catalog.exception.InvalidPayloadException;
+import org.apache.atlas.catalog.exception.ResourceAlreadyExistsException;
+import org.apache.atlas.catalog.exception.ResourceNotFoundException;
+import org.apache.atlas.catalog.query.AtlasQuery;
+import org.apache.atlas.catalog.query.QueryFactory;
+import org.easymock.Capture;
+import org.testng.annotations.Test;
+
+import java.util.*;
+
+import static org.easymock.EasyMock.*;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+/**
+ * Unit tests for TaxonomyResourceProvider.
+ */
+public class TaxonomyResourceProviderTest {
+    @Test
+    public void testGetResource() throws Exception {
+        AtlasTypeSystem typeSystem = createStrictMock(AtlasTypeSystem.class);
+        QueryFactory queryFactory = createStrictMock(QueryFactory.class);
+        AtlasQuery query = createStrictMock(AtlasQuery.class);
+        Capture<Request> requestCapture = newCapture();
+
+        Collection<Map<String, Object>> queryResult = new ArrayList<>();
+        Map<String, Object> queryResultRow = new HashMap<>();
+        queryResult.add(queryResultRow);
+        queryResultRow.put("name", "taxonomyName");
+        queryResultRow.put("description", "test taxonomy description");
+        queryResultRow.put("creation_time", "04/20/2016");
+
+        // mock expectations
+        expect(queryFactory.createTaxonomyQuery(capture(requestCapture))).andReturn(query);
+        expect(query.execute()).andReturn(queryResult);
+        replay(typeSystem, queryFactory, query);
+
+        TaxonomyResourceProvider provider = new TaxonomyResourceProvider(typeSystem);
+        provider.setQueryFactory(queryFactory);
+
+        Map<String, Object> requestProperties = new HashMap<>();
+        requestProperties.put("name", "taxonomyName");
+        Request userRequest = new InstanceRequest(requestProperties);
+
+        Result result = provider.getResourceById(userRequest);
+
+        assertEquals(1, result.getPropertyMaps().size());
+        assertEquals(queryResultRow, result.getPropertyMaps().iterator().next());
+
+        Request request = requestCapture.getValue();
+        assertNull(request.getQueryString());
+        assertEquals(0, request.getAdditionalSelectProperties().size());
+        assertEquals(requestProperties, request.getProperties());
+
+        verify(typeSystem, queryFactory, query);
+    }
+
+    @Test(expectedExceptions = ResourceNotFoundException.class)
+    public void testGetResource_404() throws Exception {
+        AtlasTypeSystem typeSystem = createStrictMock(AtlasTypeSystem.class);
+        QueryFactory queryFactory = createStrictMock(QueryFactory.class);
+        AtlasQuery query = createStrictMock(AtlasQuery.class);
+        Capture<Request> requestCapture = newCapture();
+
+        // empty response should result in a ResourceNotFoundException
+        Collection<Map<String, Object>> emptyResponse = new ArrayList<>();
+
+        // mock expectations
+        expect(queryFactory.createTaxonomyQuery(capture(requestCapture))).andReturn(query);
+        expect(query.execute()).andReturn(emptyResponse);
+        replay(typeSystem, queryFactory, query);
+
+        TaxonomyResourceProvider provider = new TaxonomyResourceProvider(typeSystem);
+        provider.setQueryFactory(queryFactory);
+
+        Map<String, Object> requestProperties = new HashMap<>();
+        requestProperties.put("name", "taxonomyName");
+        Request request = new InstanceRequest(requestProperties);
+
+        provider.getResourceById(request);
+
+        verify(typeSystem, queryFactory, query);
+    }
+
+    @Test
+    public void testGetResources() throws Exception {
+        AtlasTypeSystem typeSystem = createStrictMock(AtlasTypeSystem.class);
+        QueryFactory queryFactory = createStrictMock(QueryFactory.class);
+        AtlasQuery query = createStrictMock(AtlasQuery.class);
+        Capture<Request> requestCapture = newCapture();
+
+        Collection<Map<String, Object>> queryResult = new ArrayList<>();
+        Map<String, Object> queryResultRow1 = new HashMap<>();
+        queryResult.add(queryResultRow1);
+        queryResultRow1.put("mame", "taxonomyName1");
+        queryResultRow1.put("description", "test taxonomy description");
+        queryResultRow1.put("creation_time", "04/20/2016");
+
+        Map<String, Object> queryResultRow2 = new HashMap<>();
+        queryResult.add(queryResultRow2);
+        queryResultRow2.put("mame", "taxonomyName2");
+        queryResultRow2.put("description", "test taxonomy description 2");
+        queryResultRow2.put("creation_time", "04/21/2016");
+
+        // mock expectations
+        expect(queryFactory.createTaxonomyQuery(capture(requestCapture))).andReturn(query);
+        expect(query.execute()).andReturn(queryResult);
+        replay(typeSystem, queryFactory, query);
+
+        TaxonomyResourceProvider provider = new TaxonomyResourceProvider(typeSystem);
+        provider.setQueryFactory(queryFactory);
+
+        Request userRequest = new CollectionRequest(Collections.<String, Object>emptyMap(), "name:taxonomy*");
+        Result result = provider.getResources(userRequest);
+
+        assertEquals(2, result.getPropertyMaps().size());
+        assertTrue(result.getPropertyMaps().contains(queryResultRow1));
+        assertTrue(result.getPropertyMaps().contains(queryResultRow2));
+
+        Request request = requestCapture.getValue();
+        assertEquals("name:taxonomy*", request.getQueryString());
+        assertEquals(0, request.getAdditionalSelectProperties().size());
+        assertEquals(0, request.getProperties().size());
+
+        verify(typeSystem, queryFactory, query);
+    }
+
+    @Test
+    public void testGetResources_noResults() throws Exception {
+        AtlasTypeSystem typeSystem = createStrictMock(AtlasTypeSystem.class);
+        QueryFactory queryFactory = createStrictMock(QueryFactory.class);
+        AtlasQuery query = createStrictMock(AtlasQuery.class);
+        Capture<Request> requestCapture = newCapture();
+
+        // empty result shouldn't result in exception for collection query
+        Collection<Map<String, Object>> queryResult = new ArrayList<>();
+
+        // mock expectations
+        expect(queryFactory.createTaxonomyQuery(capture(requestCapture))).andReturn(query);
+        expect(query.execute()).andReturn(queryResult);
+        replay(typeSystem, queryFactory, query);
+
+        TaxonomyResourceProvider provider = new TaxonomyResourceProvider(typeSystem);
+        provider.setQueryFactory(queryFactory);
+
+        Request userRequest = new CollectionRequest(Collections.<String, Object>emptyMap(), "name:taxonomy*");
+        Result result = provider.getResources(userRequest);
+
+        assertEquals(0, result.getPropertyMaps().size());
+
+        Request request = requestCapture.getValue();
+        assertEquals("name:taxonomy*", request.getQueryString());
+        assertEquals(0, request.getAdditionalSelectProperties().size());
+        assertEquals(0, request.getProperties().size());
+
+        verify(typeSystem, queryFactory, query);
+    }
+
+    @Test(expectedExceptions = InvalidPayloadException.class)
+    public void testCreateResource_invalidRequest__noName() throws Exception {
+        AtlasTypeSystem typeSystem = createStrictMock(AtlasTypeSystem.class);
+        QueryFactory queryFactory = createStrictMock(QueryFactory.class);
+        AtlasQuery query = createStrictMock(AtlasQuery.class);
+
+        // mock expectations
+        replay(typeSystem, queryFactory, query);
+
+        // taxonomy create request must contain 'name' property
+        Map<String, Object> requestProperties = new HashMap<>();
+        requestProperties.put("description", "test");
+        Request userRequest = new InstanceRequest(requestProperties);
+
+        TaxonomyResourceProvider provider = new TaxonomyResourceProvider(typeSystem);
+        provider.setQueryFactory(queryFactory);
+
+        provider.createResource(userRequest);
+    }
+
+    @Test(expectedExceptions = ResourceAlreadyExistsException.class)
+    public void testCreateResource_invalidRequest__alreadyExists() throws Exception {
+        AtlasTypeSystem typeSystem = createStrictMock(AtlasTypeSystem.class);
+        QueryFactory queryFactory = createStrictMock(QueryFactory.class);
+        AtlasQuery query = createStrictMock(AtlasQuery.class);
+        Capture<Request> requestCapture = newCapture();
+
+        // query is executed to see if resource already exists
+        Collection<Map<String, Object>> queryResult = new ArrayList<>();
+        Map<String, Object> queryResultRow = new HashMap<>();
+        queryResult.add(queryResultRow);
+        queryResultRow.put("mame", "taxonomyName");
+        queryResultRow.put("description", "test taxonomy description");
+        queryResultRow.put("creation_time", "04/20/2016");
+
+        // mock expectations
+        expect(queryFactory.createTaxonomyQuery(capture(requestCapture))).andReturn(query);
+        // returning result for query should result in ResourceAlreadyExistsException
+        expect(query.execute()).andReturn(queryResult);
+        replay(typeSystem, queryFactory, query);
+
+        // taxonomy create request must contain 'name' property
+        Map<String, Object> requestProperties = new HashMap<>();
+        requestProperties.put("name", "taxonomyName");
+        Request userRequest = new InstanceRequest(requestProperties);
+
+        TaxonomyResourceProvider provider = new TaxonomyResourceProvider(typeSystem);
+        provider.setQueryFactory(queryFactory);
+
+        provider.createResource(userRequest);
+    }
+
+    @Test
+    public void testCreateResource() throws Exception {
+        AtlasTypeSystem typeSystem = createStrictMock(AtlasTypeSystem.class);
+        QueryFactory queryFactory = createStrictMock(QueryFactory.class);
+        AtlasQuery query = createStrictMock(AtlasQuery.class);
+        Capture<ResourceDefinition> resourceDefinitionCapture = newCapture();
+        Capture<Request> requestCapture = newCapture();
+
+        // empty response indicates that resource doesn't already exist
+        Collection<Map<String, Object>> queryResult = new ArrayList<>();
+
+        // mock expectations
+        expect(queryFactory.createTaxonomyQuery(capture(requestCapture))).andReturn(query);
+        expect(query.execute()).andReturn(queryResult);
+        typeSystem.createEntity(capture(resourceDefinitionCapture), capture(requestCapture));
+        replay(typeSystem, queryFactory, query);
+
+        Map<String, Object> requestProperties = new HashMap<>();
+        requestProperties.put("name", "taxonomyName");
+        Request userRequest = new InstanceRequest(requestProperties);
+
+        TaxonomyResourceProvider provider = new TaxonomyResourceProvider(typeSystem);
+        provider.setQueryFactory(queryFactory);
+
+        provider.createResource(userRequest);
+
+        assertEquals(new TaxonomyResourceDefinition().getTypeName(),
+                resourceDefinitionCapture.getValue().getTypeName());
+
+        Request request = requestCapture.getValue();
+        assertNull(request.getQueryString());
+        assertEquals(requestProperties, request.getProperties());
+
+        verify(typeSystem, queryFactory, query);
+    }
+
+    @Test(expectedExceptions = UnsupportedOperationException.class)
+    public void testCreateResources() throws Exception {
+        AtlasTypeSystem typeSystem = createStrictMock(AtlasTypeSystem.class);
+        QueryFactory queryFactory = createStrictMock(QueryFactory.class);
+
+        // mock expectations
+        replay(typeSystem, queryFactory);
+
+        Map<String, Object> requestProperties = new HashMap<>();
+        requestProperties.put("name", "taxonomyName");
+        Request userRequest = new InstanceRequest(requestProperties);
+
+        TaxonomyResourceProvider provider = new TaxonomyResourceProvider(typeSystem);
+        provider.setQueryFactory(queryFactory);
+
+        provider.createResources(userRequest);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/aaf2971a/catalog/src/test/java/org/apache/atlas/catalog/TermResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/catalog/src/test/java/org/apache/atlas/catalog/TermResourceProviderTest.java b/catalog/src/test/java/org/apache/atlas/catalog/TermResourceProviderTest.java
new file mode 100644
index 0000000..34222ca
--- /dev/null
+++ b/catalog/src/test/java/org/apache/atlas/catalog/TermResourceProviderTest.java
@@ -0,0 +1,355 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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 org.apache.atlas.catalog;
+
+import org.apache.atlas.catalog.definition.ResourceDefinition;
+import org.apache.atlas.catalog.exception.InvalidPayloadException;
+import org.apache.atlas.catalog.exception.ResourceAlreadyExistsException;
+import org.apache.atlas.catalog.exception.ResourceNotFoundException;
+import org.apache.atlas.catalog.query.AtlasQuery;
+import org.apache.atlas.catalog.query.QueryFactory;
+import org.easymock.Capture;
+import org.easymock.EasyMock;
+import org.testng.annotations.Test;
+
+import java.util.*;
+
+import static org.easymock.EasyMock.*;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+/**
+ * Unit tests for TermResourceProvider.
+ */
+public class TermResourceProviderTest {
+    @Test
+    public void testGetResource() throws Exception {
+        AtlasTypeSystem typeSystem = createStrictMock(AtlasTypeSystem.class);
+        QueryFactory queryFactory = createStrictMock(QueryFactory.class);
+        AtlasQuery query = createStrictMock(AtlasQuery.class);
+        Capture<Request> requestCapture = newCapture();
+
+        TermPath termPath = new TermPath("testTaxonomy", "termName");
+
+        Collection<Map<String, Object>> queryResult = new ArrayList<>();
+        Map<String, Object> queryResultRow = new HashMap<>();
+        queryResult.add(queryResultRow);
+        queryResultRow.put("name", "testTaxonomy.termName");
+        queryResultRow.put("description", "test term description");
+        queryResultRow.put("creation_time", "04/20/2016");
+        queryResultRow.put("acceptable_use", "anything");
+        queryResultRow.put("available_as_tag", true);
+        Map<String, Object> hierarchyMap = new HashMap<>();
+        queryResultRow.put("hierarchy", hierarchyMap);
+        hierarchyMap.put("path", "/");
+        hierarchyMap.put("short_name", "termName");
+        hierarchyMap.put("taxonomy", "testTaxonomy");
+
+        // mock expectations
+        expect(queryFactory.createTermQuery(capture(requestCapture))).andReturn(query);
+        expect(query.execute()).andReturn(queryResult);
+        replay(typeSystem, queryFactory, query);
+
+        TermResourceProvider provider = new TermResourceProvider(typeSystem);
+        provider.setQueryFactory(queryFactory);
+
+        Map<String, Object> requestProperties = new HashMap<>();
+        requestProperties.put("termPath", termPath);
+        Request userRequest = new InstanceRequest(requestProperties);
+
+        Result result = provider.getResourceById(userRequest);
+
+        assertEquals(result.getPropertyMaps().size(), 1);
+        assertEquals(result.getPropertyMaps().iterator().next(), queryResultRow);
+
+        Request request = requestCapture.getValue();
+        assertNull(request.getQueryString());
+        assertEquals(request.getAdditionalSelectProperties().size(), 0);
+        assertEquals(request.getProperties().size(), 2);
+        assertEquals(request.getProperties().get("termPath"), termPath);
+        assertEquals(request.getProperties().get("name"), termPath.getFullyQualifiedName());
+
+        verify(typeSystem, queryFactory, query);
+    }
+
+    @Test(expectedExceptions = ResourceNotFoundException.class)
+    public void testGetResource_404() throws Exception {
+        AtlasTypeSystem typeSystem = createStrictMock(AtlasTypeSystem.class);
+        QueryFactory queryFactory = createStrictMock(QueryFactory.class);
+        AtlasQuery query = createStrictMock(AtlasQuery.class);
+        Capture<Request> requestCapture = newCapture();
+
+        // empty response should result in a ResourceNotFoundException
+        Collection<Map<String, Object>> emptyResponse = new ArrayList<>();
+
+        // mock expectations
+        expect(queryFactory.createTermQuery(capture(requestCapture))).andReturn(query);
+        expect(query.execute()).andReturn(emptyResponse);
+        replay(typeSystem, queryFactory, query);
+
+        TermResourceProvider provider = new TermResourceProvider(typeSystem);
+        provider.setQueryFactory(queryFactory);
+
+        Map<String, Object> requestProperties = new HashMap<>();
+        requestProperties.put("termPath", new TermPath("taxonomyName.badTermName"));
+        Request request = new InstanceRequest(requestProperties);
+
+        provider.getResourceById(request);
+    }
+
+    @Test
+    public void testGetResources() throws Exception {
+        AtlasTypeSystem typeSystem = createStrictMock(AtlasTypeSystem.class);
+        QueryFactory queryFactory = createStrictMock(QueryFactory.class);
+        AtlasQuery query = createStrictMock(AtlasQuery.class);
+        Capture<Request> requestCapture = newCapture();
+
+        TermPath termPath = new TermPath("testTaxonomy", null);
+
+        Collection<Map<String, Object>> queryResult = new ArrayList<>();
+        Map<String, Object> queryResultRow1 = new HashMap<>();
+        queryResult.add(queryResultRow1);
+        queryResultRow1.put("name", "testTaxonomy.termName");
+        queryResultRow1.put("description", "test term description");
+        queryResultRow1.put("creation_time", "04/20/2016");
+        queryResultRow1.put("acceptable_use", "anything");
+        queryResultRow1.put("available_as_tag", true);
+        Map<String, Object> hierarchyMap = new HashMap<>();
+        queryResultRow1.put("hierarchy", hierarchyMap);
+        hierarchyMap.put("path", "/");
+        hierarchyMap.put("short_name", "termName");
+        hierarchyMap.put("taxonomy", "testTaxonomy");
+
+        Map<String, Object> queryResultRow2 = new HashMap<>();
+        queryResult.add(queryResultRow2);
+        queryResultRow2.put("name", "testTaxonomy.termName2");
+        queryResultRow2.put("description", "test term 2 description");
+        queryResultRow2.put("creation_time", "04/21/2016");
+        queryResultRow2.put("acceptable_use", "anything");
+        queryResultRow2.put("available_as_tag", true);
+        Map<String, Object> hierarchyMap2 = new HashMap<>();
+        queryResultRow2.put("hierarchy", hierarchyMap2);
+        hierarchyMap2.put("path", "/");
+        hierarchyMap2.put("short_name", "termName2");
+        hierarchyMap2.put("taxonomy", "testTaxonomy");
+
+        // mock expectations
+        expect(queryFactory.createTermQuery(capture(requestCapture))).andReturn(query);
+        expect(query.execute()).andReturn(queryResult);
+        replay(typeSystem, queryFactory, query);
+
+        TermResourceProvider provider = new TermResourceProvider(typeSystem);
+        provider.setQueryFactory(queryFactory);
+
+        Map<String, Object> requestProperties = new HashMap<>();
+        requestProperties.put("termPath", termPath);
+        Request userRequest = new CollectionRequest(requestProperties, "name:taxonomy*");
+        // invoke test method
+        Result result = provider.getResources(userRequest);
+
+        assertEquals(result.getPropertyMaps().size(), 2);
+        assertTrue(result.getPropertyMaps().contains(queryResultRow1));
+        assertTrue(result.getPropertyMaps().contains(queryResultRow2));
+
+        Request request = requestCapture.getValue();
+        assertEquals(request.getQueryString(), "name:taxonomy*");
+        assertEquals(request.getAdditionalSelectProperties().size(), 0);
+        assertEquals(request.getProperties().size(), 1);
+
+        verify(typeSystem, queryFactory, query);
+    }
+
+    @Test
+    public void testGetResources_noResults() throws Exception {
+        AtlasTypeSystem typeSystem = createStrictMock(AtlasTypeSystem.class);
+        QueryFactory queryFactory = createStrictMock(QueryFactory.class);
+        AtlasQuery query = createStrictMock(AtlasQuery.class);
+        Capture<Request> requestCapture = newCapture();
+
+        TermPath termPath = new TermPath("testTaxonomy", "termName");
+
+        // empty result shouldn't result in exception for collection query
+        Collection<Map<String, Object>> queryResult = new ArrayList<>();
+
+        // mock expectations
+        expect(queryFactory.createTermQuery(capture(requestCapture))).andReturn(query);
+        expect(query.execute()).andReturn(queryResult);
+        replay(typeSystem, queryFactory, query);
+
+        TermResourceProvider provider = new TermResourceProvider(typeSystem);
+        provider.setQueryFactory(queryFactory);
+
+        Map<String, Object> requestProperties = new HashMap<>();
+        requestProperties.put("termPath", termPath);
+        Request userRequest = new CollectionRequest(requestProperties, "name:taxonomy*");
+        // invoke test method
+        Result result = provider.getResources(userRequest);
+
+        assertEquals(0, result.getPropertyMaps().size());
+
+        Request request = requestCapture.getValue();
+        assertEquals(request.getQueryString(), "name:taxonomy*");
+        assertEquals(request.getAdditionalSelectProperties().size(), 0);
+        assertEquals(request.getProperties().size(), 1);
+
+        verify(typeSystem, queryFactory, query);
+    }
+
+    @Test(expectedExceptions = InvalidPayloadException.class)
+    public void testCreateResource_invalidRequest__noName() throws Exception {
+        AtlasTypeSystem typeSystem = createStrictMock(AtlasTypeSystem.class);
+        QueryFactory queryFactory = createStrictMock(QueryFactory.class);
+        AtlasQuery query = createStrictMock(AtlasQuery.class);
+
+        // null term name should result in InvalidPayloadException
+        TermPath termPath = new TermPath("testTaxonomy", null);
+
+        // mock expectations
+        replay(typeSystem, queryFactory, query);
+
+        Map<String, Object> requestProperties = new HashMap<>();
+        requestProperties.put("termPath", termPath);
+        Request userRequest = new InstanceRequest(requestProperties);
+
+        TermResourceProvider provider = new TermResourceProvider(typeSystem);
+        provider.setQueryFactory(queryFactory);
+
+        provider.createResource(userRequest);
+    }
+
+    @Test
+    public void testCreateResource() throws Exception {
+        AtlasTypeSystem typeSystem = createStrictMock(AtlasTypeSystem.class);
+        QueryFactory queryFactory = createStrictMock(QueryFactory.class);
+        AtlasQuery query = createStrictMock(AtlasQuery.class);
+        Capture<ResourceDefinition> resourceDefinitionCapture = newCapture();
+        ResourceProvider taxonomyResourceProvider = createStrictMock(TaxonomyResourceProvider.class);
+        Capture<Request> taxonomyRequestCapture = newCapture();
+
+        Collection<Map<String, Object>> taxonomyQueryResult = new ArrayList<>();
+        Map<String, Object> taxonomyQueryResultRow = new HashMap<>();
+        taxonomyQueryResult.add(taxonomyQueryResultRow);
+        taxonomyQueryResultRow.put("name", "testTaxonomy");
+        taxonomyQueryResultRow.put("id", "11-22-33");
+        Result taxonomyResult = new Result(taxonomyQueryResult);
+
+        Map<String, Object> expectedRequestProps = new HashMap<>();
+        expectedRequestProps.put("name", "testTaxonomy.termName");
+        // when not specified, the default value of 'true' should be set
+        expectedRequestProps.put("available_as_tag", true);
+
+        // mock expectations
+        expect(taxonomyResourceProvider.getResourceById(capture(taxonomyRequestCapture))).andReturn(taxonomyResult);
+        typeSystem.createTraitType(capture(resourceDefinitionCapture), eq("testTaxonomy.termName"), EasyMock.<String>isNull());
+        typeSystem.createTraitInstance("11-22-33", "testTaxonomy.termName", expectedRequestProps);
+        replay(typeSystem, queryFactory, query, taxonomyResourceProvider);
+
+        TermResourceProvider provider = new TestTermResourceProvider(typeSystem, taxonomyResourceProvider);
+        provider.setQueryFactory(queryFactory);
+
+        TermPath termPath = new TermPath("testTaxonomy", "termName");
+        Map<String, Object> requestProperties = new HashMap<>();
+        requestProperties.put("termPath", termPath);
+        Request userRequest = new InstanceRequest(requestProperties);
+
+        provider.createResource(userRequest);
+
+        Request taxonomyRequest = taxonomyRequestCapture.getValue();
+        Map<String, Object> taxonomyRequestProps = taxonomyRequest.getProperties();
+        assertEquals(taxonomyRequestProps.size(), 1);
+        assertEquals(taxonomyRequestProps.get("name"), "testTaxonomy");
+        assertEquals(taxonomyRequest.getAdditionalSelectProperties().size(), 1);
+        assertEquals(taxonomyRequest.getAdditionalSelectProperties().iterator().next(), "id");
+        assertNull(taxonomyRequest.getQueryString());
+
+        ResourceDefinition resourceDefinition = resourceDefinitionCapture.getValue();
+        assertEquals(resourceDefinition.getTypeName(), "Term");
+
+        verify(typeSystem, queryFactory, query, taxonomyResourceProvider);
+    }
+
+    @Test(expectedExceptions = ResourceAlreadyExistsException.class)
+    public void testCreateResource_invalidRequest__alreadyExists() throws Exception {
+        AtlasTypeSystem typeSystem = createStrictMock(AtlasTypeSystem.class);
+        QueryFactory queryFactory = createStrictMock(QueryFactory.class);
+        AtlasQuery query = createStrictMock(AtlasQuery.class);
+        Capture<ResourceDefinition> resourceDefinitionCapture = newCapture();
+        ResourceProvider taxonomyResourceProvider = createStrictMock(TaxonomyResourceProvider.class);
+        Capture<Request> taxonomyRequestCapture = newCapture();
+
+        Collection<Map<String, Object>> taxonomyQueryResult = new ArrayList<>();
+        Map<String, Object> taxonomyQueryResultRow = new HashMap<>();
+        taxonomyQueryResult.add(taxonomyQueryResultRow);
+        taxonomyQueryResultRow.put("name", "testTaxonomy");
+        taxonomyQueryResultRow.put("id", "11-22-33");
+        Result taxonomyResult = new Result(taxonomyQueryResult);
+
+        // mock expectations
+        expect(taxonomyResourceProvider.getResourceById(capture(taxonomyRequestCapture))).andReturn(taxonomyResult);
+        typeSystem.createTraitType(capture(resourceDefinitionCapture), eq("testTaxonomy.termName"), EasyMock.<String>isNull());
+        expectLastCall().andThrow(new ResourceAlreadyExistsException(""));
+
+        replay(typeSystem, queryFactory, query, taxonomyResourceProvider);
+
+        TermResourceProvider provider = new TestTermResourceProvider(typeSystem, taxonomyResourceProvider);
+        provider.setQueryFactory(queryFactory);
+
+        TermPath termPath = new TermPath("testTaxonomy", "termName");
+        Map<String, Object> requestProperties = new HashMap<>();
+        requestProperties.put("termPath", termPath);
+        Request userRequest = new InstanceRequest(requestProperties);
+
+        provider.createResource(userRequest);
+    }
+
+    @Test(expectedExceptions = UnsupportedOperationException.class)
+    public void testCreateResources() throws Exception {
+        AtlasTypeSystem typeSystem = createStrictMock(AtlasTypeSystem.class);
+        QueryFactory queryFactory = createStrictMock(QueryFactory.class);
+
+        // mock expectations
+        replay(typeSystem, queryFactory);
+
+        TermPath termPath = new TermPath("testTaxonomy", "termName");
+        Map<String, Object> requestProperties = new HashMap<>();
+        requestProperties.put("termPath", termPath);
+        Request userRequest = new InstanceRequest(requestProperties);
+
+        TermResourceProvider provider = new TermResourceProvider(typeSystem);
+        provider.setQueryFactory(queryFactory);
+
+        provider.createResources(userRequest);
+    }
+
+    private static class TestTermResourceProvider extends TermResourceProvider {
+
+        private ResourceProvider testTaxonomyResourceProvider;
+
+        public TestTermResourceProvider(AtlasTypeSystem typeSystem, ResourceProvider taxonomyResourceProvider) {
+            super(typeSystem);
+            testTaxonomyResourceProvider = taxonomyResourceProvider;
+        }
+
+        @Override
+        protected synchronized ResourceProvider getTaxonomyResourceProvider() {
+            return testTaxonomyResourceProvider;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/aaf2971a/catalog/src/test/java/org/apache/atlas/catalog/VertexWrapperTest.java
----------------------------------------------------------------------
diff --git a/catalog/src/test/java/org/apache/atlas/catalog/VertexWrapperTest.java b/catalog/src/test/java/org/apache/atlas/catalog/VertexWrapperTest.java
new file mode 100644
index 0000000..64935a6
--- /dev/null
+++ b/catalog/src/test/java/org/apache/atlas/catalog/VertexWrapperTest.java
@@ -0,0 +1,311 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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 org.apache.atlas.catalog;
+
+import com.tinkerpop.blueprints.Vertex;
+import org.apache.atlas.catalog.definition.ResourceDefinition;
+import org.apache.atlas.repository.Constants;
+import org.testng.annotations.Test;
+
+import java.util.*;
+
+import static org.easymock.EasyMock.*;
+import static org.testng.Assert.*;
+
+/**
+ * Unit tests for VertexWrapper.
+ */
+public class VertexWrapperTest {
+    @Test
+    public void testGetVertex() {
+        Vertex v = createStrictMock(Vertex.class);
+        ResourceDefinition resourceDefinition = createStrictMock(ResourceDefinition.class);
+
+        // just return null for these because they aren't used in this test
+        expect(resourceDefinition.getPropertyMapper()).andReturn(null);
+        expect(resourceDefinition.getPropertyValueFormatters()).andReturn(null);
+        expect(v.<String>getProperty(Constants.ENTITY_TYPE_PROPERTY_KEY)).andReturn("testType");
+        replay(v, resourceDefinition);
+
+        VertexWrapper vWrapper = new VertexWrapper(v, resourceDefinition);
+
+        assertEquals(vWrapper.getVertex(), v);
+        verify(v, resourceDefinition);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testGetProperty() {
+        String testType = "testType";
+        String propName = "propName";
+        String qualifiedPropName = "Prefix.propName";
+        String propValue = "val";
+        String formattedValue = "value";
+        Vertex v = createStrictMock(Vertex.class);
+        PropertyMapper propertyMapper = createStrictMock(PropertyMapper.class);
+        PropertyValueFormatter formatter = createStrictMock(PropertyValueFormatter.class);
+
+        // mock expectations
+        expect(v.<String>getProperty(Constants.ENTITY_TYPE_PROPERTY_KEY)).andReturn(testType);
+        expect(propertyMapper.toFullyQualifiedName(propName, testType)).andReturn(qualifiedPropName);
+        expect(v.getProperty(qualifiedPropName)).andReturn(propValue);
+        expect(formatter.format(propValue)).andReturn((formattedValue));
+        replay(v, propertyMapper, formatter);
+
+        VertexWrapper vWrapper = new VertexWrapper(v, propertyMapper, Collections.singletonMap(propName, formatter));
+        assertEquals(vWrapper.getProperty(propName), formattedValue);
+
+        // now remove prop
+        vWrapper.removeProperty(propName);
+        assertNull(vWrapper.getProperty(propName));
+
+        verify(v, propertyMapper, formatter);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testGetProperty2() {
+        String testType = "testType";
+        String propName = "propName";
+        String qualifiedPropName = "Prefix.propName";
+        String propValue = "val";
+        String formattedValue = "value";
+        Vertex v = createStrictMock(Vertex.class);
+        ResourceDefinition resourceDefinition = createStrictMock(ResourceDefinition.class);
+        PropertyMapper propertyMapper = createStrictMock(PropertyMapper.class);
+        PropertyValueFormatter formatter = createStrictMock(PropertyValueFormatter.class);
+
+        // mock expectations
+        expect(v.<String>getProperty(Constants.ENTITY_TYPE_PROPERTY_KEY)).andReturn(testType);
+        expect(resourceDefinition.getPropertyMapper()).andReturn(propertyMapper);
+        expect(resourceDefinition.getPropertyValueFormatters()).andReturn(Collections.singletonMap(propName, formatter));
+        expect(propertyMapper.toFullyQualifiedName(propName, testType)).andReturn(qualifiedPropName);
+        expect(v.getProperty(qualifiedPropName)).andReturn(propValue);
+        expect(formatter.format(propValue)).andReturn((formattedValue));
+        replay(v, resourceDefinition, propertyMapper, formatter);
+
+        VertexWrapper vWrapper = new VertexWrapper(v, resourceDefinition);
+        assertEquals(vWrapper.getProperty(propName), formattedValue);
+
+        // now remove prop
+        vWrapper.removeProperty(propName);
+        assertNull(vWrapper.getProperty(propName));
+
+        verify(v, resourceDefinition, propertyMapper, formatter);
+    }
+
+    @Test
+    public void testGetProperty_removed() {
+        String testType = "testType";
+        String propName = "propName";
+        Vertex v = createStrictMock(Vertex.class);
+        expect(v.<String>getProperty(Constants.ENTITY_TYPE_PROPERTY_KEY)).andReturn(testType);
+        // vertex shouldn't be asked for the removed property
+        replay(v);
+
+        VertexWrapper vWrapper = new VertexWrapper(v, null, Collections.<String, PropertyValueFormatter>emptyMap());
+        vWrapper.removeProperty(propName);
+
+        assertNull(vWrapper.getProperty(propName));
+        verify(v);
+    }
+
+    @Test
+    public void testGetPropertyKeys() {
+        String testType = "testType";
+        // vertex returns unordered set
+        Set<String> propertyKeys = new HashSet<>();
+        propertyKeys.add("foobar");
+        propertyKeys.add("Prefix.foo");
+        propertyKeys.add("Prefix.bar");
+
+        Vertex v = createStrictMock(Vertex.class);
+        PropertyMapper propertyMapper = createMock(PropertyMapper.class);
+
+        // mock expectations
+        expect(v.<String>getProperty(Constants.ENTITY_TYPE_PROPERTY_KEY)).andReturn(testType);
+        expect(v.getPropertyKeys()).andReturn(propertyKeys);
+        expect(propertyMapper.toCleanName("Prefix.bar", testType)).andReturn("bar");
+        expect(propertyMapper.toCleanName("Prefix.foo", testType)).andReturn("foo");
+        expect(propertyMapper.toCleanName("foobar", testType)).andReturn("foobar");
+
+        replay(v, propertyMapper);
+
+        VertexWrapper vWrapper = new VertexWrapper(v, propertyMapper,
+                Collections.<String, PropertyValueFormatter>emptyMap());
+
+        Collection<String> resultKeys = vWrapper.getPropertyKeys();
+        Iterator<String> propIterator = resultKeys.iterator();
+        assertEquals(resultKeys.size(), 3);
+        // natural ordering is applied in vertex wrapper
+        assertEquals(propIterator.next(), "bar");
+        assertEquals(propIterator.next(), "foo");
+        assertEquals(propIterator.next(), "foobar");
+
+        verify(v, propertyMapper);
+    }
+
+    @Test
+    public void testGetPropertyKeys_removed() {
+        String testType = "testType";
+        Set<String> propertyKeys = new TreeSet<>();
+        propertyKeys.add("Prefix.foo");
+        propertyKeys.add("Prefix.bar");
+        propertyKeys.add("foobar");
+
+        Vertex v = createStrictMock(Vertex.class);
+        PropertyMapper propertyMapper = createStrictMock(PropertyMapper.class);
+
+        // mock expectations
+        expect(v.<String>getProperty(Constants.ENTITY_TYPE_PROPERTY_KEY)).andReturn(testType);
+        expect(v.getPropertyKeys()).andReturn(propertyKeys);
+        // natural ordering provided by TreeSet
+        expect(propertyMapper.toCleanName("Prefix.bar", testType)).andReturn("bar");
+        expect(propertyMapper.toCleanName("Prefix.foo", testType)).andReturn("foo");
+        expect(propertyMapper.toCleanName("foobar", testType)).andReturn("foobar");
+
+        replay(v, propertyMapper);
+
+        VertexWrapper vWrapper = new VertexWrapper(v, propertyMapper,
+                Collections.<String, PropertyValueFormatter>emptyMap());
+
+        // remove props
+        vWrapper.removeProperty("foo");
+        vWrapper.removeProperty("foobar");
+
+        Collection<String> resultKeys = vWrapper.getPropertyKeys();
+        assertEquals(resultKeys.size(), 1);
+        assertTrue(resultKeys.contains("bar"));
+
+        verify(v, propertyMapper);
+    }
+
+    @Test
+    public void testGetPropertyMap() {
+        String testType = "testType";
+        Set<String> propertyKeys = new HashSet<>();
+        propertyKeys.add("Prefix.foo");
+        propertyKeys.add("Prefix.bar");
+        propertyKeys.add("foobar");
+
+        Vertex v = createMock(Vertex.class);
+        PropertyMapper propertyMapper = createMock(PropertyMapper.class);
+        PropertyValueFormatter formatter = createMock(PropertyValueFormatter.class);
+
+        Map<String, PropertyValueFormatter> valueFormatters = new HashMap<>();
+        valueFormatters.put("foo", formatter);
+        valueFormatters.put("bar", formatter);
+
+        // mock expectations
+        expect(v.<String>getProperty(Constants.ENTITY_TYPE_PROPERTY_KEY)).andReturn(testType);
+        expect(v.getPropertyKeys()).andReturn(propertyKeys);
+        expect(v.getProperty("Prefix.foo")).andReturn("Prefix.foo:Value");
+        expect(v.getProperty("Prefix.bar")).andReturn("Prefix.bar:Value");
+        expect(v.getProperty("foobar")).andReturn("foobarValue");
+
+        expect(propertyMapper.toCleanName("Prefix.bar", testType)).andReturn("bar");
+        expect(propertyMapper.toCleanName("Prefix.foo", testType)).andReturn("foo");
+        expect(propertyMapper.toCleanName("foobar", testType)).andReturn("foobar");
+
+        expect(formatter.format("Prefix.foo:Value")).andReturn("fooValue");
+        expect(formatter.format("Prefix.bar:Value")).andReturn("barValue");
+
+        replay(v, propertyMapper, formatter);
+
+        VertexWrapper vWrapper = new VertexWrapper(v, propertyMapper, valueFormatters);
+        Map<String, Object> resultMap = vWrapper.getPropertyMap();
+
+        assertEquals(resultMap.size(), 3);
+        Iterator<Map.Entry<String, Object>> iter = resultMap.entrySet().iterator();
+        Map.Entry<String, Object> entry1 = iter.next();
+        assertEquals(entry1.getKey(), "bar");
+        assertEquals(entry1.getValue(), "barValue");
+        Map.Entry<String, Object> entry2 = iter.next();
+        assertEquals(entry2.getKey(), "foo");
+        assertEquals(entry2.getValue(), "fooValue");
+        Map.Entry<String, Object> entry3 = iter.next();
+        assertEquals(entry3.getKey(), "foobar");
+        assertEquals(entry3.getValue(), "foobarValue");
+
+        verify(v, propertyMapper, formatter);
+    }
+
+    @Test
+    public void testGetPropertyMap_removed() {
+        String testType = "testType";
+        Set<String> propertyKeys = new HashSet<>();
+        propertyKeys.add("Prefix.foo");
+        propertyKeys.add("Prefix.bar");
+        propertyKeys.add("foobar");
+
+        Vertex v = createMock(Vertex.class);
+        PropertyMapper propertyMapper = createMock(PropertyMapper.class);
+        PropertyValueFormatter formatter = createMock(PropertyValueFormatter.class);
+
+        Map<String, PropertyValueFormatter> valueFormatters = new HashMap<>();
+        valueFormatters.put("foo", formatter);
+        valueFormatters.put("bar", formatter);
+
+        // mock expectations
+        expect(v.<String>getProperty(Constants.ENTITY_TYPE_PROPERTY_KEY)).andReturn(testType);
+        expect(v.getPropertyKeys()).andReturn(propertyKeys);
+        expect(v.getProperty("Prefix.bar")).andReturn("Prefix.bar:Value");
+        expect(v.getProperty("foobar")).andReturn("foobarValue");
+
+        expect(propertyMapper.toCleanName("Prefix.bar", testType)).andReturn("bar");
+        expect(propertyMapper.toCleanName("Prefix.foo", testType)).andReturn("foo");
+        expect(propertyMapper.toCleanName("foobar", testType)).andReturn("foobar");
+
+        expect(formatter.format("Prefix.bar:Value")).andReturn("barValue");
+
+        replay(v, propertyMapper, formatter);
+
+        VertexWrapper vWrapper = new VertexWrapper(v, propertyMapper, valueFormatters);
+        //remove "foo" property
+        vWrapper.removeProperty("foo");
+
+        Map<String, Object> resultMap = vWrapper.getPropertyMap();
+        assertEquals(resultMap.size(), 2);
+
+        Iterator<Map.Entry<String, Object>> iter = resultMap.entrySet().iterator();
+        Map.Entry<String, Object> entry1 = iter.next();
+        assertEquals(entry1.getKey(), "bar");
+        assertEquals(entry1.getValue(), "barValue");
+        Map.Entry<String, Object> entry2 = iter.next();
+        assertEquals(entry2.getKey(), "foobar");
+        assertEquals(entry2.getValue(), "foobarValue");
+
+        verify(v, propertyMapper, formatter);
+    }
+
+    @Test
+    public void testIsPropertyRemoved() {
+        String testType = "testType";
+        Vertex v = createMock(Vertex.class);
+        expect(v.<String>getProperty(Constants.ENTITY_TYPE_PROPERTY_KEY)).andReturn(testType);
+        replay(v);
+
+        VertexWrapper vWrapper = new VertexWrapper(v, null,
+                Collections.<String, PropertyValueFormatter>emptyMap());
+
+        vWrapper.removeProperty("foo");
+        assertTrue(vWrapper.isPropertyRemoved("foo"));
+        assertFalse(vWrapper.isPropertyRemoved("bar"));
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/aaf2971a/catalog/src/test/java/org/apache/atlas/catalog/definition/EntityResourceDefinitionTest.java
----------------------------------------------------------------------
diff --git a/catalog/src/test/java/org/apache/atlas/catalog/definition/EntityResourceDefinitionTest.java b/catalog/src/test/java/org/apache/atlas/catalog/definition/EntityResourceDefinitionTest.java
new file mode 100644
index 0000000..303e2ba
--- /dev/null
+++ b/catalog/src/test/java/org/apache/atlas/catalog/definition/EntityResourceDefinitionTest.java
@@ -0,0 +1,140 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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 org.apache.atlas.catalog.definition;
+
+import org.apache.atlas.catalog.CollectionRequest;
+import org.apache.atlas.catalog.InstanceRequest;
+import org.apache.atlas.catalog.Request;
+import org.apache.atlas.catalog.projection.Projection;
+import org.apache.atlas.catalog.projection.Relation;
+import org.testng.annotations.Test;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+/**
+ * Unit tests for EntityResourceDefinition.
+ */
+public class EntityResourceDefinitionTest {
+    @Test
+    public void testGetIdPropertyName() {
+        ResourceDefinition entityDefinition = new EntityResourceDefinition();
+        assertEquals(entityDefinition.getIdPropertyName(), "id");
+    }
+
+    @Test
+    public void testGetTypeName() {
+        ResourceDefinition entityDefinition = new EntityResourceDefinition();
+        assertNull(entityDefinition.getTypeName());
+    }
+
+    @Test
+    public void testResolveHref() {
+        Map<String, Object> resourceProps = new HashMap<>();
+        resourceProps.put("id", "111-222-333");
+        resourceProps.put("name", "foo");
+
+        ResourceDefinition entityDefinition = new EntityResourceDefinition();
+        String href = entityDefinition.resolveHref(resourceProps);
+        assertEquals(href, "v1/entities/111-222-333");
+    }
+
+    // Because we don't currently support entity creation, this method is basically a no-op.
+    @Test
+    public void testValidate() throws Exception {
+        Request request = new InstanceRequest(Collections.<String, Object>emptyMap());
+
+        ResourceDefinition entityDefinition = new EntityResourceDefinition();
+        entityDefinition.validate(request);
+    }
+
+    // Because we don't currently support entity creation, no properties are registered
+    @Test
+    public void testGetPropertyDefinitions() {
+        ResourceDefinition entityDefinition = new EntityResourceDefinition();
+        assertTrue(entityDefinition.getPropertyDefinitions().isEmpty());
+    }
+
+    @Test
+    public void testFilterProperties_Instance() {
+        Map<String, Object> resourceProps = new HashMap<>();
+        resourceProps.put("id", "111-222-333");
+        resourceProps.put("name", "nameVal");
+        resourceProps.put("type", "someType");
+        resourceProps.put("foo", "fooVal");
+        resourceProps.put("bar", "barVal");
+        resourceProps.put("fooBar", "fooBarVal");
+        resourceProps.put("other", "otherVal");
+
+        Request request = new InstanceRequest(resourceProps);
+        ResourceDefinition entityDefinition = new EntityResourceDefinition();
+        // no filtering should occur for entity instances
+        assertEquals(entityDefinition.filterProperties(request, resourceProps), resourceProps);
+    }
+
+    @Test
+    public void testFilterProperties_Collection() {
+        Map<String, Object> resourceProps = new HashMap<>();
+        resourceProps.put("id", "111-222-333");
+        resourceProps.put("name", "nameVal");
+        resourceProps.put("type", "someType");
+        resourceProps.put("foo", "fooVal");
+        resourceProps.put("bar", "barVal");
+        resourceProps.put("fooBar", "fooBarVal");
+        resourceProps.put("other", "otherVal");
+
+        Request request = new CollectionRequest(resourceProps, "someProperty:someValue");
+        request.addAdditionalSelectProperties(Collections.singleton("foo"));
+        ResourceDefinition entityDefinition = new EntityResourceDefinition();
+        // no filtering should occur for entity instances
+        Map<String, Object> filteredProps = entityDefinition.filterProperties(request, resourceProps);
+        assertEquals(filteredProps.size(), 4);
+        // registered collection props
+        assertTrue(filteredProps.containsKey("name"));
+        assertTrue(filteredProps.containsKey("id"));
+        assertTrue(filteredProps.containsKey("type"));
+
+        // added prop
+        assertTrue(filteredProps.containsKey("foo"));
+    }
+
+    @Test
+    public void testGetProjections() {
+        ResourceDefinition entityDefinition = new EntityResourceDefinition();
+        Map<String, Projection> projections = entityDefinition.getProjections();
+        assertEquals(projections.size(), 3);
+        assertTrue(projections.containsKey("tags"));
+        assertTrue(projections.containsKey("traits"));
+        assertTrue(projections.containsKey("default"));
+    }
+
+    @Test
+    public void testGetRelations() {
+        ResourceDefinition entityDefinition = new EntityResourceDefinition();
+        Map<String, Relation> relations = entityDefinition.getRelations();
+        assertEquals(relations.size(), 2);
+        assertTrue(relations.containsKey("tags"));
+        assertTrue(relations.containsKey("traits"));
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/aaf2971a/catalog/src/test/java/org/apache/atlas/catalog/definition/EntityTagResourceDefinitionTest.java
----------------------------------------------------------------------
diff --git a/catalog/src/test/java/org/apache/atlas/catalog/definition/EntityTagResourceDefinitionTest.java b/catalog/src/test/java/org/apache/atlas/catalog/definition/EntityTagResourceDefinitionTest.java
new file mode 100644
index 0000000..954262f
--- /dev/null
+++ b/catalog/src/test/java/org/apache/atlas/catalog/definition/EntityTagResourceDefinitionTest.java
@@ -0,0 +1,177 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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 org.apache.atlas.catalog.definition;
+
+import org.apache.atlas.catalog.CollectionRequest;
+import org.apache.atlas.catalog.InstanceRequest;
+import org.apache.atlas.catalog.Request;
+import org.apache.atlas.catalog.exception.InvalidPayloadException;
+import org.apache.atlas.catalog.projection.Projection;
+import org.apache.atlas.catalog.projection.Relation;
+import org.apache.atlas.typesystem.types.AttributeDefinition;
+import org.testng.annotations.Test;
+
+import java.util.*;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+/**
+ * Unit tests for EntityTagResourceDefinition.
+ */
+public class EntityTagResourceDefinitionTest {
+    @Test
+    public void testGetIdPropertyName() {
+        ResourceDefinition entityTagDefinition = new EntityTagResourceDefinition();
+        assertEquals(entityTagDefinition.getIdPropertyName(), "name");
+    }
+
+    @Test
+    public void testGetTypeName() {
+        ResourceDefinition entityTagDefinition = new EntityTagResourceDefinition();
+        assertNull(entityTagDefinition.getTypeName());
+    }
+
+    @Test
+    public void testResolveHref() {
+        Map<String, Object> resourceProps = new HashMap<>();
+        resourceProps.put("name", "taxonomy1.term1.term11");
+        resourceProps.put(EntityTagResourceDefinition.ENTITY_GUID_PROPERTY, "11-22-33");
+
+        ResourceDefinition entityTagDefinition = new EntityTagResourceDefinition();
+        String href = entityTagDefinition.resolveHref(resourceProps);
+        assertEquals(href, "v1/entities/11-22-33/tags/taxonomy1.term1.term11");
+    }
+
+    @Test
+    public void testValidate() throws Exception {
+        Map<String, Object> properties = new HashMap<>();
+        properties.put("name", "taxonomy1.termName");
+
+        Request request = new InstanceRequest(properties);
+
+        ResourceDefinition entityTagDefinition = new EntityTagResourceDefinition();
+        entityTagDefinition.validate(request);
+    }
+
+    @Test(expectedExceptions = InvalidPayloadException.class)
+    public void testValidate_missingName() throws Exception {
+        Map<String, Object> properties = new HashMap<>();
+
+        Request request = new InstanceRequest(properties);
+        ResourceDefinition entityTagDefinition = new EntityTagResourceDefinition();
+        entityTagDefinition.validate(request);
+    }
+
+    @Test(expectedExceptions = InvalidPayloadException.class)
+    public void testValidate_invalidProperty() throws Exception {
+        Map<String, Object> properties = new HashMap<>();
+        properties.put("name", "foo");
+        properties.put("description", "desc");
+
+        Request request = new InstanceRequest(properties);
+
+        ResourceDefinition entityTagDefinition = new EntityTagResourceDefinition();
+        entityTagDefinition.validate(request);
+    }
+
+    @Test
+    public void testGetPropertyDefinitions() {
+        ResourceDefinition entityTagDefinition = new EntityTagResourceDefinition();
+        Collection<AttributeDefinition> propertyDefinitions = entityTagDefinition.getPropertyDefinitions();
+
+        assertEquals(propertyDefinitions.size(), 1);
+        Set<String> defNames = new HashSet<>();
+        for (AttributeDefinition def : propertyDefinitions) {
+            defNames.add(def.name);
+        }
+        assertTrue(defNames.contains("name"));
+    }
+
+    @Test
+    public void testFilterProperties_Instance() {
+        Map<String, Object> resourceProps = new HashMap<>();
+        resourceProps.put("id", "111-222-333");
+        resourceProps.put("name", "nameVal");
+        resourceProps.put("type", "someType");
+        resourceProps.put("foo", "fooVal");
+        resourceProps.put("bar", "barVal");
+        resourceProps.put("description", "desc");
+        resourceProps.put("creation_time", "2016:10:10");
+        resourceProps.put("acceptable_use", "something");
+        resourceProps.put("available_as_tag", true);
+        resourceProps.put("other", "otherVal");
+
+        Request request = new InstanceRequest(resourceProps);
+        request.addAdditionalSelectProperties(Collections.singleton("foo"));
+        ResourceDefinition entityTagDefinition = new EntityTagResourceDefinition();
+
+        Map<String, Object> filteredProperties = entityTagDefinition.filterProperties(request, resourceProps);
+        assertEquals(filteredProperties.size(), 4);
+        // registered collection props
+        assertTrue(filteredProperties.containsKey("name"));
+        assertTrue(filteredProperties.containsKey("description"));
+        assertTrue(filteredProperties.containsKey("creation_time"));
+        // added prop
+        assertTrue(filteredProperties.containsKey("foo"));
+    }
+
+    @Test
+    public void testFilterProperties_Collection() {
+        Map<String, Object> resourceProps = new HashMap<>();
+        resourceProps.put("id", "111-222-333");
+        resourceProps.put("name", "nameVal");
+        resourceProps.put("type", "someType");
+        resourceProps.put("foo", "fooVal");
+        resourceProps.put("bar", "barVal");
+        resourceProps.put("description", "desc");
+        resourceProps.put("creation_time", "2016:10:10");
+        resourceProps.put("acceptable_use", "something");
+        resourceProps.put("available_as_tag", true);
+        resourceProps.put("other", "otherVal");
+
+        Request request = new CollectionRequest(resourceProps, "someProperty:someValue");
+        request.addAdditionalSelectProperties(Collections.singleton("foo"));
+        ResourceDefinition entityTagDefinition = new EntityTagResourceDefinition();
+
+        Map<String, Object> filteredProps = entityTagDefinition.filterProperties(request, resourceProps);
+        assertEquals(filteredProps.size(), 3);
+        // registered collection props
+        assertTrue(filteredProps.containsKey("name"));
+        assertTrue(filteredProps.containsKey("description"));
+        // added prop
+        assertTrue(filteredProps.containsKey("foo"));
+    }
+
+    @Test
+    public void testGetProjections() {
+        ResourceDefinition entityTagDefinition = new EntityTagResourceDefinition();
+        Map<String, Projection> projections = entityTagDefinition.getProjections();
+        assertEquals(projections.size(), 1);
+        assertTrue(projections.containsKey("terms"));
+    }
+
+    @Test
+    public void testGetRelations() {
+        ResourceDefinition entityTagDefinition = new EntityTagResourceDefinition();
+        Map<String, Relation> relations = entityTagDefinition.getRelations();
+        assertTrue(relations.isEmpty());
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/aaf2971a/catalog/src/test/java/org/apache/atlas/catalog/definition/TaxonomyResourceDefinitionTest.java
----------------------------------------------------------------------
diff --git a/catalog/src/test/java/org/apache/atlas/catalog/definition/TaxonomyResourceDefinitionTest.java b/catalog/src/test/java/org/apache/atlas/catalog/definition/TaxonomyResourceDefinitionTest.java
new file mode 100644
index 0000000..bc6f74c
--- /dev/null
+++ b/catalog/src/test/java/org/apache/atlas/catalog/definition/TaxonomyResourceDefinitionTest.java
@@ -0,0 +1,174 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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 org.apache.atlas.catalog.definition;
+
+import org.apache.atlas.catalog.CollectionRequest;
+import org.apache.atlas.catalog.InstanceRequest;
+import org.apache.atlas.catalog.Request;
+import org.apache.atlas.catalog.exception.InvalidPayloadException;
+import org.apache.atlas.catalog.projection.Projection;
+import org.apache.atlas.catalog.projection.Relation;
+import org.apache.atlas.typesystem.types.AttributeDefinition;
+import org.testng.annotations.Test;
+
+import java.util.*;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+/**
+ * Unit tests for TaxonomyResourceDefinition.
+ */
+public class TaxonomyResourceDefinitionTest {
+    @Test
+    public void testGetIdPropertyName() {
+        ResourceDefinition taxonomyDefinition = new TaxonomyResourceDefinition();
+        assertEquals(taxonomyDefinition.getIdPropertyName(), "name");
+    }
+
+    @Test
+    public void testGetTypeName() {
+        ResourceDefinition taxonomyDefinition = new TaxonomyResourceDefinition();
+        assertEquals(taxonomyDefinition.getTypeName(), "Taxonomy");
+    }
+
+    @Test
+    public void testResolveHref() {
+        Map<String, Object> resourceProps = new HashMap<>();
+        resourceProps.put("id", "111-222-333");
+        resourceProps.put("name", "foo");
+
+        ResourceDefinition taxonomyDefinition = new TaxonomyResourceDefinition();
+        String href = taxonomyDefinition.resolveHref(resourceProps);
+        assertEquals(href, "v1/taxonomies/foo");
+    }
+
+    @Test
+    public void testValidate() throws Exception {
+        Map<String, Object> properties = new HashMap<>();
+        properties.put("name", "taxonomyName");
+        properties.put("description", "foo");
+
+        Request request = new InstanceRequest(properties);
+
+        ResourceDefinition taxonomyDefinition = new TaxonomyResourceDefinition();
+        taxonomyDefinition.validate(request);
+    }
+
+    @Test(expectedExceptions = InvalidPayloadException.class)
+    public void testValidate_missingName() throws Exception {
+        Map<String, Object> properties = new HashMap<>();
+        properties.put("description", "foo");
+
+        Request request = new InstanceRequest(properties);
+
+        ResourceDefinition taxonomyDefinition = new TaxonomyResourceDefinition();
+        taxonomyDefinition.validate(request);
+    }
+
+    @Test(expectedExceptions = InvalidPayloadException.class)
+    public void testValidate_invalidProperty() throws Exception {
+        Map<String, Object> properties = new HashMap<>();
+        properties.put("name", "foo");
+        properties.put("unknownProperty", "value");
+
+        Request request = new InstanceRequest(properties);
+
+        ResourceDefinition taxonomyDefinition = new TaxonomyResourceDefinition();
+        taxonomyDefinition.validate(request);
+    }
+
+    @Test
+    public void testGetPropertyDefinitions() {
+        ResourceDefinition taxonomyDefinition = new TaxonomyResourceDefinition();
+        Collection<AttributeDefinition> propertyDefinitions = taxonomyDefinition.getPropertyDefinitions();
+
+        assertEquals(propertyDefinitions.size(), 2);
+        Set<String> defNames = new HashSet<>();
+        for (AttributeDefinition def : propertyDefinitions) {
+            defNames.add(def.name);
+        }
+        assertTrue(defNames.contains("name"));
+        assertTrue(defNames.contains("description"));
+    }
+
+    @Test
+    public void testFilterProperties_Instance() {
+        Map<String, Object> resourceProps = new HashMap<>();
+        resourceProps.put("id", "111-222-333");
+        resourceProps.put("name", "nameVal");
+        resourceProps.put("type", "someType");
+        resourceProps.put("foo", "fooVal");
+        resourceProps.put("bar", "barVal");
+        resourceProps.put("description", "desc");
+        resourceProps.put("creation_time", "2016:10:10");
+
+        Request request = new InstanceRequest(resourceProps);
+        request.addAdditionalSelectProperties(Collections.singleton("foo"));
+        ResourceDefinition taxonomyDefinition = new TaxonomyResourceDefinition();
+
+        Map<String, Object> filteredProperties = taxonomyDefinition.filterProperties(request, resourceProps);
+        assertEquals(filteredProperties.size(), 4);
+        // registered collection props
+        assertTrue(filteredProperties.containsKey("name"));
+        assertTrue(filteredProperties.containsKey("description"));
+        assertTrue(filteredProperties.containsKey("creation_time"));
+        // added prop
+        assertTrue(filteredProperties.containsKey("foo"));
+    }
+
+    @Test
+    public void testFilterProperties_Collection() {
+        Map<String, Object> resourceProps = new HashMap<>();
+        resourceProps.put("id", "111-222-333");
+        resourceProps.put("name", "nameVal");
+        resourceProps.put("type", "someType");
+        resourceProps.put("foo", "fooVal");
+        resourceProps.put("bar", "barVal");
+        resourceProps.put("description", "desc");
+        resourceProps.put("creation_time", "2016:10:10");
+
+        Request request = new CollectionRequest(resourceProps, "someProperty:someValue");
+        request.addAdditionalSelectProperties(Collections.singleton("foo"));
+        ResourceDefinition taxonomyDefinition = new TaxonomyResourceDefinition();
+
+        Map<String, Object> filteredProps = taxonomyDefinition.filterProperties(request, resourceProps);
+        assertEquals(filteredProps.size(), 3);
+        // registered collection props
+        assertTrue(filteredProps.containsKey("name"));
+        assertTrue(filteredProps.containsKey("description"));
+        // added prop
+        assertTrue(filteredProps.containsKey("foo"));
+    }
+
+    @Test
+    public void testGetProjections() {
+        ResourceDefinition taxonomyDefinition = new TaxonomyResourceDefinition();
+        Map<String, Projection> projections = taxonomyDefinition.getProjections();
+        assertEquals(projections.size(), 1);
+        assertTrue(projections.containsKey("terms"));
+    }
+
+    @Test
+    public void testGetRelations() {
+        ResourceDefinition taxonomyDefinition = new TaxonomyResourceDefinition();
+        Map<String, Relation> relations = taxonomyDefinition.getRelations();
+        assertTrue(relations.isEmpty());
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-atlas/blob/aaf2971a/catalog/src/test/java/org/apache/atlas/catalog/definition/TermResourceDefinitionTest.java
----------------------------------------------------------------------
diff --git a/catalog/src/test/java/org/apache/atlas/catalog/definition/TermResourceDefinitionTest.java b/catalog/src/test/java/org/apache/atlas/catalog/definition/TermResourceDefinitionTest.java
new file mode 100644
index 0000000..52deadf
--- /dev/null
+++ b/catalog/src/test/java/org/apache/atlas/catalog/definition/TermResourceDefinitionTest.java
@@ -0,0 +1,210 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * 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 org.apache.atlas.catalog.definition;
+
+import org.apache.atlas.catalog.CollectionRequest;
+import org.apache.atlas.catalog.InstanceRequest;
+import org.apache.atlas.catalog.Request;
+import org.apache.atlas.catalog.exception.InvalidPayloadException;
+import org.apache.atlas.catalog.projection.Projection;
+import org.apache.atlas.catalog.projection.Relation;
+import org.apache.atlas.typesystem.types.AttributeDefinition;
+import org.testng.annotations.Test;
+
+import java.util.*;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
+
+/**
+ * Unit tests for TermResourceDefinition.
+ */
+public class TermResourceDefinitionTest {
+    @Test
+    public void testGetIdPropertyName() {
+        ResourceDefinition termDefinition = new TermResourceDefinition();
+        assertEquals(termDefinition.getIdPropertyName(), "name");
+    }
+
+    @Test
+    public void testGetTypeName() {
+        ResourceDefinition termDefinition = new TermResourceDefinition();
+        assertEquals(termDefinition.getTypeName(), "Term");
+    }
+
+    @Test
+    public void testResolveHref() {
+        Map<String, Object> resourceProps = new HashMap<>();
+        resourceProps.put("name", "taxonomy1.term1.term11");
+
+        ResourceDefinition termDefinition = new TermResourceDefinition();
+        String href = termDefinition.resolveHref(resourceProps);
+        assertEquals(href, "v1/taxonomies/taxonomy1/terms/term1/terms/term11");
+    }
+
+    @Test
+    public void testValidate() throws Exception {
+        Map<String, Object> properties = new HashMap<>();
+        properties.put("name", "taxonomy1.termName");
+        properties.put("description", "foo");
+        properties.put("available_as_tag", true);
+        properties.put("acceptable_use", "something");
+
+        Request request = new InstanceRequest(properties);
+
+        ResourceDefinition termDefinition = new TermResourceDefinition();
+        termDefinition.validate(request);
+    }
+
+    @Test
+    public void testValidate_nameOnly() throws Exception {
+        Map<String, Object> properties = new HashMap<>();
+        properties.put("name", "taxonomy1.termName");
+
+        Request request = new InstanceRequest(properties);
+
+        ResourceDefinition termDefinition = new TermResourceDefinition();
+        termDefinition.validate(request);
+    }
+
+    @Test(expectedExceptions = InvalidPayloadException.class)
+    public void testValidate_invalidTermName() throws Exception {
+        Map<String, Object> properties = new HashMap<>();
+        properties.put("name", "NotQualifiedTermName");
+        properties.put("description", "foo");
+        properties.put("available_as_tag", true);
+
+        Request request = new InstanceRequest(properties);
+
+        ResourceDefinition termDefinition = new TermResourceDefinition();
+        termDefinition.validate(request);
+    }
+
+    @Test(expectedExceptions = InvalidPayloadException.class)
+    public void testValidate_missingName() throws Exception {
+        Map<String, Object> properties = new HashMap<>();
+        properties.put("description", "foo");
+
+        Request request = new InstanceRequest(properties);
+
+        ResourceDefinition termDefinition = new TermResourceDefinition();
+        termDefinition.validate(request);
+    }
+
+    @Test(expectedExceptions = InvalidPayloadException.class)
+    public void testValidate_invalidProperty() throws Exception {
+        Map<String, Object> properties = new HashMap<>();
+        properties.put("name", "foo");
+        properties.put("unknownProperty", "value");
+
+        Request request = new InstanceRequest(properties);
+
+        ResourceDefinition termDefinition = new TermResourceDefinition();
+        termDefinition.validate(request);
+    }
+
+    @Test
+    public void testGetPropertyDefinitions() {
+        ResourceDefinition termDefinition = new TermResourceDefinition();
+        Collection<AttributeDefinition> propertyDefinitions = termDefinition.getPropertyDefinitions();
+
+        assertEquals(propertyDefinitions.size(), 4);
+        Set<String> defNames = new HashSet<>();
+        for (AttributeDefinition def : propertyDefinitions) {
+            defNames.add(def.name);
+        }
+        assertTrue(defNames.contains("name"));
+        assertTrue(defNames.contains("description"));
+        assertTrue(defNames.contains("available_as_tag"));
+        assertTrue(defNames.contains("acceptable_use"));
+    }
+
+    @Test
+    public void testFilterProperties_Instance() {
+        Map<String, Object> resourceProps = new HashMap<>();
+        resourceProps.put("id", "111-222-333");
+        resourceProps.put("name", "nameVal");
+        resourceProps.put("type", "someType");
+        resourceProps.put("foo", "fooVal");
+        resourceProps.put("bar", "barVal");
+        resourceProps.put("description", "desc");
+        resourceProps.put("creation_time", "2016:10:10");
+        resourceProps.put("acceptable_use", "something");
+        resourceProps.put("available_as_tag", true);
+        resourceProps.put("other", "otherVal");
+
+        Request request = new InstanceRequest(resourceProps);
+        request.addAdditionalSelectProperties(Collections.singleton("foo"));
+        ResourceDefinition termDefinition = new TermResourceDefinition();
+
+        Map<String, Object> filteredProperties = termDefinition.filterProperties(request, resourceProps);
+        assertEquals(filteredProperties.size(), 6);
+        // registered collection props
+        assertTrue(filteredProperties.containsKey("name"));
+        assertTrue(filteredProperties.containsKey("description"));
+        assertTrue(filteredProperties.containsKey("available_as_tag"));
+        assertTrue(filteredProperties.containsKey("acceptable_use"));
+        assertTrue(filteredProperties.containsKey("creation_time"));
+        // added prop
+        assertTrue(filteredProperties.containsKey("foo"));
+    }
+
+    @Test
+    public void testFilterProperties_Collection() {
+        Map<String, Object> resourceProps = new HashMap<>();
+        resourceProps.put("id", "111-222-333");
+        resourceProps.put("name", "nameVal");
+        resourceProps.put("type", "someType");
+        resourceProps.put("foo", "fooVal");
+        resourceProps.put("bar", "barVal");
+        resourceProps.put("description", "desc");
+        resourceProps.put("creation_time", "2016:10:10");
+        resourceProps.put("acceptable_use", "something");
+        resourceProps.put("available_as_tag", true);
+        resourceProps.put("other", "otherVal");
+
+        Request request = new CollectionRequest(resourceProps, "someProperty:someValue");
+        request.addAdditionalSelectProperties(Collections.singleton("foo"));
+        ResourceDefinition termDefinition = new TermResourceDefinition();
+
+        Map<String, Object> filteredProps = termDefinition.filterProperties(request, resourceProps);
+        assertEquals(filteredProps.size(), 3);
+        // registered collection props
+        assertTrue(filteredProps.containsKey("name"));
+        assertTrue(filteredProps.containsKey("description"));
+        // added prop
+        assertTrue(filteredProps.containsKey("foo"));
+    }
+
+    @Test
+    public void testGetProjections() {
+        ResourceDefinition termDefinition = new TermResourceDefinition();
+        Map<String, Projection> projections = termDefinition.getProjections();
+        assertEquals(projections.size(), 2);
+        assertTrue(projections.containsKey("terms"));
+        assertTrue(projections.containsKey("hierarchy"));
+    }
+
+    @Test
+    public void testGetRelations() {
+        ResourceDefinition termDefinition = new TermResourceDefinition();
+        Map<String, Relation> relations = termDefinition.getRelations();
+        assertTrue(relations.isEmpty());
+    }
+}