package de.superx.dbt.model; import static org.junit.Assert.assertTrue; import java.nio.file.Path; import java.util.List; import java.util.StringJoiner; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import de.superx.BaseDbTest; import de.superx.dbt.DbtAction; import de.superx.dbt.DbtRunRequest; import de.superx.dbt.DbtRunResult; import de.superx.dbt.DbtWrapper; import de.superx.dbt.DbtExecutionState; import de.superx.rest.EtlJobApi; import de.superx.util.PathAndFileUtils; public class DbtHookTests extends BaseDbTest { static Logger logger = LoggerFactory.getLogger(DbtHookTests.class); @Autowired EtlJobApi api; @Autowired DbtWrapper dbtWrapper; private JdbcTemplate jt; @Before public void setUp() { jt = new JdbcTemplate(dataSource); } /* * Bewerbernummern sollen mit dem pre_hook "remove_applicantnumber" aus der * dim_person_applicant gelöscht werden, wenn die Person kein Bewerber mehr ist. * Bewerber sollen aber weiter in dim_person_applicant erhalten bleiben. * */ @Test public void testRemoveApplicantNumber() throws InterruptedException { // Bewerber hinzufügen String addPerson = "INSERT INTO staging.person " + "(id, k_gender_id) " + "VALUES(100, 1); "; String addApplicant = "INSERT INTO staging.applicant " + "(applicantnumber, person_id) " + "VALUES(3000, 100);"; jt.execute(addPerson + addApplicant); // Bewerber nach dim_person_applicant inkrementell laden DbtRunRequest request = new DbtRunRequest(DbtAction.BUILD, "hisinone", "+dim_person_applicant"); DbtRunResult result = dbtWrapper.execute(request); if (result.getState() != DbtExecutionState.SUCCESS) { List errors = result.getErrorMessages(); StringJoiner joiner = new StringJoiner("\n"); for (String error : errors) { joiner.add(error); } Assert.fail(joiner.toString()); } // Überprüfen, ob Bewerber in dim_person_applicant angekommen ist Integer person_id = jt.queryForObject("SELECT src_person_id " + "FROM presentation.dim_person_applicant " + "WHERE applicantnumber = '3000' AND src_person_id = 100;", Integer.class); assertTrue("Applicant added", person_id.intValue() == 100); // Bewerber aus dem staging löschen String deletePerson = "delete from staging.person where id = 100; "; String deleteApplicant = "delete from staging.applicant where applicantnumber = 3000; "; jt.execute(deletePerson + deleteApplicant); // Bewerbernummer von nicht mehr vorhandenen Bewerbern ersetzen lassen result = dbtWrapper.execute(request); assertTrue("DBT project run successfull", result.getState() == DbtExecutionState.SUCCESS); // Überprüfen, ob der Bewerber noch vorhanden ist und die Bewerbernummer ersetzt wurde person_id = jt.queryForObject("SELECT src_person_id FROM presentation.dim_person_applicant " + "WHERE applicantnumber = 'n. v.' AND src_person_id = 100;", Integer.class); assertTrue("Applicantnumber removed", person_id.intValue() == 100); } @After public void cleanUp() { String deletePerson = "delete from staging.person where id = 100; "; String deleteApplicant = "delete from staging.applicant where applicantnumber = 3000; "; String deleteInCorePerson = "delete from core.core_person where src_person_id = 100; "; String deleteInPersonApplicant = "delete from presentation.dim_person_applicant where src_person_id = 100; "; String deleteInSnapshotPerson = "delete from snapshots.person_academicdegree_snapshot where id = 100; "; jt.execute(deletePerson + deleteApplicant + deleteInPersonApplicant + deleteInCorePerson + deleteInSnapshotPerson); } }