package tap.formatter;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import org.json.JSONObject;
import org.json.JSONTokener;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import adql.db.DBType;
import adql.db.DBType.DBDatatype;
import tap.ServiceConnection;
import tap.TAPExecutionReport;
import tap.TAPJob;
import tap.data.ResultSetTableIterator;
import tap.data.TableIterator;
import tap.db_testtools.DBTools;
import tap.metadata.TAPColumn;
import tap.parameters.TAPParameters;
/**
* <p>Test the JSONFormat function {@link JSONFormat#writeResult(TableIterator, OutputStream, TAPExecutionReport, Thread)}.</p>
*
* <p>2 test ares done: 1 with an overflow and another without.</p>
*
* @author Grégory Mantelet (ARI)
* @version 2.1 (03/2017)
*/
public class TestJSONFormat {
private static Connection conn;
private static ServiceConnection serviceConn;
private static TAPColumn[] resultingColumns;
private static File jsonFile = new File("json_test.json");
@BeforeClass
public static void setUpBeforeClass() throws Exception{
DBTools.createTestDB();
conn = DBTools.createConnection("h2", null, null, DBTools.DB_TEST_PATH, DBTools.DB_TEST_USER, DBTools.DB_TEST_PWD);
serviceConn = new ServiceConnection4Test();
resultingColumns = new TAPColumn[4];
resultingColumns[0] = new TAPColumn("hip", new DBType(DBDatatype.VARCHAR));
resultingColumns[1] = new TAPColumn("ra", new DBType(DBDatatype.DOUBLE), "Right ascension", "deg", "pos.eq.ra", null);
resultingColumns[2] = new TAPColumn("dec", new DBType(DBDatatype.DOUBLE), "Declination", "deg", "pos.eq.dec", null);
resultingColumns[3] = new TAPColumn("vmag", new DBType(DBDatatype.DOUBLE), "V magnitude", "mag", "phot.mag;em.opt.V", null);
if (!jsonFile.exists())
jsonFile.createNewFile();
}
@AfterClass
public static void tearDownAfterClass() throws Exception{
DBTools.closeConnection(conn);
jsonFile.delete();
DBTools.dropTestDB();
}
@Test
public void testWriteResult(){
ResultSet rs = null;
try{
rs = DBTools.select(conn, "SELECT hip, ra, dec, vmag FROM hipparcos LIMIT 10;");
HashMap<String,Object> tapParams = new HashMap<String,Object>(1);
tapParams.put(TAPJob.PARAM_MAX_REC, "100");
TAPParameters params = new TAPParameters(serviceConn, tapParams);
TAPExecutionReport report = new TAPExecutionReport("123456A", true, params);
report.resultingColumns = resultingColumns;
TableIterator it = new ResultSetTableIterator(rs);
JSONFormat formatter = new JSONFormat(serviceConn);
OutputStream output = new BufferedOutputStream(new FileOutputStream(jsonFile));
formatter.writeResult(it, output, report, Thread.currentThread());
output.close();
JSONTokener tok = new JSONTokener(new FileInputStream(jsonFile));
JSONObject obj = (JSONObject)tok.nextValue();
assertEquals(obj.getJSONArray("data").length(), 10);
}catch(Exception t){
t.printStackTrace();
fail("Unexpected exception!");
}finally{
if (rs != null){
try{
rs.close();
}catch(SQLException se){}
}
}
}
@Test
public void testWriteResultWithOverflow(){
ResultSet rs = null;
try{
rs = DBTools.select(conn, "SELECT hip, ra, dec, vmag FROM hipparcos LIMIT 10;");
HashMap<String,Object> tapParams = new HashMap<String,Object>(1);
tapParams.put(TAPJob.PARAM_MAX_REC, "5");
TAPParameters params = new TAPParameters(serviceConn, tapParams);
TAPExecutionReport report = new TAPExecutionReport("123456A", true, params);
report.resultingColumns = resultingColumns;
TableIterator it = new ResultSetTableIterator(rs);
JSONFormat formatter = new JSONFormat(serviceConn);
OutputStream output = new BufferedOutputStream(new FileOutputStream(jsonFile));
formatter.writeResult(it, output, report, Thread.currentThread());
output.close();
JSONTokener tok = new JSONTokener(new FileInputStream(jsonFile));
JSONObject obj = (JSONObject)tok.nextValue();
assertEquals(obj.getJSONArray("data").length(), 5);
}catch(Exception t){
t.printStackTrace();
fail("Unexpected exception!");
}finally{
if (rs != null){
try{
rs.close();
}catch(SQLException e){
System.err.println("Can not close the RESULTSET!");
e.printStackTrace();
}
}
}
}
}