package de.superx.bianalysis; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import de.superx.BIATestUtils; import de.superx.BaseDbTest; import de.superx.bianalysis.models.Right; import de.superx.bianalysis.models.RightParam; import de.superx.bianalysis.rest.BiAnalysisApi; import de.superx.bianalysis.service.UserRestrictionService; import de.superx.rest.model.Result; public class ProjectRestrictionTest extends BaseDbTest { @Autowired BiAnalysisApi biAnalysisApi; // Zeig alle Projekte (Titel des Projektes) private ReportDefinition definition; private String oldUserName; private Integer oldUserPersonId; private Integer oldOrgId; @Before public void init() throws Exception { oldUserName = user.getName(); oldUserPersonId = user.getUserPersonId(); oldOrgId = user.getHisInOneOrgUnitLidOfRole(); // Werner Albrecht, bei einem Projekt Projektleiter (in fact_research_funds) user.setName("albrecht"); user.setUserPersonId(Integer.valueOf(430)); user.setHisInOneOrgUnitLidOfRole(Integer.valueOf(2)); setRight(Right.CREATE_ANALYSIS); String reportJson = """ { "factTableId": "res:105", "hideEmptyColumns": false, "leftDimensionAttributeIds": [ "res:608" ], "measureIds": [ "res:127" ] } """; this.definition = BIATestUtils.getReportDefinitionFromString(reportJson); } @After public void restoreUserValues() { user.setName(oldUserName); user.setHisInOneOrgUnitLidOfRole(oldOrgId); user.setUserPersonId(oldUserPersonId); } @Test public void testPersonIstProjektleiterSiehtEigeneProjekte() throws Exception { setRight(Right.CREATE_ANALYSIS); UserRestrictionService builder = new UserRestrictionService(user, dataSource); builder.calculateDimensionRestrictions(user.getUserPersonId()); Result result = biAnalysisApi.getReport(definition); assertEquals(2, result.rows.size()); // 1 für das Projekt, 1 für die Gesamtzeile } @Test public void testPersonIstProjektleiterSiehtAlleProjekte() throws Exception { String rightParamAlleProjekte = "2"; setRightParamValue(Right.CREATE_ANALYSIS, RightParam.PROJECT, rightParamAlleProjekte); UserRestrictionService builder = new UserRestrictionService(user, dataSource); builder.calculateDimensionRestrictions(user.getUserPersonId()); Result result = biAnalysisApi.getReport(definition); assertTrue(result.rows.size() > 2); // Werner sieht jetzt alle Projekte (sollten mehr als zwei sein) } @Test public void testPersonIstKeinProjektleiterSiehtKeineProjekte() throws Exception { user.setName("neuer testuser"); user.setUserPersonId(Integer.valueOf(3333)); user.setHisInOneOrgUnitLidOfRole(Integer.valueOf(2)); setRight(Right.CREATE_ANALYSIS); UserRestrictionService builder = new UserRestrictionService(user, dataSource); builder.calculateDimensionRestrictions(user.getUserPersonId()); Result result = biAnalysisApi.getReport(definition); assertEquals(1, result.rows.size()); // eine Zeile für die Gesamtzeile } @Test public void testPersonIstProjektleiterMitOrgeinheitEinschränkung() throws Exception { // Wir setzen die Organisationseinheit bei Werner Albrecht jetzt auf // "Lehrstuhl Numerische und Angewandte Mathematik" und erstellen die Orgunit // Restriktion. Da er seine Projekte als Forschungsleiter in einer anderen Orgunit // betreut hat, sollte er keine Projekte angezeigt bekommen. String dimOrgunitFlatInProjektFinanzSternId = "res:79126"; try { setIsRestricted(dimOrgunitFlatInProjektFinanzSternId, true); user.setHisInOneOrgUnitLidOfRole(Integer.valueOf(100199)); setRight(Right.CREATE_ANALYSIS); UserRestrictionService builder = new UserRestrictionService(user, dataSource); builder.calculateDimensionRestrictions(user.getUserPersonId()); builder.applyOrgunitRestrictions(); // Wir setzen die Orgunit Restriktion Result result = biAnalysisApi.getReport(definition); assertEquals(1, result.rows.size()); // eine Zeile für die Gesamtzeile } finally { setIsRestricted(dimOrgunitFlatInProjektFinanzSternId, false); } } private void setIsRestricted(String dimensionId, boolean isRestricted) { String sql = "UPDATE metadata.dimension SET is_restricted = ? WHERE id = ?"; int updatedRows = new JdbcTemplate(dataSource).update(sql, Boolean.valueOf(isRestricted), dimensionId); assertEquals("Expected to update exactly one entry.", 1, updatedRows); } }