package services; import com.typesafe.config.Config; import com.typesafe.config.ConfigFactory; import helpers.JsonLdConstants; import helpers.JsonTest; import models.Commit; import models.Resource; import models.TripleCommit; import org.apache.jena.rdf.model.Model; import org.apache.jena.rdf.model.ModelFactory; import org.apache.jena.riot.Lang; import org.apache.jena.riot.RDFDataMgr; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import services.repository.TriplestoreRepository; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; /** * Created by fo on 10.12.15. */ public class TriplestoreRepositoryTest implements JsonTest { private Config mConfig = ConfigFactory.load(ClassLoader.getSystemClassLoader(), "test.conf"); private static Map<String, String> mMetadata = new HashMap<>(); @BeforeClass public static void setUp() { mMetadata.put(TripleCommit.Header.AUTHOR_HEADER, "Anonymous"); mMetadata.put(TripleCommit.Header.DATE_HEADER, "2016-04-08T17:34:37.038+02:00"); } @Test public void testAddResource() throws IOException { Resource resource1 = getResourceFromJsonFile( "TriplestoreRepositoryTest/testAddResource.IN.1.json"); Resource resource2 = getResourceFromJsonFile( "TriplestoreRepositoryTest/testAddResource.IN.2.json"); Model actual = ModelFactory.createDefaultModel(); TriplestoreRepository triplestoreRepository = new TriplestoreRepository(mConfig, actual); triplestoreRepository.addResource(resource1, mMetadata); triplestoreRepository.addResource(resource2, mMetadata); Model expected = ModelFactory.createDefaultModel(); RDFDataMgr.read(expected, "TriplestoreRepositoryTest/testAddResource.IN.1.nt", Lang.NTRIPLES); assertTrue(actual.isIsomorphicWith(expected)); } @Test public void testAddResourceWithReferences() throws IOException { Resource resource1 = getResourceFromJsonFile( "TriplestoreRepositoryTest/testAddResource.IN.1.json"); Resource resource2 = getResourceFromJsonFile( "TriplestoreRepositoryTest/testAddResource.IN.2.json"); Resource resource3 = getResourceFromJsonFile( "TriplestoreRepositoryTest/testAddResourceWithReferences.IN.1.json"); Model actual = ModelFactory.createDefaultModel(); TriplestoreRepository triplestoreRepository = new TriplestoreRepository(mConfig, actual); triplestoreRepository.addResource(resource1, mMetadata); triplestoreRepository.addResource(resource2, mMetadata); triplestoreRepository.addResource(resource3, mMetadata); Model expected = ModelFactory.createDefaultModel(); RDFDataMgr.read(expected, "TriplestoreRepositoryTest/testAddResourceWithReferences.IN.1.nt", Lang.NTRIPLES); assertTrue(actual.isIsomorphicWith(expected)); } @Test public void testUpdateResource() throws IOException { Resource resource1 = getResourceFromJsonFile( "TriplestoreRepositoryTest/testAddResource.IN.1.json"); Resource resource2 = getResourceFromJsonFile( "TriplestoreRepositoryTest/testAddResource.IN.2.json"); Resource update1 = getResourceFromJsonFile( "TriplestoreRepositoryTest/testUpdateResource.IN.1.json"); Model actual = ModelFactory.createDefaultModel(); TriplestoreRepository triplestoreRepository = new TriplestoreRepository(mConfig, actual); triplestoreRepository.addResource(resource1, mMetadata); triplestoreRepository.addResource(resource2, mMetadata); triplestoreRepository.addResource(update1, mMetadata); Model expected = ModelFactory.createDefaultModel(); RDFDataMgr.read(expected, "TriplestoreRepositoryTest/testUpdateResource.IN.1.nt", Lang.NTRIPLES); assertTrue(actual.isIsomorphicWith(expected)); } @Test public void testUpdateResourceWithReferences() throws IOException { Resource resource1 = getResourceFromJsonFile( "TriplestoreRepositoryTest/testAddResource.IN.1.json"); Resource resource2 = getResourceFromJsonFile( "TriplestoreRepositoryTest/testAddResource.IN.2.json"); Resource resource3 = getResourceFromJsonFile( "TriplestoreRepositoryTest/testAddResourceWithReferences.IN.1.json"); Resource update1 = getResourceFromJsonFile( "TriplestoreRepositoryTest/testUpdateResourceWithReferences.IN.1.json"); Model actual = ModelFactory.createDefaultModel(); TriplestoreRepository triplestoreRepository = new TriplestoreRepository(mConfig, actual); triplestoreRepository.addResource(resource1, mMetadata); triplestoreRepository.addResource(resource2, mMetadata); triplestoreRepository.addResource(resource3, mMetadata); triplestoreRepository.addResource(update1, mMetadata); Model expected = ModelFactory.createDefaultModel(); RDFDataMgr.read(expected, "TriplestoreRepositoryTest/testUpdateResourceWithReferences.IN.1.nt", Lang.NTRIPLES); assertTrue(actual.isIsomorphicWith(expected)); } @Test public void testGetResource() throws IOException { Resource resource1 = getResourceFromJsonFile( "TriplestoreRepositoryTest/testAddResource.IN.1.json"); TriplestoreRepository triplestoreRepository = new TriplestoreRepository(mConfig); triplestoreRepository.addResource(resource1, mMetadata); Resource back = triplestoreRepository.getResource(resource1.getId()); assertEquals(resource1, back); } @Test public void testGetUpdatedResource() throws IOException { Resource resource1 = getResourceFromJsonFile( "TriplestoreRepositoryTest/testAddResource.IN.1.json"); Resource resource2 = getResourceFromJsonFile( "TriplestoreRepositoryTest/testAddResource.IN.2.json"); Resource resource3 = getResourceFromJsonFile( "TriplestoreRepositoryTest/testAddResourceWithReferences.IN.1.json"); Resource update1 = getResourceFromJsonFile( "TriplestoreRepositoryTest/testUpdateResourceWithReferences.IN.1.json"); Model actual = ModelFactory.createDefaultModel(); TriplestoreRepository triplestoreRepository = new TriplestoreRepository(mConfig, actual); triplestoreRepository.addResource(resource1, mMetadata); triplestoreRepository.addResource(resource2, mMetadata); triplestoreRepository.addResource(resource3, mMetadata); triplestoreRepository.addResource(update1, mMetadata); Resource expected = getResourceFromJsonFile( "TriplestoreRepositoryTest/testGetUpdatedResource.OUT.1.json"); Resource back = triplestoreRepository.getResource(resource1.getId()); assertEquals(expected, back); } @Test public void testDeleteResource() throws IOException { Resource resource1 = getResourceFromJsonFile( "TriplestoreRepositoryTest/testAddResource.IN.1.json"); Resource resource2 = getResourceFromJsonFile( "TriplestoreRepositoryTest/testAddResource.IN.2.json"); Resource resource3 = getResourceFromJsonFile( "TriplestoreRepositoryTest/testAddResourceWithReferences.IN.1.json"); Model actual = ModelFactory.createDefaultModel(); TriplestoreRepository triplestoreRepository = new TriplestoreRepository(mConfig, actual); triplestoreRepository.addResource(resource1, mMetadata); triplestoreRepository.addResource(resource2, mMetadata); triplestoreRepository.addResource(resource3, mMetadata); assertNotNull(triplestoreRepository.getResource("info:alice")); assertNotNull(triplestoreRepository.getResource("info:bob")); assertNotNull(triplestoreRepository.getResource("info:carol")); assertEquals(10, actual.size()); triplestoreRepository.deleteResource("info:alice", mMetadata); assertNull(triplestoreRepository.getResource("info:alice")); assertNotNull(triplestoreRepository.getResource("info:bob")); assertNotNull(triplestoreRepository.getResource("info:carol")); assertEquals(6, actual.size()); } @Test public void testDeleteResourceWithMentionedResources() throws IOException { // setup: 1 Person ("in1") who has 2 affiliations Resource in1 = getResourceFromJsonFile("BaseRepositoryTest/testDeleteResourceWithMentionedResources.IN.1.json"); Resource in2 = getResourceFromJsonFile("BaseRepositoryTest/testDeleteResourceWithMentionedResources.IN.2.json"); Resource in3 = getResourceFromJsonFile("BaseRepositoryTest/testDeleteResourceWithMentionedResources.IN.3.json"); Resource expected1 = getResourceFromJsonFile( "BaseRepositoryTest/testDeleteResourceWithMentionedResources.OUT.1.json"); Resource expected2 = getResourceFromJsonFile( "BaseRepositoryTest/testDeleteResourceWithMentionedResources.OUT.2.json"); Model actual = ModelFactory.createDefaultModel(); TriplestoreRepository triplestoreRepository = new TriplestoreRepository(mConfig, actual); triplestoreRepository.addResource(in1, mMetadata); triplestoreRepository.addResource(in2, mMetadata); triplestoreRepository.addResource(in3, mMetadata); // delete affiliation "Oh No Company" and check whether it has been removed // from referencing resources Resource toBeDeleted = triplestoreRepository.getResource("info:urn:uuid:49d8b330-e3d5-40ca-b5cb-2a8dfca70987"); triplestoreRepository.deleteResource(toBeDeleted.getAsString(JsonLdConstants.ID), mMetadata); Resource result1 = triplestoreRepository.getResource("info:urn:uuid:49d8b330-e3d5-40ca-b5cb-2a8dfca70456"); Resource result2 = triplestoreRepository.getResource("info:urn:uuid:49d8b330-e3d5-40ca-b5cb-2a8dfca70123"); Assert.assertEquals(expected1, result1); Assert.assertEquals(expected2, result2); Assert.assertNull(triplestoreRepository.getResource("info:urn:uuid:49d8b330-e3d5-40ca-b5cb-2a8dfca70987")); } @Test public void testGetAll() throws IOException { Resource resource1 = getResourceFromJsonFile( "TriplestoreRepositoryTest/testAddResource.IN.1.json"); Resource resource2 = getResourceFromJsonFile( "TriplestoreRepositoryTest/testAddResource.IN.2.json"); Resource resource3 = getResourceFromJsonFile( "TriplestoreRepositoryTest/testAddResourceWithReferences.IN.1.json"); Model actual = ModelFactory.createDefaultModel(); TriplestoreRepository triplestoreRepository = new TriplestoreRepository(mConfig, actual); triplestoreRepository.addResource(resource1, mMetadata); triplestoreRepository.addResource(resource2, mMetadata); triplestoreRepository.addResource(resource3, mMetadata); List<Resource> resources = triplestoreRepository.getAll("http://schema.org/Person"); assertEquals(3, resources.size()); } @Test public void testStage() throws IOException { Resource resource1 = getResourceFromJsonFile( "TriplestoreRepositoryTest/testAddResource.IN.1.json"); Resource update1 = getResourceFromJsonFile( "TriplestoreRepositoryTest/testUpdateResource.IN.1.json"); Model actual = ModelFactory.createDefaultModel(); TriplestoreRepository triplestoreRepository = new TriplestoreRepository(mConfig, actual); Resource staged1 = triplestoreRepository.stage(resource1); assertEquals(resource1, staged1); assertTrue(actual.isEmpty()); triplestoreRepository.addResource(staged1, mMetadata); Resource staged2 = triplestoreRepository.stage(update1); assertEquals(triplestoreRepository.getResource("info:alice"), resource1); assertEquals(update1, staged2); } @Test public void testStageWithBnodeInSelfReference() throws IOException { Resource resource = getResourceFromJsonFile( "TriplestoreRepositoryTest/testStageWithSelfReference.IN.1.json"); Model actual = ModelFactory.createDefaultModel(); TriplestoreRepository triplestoreRepository = new TriplestoreRepository(mConfig, actual); triplestoreRepository.addResource(resource, mMetadata); Resource staged = triplestoreRepository.stage(resource); assertEquals(resource, staged); } @Test public void testUpdateDelete() throws IOException { Model db = ModelFactory.createDefaultModel(); RDFDataMgr.read(db, "TriplestoreRepositoryTest/testUpdate.IN.nt", Lang.NTRIPLES); TriplestoreRepository triplestoreRepository = new TriplestoreRepository(mConfig, db); Commit.Diff actual = triplestoreRepository.update( "?s <info:objectProperty> ?o", null, "?s <info:objectProperty> ?o" ); Commit.Diff expected = TripleCommit.Diff.fromString( "- <info:subject> <info:objectProperty> <info:object> .\n" ); assertEquals(expected.toString(), actual.toString()); } @Test public void testUpdateInsert() throws IOException { Model db = ModelFactory.createDefaultModel(); RDFDataMgr.read(db, "TriplestoreRepositoryTest/testUpdate.IN.nt", Lang.NTRIPLES); TriplestoreRepository triplestoreRepository = new TriplestoreRepository(mConfig, db); Commit.Diff actual = triplestoreRepository.update( null, "?s <info:anotherProperty> ?o", "?s <info:objectProperty> ?o" ); Commit.Diff expected = TripleCommit.Diff.fromString( "+ <info:subject> <info:anotherProperty> <info:object> .\n" ); assertEquals(expected.toString(), actual.toString()); } @Test public void testUpdateDeleteInsert() throws IOException { Model db = ModelFactory.createDefaultModel(); RDFDataMgr.read(db, "TriplestoreRepositoryTest/testUpdate.IN.nt", Lang.NTRIPLES); TriplestoreRepository triplestoreRepository = new TriplestoreRepository(mConfig, db); Commit.Diff actual = triplestoreRepository.update( "?s <info:objectProperty> ?o", "?s <info:anotherProperty> ?o", "?s <info:objectProperty> ?o" ); Commit.Diff expected = TripleCommit.Diff.fromString( "- <info:subject> <info:objectProperty> <info:object> .\n" + "+ <info:subject> <info:anotherProperty> <info:object> .\n" ); assertEquals(expected.toString(), actual.toString()); } }