SuperX-Kernmodul
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

233 lines
12 KiB

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<String, String> preAssignementParams = mockPreAssignmentParams();
int targetMaskenId = MASK_STUD_NACH_ABSCHLUSS;
Map<String, String> actualPreAssignment = getActualPreAssginment(preAssignmentMaskeId, preAssignementParams, targetMaskenId);
Map<String, String> expectedPreAssignment = new HashMap<String, String>();
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<String, String> preAssignementParams = mockPreAssignmentParams();
int targetMaskenId = MASK_STUD_DATENBLATT;
Map<String, String> actualPreAssignment = getActualPreAssginment(preAssignmentMaskeId, preAssignementParams, targetMaskenId);
Map<String, String> expectedPreAssignment = new HashMap<String, String>();
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<String, String> preAssignementParams = mockPreAssignmentParams();
int targetMaskenId = MASK_BEW_DATENBLATT;
setApnr("VORBELEGUNG_BERICHTE", Integer.valueOf(0));
Map<String, String> actualPreAssignment = getActualPreAssginment(preAssignmentMaskeId, preAssignementParams, targetMaskenId);
Map<String, String> expectedPreAssignment = new HashMap<String, String>();
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<String, String> preAssignementParams = mockPreAssignmentParams();
int targetMaskenId = MASK_BEW_DATENBLATT;
//
setApnr("VORBELEGUNG_BERICHTE", Integer.valueOf(1));
Map<String, String> 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<String, String> mockPreAssignmentParams() {
Map<String, String> preAssignementParams = new HashMap<String, String>();
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<String, String> getActualPreAssginment(int preAssignmentMaskeId, Map<String, String> 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<String, String> 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();
}
}