package de.superx.kettle.statistics;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.time.Year;
import java.util.HashMap;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import org.pentaho.di.core.logging.LogLevel;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.support.rowset.SqlRowSet;
import de.superx.BaseDbTest;
import de.superx.KettleTestRunner;
import de.superx.stat.StatisticsBase;
public class ExaminationOfficialStatisticTest extends BaseDbTest {
private static final String KETTLE_JOB_FILE = "superx/WEB-INF/conf/edustore/db/module/astat/etl/statistik2016/estatistik.kjb";
private final int year = Year.now().getValue() - 1;
private String STICHTAG_STUD_AKTUELLE;
private String STICHTAG_STUD_AMTLSTAT;
private String STICHTAG_PRUEF_AKTUELLE;
private String STICHTAG_PRUEF_AMTLSTAT;
@Before
public void _init() throws Exception {
JdbcTemplate jt = new JdbcTemplate(dataSource);
STICHTAG_STUD_AKTUELLE = jt.queryForObject("SELECT tid FROM sos_stichtag where TRIM(stichtagsart)='Studierende'"
+ " AND TRIM(name)='Aktuelle Zahlen'", String.class);
STICHTAG_STUD_AMTLSTAT = jt.queryForObject("SELECT tid FROM sos_stichtag where TRIM(stichtagsart)='Studierende'"
+ " AND TRIM(name)='Amtl. Statistik Land'", String.class);
STICHTAG_PRUEF_AKTUELLE = jt.queryForObject("SELECT tid FROM sos_stichtag where TRIM(stichtagsart)='Prüfungen'"
+ " AND TRIM(name)='Aktuelle Zahlen'", String.class);
STICHTAG_PRUEF_AMTLSTAT = jt.queryForObject("SELECT tid FROM sos_stichtag where TRIM(stichtagsart)='Prüfungen'"
+ " AND TRIM(name)='Amtl. Statistik Land (Prüf.)'", String.class);
}
/**
* Test to check if statistics contains a column for berichtseinheitid
* #186046
*
* @author hiber
*
*/
@Test
public void testBerichtseinheitId() throws Exception {
Map parameter = new HashMap<>() {
private static final long serialVersionUID = 1L;
{
put("lieferung", "2");
put("berichtssemester", year + "1");
put("stichtagsart_stud_berichtssem", STICHTAG_STUD_AMTLSTAT);
put("stichtagsart_stud_vorsem", STICHTAG_STUD_AKTUELLE);
put("stichtagsart_pruef_berichtssem", STICHTAG_PRUEF_AMTLSTAT);
put("stichtagsart_pruef_vorsem", STICHTAG_PRUEF_AKTUELLE);
put("finalizePruefStatSql", "");
put("berichtseinheitid", "42");
}
};
KettleTestRunner.runKettleJob(KETTLE_JOB_FILE, parameter, LogLevel.BASIC);
final String EXPECTED = "4200";
SqlRowSet rs = executeQuery("SELECT distinct berichtseinheitid FROM " + StatisticsBase.MODULE_PREFIX + "astat;");
rs.next();
String berichtseinheitid = rs.getString(1);
assertNotNull("berichtseinheitid not null", berichtseinheitid);
assertTrue("berichtseinheitid has been right padded", berichtseinheitid.endsWith(EXPECTED));
assertTrue("length berichtseinheitid", berichtseinheitid.length() == 8);
}
/**
* Test to check if gender '3' is set correctly, see
* #186046
*
* Attention: this test uses modified unload data at the moment
*
* @author hiber
*
* @throws Exception
*/
@Test
public void testGender() throws Exception {
Map parameter = new HashMap<>() {
private static final long serialVersionUID = 1L;
{
put("lieferung", "2");
put("berichtssemester", year + "1");
put("stichtagsart_stud_berichtssem", STICHTAG_STUD_AMTLSTAT);
put("stichtagsart_stud_vorsem", STICHTAG_STUD_AKTUELLE);
put("stichtagsart_pruef_berichtssem", STICHTAG_PRUEF_AMTLSTAT);
put("stichtagsart_pruef_vorsem", STICHTAG_PRUEF_AKTUELLE);
put("finalizePruefStatSql", "");
put("berichtseinheitid", "42");
}
};
KettleTestRunner.runKettleJob(KETTLE_JOB_FILE, parameter, LogLevel.BASIC);
SqlRowSet resultSet = executeQuery("SELECT ef007 FROM " + StatisticsBase.MODULE_PREFIX + "astat WHERE ef006 = '000011264819';");
resultSet.next();
int gender = resultSet.getInt("ef007");
assertEquals("Field ef007 contains correct gender", 3, gender);
}
/**
* Test to check if the specified finalizePruefStatSql variable will be executed
* @author hiber
*
*/
@Test
public void testFinalizePruefStatSql() throws Exception {
final String EXPECTED = "42";
Map parameter = new HashMap<>() {
private static final long serialVersionUID = 1L;
{
put("lieferung", "2");
put("berichtssemester", year + "1");
put("matrikelnr", "11244235");
put("stichtagsart_stud_berichtssem", STICHTAG_STUD_AMTLSTAT);
put("stichtagsart_stud_vorsem", STICHTAG_STUD_AKTUELLE);
put("stichtagsart_pruef_berichtssem", STICHTAG_PRUEF_AMTLSTAT);
put("stichtagsart_pruef_vorsem", STICHTAG_PRUEF_AKTUELLE);
put("finalizePruefStatSql", "UPDATE " + StatisticsBase.MODULE_PREFIX + "astat SET berichtseinheitid='42' WHERE ef006='000011244235'");
put("berichtseinheitid", "42");
}
};
KettleTestRunner.runKettleJob(KETTLE_JOB_FILE, parameter, LogLevel.BASIC);
SqlRowSet rs = executeQuery("SELECT berichtseinheitid FROM " + StatisticsBase.MODULE_PREFIX + "astat WHERE ef006='000011244235';");
rs.next();
String berichtseinheitid = rs.getString(1);
assertNotNull("berichtseinheitid not null", berichtseinheitid);
assertEquals("finalizePruefStatSql has been executed", EXPECTED, berichtseinheitid);
}
/**
* Test to check if the specified finalizeStudStatSql variable will be executed
* @author hiber
*
*/
@Test
public void testFinalizeStudStatSql() throws Exception {
final String EXPECTED = "42";
Map parameter = new HashMap<>() {
private static final long serialVersionUID = 1L;
{
put("lieferung", "1");
put("berichtssemester", year + "1");
put("matrikelnr", "11244235");
put("stichtagsart_stud_berichtssem", STICHTAG_STUD_AMTLSTAT);
put("stichtagsart_stud_vorsem", STICHTAG_STUD_AKTUELLE);
put("stichtagsart_pruef_berichtssem", STICHTAG_PRUEF_AMTLSTAT);
put("stichtagsart_pruef_vorsem", STICHTAG_PRUEF_AKTUELLE);
put("finalizeStudStatSql", "UPDATE " + StatisticsBase.MODULE_PREFIX + "astat SET berichtseinheitid='42' WHERE ef006='000011244235'");
put("berichtseinheitid", "42");
}
};
KettleTestRunner.runKettleJob(KETTLE_JOB_FILE, parameter, LogLevel.BASIC);
SqlRowSet rs = executeQuery("SELECT berichtseinheitid FROM " + StatisticsBase.MODULE_PREFIX + "astat WHERE ef006='000011244235';");
rs.next();
String berichtseinheitid = rs.getString(1);
assertNotNull("berichtseinheitid not null", berichtseinheitid);
assertEquals("finalizePruefStatSql has been executed", EXPECTED, berichtseinheitid);
}
/**
* BIA TC15976: Studierenden- und Prüfungsstatistik ab SS 2017: Export Prüfungsstatistik
* Test to checks the content of the generated small examination Statistic
*
* @author hase
*
*/
@Test
public void testSmallExaminationStatistic() throws Exception {
Map parameter = new HashMap<>() {
private static final long serialVersionUID = 1L;
{
put("lieferung", "2"); //ExaminationStatistic
put("berichtssemester", year + "1");
put("stichtagsart_stud_berichtssem", STICHTAG_STUD_AMTLSTAT);
put("matrikelnr", "11244235");
put("stichtagsart_stud_vorsem", STICHTAG_STUD_AKTUELLE);
put("stichtagsart_pruef_berichtssem", STICHTAG_PRUEF_AMTLSTAT);
put("stichtagsart_pruef_vorsem", STICHTAG_PRUEF_AKTUELLE);
put("finalizePruefStatSql", "");
put("berichtseinheitid", "42");
}
};
KettleTestRunner.runKettleJob(KETTLE_JOB_FILE, parameter, LogLevel.ERROR);
Integer YEAR = Integer.valueOf(year);
final String[] EXPECTED = (String.format("99914200;03;1;%s;9991;000001;000011244235;2;10;04;2006;Simo;000"
+ ";;;;;;;;;9990;121;1;%s;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"
+ ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;%s;03;05;774;;;;;;;1999106;01;00;0;0;0;030;000;000;;;;"
+ ";;;;;;;;;168;;04;663;664;;665;;04;%s;1;8;;;;;1999101;03;00;0;0;0;182;000;000;;;;;;;;;;;;"
+ ";135;;06;026;105;;273;;01;%s;1;8;;;;;"
,YEAR, Integer.valueOf(year - 3), Integer.valueOf(year - 1), YEAR, YEAR)).split(";", -1);
SqlRowSet rs = executeQuery("SELECT * FROM " + StatisticsBase.MODULE_PREFIX + "astat");
final int colomnCount = rs.getMetaData().getColumnCount();
assertTrue("Result not empty", rs.next());
for (int i = 0; i < colomnCount - 1; i++) {
String s = rs.getString(i + 1);
if (s == null) s = "";
//work around (temporarily) faulty sample data, Z.245383/FS-Umstellung:
int j =i;
if (s.contains("-") && j == 134) s = s.substring(1);
if (s.contains("-") && j == 171) s = "03";
assertEquals("Field " + (i+1) + " contains correct value ", EXPECTED[i], s);
}
}
protected SqlRowSet executeQuery(String query) throws Exception {
JdbcTemplate jt = new JdbcTemplate(dataSource);
return jt.queryForRowSet(query);
}
}