package de.geeksfactory.opacclient.apis;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import de.geeksfactory.opacclient.searchfields.SearchField;
import de.geeksfactory.opacclient.utils.JsonKeyIterator;
import static org.hamcrest.CoreMatchers.anyOf;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.isIn;
import static org.junit.Assert.assertThat;
/**
* Tests validity of JSON files shipped with libopac
*/
public class JSONFilesTest extends BaseHtmlTest {
List<String> keys_both = Arrays.asList("title", "author", "format", "id", "status");
List<String> keys_lent =
Arrays.asList("barcode", "returndate", "homebranch", "lendingbranch", "prolongurl",
"renewable", "download");
List<String> keys_reservations =
Arrays.asList("availability", "expirationdate", "branch", "cancelurl", "bookingurl");
List<String> keys_meaning;
JSONObject bibliothecaHeadersLent;
JSONObject bibliothecaHeadersReservations;
JSONObject biber1992HeadersLent;
JSONObject biber1992HeadersReservations;
List<JSONObject> meaningsData;
JSONArray meaningsIgnore;
@Before
public void setUp() throws JSONException, IOException {
bibliothecaHeadersLent = new JSONObject(readResource("/bibliotheca/headers_lent.json"));
bibliothecaHeadersReservations =
new JSONObject(readResource("/bibliotheca/headers_reservations.json"));
biber1992HeadersLent = new JSONObject(readResource("/biber1992/headers_lent.json"));
biber1992HeadersReservations =
new JSONObject(readResource("/biber1992/headers_reservations.json"));
List<String> meaningsFiles = getResourceFiles("/meanings");
meaningsData = new ArrayList<>();
for (String filename : meaningsFiles) {
String content = readResource("/meanings/" + filename);
if (filename.equals("ignore.json")) {
meaningsIgnore = new JSONArray(content);
} else {
meaningsData.add(new JSONObject(content));
}
}
keys_meaning = new ArrayList<>();
for (SearchField.Meaning meaning : SearchField.Meaning.values()) {
keys_meaning.add(meaning.toString());
}
}
@Test
public void testBibliothecaHeadersLent() throws JSONException {
Iterator iterator = bibliothecaHeadersLent.keys();
while (iterator.hasNext()) {
String key = (String) iterator.next();
if (!bibliothecaHeadersLent.isNull(key)) {
String value = bibliothecaHeadersLent.getString(key);
assertThat(value, anyOf(isIn(keys_both), isIn(keys_lent)));
}
}
}
@Test
public void testBibliothecaHeadersReservations() throws JSONException {
Iterator iterator = bibliothecaHeadersReservations.keys();
while (iterator.hasNext()) {
String key = (String) iterator.next();
if (!bibliothecaHeadersReservations.isNull(key)) {
String value = bibliothecaHeadersReservations.getString(key);
assertThat(value, anyOf(isIn(keys_both), isIn(keys_reservations)));
}
}
}
@Test
public void testBiBer1992HeadersLent() throws JSONException {
Iterator iterator = biber1992HeadersLent.keys();
while (iterator.hasNext()) {
String key = (String) iterator.next();
if (!biber1992HeadersLent.isNull(key)) {
String value = biber1992HeadersLent.getString(key);
assertThat(value, anyOf(isIn(keys_both), isIn(keys_lent),
equalTo("author+title"), equalTo("renewals_number")));
}
}
}
@Test
public void testBiBer1992HeadersReservations() throws JSONException {
Iterator iterator = biber1992HeadersReservations.keys();
while (iterator.hasNext()) {
String key = (String) iterator.next();
if (!biber1992HeadersReservations.isNull(key)) {
String value = biber1992HeadersReservations.getString(key);
assertThat(value, anyOf(isIn(keys_both), isIn(keys_reservations),
equalTo("author+title"), equalTo("renewals_number")));
}
}
}
@Test
public void testMeanings() throws JSONException {
for (JSONObject json : meaningsData) {
// Detect layout of the JSON entries. Can be "field name":
// "meaning" or "meaning": [ "field name", "field name", ... ]
Iterator<String> iter = new JsonKeyIterator(json);
if (!iter.hasNext()) {
return; // No entries
}
String firstKey = iter.next();
Object firstValue = json.get(firstKey);
boolean arrayLayout = firstValue instanceof JSONArray;
if (arrayLayout) {
assertThat(firstKey, isIn(keys_meaning));
while (iter.hasNext()) {
String key = iter.next();
assertThat(key, isIn(keys_meaning));
}
} else {
assertThat((String) firstValue, isIn(keys_meaning));
while (iter.hasNext()) {
String key = iter.next();
String val = json.getString(key);
assertThat(val, isIn(keys_meaning));
}
}
}
}
@Test
public void testMeaningsIgnore() throws JSONException {
for (int i = 0; i < meaningsIgnore.length(); i++) {
assertThat(meaningsIgnore.get(i), instanceOf(String.class));
}
}
}