001/*
002 * Licensed to DuraSpace under one or more contributor license agreements.
003 * See the NOTICE file distributed with this work for additional information
004 * regarding copyright ownership.
005 *
006 * DuraSpace licenses this file to you under the Apache License,
007 * Version 2.0 (the "License"); you may not use this file except in
008 * compliance with the License.  You may obtain a copy of the License at
009 *
010 *     http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018package org.fcrepo.transform.http.responses;
019
020import static com.hp.hpl.jena.graph.NodeFactory.createLiteral;
021import static com.hp.hpl.jena.graph.NodeFactory.createURI;
022import static com.hp.hpl.jena.rdf.model.ModelFactory.createDefaultModel;
023import static com.hp.hpl.jena.sparql.resultset.ResultsFormat.FMT_RDF_XML;
024import static com.hp.hpl.jena.sparql.resultset.ResultsFormat.FMT_RS_TSV;
025import static com.hp.hpl.jena.sparql.resultset.ResultsFormat.FMT_RS_XML;
026import static com.hp.hpl.jena.sparql.resultset.ResultsFormat.FMT_UNKNOWN;
027import static com.hp.hpl.jena.sparql.resultset.ResultsFormat.FMT_RDF_NT;
028import static com.hp.hpl.jena.sparql.resultset.ResultsFormat.FMT_RDF_TTL;
029import static com.hp.hpl.jena.sparql.resultset.ResultsFormat.FMT_RS_BIO;
030import static com.hp.hpl.jena.sparql.resultset.ResultsFormat.FMT_RS_CSV;
031import static com.hp.hpl.jena.sparql.resultset.ResultsFormat.FMT_RS_JSON;
032import static javax.ws.rs.core.MediaType.valueOf;
033import static org.apache.jena.riot.WebContent.contentTypeNTriples;
034import static org.apache.jena.riot.WebContent.contentTypeRDFXML;
035import static org.apache.jena.riot.WebContent.contentTypeResultsBIO;
036import static org.apache.jena.riot.WebContent.contentTypeResultsJSON;
037import static org.apache.jena.riot.WebContent.contentTypeResultsXML;
038import static org.apache.jena.riot.WebContent.contentTypeTextCSV;
039import static org.apache.jena.riot.WebContent.contentTypeTextTSV;
040import static org.apache.jena.riot.WebContent.contentTypeTurtleAlt2;
041import static org.fcrepo.kernel.api.RdfLexicon.JCR_NAMESPACE;
042import static org.fcrepo.kernel.modeshape.rdf.JcrRdfTools.getRDFNamespaceForJcrNamespace;
043import static org.fcrepo.transform.http.responses.ResultSetStreamingOutput.getResultsFormat;
044import static org.junit.Assert.assertEquals;
045import static org.junit.Assert.assertFalse;
046import static org.junit.Assert.assertTrue;
047import static org.mockito.MockitoAnnotations.initMocks;
048
049import java.io.ByteArrayOutputStream;
050
051import org.junit.Before;
052import org.junit.Test;
053import org.mockito.Mock;
054
055import com.hp.hpl.jena.graph.Triple;
056import com.hp.hpl.jena.query.Dataset;
057import com.hp.hpl.jena.query.Query;
058import com.hp.hpl.jena.query.QueryExecution;
059import com.hp.hpl.jena.query.QueryExecutionFactory;
060import com.hp.hpl.jena.query.QueryFactory;
061import com.hp.hpl.jena.query.ResultSet;
062import com.hp.hpl.jena.sparql.core.DatasetImpl;
063
064import javax.ws.rs.core.MediaType;
065
066/**
067 * <p>ResultSetStreamingOutputTest class.</p>
068 *
069 * @author cbeer
070 */
071public class ResultSetStreamingOutputTest {
072
073    @Mock
074    ResultSet mockResultSet;
075
076    ResultSetStreamingOutput testObj;
077
078    Dataset testData = new DatasetImpl(createDefaultModel());
079
080    {
081        testData.asDatasetGraph().getDefaultGraph().add(
082                new Triple(createURI("test:subject"),
083                        createURI("test:predicate"),
084                        createLiteral("test:object")));
085        testData.asDatasetGraph().getDefaultGraph().add(
086                new Triple(createURI("test:subject"),
087                        createURI(getRDFNamespaceForJcrNamespace(JCR_NAMESPACE) + "primaryType"),
088                        createLiteral("nt:file")));
089
090    }
091
092    @Before
093    public void setUp() {
094        initMocks(this);
095        testObj = new ResultSetStreamingOutput();
096    }
097
098    @Test
099    public void testWrite() throws Exception {
100
101        final Query sparqlQuery =
102            QueryFactory.create("SELECT ?x WHERE { ?x ?y ?z }");
103
104        try (final QueryExecution testResult =
105                QueryExecutionFactory.create(sparqlQuery, testData)) {
106            final ResultSet resultSet = testResult.execSelect();
107
108
109            try (final ByteArrayOutputStream out = new ByteArrayOutputStream()) {
110                testObj.writeTo(resultSet, null, null, null,
111                        valueOf(contentTypeTextTSV), null, out);
112
113                final String serialized = out.toString();
114                assertTrue(serialized.contains("test:subject"));
115            }
116        }
117    }
118
119    @Test
120    public void testWriteWithRDFFormat() throws Exception {
121
122        final Query sparqlQuery =
123            QueryFactory.create("SELECT ?x WHERE { ?x ?y ?z }");
124
125        try (final QueryExecution testResult =
126                QueryExecutionFactory.create(sparqlQuery, testData)) {
127            final ResultSet resultSet = testResult.execSelect();
128
129            try (final ByteArrayOutputStream out = new ByteArrayOutputStream()) {
130                testObj.writeTo(resultSet, null, null, null,
131                        valueOf(contentTypeRDFXML), null, out);
132                final String serialized = out.toString();
133                assertTrue(serialized.contains("rs:ResultSet"));
134            }
135        }
136    }
137
138    @Test
139    public void testGetResultsFormat() {
140        assertEquals(FMT_RS_TSV, getResultsFormat(valueOf(contentTypeTextTSV)));
141        assertEquals(FMT_UNKNOWN, getResultsFormat(valueOf("some/type")));
142        assertEquals(FMT_RS_CSV, getResultsFormat(valueOf(contentTypeTextCSV)));
143        assertEquals(FMT_RS_JSON, getResultsFormat(valueOf(contentTypeResultsJSON)));
144        assertEquals(FMT_RS_BIO, getResultsFormat(valueOf(contentTypeResultsBIO)));
145        assertEquals(FMT_RDF_TTL, getResultsFormat(valueOf(contentTypeTurtleAlt2)));
146        assertEquals(FMT_RDF_NT, getResultsFormat(valueOf(contentTypeNTriples)));
147        assertEquals(FMT_RDF_XML, getResultsFormat(valueOf(contentTypeRDFXML)));
148        assertEquals(FMT_RS_XML, getResultsFormat(valueOf(contentTypeResultsXML)));
149    }
150
151    @Test
152    public void testNonWriteable() {
153        assertFalse(testObj.isWriteable(null, null, null,
154                MediaType.APPLICATION_FORM_URLENCODED_TYPE));
155    }
156
157    @Test
158    public void testNegativeSize() {
159        assertTrue(testObj.getSize(null, null, null, null,
160                MediaType.APPLICATION_FORM_URLENCODED_TYPE) == -1);
161    }
162}