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
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(); |
|
} |
|
|
|
}
|
|
|