package com.cse10.analyzer;
import com.cse10.database.DatabaseConstants;
import com.cse10.database.DatabaseHandler;
import com.cse10.database.HibernateUtil;
import org.hibernate.Criteria;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.*;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import static org.junit.Assert.*;
public class AnalyzerTest {
private Analyzer analyzer;
private static String previousDB;
public AnalyzerTest() throws Exception {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
session.createSQLQuery("truncate table news_statistics").executeUpdate();
tx.commit();
session.close();
analyzer = new Analyzer();
}
@BeforeClass
public static void setUp() throws Exception {
previousDB = DatabaseConstants.DB_URL;
DatabaseConstants.DB_URL = "jdbc:mysql://localhost:3306/newsstats";
}
@AfterClass
public static void tearDown() throws Exception {
DatabaseConstants.DB_URL = previousDB;
DatabaseHandler.closeDatabase();
}
@Test
public void testGenerateStats() throws Exception {
Session session = HibernateUtil.getSessionFactory().openSession();
String sql = "SELECT * FROM news_statistics";
SQLQuery query = session.createSQLQuery(sql);
query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
List results = query.list();
assertEquals(0,results.size());
session.close();
//test if table is empty
assertEquals(0, results.size());
analyzer.generateStats("2012-01-01", "2014-12-31");
session = HibernateUtil.getSessionFactory().openSession();
sql = "SELECT SUM(crime_count) as count FROM news_statistics";
query = session.createSQLQuery(sql);
query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
results = query.list();
int noOfCrimesOfOutput = ((BigDecimal) ((HashMap) results.get(0)).get("count")).intValue();
sql = "SELECT count(id) as count FROM crime_entity_group WHERE label = 'unique' AND (YEAR(crime_date) = 2012 OR YEAR(crime_date) = 2013 OR YEAR(crime_date) = 2014)";
query = session.createSQLQuery(sql);
query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
results = query.list();
int noOfCrimesOfInput = ((BigInteger) ((HashMap) results.get(0)).get("count")).intValue();
session.close();
//test if crime counts are equal in the input and output
assertEquals(noOfCrimesOfInput, noOfCrimesOfOutput);
}
}