package de.superx.kettle; import java.io.File; import java.io.IOException; import java.time.Year; import java.util.HashMap; import java.util.Map; import org.codehaus.groovy.control.CompilationFailedException; import org.junit.Assert; 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; public class PromOfficialStatisticsAbschlPruefTest extends BaseDbTest { private static final String KETTLE_JOB = String.join(File.separator, "superx","WEB-INF","conf","edustore","db","module", "prom", "etl", "stat_prom2017", "astat_prom.kjb"); private static final String UNLOADS_PATH = String.join(File.separator, "test", "resources", "schema_files", "promovierenden_statistik_202606", "unloads"); private static final String STUDY_STATUS_FIELD_NAME = "study_status_hiskey"; private static final String STUDY_STATUS_NATIVE = "'3'"; private static final String STUDY_STATUS_VACATION = "'4'"; private static final String STUDY_STATUS_NULL = "null"; private static Map parameters = createParameterMap(); private static Map parametersForNoGrade = createParameterMapForNoGrade(); @Test public void testPromStatistics() throws CompilationFailedException, IOException { loadFixture(); // test ef023, ticket 182117 KettleTestRunner.runKettleJob(KETTLE_JOB, parameters, LogLevel.BASIC); // startDebugWebserver(); SqlRowSet resultSet = getPromAstat(); validateEf007PersonFran(resultSet); validateEf023ExamPassed(resultSet); // test ef015, ticket 207087 updateFransRecordSet(STUDY_STATUS_FIELD_NAME, STUDY_STATUS_VACATION); KettleTestRunner.runKettleJob(KETTLE_JOB, parameters, LogLevel.BASIC); resultSet = getPromAstat(); validateEf007PersonFran(resultSet); validateEf015Registered(resultSet); // test ef015, ticket 207515 updateFransRecordSet(STUDY_STATUS_FIELD_NAME, STUDY_STATUS_NULL); KettleTestRunner.runKettleJob(KETTLE_JOB, parameters, LogLevel.BASIC); resultSet = getPromAstat(); validateEf007PersonFran(resultSet); validateEf015NotRegistered(resultSet); // test ef034 - ef038 #210725 // https://hiszilla.his.de/hiszilla/show_bug.cgi?id=210725 updateFransRecordSet("doc_ef34", "'12345678910111214151617181920'"); updateFransRecordSet("doc_ef35", "'6543210123456'"); updateFransRecordSet("doc_ef36", "'ABCDEF_123456_XYZ'"); updateFransRecordSet("doc_ef37", "'FEDCBA'"); updateFransRecordSet("doc_ef38", "'A1B2C3'"); KettleTestRunner.runKettleJob(KETTLE_JOB, parameters, LogLevel.BASIC); resultSet = getPromAstat(); validateEf034ToEf038(resultSet); // test ef030 #202234 // test ef030, Z.244194 updateFransRecordSet(STUDY_STATUS_FIELD_NAME, STUDY_STATUS_NATIVE); KettleTestRunner.runKettleJob(KETTLE_JOB, parameters, LogLevel.BASIC); resultSet = getPromAstat(); validateEf030Grade(resultSet); //funktioniert nicht: // updateFransAbschlPruefRecordSet("ext_grade","null"); // KettleTestRunner.runKettleJob(KETTLE_JOB, parameters, LogLevel.DETAILED); // resultSet = getPromAstat(); // test ef030, Z.244194 // validateEf030NoGrade(resultSet); KettleTestRunner.runKettleJob(KETTLE_JOB, parametersForNoGrade, LogLevel.DETAILED); SqlRowSet resultSetNoGrade = getPromAstat(); // test ef030, Z.244194 validateEf030NoGrade(resultSetNoGrade); } private static Map createParameterMap() { Map parameterMap = new HashMap<>(); parameterMap.put("name", "'Fran'"); parameterMap.put("berichtsjahr", "2026"); return parameterMap; } private static Map createParameterMapForNoGrade() { Map parameterMap = new HashMap<>(); parameterMap.put("name", "'Yasm'"); parameterMap.put("berichtsjahr", "2026"); return parameterMap; } private static void validateEf015Registered(SqlRowSet resultSet) { String ef015_immatrikuliert = resultSet.getString("ef015"); Assert.assertEquals("'ef015' (immatrikuliert) differs from expected value", "1", ef015_immatrikuliert); } private static void validateEf015NotRegistered(SqlRowSet resultSet) { String ef015_immatrikuliert = resultSet.getString("ef015"); Assert.assertEquals("'ef015' (immatrikuliert) differs from expected value", "0", ef015_immatrikuliert); } private static void validateEf023ExamPassed(SqlRowSet resultSet) { String ef023_pruefungBestanden = resultSet.getString("ef023"); Assert.assertEquals("'ef023' (pruefungBestanden) differs from expected value", "1", ef023_pruefungBestanden); } private static void validateEf007PersonFran(SqlRowSet resultSet) { String ef007_name = resultSet.getString("ef007"); Assert.assertEquals("'ef007' (name) differs from expected value", "Fran", ef007_name); } private static void validateEf034ToEf038(SqlRowSet resultSet) { String ef034 = resultSet.getString("ef034"); String ef035 = resultSet.getString("ef035"); String ef036 = resultSet.getString("ef036"); String ef037 = resultSet.getString("ef037"); String ef038 = resultSet.getString("ef038"); Assert.assertEquals("ef034 has been cut as expected", "123", ef034); Assert.assertEquals("ef035 has been cut as expected", "654", ef035); Assert.assertEquals("ef036 has been cut as expected", "ABC", ef036); Assert.assertEquals("ef037 has been cut as expected", "FED", ef037); Assert.assertEquals("ef038 has been cut as expected", "A1B", ef038); } private static void validateEf030NoGrade(SqlRowSet resultSet) { int index = resultSet.findColumn("ef030"); String ef030_gesamtnote = resultSet.getString(index); Assert.assertNull(ef030_gesamtnote); } private static void validateEf030Grade(SqlRowSet resultSet) { int index = resultSet.findColumn("ef030"); String ef030_gesamtnote = resultSet.getString(index); //Char an der 1.Stelle: Assert.assertEquals("'ef030' (gesamtnote) expected value", "1", ef030_gesamtnote); } private SqlRowSet getPromAstat() { JdbcTemplate jt = new JdbcTemplate(dataSource); SqlRowSet result = jt.queryForRowSet("SELECT * FROM prom_astat;"); if(!result.next()) { throw new RuntimeException("EMPTY RESULT!"); } return result; } private void updateFransRecordSet(String field, String value) { JdbcTemplate jt = new JdbcTemplate(dataSource); jt.execute("UPDATE prom_promovierende SET " + field + "=" + value + ";"); } private void updateFransAbschlPruefRecordSet(String field, String value) { JdbcTemplate jt = new JdbcTemplate(dataSource); jt.execute("UPDATE prom_abschlusspruefungen SET " + field + "=" + value + " WHERE his_person_id IN (3936);"); } private void loadFixture() throws IOException { loadCsvFileIntoTable(String.join(File.separator, UNLOADS_PATH, "prom_abschlusspruefungen"), "prom_abschlusspruefungen", '*'); loadCsvFileIntoTable(String.join(File.separator, UNLOADS_PATH, "prom_astat"), "prom_astat"); loadCsvFileIntoTable(String.join(File.separator, UNLOADS_PATH, "prom_promotion_data"), "prom_promotion_data", '*'); loadCsvFileIntoTable(String.join(File.separator, UNLOADS_PATH, "prom_promovierende"), "prom_promovierende", '*'); loadCsvFileIntoTable(String.join(File.separator, UNLOADS_PATH, "prom_promovierende_temporal_status"), "prom_promovierende_temporal_status", '*'); } }