package de.superx.masken; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import java.text.ParseException; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.transform.TransformerException; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import de.memtext.tree.KeyParentEqualException; import de.memtext.tree.NoMainEntryException; import de.superx.BaseDbTest; import de.superx.TestUtils; import de.superx.common.DBServletException; import de.superx.common.InvalidDataTypeException; import de.superx.common.SichtException; import de.superx.common.UngueltigeEingabeException; import de.superx.rest.FormApi; import de.superx.rest.model.Form; import freemarker.template.TemplateException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpSession; public class PreAssignmentMaskTest extends BaseDbTest { @Mock protected HttpServletRequest request; @Mock protected HttpSession session; @Autowired FormApi formApi; // in der Oberfläche verbirgt sich hinter der Auswahl "Köpfe" eine SQL-Filterklausel private static final String KOEPFE = "KoF_1"; private static final String AKTUELLE_ZAHLEN = "6"; // Sicht 39 Studiengang, Auswahl: Standort, Fach (intern), Studiengang private static String SICHT_OHNE_AUSWAHL = ""; // Sicht 18 Lehreinheit und Fach, Datum: 22.08.2024, Auswahl: LE Historisches Seminar, LE Institut für Elektrotechnik, LE Institut für Informatik private static String SICHT_MIT_DATUM_UND_AUSWAHL = ""; // Select Hörerstatus alle (vorher: Haupt- und Nebenhörer (Amtl.)) private static final String HOERERSTATUS = "HRST_2"; private static final String LEER = ""; private static final String FREITEXT = "Freitext"; private static final String TABELLEN = "dim_person_attribute_aggr,semester"; private static final String DUMMY_WERT = "Testwert, der nicht eingefügt werden darf"; private static final String TABLESTYLESHEET = "tabelle_html_datenblatt.xsl"; // Da die Musterdaten jährlich verjüngt werden, sollte das Auswertungssemester dynamisch ermittelt werden private static final String LETZTES_WINTERSEMESTER = (TestUtils.getYearFromBranchName() - 1) + "2"; private static final int MASK_STUD_NACH_ABSCHLUSS = 16690; private static final int MASK_STUD_DATENBLATT = 160440; private static final int MASK_BEW_DATENBLATT = 26040; @Before public void setupTest() throws Exception { this.request = mock(HttpServletRequest.class); this.session = mock(HttpSession.class); when(request.getSession()).thenReturn(session); try (Connection conn = dataSource.getConnection(); Statement stmt = conn.createStatement();) { user = getTestUserService().createTestUser(true, List.of(Integer.valueOf(16690), Integer.valueOf(160440), Integer.valueOf(26040))); // tid der Sichten ändern sich bei jedem Datenbankaufbau SICHT_OHNE_AUSWAHL = getSichtTid("sos_stort_fach_stg") +"::"; SICHT_MIT_DATUM_UND_AUSWAHL = getSichtTid("sos_lehr_fach") + ":22.8.2024:0403,0302,0605"; } } /* * Es wird eine Vorbelegung für die Maske Studierende nach Abschluss (intern) erstellt. * Diese wird hier in die selbe Maske Studierende nach Abschluss (intern) eingefügt, * sodass alle gültigen Vorbelegungen übernommen werden sollten. */ @Test public void preAssignmentSameReportTest() throws TemplateException, KeyParentEqualException, CloneNotSupportedException, SichtException, IOException, SQLException, DBServletException, NoMainEntryException, ParseException, InvalidDataTypeException, UngueltigeEingabeException, TransformerException { int preAssignmentMaskeId = MASK_STUD_NACH_ABSCHLUSS; Map preAssignementParams = mockPreAssignmentParams(); int targetMaskenId = MASK_STUD_NACH_ABSCHLUSS; Map actualPreAssignment = getActualPreAssginment(preAssignmentMaskeId, preAssignementParams, targetMaskenId); Map expectedPreAssignment = new HashMap(); expectedPreAssignment.put("Köpfe oder Fälle ?", KOEPFE); expectedPreAssignment.put("Stichtag", AKTUELLE_ZAHLEN); expectedPreAssignment.put("Semester", LETZTES_WINTERSEMESTER); expectedPreAssignment.put("Studiengang", SICHT_OHNE_AUSWAHL); expectedPreAssignment.put("Fächer", SICHT_MIT_DATUM_UND_AUSWAHL); expectedPreAssignment.put("bis Fachsemester", FREITEXT); expectedPreAssignment.put("Hörerstatus", HOERERSTATUS); expectedPreAssignment.put("Geschlecht", LEER); Assert.assertEquals(actualPreAssignment, expectedPreAssignment); } /* * Es wird eine Vorbelegung für die Maske Studierende nach Abschluss (intern) erstellt. * Diese wird hier in das Studierende Datenblatt eingefügt, sodass nur Werte in Felder eingefügt werden, * bei denen das Feld aus der Vorbelegung und das Zielfeld den gleichen Namen und den gleichen Typen haben. * Das Zielfeld darf nicht "hidden" sein. Der Wert der Vorbelegung muss bei Feldern mit Auswahlliste * (Select, Multiselect, Treeselect) in der Auswahlliste des Zielfeldes enthalten sein. */ @Test public void preAssignmentDifferentReportTest() throws TemplateException, KeyParentEqualException, CloneNotSupportedException, SichtException, IOException, SQLException, DBServletException, NoMainEntryException, ParseException, InvalidDataTypeException, UngueltigeEingabeException, TransformerException { int preAssignmentMaskeId = MASK_STUD_NACH_ABSCHLUSS; Map preAssignementParams = mockPreAssignmentParams(); int targetMaskenId = MASK_STUD_DATENBLATT; Map actualPreAssignment = getActualPreAssginment(preAssignmentMaskeId, preAssignementParams, targetMaskenId); Map expectedPreAssignment = new HashMap(); expectedPreAssignment.put("Köpfe oder Fälle ?", KOEPFE); expectedPreAssignment.put("Stichtag", AKTUELLE_ZAHLEN); expectedPreAssignment.put("Studiengang", SICHT_OHNE_AUSWAHL); expectedPreAssignment.put("bis Fachsemester", FREITEXT); expectedPreAssignment.put("Hörerstatus", HOERERSTATUS); expectedPreAssignment.put("Geschlecht", LEER); Assert.assertEquals(actualPreAssignment, expectedPreAssignment); } /* * Es wird eine Vorbelegung für die Maske Studierende Datenblatt erstellt. * Diese wird hier in Bewertbung und Zulassung Datenblatt eingefügt. * Dies sollte nur möglich sein, wenn die Konstante VORBELEGUNG_BERICHTE * auf 0-global gesetzt ist (Standard). */ @Test public void preAssignmentDifferentSachgebietTestGlobal() throws TemplateException, KeyParentEqualException, CloneNotSupportedException, SichtException, IOException, SQLException, DBServletException, NoMainEntryException, ParseException, InvalidDataTypeException, UngueltigeEingabeException, TransformerException { int preAssignmentMaskeId = MASK_STUD_DATENBLATT; Map preAssignementParams = mockPreAssignmentParams(); int targetMaskenId = MASK_BEW_DATENBLATT; setApnr("VORBELEGUNG_BERICHTE", Integer.valueOf(0)); Map actualPreAssignment = getActualPreAssginment(preAssignmentMaskeId, preAssignementParams, targetMaskenId); Map expectedPreAssignment = new HashMap(); expectedPreAssignment.put("Seit Semester", LETZTES_WINTERSEMESTER); Assert.assertEquals(actualPreAssignment, expectedPreAssignment); } /* * Es wird eine Vorbelegung für die Maske Studierende Datenblatt erstellt. * Diese wird hier in Bewertbung und Zulassung Datenblatt eingefügt. * Dies sollte nicht funktionieren, da die Konstante VORBELEGUNG_BERICHTE auf 1-sachgebiet gesetzt ist. */ @Test public void preAssignmentDifferentSachgebietTest() throws TemplateException, KeyParentEqualException, CloneNotSupportedException, SichtException, IOException, SQLException, DBServletException, NoMainEntryException, ParseException, InvalidDataTypeException, UngueltigeEingabeException, TransformerException { int preAssignmentMaskeId = MASK_STUD_DATENBLATT; Map preAssignementParams = mockPreAssignmentParams(); int targetMaskenId = MASK_BEW_DATENBLATT; // setApnr("VORBELEGUNG_BERICHTE", Integer.valueOf(1)); Map actualPreAssignment = getActualPreAssginment(preAssignmentMaskeId, preAssignementParams, targetMaskenId); setApnr("VORBELEGUNG_BERICHTE", Integer.valueOf(0)); Assert.assertNull(actualPreAssignment); } /* * Mock für Felder aus Maske 16690 Studierende nach Abschluss (intern) und Maske 160440 Studierende Datenblatt * Die Felder, die nicht in der jeweiligen Maske enthalten sind, werden später nicht in die Vorbelegung aufgenommen. * Die Feldtypen Select, Multiselect, Treeselect (View) und Freitext sind abgebildet. * Zusätzlich ein tablestyleshee, dies sollte eigentlich immer "hidden" sein, ist es aber nicht immer... */ private static Map mockPreAssignmentParams() { Map preAssignementParams = new HashMap(); preAssignementParams.put("Köpfe oder Fälle ?", KOEPFE); preAssignementParams.put("Stichtag", AKTUELLE_ZAHLEN); preAssignementParams.put("Semester", LETZTES_WINTERSEMESTER); preAssignementParams.put("Seit Semester", LETZTES_WINTERSEMESTER); preAssignementParams.put("Studiengang", SICHT_OHNE_AUSWAHL); preAssignementParams.put("Fächer", SICHT_MIT_DATUM_UND_AUSWAHL); preAssignementParams.put("Status", DUMMY_WERT); preAssignementParams.put("bis Fachsemester", FREITEXT); preAssignementParams.put("Hörerstatus", HOERERSTATUS); preAssignementParams.put("Geschlecht", LEER); preAssignementParams.put("Nicht vorhandenes Feld", DUMMY_WERT); preAssignementParams.put("Weitere Tabellen", TABELLEN); preAssignementParams.put("tablestylesheet", TABLESTYLESHEET); //preAssignementParams.put("Felder", "sos_stg_aggr.abmeldegrund_tsg,sos_stg_aggr.aktiv_intern"); // Multiselect -> funktioniert nicht return preAssignementParams; } private Map getActualPreAssginment(int preAssignmentMaskeId, Map preAssignementParams, int targetMaskenId) throws ParseException, KeyParentEqualException, NoMainEntryException, SQLException, InvalidDataTypeException, SichtException, UngueltigeEingabeException, TemplateException, CloneNotSupportedException, IOException, DBServletException, TransformerException { formApi.setPreAssignment(preAssignmentMaskeId, preAssignementParams, request); when(this.session.getAttribute(formApi.getPreAssignmentSachgebietId(preAssignmentMaskeId)+ formApi.PREASSIGNMENT)) .thenReturn(formApi.getFelderOfPreAssignment(preAssignmentMaskeId, preAssignementParams)); Form form = formApi.getSelektionsparameterConfig(targetMaskenId, request); Map actualPreAssignment = form.preAssignmentParams; return actualPreAssignment; } private String getSichtTid(String sichtNameIntern) { JdbcTemplate jt = new JdbcTemplate(dataSource); Integer sichTid = jt.queryForObject("SELECT tid FROM sichten where name_intern = '" + sichtNameIntern + "';", Integer.class); return sichTid.toString(); } }