/*
* Copyright 2017 ThoughtWorks, Inc.
*
* Licensed 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
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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 com.thoughtworks.studios.shine.semweb.sesame;
import com.thoughtworks.studios.shine.ShineRuntimeException;
import com.thoughtworks.studios.shine.semweb.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openrdf.repository.Repository;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.RepositoryException;
import java.io.StringReader;
import java.util.List;
import static com.thoughtworks.studios.shine.AssertUtils.assertAskIsFalse;
import static com.thoughtworks.studios.shine.AssertUtils.assertAskIsTrue;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
public class SesameGraphTest {
private final static String CONTEXT = "http://foo.com/context";
Repository sesameRepository = InMemoryRepositoryFactory.emptyRepository();
InMemoryTempGraphFactory graphFactory = new InMemoryTempGraphFactory();
protected Graph contextAwareGraph;
protected Graph contextUnawareGraph;
@Before
public void setUp() {
contextUnawareGraph = createSesameGraph(null);
contextAwareGraph = createSesameGraph(CONTEXT);
}
@After
public void tearDown() {
contextAwareGraph.close();
contextAwareGraph = null;
contextUnawareGraph.close();
contextUnawareGraph = null;
}
private Graph createSesameGraph(String contextURI) {
try {
return new SesameGraph(sesameRepository.getConnection(), contextURI);
} catch (RepositoryException ex) {
throw new ShineRuntimeException("Unable to get connection to repos!", ex);
}
}
@Test
public void checkAddStatementToGraphWithURIReferenceAsObject() {
Resource subject = contextUnawareGraph.createURIReference(new RDFType("http://example.com/subject"), "http://example.com/1");
RDFProperty predicate = new RDFProperty("http://example.com/predicate");
Resource object = contextUnawareGraph.createURIReference(new RDFType("http://example.com/object"), "http://example.com/2");
contextUnawareGraph.addStatement(subject, predicate, object);
String sparql =
"ASK WHERE { " +
"<http://example.com/1> <http://example.com/predicate> <http://example.com/2> . " +
"<http://example.com/1> a <http://example.com/subject> . " +
"<http://example.com/2> a <http://example.com/object> " +
"}";
assertAskIsTrue(contextUnawareGraph, sparql);
}
@Test
public void checkAddStatementToGraphWithURIReferenceAsObjectInContext() {
Resource subject = contextAwareGraph.createURIReference(new RDFType("http://example.com/subject"), "http://example.com/1");
RDFProperty predicate = new RDFProperty("http://example.com/predicate");
Resource object = contextAwareGraph.createURIReference(new RDFType("http://example.com/object"), "http://example.com/2");
contextAwareGraph.addStatement(subject, predicate, object);
String sparqlWithContext =
"ASK " +
"FROM NAMED <http://foo.com/context> " +
"WHERE { " +
" GRAPH <" + CONTEXT + "> { " +
" <http://example.com/1> <http://example.com/predicate> <http://example.com/2> . " +
" <http://example.com/1> a <http://example.com/subject> . " +
" <http://example.com/2> a <http://example.com/object> " +
" } " +
"}";
assertAskIsTrue(contextUnawareGraph, (sparqlWithContext));
}
@Test
public void checkAddStatementWithIntegerObject() {
Resource subject = contextUnawareGraph.createURIReference(new RDFType("http://example.com/subject"), "http://example.com/1");
RDFProperty predicate = new RDFProperty("http://example.com/predicate");
contextUnawareGraph.addStatement(subject, predicate, 3);
String sparql =
"PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>" +
"ASK WHERE { " +
"<http://example.com/1> <http://example.com/predicate> \"3\"^^xsd:integer . " +
"}";
assertAskIsTrue(contextUnawareGraph, sparql);
}
@Test
public void checkAddStatementWithIntegerObjectInContext() {
Resource subject = contextAwareGraph.createURIReference(new RDFType("http://example.com/subject"), "http://example.com/1");
RDFProperty predicate = new RDFProperty("http://example.com/predicate");
contextAwareGraph.addStatement(subject, predicate, 3);
String sparqlWithContext =
"PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>" +
"ASK " +
"FROM NAMED <http://foo.com/context> " +
"WHERE { " +
"GRAPH <http://foo.com/context> {" +
" <http://example.com/1> <http://example.com/predicate> \"3\"^^xsd:integer . " +
" <http://example.com/1> a <http://example.com/subject> . " +
" } " +
"}";
assertAskIsTrue(contextUnawareGraph, sparqlWithContext);
}
@Test
public void checkAddStatementWithStringObject() {
Resource subject = contextUnawareGraph.createURIReference(new RDFType("http://example.com/subject"), "http://example.com/1");
RDFProperty predicate = new RDFProperty("http://example.com/predicate");
contextUnawareGraph.addStatement(subject, predicate, "boo");
String sparql =
"PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>" +
"ASK WHERE { " +
" <http://example.com/1> <http://example.com/predicate> \"boo\"^^xsd:string . " +
" <http://example.com/1> a <http://example.com/subject> . " +
"}";
assertAskIsTrue(contextUnawareGraph, sparql);
}
@Test
public void checkAddStatementWithStringObjectInContext() {
Resource subject = contextAwareGraph.createURIReference(new RDFType("http://example.com/subject"), "http://example.com/1");
RDFProperty predicate = new RDFProperty("http://example.com/predicate");
contextAwareGraph.addStatement(subject, predicate, "boo");
String sparqlWithContext =
"PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>" +
"ASK FROM NAMED <http://foo.com/context> WHERE { " +
" GRAPH <http://foo.com/context> {" +
" <http://example.com/1> <http://example.com/predicate> \"boo\"^^xsd:string . " +
" <http://example.com/1> a <http://example.com/subject> . " +
" } " +
"}";
assertAskIsTrue(contextUnawareGraph, sparqlWithContext);
}
@Test
public void checkAddStatementWithBooleanObject() {
Resource subject = contextUnawareGraph.createURIReference(new RDFType("http://example.com/subject"), "http://example.com/1");
RDFProperty predicate = new RDFProperty("http://example.com/predicate");
contextUnawareGraph.addStatement(subject, predicate, false);
String sparql =
"PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>" +
"ASK WHERE { " +
"<http://example.com/1> <http://example.com/predicate> \"false\"^^xsd:boolean . " +
"}";
assertAskIsTrue(contextUnawareGraph, sparql);
}
@Test
public void checkAddStatementWithBooleanObjectInContext() {
Resource subject = contextAwareGraph.createURIReference(new RDFType("http://example.com/subject"), "http://example.com/1");
RDFProperty predicate = new RDFProperty("http://example.com/predicate");
contextAwareGraph.addStatement(subject, predicate, false);
String sparqlWithContext =
"PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>" +
"ASK FROM NAMED <http://foo.com/context> WHERE { " +
" GRAPH <http://foo.com/context> {" +
" <http://example.com/1> <http://example.com/predicate> \"false\"^^xsd:boolean . " +
" } " +
"}";
assertAskIsTrue(contextUnawareGraph, sparqlWithContext);
}
@Test(expected = IllegalArgumentException.class)
public void ensureCreateURIRefenceExplodesWhenGivenANullType() {
contextUnawareGraph.createURIReference(null, "http://example.com/1");
}
@Test(expected = IllegalArgumentException.class)
public void ensureCreateURIRefenceExplodesWhenGivenANullURI() {
contextUnawareGraph.createURIReference(new RDFType("http://example.com/subject"), null);
}
@Test(expected = IllegalArgumentException.class)
public void ensureCreateURIRefenceExplodesWhenGivenAnInvalidURI() {
contextUnawareGraph.createURIReference(new RDFType("http://example.com/subject"), "_:iAmABlankNodeNotAnURIIShouldBreak");
}
@Test
public void ensureThatAskWorks() {
String rdf =
"@prefix ex: <http://example.com/ontology#> . " +
"<http://example.com/1> ex:Predicate <http://example.com/2> . ";
contextUnawareGraph.addTriplesFromTurtle(rdf);
String falseSparql =
"PREFIX ex: <http://example.com/ontology#>" +
"ASK WHERE { " +
" <http://example.com/1> ex:Predicate <http://example.com/254645> . " +
"}";
assertAskIsFalse(contextUnawareGraph, falseSparql);
String trueSparql =
"PREFIX ex: <http://example.com/ontology#>" +
"ASK WHERE { " +
" <http://example.com/1> ex:Predicate <http://example.com/2> . " +
"}";
assertAskIsTrue(contextUnawareGraph, trueSparql);
}
@Test
public void ensureThatAskWorksWithContext() {
String rdf =
"@prefix ex: <http://example.com/ontology#> . " +
"<http://example.com/1> ex:Predicate <http://example.com/2> . ";
contextAwareGraph.addTriplesFromTurtle(rdf);
String falseSparql =
"PREFIX ex: <http://example.com/ontology#>" +
"ASK WHERE { " +
" <http://example.com/1> ex:Predicate <http://example.com/254645> . " +
"}";
assertAskIsFalse(contextAwareGraph, falseSparql);
assertAskIsFalse(contextUnawareGraph, falseSparql);
String trueSparql =
"PREFIX ex: <http://example.com/ontology#>" +
"ASK WHERE { " +
" <http://example.com/1> ex:Predicate <http://example.com/2> . " +
"}";
assertAskIsTrue(contextAwareGraph, trueSparql);
assertAskIsTrue(contextUnawareGraph, trueSparql);
String falseSparqlWithContext =
"PREFIX ex: <http://example.com/ontology#>" +
"ASK FROM NAMED <http://foo.com/context> WHERE { " +
" GRAPH <http://foo.com/context> {" +
" <http://example.com/1> ex:Predicate <http://example.com/254645> . " +
" }" +
"}";
assertAskIsFalse(contextUnawareGraph, falseSparqlWithContext);
String trueSparqlWithContext =
"PREFIX ex: <http://example.com/ontology#>" +
"ASK FROM NAMED <http://foo.com/context> WHERE { " +
" GRAPH <http://foo.com/context> {" +
" <http://example.com/1> ex:Predicate <http://example.com/2> . " +
" }" +
"}";
assertAskIsTrue(contextUnawareGraph, trueSparqlWithContext);
}
@Test
public void ensureAddTriplesFromTURTLEWorks() {
String turtle =
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . " +
"<http://example.com/1> rdf:type ex:Yadda . ";
contextUnawareGraph.addTriplesFromTurtle(turtle);
assertAskIsTrue(contextUnawareGraph, "PREFIX ex: <http://example.com/ontology#> ASK WHERE { <http://example.com/1> a ex:Yadda }");
}
@Test
public void ensureAddTriplesFromTURTLEWorksWithContext() {
String turtle =
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . " +
"<http://example.com/1> rdf:type ex:Yadda . ";
contextAwareGraph.addTriplesFromTurtle(turtle);
assertAskIsTrue(contextAwareGraph, "PREFIX ex: <http://example.com/ontology#> ASK WHERE { <http://example.com/1> a ex:Yadda }");
assertAskIsTrue(contextUnawareGraph, "PREFIX ex: <http://example.com/ontology#> ASK WHERE { <http://example.com/1> a ex:Yadda }");
assertAskIsTrue(contextUnawareGraph,
"PREFIX ex: <http://example.com/ontology#> ASK FROM NAMED <http://foo.com/context> WHERE { GRAPH <http://foo.com/context> {<http://example.com/1> a ex:Yadda } }");
}
@Test
public void ensureAddTriplesFromXMLRDFAbbrevWorks() {
String rdf =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">" +
"" +
"<rdf:Description rdf:about=\"http://example.com/1\">" +
"<rdf:type rdf:resource=\"http://example.com/ontology#Yadda\"/>" +
"</rdf:Description>" +
"" +
"</rdf:RDF>";
contextUnawareGraph.addTriplesFromRDFXMLAbbrev(new StringReader(rdf));
assertAskIsTrue(contextUnawareGraph, "PREFIX ex: <http://example.com/ontology#> ASK WHERE { <http://example.com/1> a ex:Yadda }");
}
@Test
public void ensureAddTriplesFromXMLRDFAbbrevWorksWithContext() {
String rdf =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">" +
"" +
"<rdf:Description rdf:about=\"http://example.com/1\">" +
"<rdf:type rdf:resource=\"http://example.com/ontology#Yadda\"/>" +
"</rdf:Description>" +
"" +
"</rdf:RDF>";
contextAwareGraph.addTriplesFromRDFXMLAbbrev(new StringReader(rdf));
assertAskIsTrue(contextAwareGraph, "PREFIX ex: <http://example.com/ontology#> ASK WHERE { <http://example.com/1> a ex:Yadda }");
assertAskIsTrue(contextUnawareGraph, "PREFIX ex: <http://example.com/ontology#> ASK WHERE { <http://example.com/1> a ex:Yadda }");
assertAskIsTrue(contextUnawareGraph,
"PREFIX ex: <http://example.com/ontology#> ASK FROM NAMED <http://foo.com/context> WHERE { GRAPH <http://foo.com/context> {<http://example.com/1> a ex:Yadda } }");
}
@Test
public void ensureThatSelectFirstWorks() {
String turtle =
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . " +
"<http://example.com/1> rdf:type ex:Yadda . ";
contextUnawareGraph.addTriplesFromTurtle(turtle);
String selectFirst =
"PREFIX ex: <http://example.com/ontology#> " +
"SELECT ?s WHERE " +
"{ " +
"?s a ex:Yadda " +
"}";
BoundVariables boundVariables = contextUnawareGraph.selectFirst(selectFirst);
assertEquals("http://example.com/1", boundVariables.getURIReference("s").getURIText());
}
@Test
public void ensureThatSelectFirstWorksWithContext() {
String turtle =
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . " +
"<http://example.com/1> rdf:type ex:Yadda . ";
contextAwareGraph.addTriplesFromTurtle(turtle);
String selectFirst =
"PREFIX ex: <http://example.com/ontology#> " +
"SELECT ?s " +
"WHERE { " +
" ?s a ex:Yadda " +
"}";
BoundVariables boundVariables = contextAwareGraph.selectFirst(selectFirst);
assertEquals("http://example.com/1", boundVariables.getURIReference("s").getURIText());
String selectFirstWithContext =
"PREFIX ex: <http://example.com/ontology#> " +
"SELECT ?s " +
"FROM NAMED <http://foo.com/context> " +
"WHERE { " +
" GRAPH <http://foo.com/context> {" +
" ?s a ex:Yadda " +
" } " +
"}";
boundVariables = contextUnawareGraph.selectFirst(selectFirstWithContext);
assertEquals("http://example.com/1", boundVariables.getURIReference("s").getURIText());
}
@Test(expected = MoreThanOneResultFoundException.class)
public void ensureThatSelectFirstExplodesWithMoreThanOneResult() {
String turtle =
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . " +
"<http://example.com/1> rdf:type ex:Yadda . " +
"<http://example.com/2> rdf:type ex:Yadda . ";
contextUnawareGraph.addTriplesFromTurtle(turtle);
String selectFirst =
"PREFIX ex: <http://example.com/ontology#> " +
"SELECT ?s WHERE { " +
"?s a ex:Yadda " +
"}";
contextUnawareGraph.selectFirst(selectFirst);
}
@Test
public void ensureTheSelectFirstReturnsNullWhenNoResults() {
String select =
"PREFIX ex: <http://example.com/ontology#> " +
"SELECT ?s WHERE { " +
"?s a ex:Yadda " +
"}";
assertNull(contextUnawareGraph.selectFirst(select));
}
@Test
public void ensureThatSelectWorksWithMultipleResults() {
String turtle =
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . " +
"<http://example.com/1> rdf:type ex:Yadda . " +
"<http://example.com/2> rdf:type ex:Yadda . ";
contextUnawareGraph.addTriplesFromTurtle(turtle);
String select =
"PREFIX ex: <http://example.com/ontology#> " +
"SELECT ?s WHERE { " +
"?s a ex:Yadda " +
"} ORDER BY ?s";
List<BoundVariables> boundVariables = contextUnawareGraph.select(select);
assertEquals(2, boundVariables.size());
assertEquals("http://example.com/1", boundVariables.get(0).getURIReference("s").getURIText());
assertEquals("http://example.com/2", boundVariables.get(1).getURIReference("s").getURIText());
}
@Test
public void ensureTheSelectReturnsEmptyListWhenNoResults() {
String select =
"PREFIX ex: <http://example.com/ontology#> " +
"SELECT ?s WHERE " +
"{ " +
"?s a ex:Yadda " +
"}";
assertEquals(0, contextUnawareGraph.select(select).size());
}
@Test
public void ensureThatSelectWithContextDoesNotGetTripelsFromDefaultGraph() {
String turtle =
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . " +
"<http://example.com/1> ex:foo \"Yadda\"^^xsd:string . ";
contextUnawareGraph.addTriplesFromTurtle(turtle);
String sparqlWithExplicitContext =
"PREFIX ex: <http://example.com/ontology#> " +
"SELECT ?foo WHERE { " +
"GRAPH <" + CONTEXT + "> { " +
"[] ex:foo ?foo " +
"}" +
"}";
assertEquals(0, contextUnawareGraph.select(sparqlWithExplicitContext).size());
String sparqlWithNoContext =
"PREFIX ex: <http://example.com/ontology#> " +
"SELECT ?foo WHERE { " +
"[] ex:foo ?foo " +
"}";
assertEquals(0, contextAwareGraph.select(sparqlWithNoContext).size());
}
@Test
public void ensureThatSelectWithContextDoesNotGetTripelsFromDifferentGraph() {
String turtle =
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . " +
"<http://example.com/1> ex:foo \"Yadda\"^^xsd:string . ";
Graph otherContextAwareGraph = createSesameGraph("http://otherGraph/");
otherContextAwareGraph.addTriplesFromTurtle(turtle);
String sparqlWithNoContext =
"PREFIX ex: <http://example.com/ontology#> " +
"SELECT ?foo WHERE { " +
"[] ex:foo ?foo " +
"}";
// NOTE: The triples were added to a DIFFERENT context than contextAwareGraph uses
assertEquals(0, contextAwareGraph.select(sparqlWithNoContext).size());
}
@Test
public void ensureThatAskWithContextDoesNotGetTriplesFromDefaultGraph() {
String turtle =
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . " +
"<http://example.com/1> ex:foo \"Yadda\"^^xsd:string . ";
contextUnawareGraph.addTriplesFromTurtle(turtle);
String sparqlWithExplicitContext =
"PREFIX ex: <http://example.com/ontology#> " +
"ASK WHERE { " +
"GRAPH <" + CONTEXT + "> { " +
"[] ex:foo _:foo " +
"}" +
"}";
assertFalse(contextUnawareGraph.ask(sparqlWithExplicitContext));
String sparqlWithNoContext =
"PREFIX ex: <http://example.com/ontology#> " +
"ASK WHERE { " +
"[] ex:foo _:foo " +
"}";
assertFalse(contextAwareGraph.ask(sparqlWithNoContext));
}
@Test
public void checkSize() {
assertEquals(0, contextUnawareGraph.size());
String turtle1 =
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . " +
"<http://example.com/1> ex:foo \"Yadda\"^^xsd:string . ";
contextUnawareGraph.addTriplesFromTurtle(turtle1);
assertEquals(0, contextAwareGraph.size());
assertEquals(1, contextUnawareGraph.size());
String turtle2 =
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . " +
"<http://example.com/1> rdf:type ex:Yadda . " +
"<http://example.com/2> rdf:type ex:Yadda . ";
contextAwareGraph.addTriplesFromTurtle(turtle2);
assertEquals(2, contextAwareGraph.size());
assertEquals(3, contextUnawareGraph.size());
}
@Test
public void checkWeCanAddANamespaceAndGetItBackByPrefix() {
contextUnawareGraph.addNamespace(new Namespace("ex", "http://www.example.com/ontology#"));
Namespace namespaceWeGetOutOfGraph = contextUnawareGraph.getNamespaceByPrefix("ex");
assertEquals("http://www.example.com/ontology#", namespaceWeGetOutOfGraph.getURIText());
}
@Test
public void checkWeCanClearAGraph() {
String turtle1 =
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . " +
"<http://example.com/1> ex:foo \"Yadda\"^^xsd:string . ";
contextAwareGraph.addTriplesFromTurtle(turtle1);
assertEquals(1, contextAwareGraph.size());
assertEquals(1, contextUnawareGraph.size());
contextAwareGraph.clearAllTriples();
assertEquals(0, contextAwareGraph.size());
assertEquals(0, contextUnawareGraph.size());
}
@Test(expected = IllegalArgumentException.class)
public void checkAddingABNodeWithNullTypeExplodes() {
contextUnawareGraph.createFakeBlankNode(null);
}
@Test
public void checkWeCanAddURIReferenceToGraphWtihContext() {
String turtle1 =
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . " +
"<http://example.com/1> ex:foo \"Yadda\"^^xsd:string . ";
contextAwareGraph.addTriplesFromTurtle(turtle1);
String select =
"PREFIX ex: <http://example.com/ontology#> " +
"SELECT ?s " +
"WHERE { " +
" ?s ex:foo _:o " +
"}";
URIReference uriReference = contextAwareGraph.createURIReference(new RDFType("http://example.com/ontology#Boo"), "http://example.com/Foo");
URIReference foo = contextAwareGraph.selectFirst(select).getURIReference("s");
contextAwareGraph.addStatement(foo, new RDFProperty("http://example.com/ontology#ugh"), uriReference);
String ask =
"PREFIX ex: <http://example.com/ontology#> " +
"ASK WHERE { " +
" ?s ex:ugh <http://example.com/Foo>" +
"}";
assertAskIsTrue(contextAwareGraph, ask);
}
@Test(expected = IllegalArgumentException.class)
public void checkAddingURIREferenceWithNullTypeExplodes() {
contextUnawareGraph.createURIReference(null, "http://example.com/hi");
}
@Test(expected = IllegalArgumentException.class)
public void checkAddingURIREferenceWithNullURIExplodes() {
contextUnawareGraph.createURIReference(new RDFType("http://example.com/ontology#Boo"), null);
}
@Test
public void checkAddTriplesFromGraph() {
String turtle =
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . " +
"<http://example.com/1> rdf:type ex:Yadda . ";
Graph sourceGraph = createSesameGraph("http://a-context/");
sourceGraph.addTriplesFromTurtle(turtle);
contextAwareGraph.addTriplesFromGraph(sourceGraph);
assertTrue(contextAwareGraph.ask("PREFIX ex: <http://example.com/ontology#> ASK WHERE { <http://example.com/1> a ex:Yadda }"));
assertEquals(1, contextAwareGraph.size());
}
@Test
public void checkAddTriplesFromGraphWithContext() {
String turtle =
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . " +
"<http://example.com/1> rdf:type ex:Yadda . ";
Graph sourceGraph = graphFactory.createTempGraph();
sourceGraph.addTriplesFromTurtle(turtle);
contextAwareGraph.addTriplesFromGraph(sourceGraph);
String sparql = "PREFIX ex: <http://example.com/ontology#> " +
"ASK WHERE { " +
" <http://example.com/1> a ex:Yadda " +
"}";
assertTrue(contextAwareGraph.ask(
sparql));
assertTrue(contextUnawareGraph.ask(
sparql));
assertEquals(1, contextAwareGraph.size());
assertEquals(1, contextUnawareGraph.size());
}
@Test
public void checkCanRemoveStatementWithURIReferenceObject() {
String turtle =
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . " +
"<http://example.com/1> <http://example.com/predicate> <http://example.com/2> . " +
"<http://example.com/3> <http://example.com/predicate> <http://example.com/4> . ";
contextUnawareGraph.addTriplesFromTurtle(turtle);
contextUnawareGraph.remove(contextUnawareGraph.getURIReference("http://example.com/1"), new RDFProperty("http://example.com/predicate"),
contextUnawareGraph.getURIReference("http://example.com/2"));
assertEquals(1, contextUnawareGraph.size());
String ask = "" +
"ASK WHERE {" +
"<http://example.com/3> <http://example.com/predicate> <http://example.com/4>" +
"}";
assertAskIsTrue(contextUnawareGraph, (ask));
}
@Test
public void checkCanRemoveStatementWithURIReferenceObjectWithContext() {
String turtle =
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . " +
"<http://example.com/1> <http://example.com/predicate> <http://example.com/2> . " +
"<http://example.com/3> <http://example.com/predicate> <http://example.com/4> . ";
contextAwareGraph.addTriplesFromTurtle(turtle);
contextAwareGraph.remove(contextAwareGraph.getURIReference("http://example.com/1"), new RDFProperty("http://example.com/predicate"), contextAwareGraph.getURIReference("http://example.com/2"));
assertEquals(1, contextAwareGraph.size());
String ask = "" +
"ASK WHERE { " +
" <http://example.com/3> <http://example.com/predicate> <http://example.com/4>" +
"}";
assertAskIsTrue(contextAwareGraph, ask);
}
@Test
public void checkCanRemoveStatementWithIntegerObject() {
String turtle =
"@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . " +
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . " +
"<http://example.com/1> <http://example.com/predicate> <http://example.com/2> . " +
"<http://example.com/3> <http://example.com/predicate> \"3\"^^xsd:integer . ";
contextUnawareGraph.addTriplesFromTurtle(turtle);
contextUnawareGraph.remove(contextUnawareGraph.getURIReference("http://example.com/3"), new RDFProperty("http://example.com/predicate"), 3);
assertEquals(1, contextUnawareGraph.size());
String ask = "" +
"PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>" +
"ASK WHERE {" +
"<http://example.com/1> <http://example.com/predicate> <http://example.com/2>" +
"}";
assertAskIsTrue(contextUnawareGraph, (ask));
}
@Test
public void checkCanRemoveStatementWithIntegerObjectWithContext() {
String turtle =
"@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . " +
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . " +
"<http://example.com/1> <http://example.com/predicate> <http://example.com/2> . " +
"<http://example.com/3> <http://example.com/predicate> \"3\"^^xsd:integer . ";
contextAwareGraph.addTriplesFromTurtle(turtle);
contextAwareGraph.remove(contextAwareGraph.getURIReference("http://example.com/3"), new RDFProperty("http://example.com/predicate"), 3);
assertEquals(1, contextAwareGraph.size());
String ask = "" +
"PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>" +
"ASK WHERE { " +
" <http://example.com/1> <http://example.com/predicate> <http://example.com/2>" +
"}";
assertAskIsTrue(contextAwareGraph, (ask));
}
@Test
public void checkCanRemoveStatementWithStringObject() {
String turtle =
"@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . " +
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . " +
"<http://example.com/1> <http://example.com/predicate> <http://example.com/2> . " +
"<http://example.com/3> <http://example.com/predicate> \"boo\"^^xsd:string . ";
contextUnawareGraph.addTriplesFromTurtle(turtle);
contextUnawareGraph.remove(contextUnawareGraph.getURIReference("http://example.com/3"), new RDFProperty("http://example.com/predicate"), "boo");
assertEquals(1, contextUnawareGraph.size());
String ask = "" +
"PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>" +
"ASK WHERE {" +
"<http://example.com/1> <http://example.com/predicate> <http://example.com/2>" +
"}";
assertAskIsTrue(contextUnawareGraph, (ask));
}
@Test
public void checkCanRemoveStatementWithStringObjectWithContext() {
String turtle =
"@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . " +
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . " +
"<http://example.com/1> <http://example.com/predicate> <http://example.com/2> . " +
"<http://example.com/3> <http://example.com/predicate> \"boo\"^^xsd:string . ";
contextAwareGraph.addTriplesFromTurtle(turtle);
contextAwareGraph.remove(contextAwareGraph.getURIReference("http://example.com/3"), new RDFProperty("http://example.com/predicate"), "boo");
assertEquals(1, contextAwareGraph.size());
String ask = "" +
"PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>" +
"ASK WHERE { " +
" <http://example.com/1> <http://example.com/predicate> <http://example.com/2>" +
"}";
assertAskIsTrue(contextAwareGraph, (ask));
}
@Test
public void checkCanRemoveStatementWithItsType() {
String turtle =
"@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . " +
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . " +
"<http://example.com/1> <http://example.com/predicate> <http://example.com/2> . " +
"<http://example.com/3> a <http://example.com/type> . ";
contextUnawareGraph.addTriplesFromTurtle(turtle);
contextUnawareGraph.removeTypeOn(contextUnawareGraph.getURIReference("http://example.com/3"), new RDFType("http://example.com/type"));
assertEquals(1, contextUnawareGraph.size());
String ask = "" +
"PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>" +
"ASK WHERE {" +
"<http://example.com/1> <http://example.com/predicate> <http://example.com/2>" +
"}";
assertAskIsTrue(contextUnawareGraph, (ask));
}
@Test
public void checkCanRemoveStatementWithItsTypeWithContext() {
String turtle =
"@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . " +
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . " +
"<http://example.com/1> <http://example.com/predicate> <http://example.com/2> . " +
"<http://example.com/3> a <http://example.com/type> . ";
contextAwareGraph.addTriplesFromTurtle(turtle);
contextAwareGraph.removeTypeOn(contextAwareGraph.getURIReference("http://example.com/3"), new RDFType("http://example.com/type"));
assertEquals(1, contextAwareGraph.size());
String ask = "" +
"PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>" +
"ASK WHERE { " +
" <http://example.com/1> <http://example.com/predicate> <http://example.com/2>" +
"}";
assertAskIsTrue(contextAwareGraph, ask);
}
@Test
public void checkCanCheckForExistenceOfResourceByURI() {
String turtle =
"@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . " +
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . " +
"<http://example.com/1> <http://example.com/predicate> <http://example.com/2> . " +
"<http://example.com/3> <http://example.com/predicate> \"boo\"^^xsd:string . ";
contextUnawareGraph.addTriplesFromTurtle(turtle);
assertTrue(contextUnawareGraph.containsResourceWithURI("http://example.com/3"));
}
@Test
public void checkCanCheckForExistenceOfResourceByURIWithContext() {
String turtle =
"@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . " +
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . " +
"<http://example.com/1> <http://example.com/predicate> <http://example.com/2> . " +
"<http://example.com/3> <http://example.com/predicate> \"boo\"^^xsd:string . ";
contextAwareGraph.addTriplesFromTurtle(turtle);
assertTrue(contextAwareGraph.containsResourceWithURI("http://example.com/3"));
}
@Test(expected = UnsupportedSPARQLStatementException.class)
public void sparqlShouldNotHaveGraphStatementWhenAskAgainstContextAwareGraph() {
String turtle =
"@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . " +
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . " +
"<http://example.com/1> <http://example.com/predicate> <http://example.com/2> . " +
"<http://example.com/3> a <http://example.com/type> . ";
contextUnawareGraph.addTriplesFromTurtle(turtle);
String sparql =
"ASK WHERE { " +
" GRAPH <http://foo.com/context> {" +
" <http://example.com/1> <http://example.com/predicate> <http://example.com/2>" +
" }" +
"}";
contextAwareGraph.ask(sparql);
}
@Test(expected = UnsupportedSPARQLStatementException.class)
public void sparqlShouldNotHaveGraphStatementWhenSelectAgainstContextAwareGraph() {
String turtle =
"@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . " +
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . " +
"<http://example.com/1> <http://example.com/predicate> <http://example.com/2> . " +
"<http://example.com/3> a <http://example.com/type> . ";
contextUnawareGraph.addTriplesFromTurtle(turtle);
String sparql =
"SELECT ?foo WHERE { " +
" GRAPH <http://foo.com/context> {" +
" ?foo <http://example.com/predicate> <http://example.com/2>" +
" }" +
"}";
contextAwareGraph.select(sparql);
}
@Test(expected = UnsupportedSPARQLStatementException.class)
public void sparqlShouldNotHaveGraphStatementWhenSelectFirstContextAwareGraph() {
String turtle =
"@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . " +
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . " +
"<http://example.com/1> <http://example.com/predicate> <http://example.com/2> . " +
"<http://example.com/3> a <http://example.com/type> . ";
contextUnawareGraph.addTriplesFromTurtle(turtle);
String sparql =
"SELECT ?foo WHERE { " +
" GRAPH <http://foo.com/context> {" +
" ?foo <http://example.com/predicate> <http://example.com/2>" +
" }" +
"}";
contextAwareGraph.selectFirst(sparql);
}
@Test(expected = ShineRuntimeException.class)
public void checkWhenAddNamespaceExplodesItThrowsAShineRuntimeException() throws Exception {
RepositoryConnection badConnection = mock(RepositoryConnection.class);
doThrow(new RepositoryException("")).when(badConnection).setNamespace("foo", "http://example.org/");
SesameGraph badGraph = new SesameGraph(badConnection, null);
badGraph.addNamespace(new Namespace("foo", "http://example.org/"));
}
@Test(expected = ShineRuntimeException.class)
public void checkGetNamespaceByPrefixExplodesItThrowsAShineRuntimeException() throws RepositoryException {
RepositoryConnection badConnection = mock(RepositoryConnection.class);
when(badConnection.getNamespace("ex")).thenThrow(new RepositoryException(""));
SesameGraph badGraph = new SesameGraph(badConnection, null);
badGraph.getNamespaceByPrefix("ex");
}
@Test(expected = ShineRuntimeException.class)
public void checkWhenAddStatementWithResourceObjectExplodesItThrowsAShineRuntimeException() throws RepositoryException {
RDFProperty property = new RDFProperty("http://www.example.com/ontology#foo");
RepositoryConnection badConnection = mock(RepositoryConnection.class);
doThrow(new RepositoryException("")).when(badConnection).add((org.openrdf.model.Resource) any(), (org.openrdf.model.URI) any(), (org.openrdf.model.Value) any());
org.openrdf.model.ValueFactory stubValueFactory = mock(org.openrdf.model.ValueFactory.class);
when(badConnection.getValueFactory()).thenReturn(stubValueFactory);
SesameURIReference stubSubject = mock(SesameURIReference.class);
when(stubSubject.getSesameNativeResource()).thenReturn(null);
URIReference stubPredicate = mock(URIReference.class);
when(stubPredicate.getURIText()).thenReturn("");
SesameGraph badGraph = new SesameGraph(badConnection, null);
badGraph.addStatement(stubSubject, property, (Integer) null);
}
@Test(expected = ShineRuntimeException.class)
public void checkWhenAddStatementWithStringObjectExplodesItThrowsAShineRuntimeException() throws RepositoryException {
RDFProperty property = new RDFProperty("http://www.example.com/ontology#foo");
RepositoryConnection badConnection = mock(RepositoryConnection.class);
doThrow(new RepositoryException("")).when(badConnection).add((org.openrdf.model.Resource) any(), (org.openrdf.model.URI) any(), (org.openrdf.model.Literal) any());
org.openrdf.model.ValueFactory stubValueFactory = mock(org.openrdf.model.ValueFactory.class);
when(badConnection.getValueFactory()).thenReturn(stubValueFactory);
SesameURIReference stubSubject = mock(SesameURIReference.class);
when(stubSubject.getSesameNativeResource()).thenReturn(null);
URIReference stubPredicate = mock(URIReference.class);
when(stubPredicate.getURIText()).thenReturn("");
SesameGraph badGraph = new SesameGraph(badConnection, null);
badGraph.addStatement(stubSubject, property, "foo");
}
@Test(expected = ShineRuntimeException.class)
public void checkWhenAddStatementWithIntObjectExplodesItThrowsAShineRuntimeException() throws RepositoryException {
RDFProperty property = new RDFProperty("http://www.example.com/ontology#foo");
RepositoryConnection badConnection = mock(RepositoryConnection.class);
doThrow(new RepositoryException("")).when(badConnection).add((org.openrdf.model.Resource) any(), (org.openrdf.model.URI) any(), (org.openrdf.model.Literal) any());
org.openrdf.model.ValueFactory stubValueFactory = mock(org.openrdf.model.ValueFactory.class);
when(badConnection.getValueFactory()).thenReturn(stubValueFactory);
SesameURIReference stubSubject = mock(SesameURIReference.class);
when(stubSubject.getSesameNativeResource()).thenReturn(null);
URIReference stubPredicate = mock(URIReference.class);
when(stubPredicate.getURIText()).thenReturn("");
SesameGraph badGraph = new SesameGraph(badConnection, null);
badGraph.addStatement(stubSubject, property, 3);
}
@Test(expected = ShineRuntimeException.class)
public void checkWhenAddStatementWithBooleanObjectExplodesItThrowsAShineRuntimeException() throws RepositoryException {
RDFProperty property = new RDFProperty("http://www.example.com/ontology#foo");
RepositoryConnection badConnection = mock(RepositoryConnection.class);
doThrow(new RepositoryException("")).when(badConnection).add((org.openrdf.model.Resource) any(), (org.openrdf.model.URI) any(), (org.openrdf.model.Literal) any());
org.openrdf.model.ValueFactory stubValueFactory = mock(org.openrdf.model.ValueFactory.class);
when(badConnection.getValueFactory()).thenReturn(stubValueFactory);
SesameURIReference stubSubject = mock(SesameURIReference.class);
when(stubSubject.getSesameNativeResource()).thenReturn(null);
URIReference stubPredicate = mock(URIReference.class);
when(stubPredicate.getURIText()).thenReturn("");
SesameGraph badGraph = new SesameGraph(badConnection, null);
badGraph.addStatement(stubSubject, property, false);
}
@Test(expected = ShineRuntimeException.class)
public void checkWhenAddTriplesFromGraphExplodesItThrowsShineRuntimeException() throws RepositoryException {
RepositoryConnection badConnection = mock(RepositoryConnection.class);
doThrow(new RepositoryException("")).when(badConnection).getStatements((org.openrdf.model.Resource) any(),
(org.openrdf.model.URI) any(), (org.openrdf.model.Value) any(), anyBoolean());
SesameGraph otherGraph = new SesameGraph(badConnection, null);
SesameGraph badGraph = new SesameGraph(badConnection, null);
badGraph.addTriplesFromGraph(otherGraph);
}
@Test(expected = UnsupportedSPARQLStatementException.class)
public void canValidateUnsupportedSPARQLStatement() throws Exception {
String turtle =
"@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . " +
"@prefix ex: <http://example.com/ontology#> . " +
"@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . " +
"<http://example.com/1> <http://example.com/predicate> <http://example.com/2> . " +
"<http://example.com/3> a <http://example.com/type> . ";
contextUnawareGraph.addTriplesFromTurtle(turtle);
String sparql =
"ASK WHERE { " +
" GRAPH <http://foo.com/context> {" +
" <http://example.com/1> <http://example.com/predicate> <http://example.com/2>" +
" }" +
"}";
contextAwareGraph.validate(sparql);
}
@Test(expected = MalformedSPARQLException.class)
public void canValidateMalformedSPARQLStatement() throws Exception {
String sparql = "I am a teapot!";
contextAwareGraph.validate(sparql);
}
@Test(expected = IllegalStateException.class)
public void shouldNotAllowCreatingNewTempGraphOnClosedGraph() throws Exception {
Graph sesameGraph = createSesameGraph(null);
sesameGraph.close();
sesameGraph.createTempGraph();
}
}