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