/**
* Copyright (c) Codice Foundation
* <p/>
* This is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser
* General Public License as published by the Free Software Foundation, either version 3 of the
* License, or any later version.
* <p/>
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details. A copy of the GNU Lesser General Public License
* is distributed along with this program and can be found at
* <http://www.gnu.org/licenses/lgpl.html>.
*/
package ddf.catalog.transformer.queryresponse.geojson;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ddf.catalog.data.BinaryContent;
import ddf.catalog.data.Metacard;
import ddf.catalog.data.Result;
import ddf.catalog.data.impl.MetacardImpl;
import ddf.catalog.data.impl.ResultImpl;
import ddf.catalog.operation.SourceResponse;
import ddf.catalog.operation.impl.SourceResponseImpl;
import ddf.catalog.transform.CatalogTransformerException;
import ddf.catalog.transformer.metacard.geojson.GeoJsonMetacardTransformer;
import net.minidev.json.JSONObject;
import net.minidev.json.parser.JSONParser;
import net.minidev.json.parser.ParseException;
/**
* Tests the {@link GeoJsonQueryResponseTransformer}
*
*/
public class TestGeoJsonQueryResponseTransformer {
private static final Logger LOGGER = LoggerFactory
.getLogger(TestGeoJsonQueryResponseTransformer.class);
private static final JSONParser PARSER = new JSONParser();
private static final String DEFAULT_TITLE = "myTitle";
private static final String DEFAULT_VERSION = "myVersion";
private static final String DEFAULT_XML = "<xml></xml>";
private static final String DEFAULT_URI = "http://example.com";
private static final String DEFAULT_TYPE = "myType";
private static final String DEFAULT_LOCATION = "POINT (1 0)";
private static final String DEFAULT_SOURCE_ID = "ddf";
private static final double DEFAULT_RELEVANCE = 0.75;
private static final Date NOW = new Date();
@Test(expected = CatalogTransformerException.class)
public void testNullResponse() throws CatalogTransformerException {
new GeoJsonQueryResponseTransformer().transform(null, null);
}
@Test
public void testNullResults() throws CatalogTransformerException, IOException, ParseException {
SourceResponse sourceResponse = new SourceResponseImpl(null, null, 0L);
JSONObject obj = transform(sourceResponse, 0, 0);
verifyResponse(obj, 0, 0);
}
@Test(expected = CatalogTransformerException.class)
public void testNullResult() throws CatalogTransformerException {
List<Result> results = new LinkedList<Result>();
results.add(null);
results.add(null);
SourceResponse sourceResponse = new SourceResponseImpl(null, results, 2L);
new GeoJsonQueryResponseTransformer().transform(sourceResponse, null);
}
@Test(expected = CatalogTransformerException.class)
public void testNullMetacard() throws CatalogTransformerException {
List<Result> results = new LinkedList<Result>();
Result result = new ResultImpl(null);
results.add(result);
SourceResponse sourceResponse = new SourceResponseImpl(null, results, 1L);
new GeoJsonQueryResponseTransformer().transform(sourceResponse, null);
}
@Test
public void testGoodResponse() throws CatalogTransformerException, IOException, ParseException {
final int resultCount = 3;
final int hitCount = 12;
SourceResponse sourceResponse = setupResponse(resultCount, hitCount);
JSONObject obj = transform(sourceResponse, resultCount, hitCount);
verifyResponse(obj, resultCount, hitCount);
}
private JSONObject transform(SourceResponse sourceResponse, final int resultCount,
final int hitCount) throws CatalogTransformerException, IOException, ParseException {
BinaryContent content = new GeoJsonQueryResponseTransformer()
.transform(sourceResponse, null);
assertEquals(content.getMimeTypeValue(),
GeoJsonQueryResponseTransformer.defaultMimeType.getBaseType());
String jsonText = new String(content.getByteArray());
Object object = PARSER.parse(jsonText);
JSONObject obj = (JSONObject) object;
return obj;
}
private SourceResponse setupResponse(int count, long hitsTotal) {
List<Result> results = new LinkedList<Result>();
for (int i = 0; i < count; i++) {
results.add(setupResult());
}
SourceResponse sourceResponse = new SourceResponseImpl(null, results, hitsTotal);
return sourceResponse;
}
private Result setupResult() {
MetacardImpl metacard = new MetacardImpl();
metacard.setCreatedDate(NOW);
metacard.setModifiedDate(NOW);
metacard.setMetadata(DEFAULT_XML);
metacard.setContentTypeName(DEFAULT_TYPE);
metacard.setContentTypeVersion(DEFAULT_VERSION);
metacard.setLocation(DEFAULT_LOCATION);
byte[] buffer = {8};
metacard.setThumbnail(buffer);
metacard.setTitle(DEFAULT_TITLE);
metacard.setSourceId(DEFAULT_SOURCE_ID);
try {
metacard.setResourceURI(new URI(DEFAULT_URI));
} catch (URISyntaxException e) {
LOGGER.warn("Exception during testing", e);
}
ResultImpl result = new ResultImpl(metacard);
result.setRelevanceScore(DEFAULT_RELEVANCE);
return result;
}
@SuppressWarnings("rawtypes")
private void verifyResponse(JSONObject response, int count, long hits) {
assertThat(toString(response.get("hits")), is(Long.toString(hits)));
List results = (List) response.get("results");
assertThat(results.size(), is(count));
for (Object o : results) {
verifyResult((Map) o);
}
}
private void verifyResult(@SuppressWarnings("rawtypes") Map result) {
assertThat(toString(result.get("relevance")), is(Double.toString(DEFAULT_RELEVANCE)));
@SuppressWarnings("rawtypes")
Map metacard = (Map) result.get("metacard");
assertThat(metacard.get("properties"), notNullValue());
@SuppressWarnings("rawtypes")
Map properties = ((Map) metacard.get("properties"));
assertThat(properties.size(), is(10));
assertThat(toString(properties.get(Metacard.TITLE)), is(DEFAULT_TITLE));
assertThat(toString(properties.get(Metacard.CONTENT_TYPE)), is(DEFAULT_TYPE));
assertThat(toString(properties.get(Metacard.CONTENT_TYPE_VERSION)), is(DEFAULT_VERSION));
SimpleDateFormat dateFormat = new SimpleDateFormat(
GeoJsonMetacardTransformer.ISO_8601_DATE_FORMAT);
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
assertThat(toString(properties.get(Metacard.CREATED)), is(dateFormat.format(NOW)));
assertThat(toString(properties.get(Metacard.EXPIRATION)), nullValue());
assertThat(toString(properties.get(Metacard.EFFECTIVE)), nullValue());
assertThat(toString(properties.get(Metacard.MODIFIED)), is(dateFormat.format(NOW)));
assertThat(toString(properties.get(Metacard.THUMBNAIL)), is("CA=="));
assertThat(toString(properties.get(Metacard.METADATA)), is(DEFAULT_XML));
assertThat(toString(properties.get(Metacard.RESOURCE_URI)), is(DEFAULT_URI));
}
private String toString(Object object) {
if (object != null) {
return object.toString();
}
return null;
}
}