com.redhat.lightblue.metadata.mongo.MongoMetadataTest.java Source code

Java tutorial

Introduction

Here is the source code for com.redhat.lightblue.metadata.mongo.MongoMetadataTest.java

Source

/*
 Copyright 2013 Red Hat, Inc. and/or its affiliates.
    
 This file is part of lightblue.
    
 This program is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.
    
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
    
 You should have received a copy of the GNU General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.redhat.lightblue.metadata.mongo;

import java.lang.reflect.*;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Set;
import java.util.HashSet;
import java.util.ArrayList;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.mongodb.BasicDBObject;
import com.redhat.lightblue.OperationStatus;
import com.redhat.lightblue.Response;
import com.redhat.lightblue.common.mongo.MongoDataStore;
import com.redhat.lightblue.crud.*;
import com.redhat.lightblue.metadata.constraints.EnumConstraint;
import com.redhat.lightblue.metadata.*;
import com.redhat.lightblue.metadata.parser.Extensions;
import com.redhat.lightblue.metadata.parser.JSONMetadataParser;
import com.redhat.lightblue.metadata.types.DefaultTypes;
import com.redhat.lightblue.metadata.types.IntegerType;
import com.redhat.lightblue.metadata.types.StringType;
import com.redhat.lightblue.mongo.test.EmbeddedMongo;
import com.redhat.lightblue.query.Projection;
import com.redhat.lightblue.query.QueryExpression;
import com.redhat.lightblue.query.Sort;
import com.redhat.lightblue.query.UpdateExpression;
import com.redhat.lightblue.util.Error;
import com.redhat.lightblue.util.JsonDoc;
import com.redhat.lightblue.util.Path;
import com.redhat.lightblue.util.test.AbstractJsonNodeTest;
import org.bson.BSONObject;
import org.json.JSONException;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.Ignore;
import org.skyscreamer.jsonassert.JSONAssert;

import java.io.IOException;
import java.util.Iterator;

public class MongoMetadataTest {

    private static final EmbeddedMongo mongo = EmbeddedMongo.getInstance();

    private MongoMetadata md;

    @Before
    public void setup() {
        Factory factory = new Factory();
        factory.addCRUDController("mongo", new TestCRUDController());
        Extensions<BSONObject> x = new Extensions<>();
        x.addDefaultExtensions();
        x.registerDataStoreParser("mongo", new MongoDataStoreParser<BSONObject>());
        md = new MongoMetadata(mongo.getDB(), x, new DefaultTypes(), factory);
        BasicDBObject index = new BasicDBObject("name", 1);
        index.put("version.value", 1);
        mongo.getDB().getCollection(MongoMetadata.DEFAULT_METADATA_COLLECTION).ensureIndex(index, "name", true);
    }

    @After
    public void teardown() {
        mongo.reset();
    }

    public static class TestCRUDController implements CRUDController {

        @Override
        public CRUDInsertionResponse insert(CRUDOperationContext ctx, Projection projection) {
            return null;
        }

        @Override
        public CRUDSaveResponse save(CRUDOperationContext ctx, boolean upsert, Projection projection) {
            return null;
        }

        @Override
        public CRUDUpdateResponse update(CRUDOperationContext ctx, QueryExpression query, UpdateExpression update,
                Projection projection) {
            return null;
        }

        @Override
        public CRUDDeleteResponse delete(CRUDOperationContext ctx, QueryExpression query) {
            return null;
        }

        @Override
        public CRUDFindResponse find(CRUDOperationContext ctx, QueryExpression query, Projection projection,
                Sort sort, Long from, Long to) {
            return null;
        }

        @Override
        public MetadataListener getMetadataListener() {
            return null;
        }

        @Override
        public void updatePredefinedFields(CRUDOperationContext ctx, JsonDoc doc) {
        }
    }

    @Test
    public void defaultVersionTest() throws Exception {

        EntityMetadata e = new EntityMetadata("testEntity");
        e.setVersion(new Version("1.0.0", null, "some text blah blah"));
        e.setStatus(MetadataStatus.ACTIVE);
        e.setDataStore(new MongoDataStore(null, null, "testCollection"));
        e.getFields().put(new SimpleField("field1", StringType.TYPE));
        ObjectField o = new ObjectField("field2");
        o.getFields().put(new SimpleField("x", IntegerType.TYPE));
        e.getFields().put(o);
        e.getEntityInfo().setDefaultVersion("1.0.0");
        md.createNewMetadata(e);

        EntityMetadata g = md.getEntityMetadata("testEntity", null);
        Assert.assertEquals("1.0.0", g.getVersion().getValue());
    }

    @Test
    public void createMdTest() throws Exception {
        EntityMetadata e = new EntityMetadata("testEntity");
        e.setVersion(new Version("1.0.0", null, "some text blah blah"));
        e.setStatus(MetadataStatus.ACTIVE);
        e.setDataStore(new MongoDataStore(null, null, "testCollection"));
        e.getFields().put(new SimpleField("field1", StringType.TYPE));
        ObjectField o = new ObjectField("field2");
        o.getFields().put(new SimpleField("x", IntegerType.TYPE));
        e.getFields().put(o);
        md.createNewMetadata(e);
        EntityMetadata g = md.getEntityMetadata("testEntity", "1.0.0");
        Assert.assertNotNull("Can't retrieve entity", g);
        Assert.assertEquals(e.getName(), g.getName());
        Assert.assertEquals(e.getVersion().getValue(), g.getVersion().getValue());
        Assert.assertEquals(e.getVersion().getChangelog(), g.getVersion().getChangelog());
        Assert.assertEquals(e.getStatus(), g.getStatus());
        Assert.assertEquals((e.resolve(new Path("field1"))).getType(), (g.resolve(new Path("field1"))).getType());
        Assert.assertEquals((e.resolve(new Path("field2.x"))).getType(),
                (g.resolve(new Path("field2.x"))).getType());
        Version[] v = md.getEntityVersions("testEntity");
        Assert.assertEquals(1, v.length);
        Assert.assertEquals("1.0.0", v[0].getValue());

        String[] names = md.getEntityNames();
        Assert.assertEquals(1, names.length);
        Assert.assertEquals("testEntity", names[0]);
    }

    @Test
    public void createMdWithAndRefTest() throws Exception {
        Extensions<JsonNode> extensions = new Extensions<>();
        extensions.addDefaultExtensions();
        extensions.registerDataStoreParser("mongo", new MongoDataStoreParser<JsonNode>());
        JSONMetadataParser parser = new JSONMetadataParser(extensions, new DefaultTypes(),
                new JsonNodeFactory(true));

        // get JsonNode representing metadata
        JsonNode jsonMetadata = AbstractJsonNodeTest
                .loadJsonNode(getClass().getSimpleName() + "-qps-andquery.json");

        // parser into EntityMetadata
        EntityMetadata e = parser.parseEntityMetadata(jsonMetadata);

        // persist
        md.createNewMetadata(e);
        EntityMetadata g = md.getEntityMetadata("test", "1.0.0");
        // No exception=OK
    }

    /**
     * Issue #13: if you create it twice, the error thrown for the second one
     * cleans up the first
     */
    @Test
    public void createMd2Test() throws Exception {
        EntityMetadata e = new EntityMetadata("testEntity");
        e.setVersion(new Version("1.0.0", null, "some text blah blah"));
        e.setStatus(MetadataStatus.ACTIVE);
        e.setDataStore(new MongoDataStore(null, null, "testCollection"));
        e.getFields().put(new SimpleField("field1", StringType.TYPE));
        ObjectField o = new ObjectField("field2");
        o.getFields().put(new SimpleField("x", IntegerType.TYPE));
        e.getFields().put(o);
        md.createNewMetadata(e);
        Assert.assertNotNull(md.getEntityMetadata("testEntity", "1.0.0"));
        try {
            md.createNewMetadata(e);
            Assert.fail();
        } catch (Exception x) {
        }
        Assert.assertNotNull(md.getEntityMetadata("testEntity", "1.0.0"));
    }

    @Test
    public void testCollectionName() throws Exception {
        EntityMetadata e = new EntityMetadata("testEntity");
        e.setVersion(new Version("1.0.0", null, "some text blah blah"));
        e.setStatus(MetadataStatus.ACTIVE);
        e.setDataStore(new MongoDataStore(null, null, "test-Collection"));
        e.getFields().put(new SimpleField("field1", StringType.TYPE));
        ObjectField o = new ObjectField("field2");
        o.getFields().put(new SimpleField("x", IntegerType.TYPE));
        e.getFields().put(o);
        try {
            md.createNewMetadata(e);
            Assert.fail();
        } catch (Error x) {
        }

        e.setDataStore(new MongoDataStore(null, null, "testCollection"));
        md.createNewMetadata(e);
    }

    @Test
    public void updateStatusTest() throws Exception {
        EntityMetadata e2 = new EntityMetadata("testEntity");
        e2.setVersion(new Version("1.1.0", null, "some text blah blah"));
        e2.setStatus(MetadataStatus.ACTIVE);
        e2.setDataStore(new MongoDataStore(null, null, "testCollection"));
        e2.getFields().put(new SimpleField("field1", StringType.TYPE));
        md.createNewMetadata(e2);
        EntityMetadata g = md.getEntityMetadata("testEntity", "1.1.0");
        Assert.assertEquals(MetadataStatus.ACTIVE, g.getStatus());

        md.setMetadataStatus("testEntity", "1.1.0", MetadataStatus.DEPRECATED, "disable testEntity");
        EntityMetadata g1 = md.getEntityMetadata("testEntity", "1.1.0");
        Assert.assertEquals(e2.getVersion().getValue(), g1.getVersion().getValue());
        Assert.assertEquals(MetadataStatus.DEPRECATED, g1.getStatus());
    }

    @Test
    public void disabledDefaultUpdateTest() throws Exception {
        EntityMetadata e = new EntityMetadata("testEntity");
        e.setVersion(new Version("1.0.0", null, "some text blah blah"));
        e.setStatus(MetadataStatus.ACTIVE);
        e.setDataStore(new MongoDataStore(null, null, "testCollection"));
        e.getFields().put(new SimpleField("field1", StringType.TYPE));
        e.getEntityInfo().setDefaultVersion("1.0.0");
        md.createNewMetadata(e);
        EntityMetadata g1 = md.getEntityMetadata("testEntity", "1.0.0");
        Assert.assertEquals(e.getVersion().getValue(), g1.getVersion().getValue());
        Assert.assertEquals(MetadataStatus.ACTIVE, g1.getStatus());
        try {
            md.setMetadataStatus("testEntity", "1.0.0", MetadataStatus.DISABLED, "disabling the default version");
            Assert.fail("expected " + MongoMetadataConstants.ERR_DISABLED_DEFAULT_VERSION);
        } catch (Error ex) {
            Assert.assertEquals(MongoMetadataConstants.ERR_DISABLED_DEFAULT_VERSION, ex.getErrorCode());
        }
    }

    @Test
    public void disabledDefaultCreationTest() throws Exception {
        EntityMetadata e = new EntityMetadata("testEntity");
        e.setVersion(new Version("1.0.0", null, "some text blah blah"));
        e.setStatus(MetadataStatus.DISABLED);
        e.setDataStore(new MongoDataStore(null, null, "testCollection"));
        e.getFields().put(new SimpleField("field1", StringType.TYPE));
        e.getEntityInfo().setDefaultVersion("1.0.0");
        try {
            md.createNewMetadata(e);
            Assert.fail("expected " + MongoMetadataConstants.ERR_DISABLED_DEFAULT_VERSION);
        } catch (Error ex) {
            Assert.assertEquals(MongoMetadataConstants.ERR_DISABLED_DEFAULT_VERSION, ex.getErrorCode());
        }
    }

    @Test
    public void illegalArgumentTest() throws Exception {
        EntityMetadata e = new EntityMetadata("testEntity");
        e.setVersion(new Version("1.0.0", null, "some text blah blah"));
        e.setStatus(MetadataStatus.ACTIVE);
        e.setDataStore(new MongoDataStore(null, null, "testCollection"));
        e.getFields().put(new SimpleField("field1", StringType.TYPE));
        md.createNewMetadata(e);
        try {
            md.getEntityMetadata("testEntity", "");
            Assert.fail("expected " + IllegalArgumentException.class);
        } catch (IllegalArgumentException ex) {
            Assert.assertEquals("version", ex.getMessage());
        }

        try {
            md.getEntityMetadata("testEntity", null);
            Assert.fail("expected " + IllegalArgumentException.class);
        } catch (IllegalArgumentException ex) {
            Assert.assertEquals("version", ex.getMessage());
        }

    }

    @Test
    public void unknownVersionTest() throws Exception {
        EntityMetadata e = new EntityMetadata("testEntity");
        e.setVersion(new Version("1.0.0", null, "some text blah blah"));
        e.setStatus(MetadataStatus.ACTIVE);
        e.setDataStore(new MongoDataStore(null, null, "testCollection"));
        e.getFields().put(new SimpleField("field1", StringType.TYPE));
        md.createNewMetadata(e);
        try {
            md.getEntityMetadata("testEntity", "1.1.0");
            Assert.fail("expected " + MongoMetadataConstants.ERR_UNKNOWN_VERSION);
        } catch (Error ex) {
            Assert.assertEquals(MongoMetadataConstants.ERR_UNKNOWN_VERSION, ex.getErrorCode());
        }

    }

    @Test
    public void updateEntityInfo() throws Exception {
        EntityMetadata e = new EntityMetadata("testEntity");
        e.setVersion(new Version("1.0.0", null, "some text blah blah"));
        e.setStatus(MetadataStatus.ACTIVE);
        e.setDataStore(new MongoDataStore(null, null, "testCollection"));
        e.getFields().put(new SimpleField("field1", StringType.TYPE));
        ObjectField o = new ObjectField("field2");
        o.getFields().put(new SimpleField("x", IntegerType.TYPE));
        e.getFields().put(o);
        md.createNewMetadata(e);

        EntityInfo ei = new EntityInfo("testEntity");
        ei.setDataStore(new MongoDataStore(null, null, "somethingelse"));
        md.updateEntityInfo(ei);
    }

    @Test
    public void updateEntityInfo_invalidates() throws Exception {
        EntityMetadata e = new EntityMetadata("testEntity");
        e.setVersion(new Version("1.0.0", null, "some text blah blah"));
        e.setStatus(MetadataStatus.ACTIVE);
        e.setDataStore(new MongoDataStore(null, null, "testCollection"));
        e.getFields().put(new SimpleField("field1", StringType.TYPE));
        ObjectField o = new ObjectField("field2");
        o.getFields().put(new SimpleField("x", IntegerType.TYPE));
        e.getFields().put(o);
        com.redhat.lightblue.metadata.Enum enumdef = new com.redhat.lightblue.metadata.Enum("en");
        Set<String> envalues = new HashSet<>();
        envalues.add("value");
        enumdef.setValues(envalues);
        e.getEntityInfo().getEnums().addEnum(enumdef);

        SimpleField s = new SimpleField("z", StringType.TYPE);
        ArrayList<FieldConstraint> enumsc = new ArrayList<>();
        EnumConstraint enumc = new EnumConstraint();
        enumc.setName("en");
        enumsc.add(enumc);
        s.setConstraints(enumsc);
        e.getFields().put(s);

        md.createNewMetadata(e);

        e.getEntityInfo().getEnums().setEnums(new ArrayList());
        try {
            md.updateEntityInfo(e.getEntityInfo());
            Assert.fail();
        } catch (Error x) {
        }
    }

    @Test
    public void createEntityInfo_validates() throws Exception {
        EntityMetadata e = new EntityMetadata("testEntity");
        e.setVersion(new Version("1.0.0", null, "some text blah blah"));
        e.setStatus(MetadataStatus.ACTIVE);
        e.setDataStore(new MongoDataStore(null, null, "testCollection"));
        e.getFields().put(new SimpleField("field1", StringType.TYPE));
        ObjectField o = new ObjectField("field2");
        o.getFields().put(new SimpleField("x", IntegerType.TYPE));
        e.getFields().put(o);
        SimpleField s = new SimpleField("z", StringType.TYPE);
        ArrayList<FieldConstraint> enumsc = new ArrayList<>();
        EnumConstraint enumc = new EnumConstraint();
        enumc.setName("en");
        enumsc.add(enumc);
        s.setConstraints(enumsc);
        e.getFields().put(s);
        try {
            md.createNewMetadata(e);
            Assert.fail();
        } catch (Error x) {
        }
    }

    @Test
    public void updateEntityInfo_noEntity() throws Exception {
        EntityMetadata e = new EntityMetadata("testEntity");
        e.setVersion(new Version("1.0.0", null, "some text blah blah"));
        e.setStatus(MetadataStatus.ACTIVE);
        e.setDataStore(new MongoDataStore(null, null, "testCollection"));
        e.getFields().put(new SimpleField("field1", StringType.TYPE));
        ObjectField o = new ObjectField("field2");
        o.getFields().put(new SimpleField("x", IntegerType.TYPE));
        e.getFields().put(o);
        md.createNewMetadata(e);

        EntityInfo ei = new EntityInfo("NottestEntity");
        ei.setDataStore(new MongoDataStore(null, null, "somethingelse"));
        try {
            md.updateEntityInfo(ei);
            Assert.fail();
        } catch (Error ex) {
            Assert.assertEquals(MongoMetadataConstants.ERR_MISSING_ENTITY_INFO, ex.getErrorCode());
        }
    }

    @Test
    public void invalidDefaultVersionTest() throws Exception {
        //with non-existant default.
        EntityMetadata eDefault = new EntityMetadata("testDefaultEntity");
        eDefault.setVersion(new Version("1.0.0", null, "some text blah blah"));
        eDefault.setStatus(MetadataStatus.DISABLED);
        eDefault.setDataStore(new MongoDataStore(null, null, "testCollection"));
        eDefault.getFields().put(new SimpleField("field1", StringType.TYPE));
        eDefault.getEntityInfo().setDefaultVersion("blah");
        try {
            md.createNewMetadata(eDefault);
            Assert.fail("expected " + MetadataConstants.ERR_INVALID_DEFAULT_VERSION);
        } catch (Error ex) {
            Assert.assertEquals(MetadataConstants.ERR_INVALID_DEFAULT_VERSION, ex.getErrorCode());
        }
    }

    @Test
    public void multipleVersions() throws Exception {
        EntityMetadata e = new EntityMetadata("testEntity");
        e.setVersion(new Version("1.0.0", null, "some text blah blah"));
        e.setStatus(MetadataStatus.ACTIVE);
        e.setDataStore(new MongoDataStore(null, null, "testCollection"));
        e.getFields().put(new SimpleField("field1", StringType.TYPE));
        ObjectField o = new ObjectField("field2");
        o.getFields().put(new SimpleField("x", IntegerType.TYPE));
        e.getFields().put(o);
        md.createNewMetadata(e);
        EntityMetadata g = md.getEntityMetadata("testEntity", "1.0.0");
        Assert.assertNotNull("Can't retrieve entity", g);
        Assert.assertEquals(e.getName(), g.getName());
        Assert.assertEquals(e.getVersion().getValue(), g.getVersion().getValue());
        Version[] v = md.getEntityVersions("testEntity");
        Assert.assertEquals(1, v.length);
        Assert.assertEquals("1.0.0", v[0].getValue());
        e.setVersion(new Version("2.0.0", null, "blahblahyadayada"));
        md.createNewSchema(e);
        v = md.getEntityVersions("testEntity");
        Assert.assertEquals(2, v.length);
        try {
            md.createNewMetadata(e);
            Assert.fail();
        } catch (Exception x) {
        }
    }

    @Test
    public void getWithStatus() throws Exception {
        EntityMetadata e = new EntityMetadata("testEntity");
        e.setVersion(new Version("1.0.0", null, "some text blah blah"));
        e.setStatus(MetadataStatus.ACTIVE);
        e.setDataStore(new MongoDataStore(null, null, "testCollection"));
        e.getFields().put(new SimpleField("field1", StringType.TYPE));
        ObjectField o = new ObjectField("field2");
        o.getFields().put(new SimpleField("x", IntegerType.TYPE));
        e.getFields().put(o);
        md.createNewMetadata(e);
        EntityMetadata g = md.getEntityMetadata("testEntity", "1.0.0");
        e.setVersion(new Version("2.0.0", null, "blahblahyadayada"));
        md.createNewSchema(e);

        e = new EntityMetadata("testEntity2");
        e.setVersion(new Version("1.0.0", null, "some text blah blah"));
        e.setStatus(MetadataStatus.ACTIVE);
        e.setDataStore(new MongoDataStore(null, null, "testCollection"));
        e.getFields().put(new SimpleField("field1", StringType.TYPE));
        o = new ObjectField("field2");
        o.getFields().put(new SimpleField("x", IntegerType.TYPE));
        e.getFields().put(o);
        md.createNewMetadata(e);
        g = md.getEntityMetadata("testEntity2", "1.0.0");
        e.setVersion(new Version("2.0.0", null, "sfr"));
        md.createNewSchema(e);

        Assert.assertEquals(2, md.getEntityNames().length);
        Assert.assertEquals(2, md.getEntityNames(MetadataStatus.ACTIVE).length);
        Assert.assertEquals(0, md.getEntityNames(MetadataStatus.DEPRECATED).length);

        md.setMetadataStatus("testEntity", "1.0.0", MetadataStatus.DEPRECATED, "x");
        Assert.assertEquals(2, md.getEntityNames().length);
        Assert.assertEquals(2, md.getEntityNames(MetadataStatus.ACTIVE).length);

        md.setMetadataStatus("testEntity2", "1.0.0", MetadataStatus.DEPRECATED, "x");
        Assert.assertEquals(2, md.getEntityNames().length);
        Assert.assertEquals(2, md.getEntityNames(MetadataStatus.ACTIVE).length);
        Assert.assertEquals(2, md.getEntityNames(MetadataStatus.ACTIVE, MetadataStatus.DEPRECATED).length);

        md.setMetadataStatus("testEntity2", "2.0.0", MetadataStatus.DEPRECATED, "x");
        Assert.assertEquals(2, md.getEntityNames().length);
        Assert.assertEquals(1, md.getEntityNames(MetadataStatus.ACTIVE).length);
        Assert.assertEquals(2, md.getEntityNames(MetadataStatus.ACTIVE, MetadataStatus.DEPRECATED).length);

    }

    @Test
    public void removal() throws Exception {
        EntityMetadata e = new EntityMetadata("testEntity");
        e.setVersion(new Version("1.0.0", null, "some text blah blah"));
        e.setStatus(MetadataStatus.ACTIVE);
        e.setDataStore(new MongoDataStore(null, null, "testCollection"));
        e.getFields().put(new SimpleField("field1", StringType.TYPE));
        ObjectField o = new ObjectField("field2");
        o.getFields().put(new SimpleField("x", IntegerType.TYPE));
        e.getFields().put(o);
        md.createNewMetadata(e);
        EntityMetadata g = md.getEntityMetadata("testEntity", "1.0.0");
        e.setVersion(new Version("2.0.0", null, "blahblahyadayada"));
        md.createNewSchema(e);

        try {
            md.removeEntity("testEntity");
            Assert.fail();
        } catch (Exception x) {
        }

        md.setMetadataStatus("testEntity", "1.0.0", MetadataStatus.DEPRECATED, "x");
        try {
            md.removeEntity("testEntity");
            Assert.fail();
        } catch (Exception x) {
        }

        md.setMetadataStatus("testEntity", "2.0.0", MetadataStatus.DISABLED, "x");
        try {
            md.removeEntity("testEntity");
            Assert.fail();
        } catch (Exception x) {
        }
        md.setMetadataStatus("testEntity", "1.0.0", MetadataStatus.DISABLED, "x");
        md.removeEntity("testEntity");
        Assert.assertNull(md.getEntityInfo("testEntity"));
    }

    @Test
    public void getAccessEntityVersion() throws IOException, JSONException {
        // setup parser
        Extensions<JsonNode> extensions = new Extensions<>();
        extensions.addDefaultExtensions();
        extensions.registerDataStoreParser("mongo", new MongoDataStoreParser<JsonNode>());
        JSONMetadataParser parser = new JSONMetadataParser(extensions, new DefaultTypes(),
                new JsonNodeFactory(true));

        // get JsonNode representing metadata
        JsonNode jsonMetadata = AbstractJsonNodeTest
                .loadJsonNode(getClass().getSimpleName() + "-access-entity-version.json");

        // parser into EntityMetadata
        EntityMetadata e = parser.parseEntityMetadata(jsonMetadata);

        // persist
        md.createNewMetadata(e);

        // ready to test!
        Response response = md.getAccess(e.getName(), e.getVersion().getValue());

        Assert.assertNotNull(response);

        // verify response content
        Assert.assertEquals(OperationStatus.COMPLETE, response.getStatus());
        Assert.assertTrue(response.getDataErrors().isEmpty());

        // verify data
        Assert.assertNotNull(response.getEntityData());
        String jsonEntityData = response.getEntityData().toString();
        String jsonExpected = "[{\"role\":\"field.find\",\"find\":[\"test.name\"]},{\"role\":\"field.insert\",\"insert\":[\"test.name\"]},{\"role\":\"noone\",\"update\":[\"test.objectType\"]},{\"role\":\"field.update\",\"update\":[\"test.name\"]},{\"role\":\"anyone\",\"find\":[\"test.objectType\"]},{\"role\":\"entity.insert\",\"insert\":[\"test\"]},{\"role\":\"entity.update\",\"update\":[\"test\"]},{\"role\":\"entity.find\",\"find\":[\"test\"]},{\"role\":\"entity.delete\",\"delete\":[\"test\"]}]";
        JSONAssert.assertEquals(jsonExpected, jsonEntityData, false);
    }

    @Test
    public void getAccessEntityMissingDefaultVersion() throws IOException, JSONException {
        // setup parser
        Extensions<JsonNode> extensions = new Extensions<>();
        extensions.addDefaultExtensions();
        extensions.registerDataStoreParser("mongo", new MongoDataStoreParser<JsonNode>());
        JSONMetadataParser parser = new JSONMetadataParser(extensions, new DefaultTypes(),
                new JsonNodeFactory(true));

        // get JsonNode representing metadata
        JsonNode jsonMetadata = AbstractJsonNodeTest
                .loadJsonNode(getClass().getSimpleName() + "-access-entity-missing-default-version.json");

        // parser into EntityMetadata
        EntityMetadata e = parser.parseEntityMetadata(jsonMetadata);

        // persist
        md.createNewMetadata(e);

        // ready to test!
        Response response = md.getAccess(e.getName(), null);

        Assert.assertNotNull(response);

        // verify response content
        Assert.assertEquals(OperationStatus.ERROR, response.getStatus());
        Assert.assertFalse(response.getDataErrors().isEmpty());

        // verify data
        Assert.assertNull(response.getEntityData());
    }

    /**
     * TODO enable once mongo metadata allows falling back on default version in
     * getEntityMetadata()
     *
     * @throws IOException
     * @throws JSONException
     */
    @Test
    public void getAccessEntityDefaultVersion() throws IOException, JSONException {
        // setup parser
        Extensions<JsonNode> extensions = new Extensions<>();
        extensions.addDefaultExtensions();
        extensions.registerDataStoreParser("mongo", new MongoDataStoreParser<JsonNode>());
        JSONMetadataParser parser = new JSONMetadataParser(extensions, new DefaultTypes(),
                new JsonNodeFactory(true));

        // get JsonNode representing metadata
        JsonNode jsonMetadata = AbstractJsonNodeTest
                .loadJsonNode(getClass().getSimpleName() + "-access-entity-default-version.json");

        // parser into EntityMetadata
        EntityMetadata e = parser.parseEntityMetadata(jsonMetadata);

        // persist
        md.createNewMetadata(e);

        // ready to test!
        Response response = md.getAccess(e.getName(), null);

        Assert.assertNotNull(response);

        // verify response content
        Assert.assertEquals(OperationStatus.COMPLETE, response.getStatus());
        Assert.assertTrue(response.getDataErrors().isEmpty());

        // verify data
        Assert.assertNotNull(response.getEntityData());
        String jsonEntityData = response.getEntityData().toString();
        String jsonExpected = "[{\"role\":\"field.find\",\"find\":[\"test.name\"]},{\"role\":\"field.insert\",\"insert\":[\"test.name\"]},{\"role\":\"field.update\",\"update\":[\"test.name\"]},{\"role\":\"noone\",\"update\":[\"test.objectType\"]},{\"role\":\"anyone\",\"find\":[\"test.objectType\"]},{\"role\":\"entity.insert\",\"insert\":[\"test\"]},{\"role\":\"entity.update\",\"update\":[\"test\"]},{\"role\":\"entity.find\",\"find\":[\"test\"]},{\"role\":\"entity.delete\",\"delete\":[\"test\"]}]";
        JSONAssert.assertEquals(jsonExpected, jsonEntityData, false);
    }

    /**
     * TODO enable once mongo metadata allows falling back on default version in
     * getEntityMetadata()
     *
     * @throws IOException
     * @throws JSONException
     */
    @Test
    public void getAccessSingleEntityDefaultVersion() throws IOException, JSONException {
        // setup parser
        Extensions<JsonNode> extensions = new Extensions<>();
        extensions.addDefaultExtensions();
        extensions.registerDataStoreParser("mongo", new MongoDataStoreParser<JsonNode>());
        JSONMetadataParser parser = new JSONMetadataParser(extensions, new DefaultTypes(),
                new JsonNodeFactory(true));

        // get JsonNode representing metadata
        JsonNode jsonMetadata = AbstractJsonNodeTest
                .loadJsonNode(getClass().getSimpleName() + "-access-single-entity-default-version.json");

        // parser into EntityMetadata
        EntityMetadata e = parser.parseEntityMetadata(jsonMetadata);
        // persist
        md.createNewMetadata(e);

        // ready to test!
        Response response = md.getAccess(null, null);

        Assert.assertNotNull(response);

        // verify response content
        Assert.assertEquals(OperationStatus.COMPLETE, response.getStatus());
        Assert.assertTrue(response.getDataErrors().isEmpty());

        // verify data
        Assert.assertNotNull(response.getEntityData());
        String jsonEntityData = response.getEntityData().toString();
        String jsonExpected = "[{\"role\":\"field.find\",\"find\":[\"test.name\"]},{\"role\":\"field.insert\",\"insert\":[\"test.name\"]},{\"role\":\"field.update\",\"update\":[\"test.name\"]},{\"role\":\"noone\",\"update\":[\"test.objectType\"]},{\"role\":\"anyone\",\"find\":[\"test.objectType\"]},{\"role\":\"entity.insert\",\"insert\":[\"test\"]},{\"role\":\"entity.update\",\"update\":[\"test\"]},{\"role\":\"entity.find\",\"find\":[\"test\"]},{\"role\":\"entity.delete\",\"delete\":[\"test\"]}]";
        JSONAssert.assertEquals(jsonExpected, jsonEntityData, false);
    }

    /**
     * TODO enable once mongo metadata allows falling back on default version in
     * getEntityMetadata()
     *
     * @throws IOException
     * @throws JSONException
     */
    @Test
    public void getAccessMultipleEntitiesDefaultVersion() throws IOException, JSONException {
        // setup parser
        Extensions<JsonNode> extensions = new Extensions<>();
        extensions.addDefaultExtensions();
        extensions.registerDataStoreParser("mongo", new MongoDataStoreParser<JsonNode>());
        JSONMetadataParser parser = new JSONMetadataParser(extensions, new DefaultTypes(),
                new JsonNodeFactory(true));

        // get JsonNode representing metadata
        JsonNode jsonMetadata = AbstractJsonNodeTest
                .loadJsonNode(getClass().getSimpleName() + "-access-multiple-entities-default-version.json");

        ArrayNode an = (ArrayNode) jsonMetadata;
        Iterator<JsonNode> itr = an.iterator();
        while (itr.hasNext()) {
            // parser into EntityMetadata
            EntityMetadata e = parser.parseEntityMetadata(itr.next());

            // persist
            md.createNewMetadata(e);
        }

        // ready to test!
        Response response = md.getAccess(null, null);

        Assert.assertNotNull(response);

        // verify response content
        Assert.assertEquals(OperationStatus.PARTIAL, response.getStatus());
        Assert.assertFalse(response.getDataErrors().isEmpty());
        Assert.assertEquals(1, response.getDataErrors().size());
        String jsonErrorExpected = "[{\"data\":{\"name\":\"test2\"},\"errors\":[{\"objectType\":\"error\",\"errorCode\":\"ERR_NO_METADATA\",\"msg\":\"Could not get metadata for given input. Error message: version\"}]}]";
        JSONAssert.assertEquals(jsonErrorExpected, response.getDataErrors().toString(), false);

        // verify data
        Assert.assertNotNull(response.getEntityData());
        String jsonEntityData = response.getEntityData().toString();
        String jsonExpected = "[{\"role\":\"field.find\",\"find\":[\"test1.name\",\"test3.name\"]},{\"role\":\"field.insert\",\"insert\":[\"test1.name\",\"test3.name\"]},{\"role\":\"noone\",\"update\":[\"test1.objectType\",\"test3.objectType\"]},{\"role\":\"field.update\",\"update\":[\"test1.name\",\"test3.name\"]},{\"role\":\"anyone\",\"find\":[\"test1.objectType\",\"test3.objectType\"]},{\"role\":\"entity.insert\",\"insert\":[\"test1\",\"test3\"]},{\"role\":\"entity.update\",\"update\":[\"test1\",\"test3\"]},{\"role\":\"entity.find\",\"find\":[\"test1\",\"test3\"]},{\"role\":\"entity.delete\",\"delete\":[\"test1\",\"test3\"]}]";
        JSONAssert.assertEquals(jsonExpected, jsonEntityData, false);
    }

}