package org.emfjson.mongo.tests;
import com.mongodb.BasicDBObject;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import org.bson.Document;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.emfjson.jackson.resource.JsonResourceFactory;
import org.emfjson.mongo.MongoHandler;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.util.List;
import static org.junit.Assert.*;
public class MongoHandlerSaveTest {
private ResourceSet resourceSet;
private MongoClient client;
private MongoHandler handler;
private URI testURI = URI.createURI("mongodb://localhost:27017/emfjson-test/models/model1");
@Before
public void setUp() {
client = new MongoClient();
handler = new MongoHandler(client);
resourceSet = new ResourceSetImpl();
resourceSet.getPackageRegistry().put(EcorePackage.eNS_URI, EcorePackage.eINSTANCE);
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("*", new JsonResourceFactory());
resourceSet.getURIConverter().getURIHandlers().add(0, handler);
}
@After
public void tearDown() {
client.getDatabase("emfjson-test").drop();
}
@Test
public void testSave() throws IOException {
Resource resource = resourceSet.createResource(testURI);
EPackage p = EcoreFactory.eINSTANCE.createEPackage();
p.setName("p");
EClass c = EcoreFactory.eINSTANCE.createEClass();
c.setName("A");
p.getEClassifiers().add(c);
resource.getContents().add(p);
resource.save(null);
checkDocument(testURI);
}
@Test
public void testSaveWithUriMapping() throws IOException {
resourceSet.getURIConverter().getURIMap().put(
URI.createURI("http://resources/"),
URI.createURI("mongodb://localhost:27017/emfjson-test/models/"));
Resource resource = resourceSet.createResource(URI.createURI("http://resources/model1"));
EPackage p = EcoreFactory.eINSTANCE.createEPackage();
p.setName("p");
EClass c = EcoreFactory.eINSTANCE.createEClass();
c.setName("A");
p.getEClassifiers().add(c);
resource.getContents().add(p);
resource.save(null);
checkDocument(testURI);
}
private void checkDocument(URI uri) {
MongoCollection<Document> collection = handler.getCollection(uri);
assertNotNull(collection);
Document document = collection.find(new BasicDBObject("_id", "model1")).first();
assertNotNull(document);
assertEquals("model1", document.get("_id"));
assertEquals("resource", document.get("_type"));
Document contents = (Document) document.get("contents");
assertEquals(3, contents.keySet().size());
assertEquals("http://www.eclipse.org/emf/2002/Ecore#//EPackage", contents.getString("eClass"));
assertEquals("p", contents.getString("name"));
assertTrue(contents.get("eClassifiers") instanceof List);
List<Document> eClassifiers = (List<Document>) contents.get("eClassifiers");
Document first = eClassifiers.get(0);
assertEquals("http://www.eclipse.org/emf/2002/Ecore#//EClass", first.getString("eClass"));
assertEquals("A", first.getString("name"));
}
}