From f09826a8fff78361de9cbe5eccdfffb86a6e610a Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Wed, 15 Mar 2023 12:01:50 +0100 Subject: [PATCH] Verwende Spring Configuration zur Pluginkonfiguration Dies erlaubt eine dynamische Konfiguration der zu verwendenden Service-Implementierungen mit Anpassungen je nach Standort oder Einstellungen. --- .../DNPM/analyzer/TherapieplanAnalyzer.java | 158 +----------------- .../java/DNPM/config/PluginConfiguration.java | 42 +++++ .../DNPM/services/DefaultFormService.java | 7 +- .../DNPM/services/DefaultStudienService.java | 2 - .../services/DefaultTherapieplanService.java | 142 ++++++++++++++++ src/main/java/DNPM/services/FormService.java | 26 ++- .../MultipleMtbTherapieplanService.java | 12 ++ .../DNPM/services/TherapieplanService.java | 15 ++ .../de/itc/onkostar/library/moduleContext.xml | 3 +- .../analyzer/TherapieplanAnalyzerTest.java | 112 +------------ .../DNPM/config/PluginConfigurationTest.java | 72 ++++++++ .../DefaultTherapieplanServiceTest.java | 120 +++++++++++++ 12 files changed, 451 insertions(+), 260 deletions(-) create mode 100644 src/main/java/DNPM/config/PluginConfiguration.java create mode 100644 src/main/java/DNPM/services/DefaultTherapieplanService.java create mode 100644 src/main/java/DNPM/services/MultipleMtbTherapieplanService.java create mode 100644 src/main/java/DNPM/services/TherapieplanService.java create mode 100644 src/test/java/DNPM/config/PluginConfigurationTest.java create mode 100644 src/test/java/DNPM/services/DefaultTherapieplanServiceTest.java diff --git a/src/main/java/DNPM/analyzer/TherapieplanAnalyzer.java b/src/main/java/DNPM/analyzer/TherapieplanAnalyzer.java index 17317cb..29441cf 100644 --- a/src/main/java/DNPM/analyzer/TherapieplanAnalyzer.java +++ b/src/main/java/DNPM/analyzer/TherapieplanAnalyzer.java @@ -1,24 +1,18 @@ package DNPM.analyzer; -import DNPM.services.FormService; import DNPM.services.Studie; import DNPM.services.StudienService; +import DNPM.services.TherapieplanService; import de.itc.onkostar.api.Disease; -import de.itc.onkostar.api.IOnkostarApi; -import de.itc.onkostar.api.Item; import de.itc.onkostar.api.Procedure; import de.itc.onkostar.api.analysis.AnalyseTriggerEvent; import de.itc.onkostar.api.analysis.AnalyzerRequirement; import de.itc.onkostar.api.analysis.IProcedureAnalyzer; import de.itc.onkostar.api.analysis.OnkostarPluginType; -import de.itc.onkostar.api.constants.JaNeinUnbekannt; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Set; /** @@ -29,18 +23,16 @@ import java.util.Set; @Component public class TherapieplanAnalyzer implements IProcedureAnalyzer { - private final Logger logger = LoggerFactory.getLogger(this.getClass()); - - private final IOnkostarApi onkostarApi; - - private final FormService formService; - private final StudienService studienService; - public TherapieplanAnalyzer(final IOnkostarApi onkostarApi, final FormService formService, final StudienService studienService) { - this.onkostarApi = onkostarApi; - this.formService = formService; + private final TherapieplanService therapieplanService; + + public TherapieplanAnalyzer( + final StudienService studienService, + final TherapieplanService therapieplanService + ) { this.studienService = studienService; + this.therapieplanService = therapieplanService; } @Override @@ -97,8 +89,7 @@ public class TherapieplanAnalyzer implements IProcedureAnalyzer { @Override public void analyze(Procedure procedure, Disease disease) { - updateMtbInSections(procedure); - updateMtbInSubforms(procedure); + therapieplanService.updateRequiredMtbEntries(procedure); } @@ -128,135 +119,4 @@ public class TherapieplanAnalyzer implements IProcedureAnalyzer { return studienService.findByQuery(query.toString()); } - /** - * Verlinke MTB und Übernahme Datum aus Hauptformular in weiteren Bereichen - * "Humangenetische Beratung" und "Reevaluation", wenn erforderlich. - * - * @param procedure Die Prozedur mit Hauptformular - */ - private void updateMtbInSections(Procedure procedure) { - if ( - this.hasMultipleMtbsEnabled() || ( - !isYes(procedure, "humangenberatung") && !isYes(procedure, "reevaluation") - ) - ) { - return; - } - - var a = procedure.getValue("humangenberatung").getString(); - var b = procedure.getValue("reevaluation").getString(); - - var mtbReference = procedure.getValue("referstemtb").getInt(); - var mtbDate = procedure.getValue("datum").getDate(); - var noUpdateRequired = true; - - if ( - isYes(procedure, "humangenberatung") && ( - !hasValue(procedure, "reftkhumangenber") - || mtbReference != procedure.getValue("reftkhumangenber").getInt() - ) - ) { - procedure.setValue("reftkhumangenber", new Item("ref_tk_humangenber", mtbReference)); - noUpdateRequired = false; - } - - if ( - isYes(procedure, "humangenberatung") && ( - !hasValue(procedure, "datumtkhumangenber") - || !mtbDate.equals(procedure.getValue("datumtkhumangenber").getDate()) - ) - ) { - procedure.setValue("datumtkhumangenber", new Item("datum_tk_humangenber", mtbDate)); - noUpdateRequired = false; - } - - if ( - isYes(procedure, "reevaluation") && ( - !hasValue(procedure, "reftkreevaluation") - || mtbReference != procedure.getValue("reftkreevaluation").getInt() - ) - ) { - procedure.setValue("reftkreevaluation", new Item("ref_tk_reevaluation", mtbReference)); - noUpdateRequired = false; - } - - if ( - isYes(procedure, "reevaluation") && ( - !hasValue(procedure, "datumtkreevaluation") - || !mtbDate.equals(procedure.getValue("datumtkreevaluation").getDate()) - ) - ) { - procedure.setValue("datumtkreevaluation", new Item("datum_tk_reevaluation", mtbDate)); - noUpdateRequired = false; - } - - if (noUpdateRequired) { - return; - } - - try { - onkostarApi.saveProcedure(procedure, false); - } catch (Exception e) { - logger.error("Formular 'DNPM Therapieplan' konnte nicht aktualisiert werden", e); - } - } - - /** - * Verlinke MTB und Übernahme Datum aus Hauptformular in Unterformularen - * - * @param procedure Die Prozedur mit Hauptformular - */ - private void updateMtbInSubforms(Procedure procedure) { - if (this.hasMultipleMtbsEnabled()) { - return; - } - - var mtbReference = procedure.getValue("referstemtb").getInt(); - var mtbDate = procedure.getValue("datum").getDate(); - - formService.getSubFormProcedureIds(procedure.getId()).stream() - .map(onkostarApi::getProcedure) - .filter(Objects::nonNull) - .forEach(subform -> { - if (subform.getFormName().equals("DNPM UF Einzelempfehlung")) { - if (mtbReference != subform.getValue("mtb").getInt() && !mtbDate.equals(subform.getValue("ufeedatum").getDate())) { - subform.setValue("mtb", new Item("ref_tumorkonferenz", mtbReference)); - subform.setValue("ufeedatum", new Item("datum", mtbDate)); - - try { - onkostarApi.saveProcedure(subform, false); - } catch (Exception e) { - logger.error("Formular 'DNPM UF Einzelempfehlung' konnte nicht aktualisiert werden", e); - } - } - } - - if (subform.getFormName().equals("DNPM UF Rebiopsie")) { - if (mtbReference != subform.getValue("reftumorkonferenz").getInt() && !mtbDate.equals(subform.getValue("ufrbdatum").getDate())) { - subform.setValue("reftumorkonferenz", new Item("ref_tumorkonferenz", mtbReference)); - subform.setValue("ufrbdatum", new Item("datum", mtbDate)); - - try { - onkostarApi.saveProcedure(subform, false); - } catch (Exception e) { - logger.error("Formular 'DNPM UF Rebiopsie' konnte nicht aktualisiert werden", e); - } - } - } - }); - } - - private boolean hasMultipleMtbsEnabled() { - return null != onkostarApi.getGlobalSetting("mehrere_mtb_in_mtbepisode") - && onkostarApi.getGlobalSetting("mehrere_mtb_in_mtbepisode").equals("true"); - } - - private boolean hasValue(final Procedure procedure, final String fieldName) { - return null != procedure.getValue(fieldName); - } - - private boolean isYes(final Procedure procedure, final String fieldName) { - return hasValue(procedure, fieldName) - && procedure.getValue(fieldName).getString().equals(JaNeinUnbekannt.JA.getCode()); - } } diff --git a/src/main/java/DNPM/config/PluginConfiguration.java b/src/main/java/DNPM/config/PluginConfiguration.java new file mode 100644 index 0000000..d417132 --- /dev/null +++ b/src/main/java/DNPM/config/PluginConfiguration.java @@ -0,0 +1,42 @@ +package DNPM.config; + +import DNPM.services.*; +import de.itc.onkostar.api.IOnkostarApi; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +import javax.sql.DataSource; + +/** + * Dynamische Konfiguration des Plugins basierend auf Onkostar-Einstellungen + * + * @since 0.0.2 + */ +@Configuration +@ComponentScan(basePackages = "DNPM.analyzer") +public class PluginConfiguration { + + @Bean + public FormService formService(final DataSource dataSource) { + return new DefaultFormService(dataSource); + } + + @Bean + public StudienService studienService(final DataSource dataSource) { + return new DefaultStudienService(dataSource); + } + + @Bean + public TherapieplanService therapieplanService(final IOnkostarApi onkostarApi, final FormService formService) { + if ( + null != onkostarApi.getGlobalSetting("mehrere_mtb_in_mtbepisode") + && onkostarApi.getGlobalSetting("mehrere_mtb_in_mtbepisode").equals("true") + ) { + return new MultipleMtbTherapieplanService(); + } + + return new DefaultTherapieplanService(onkostarApi, formService); + } + +} diff --git a/src/main/java/DNPM/services/DefaultFormService.java b/src/main/java/DNPM/services/DefaultFormService.java index c7fb042..9feaeb2 100644 --- a/src/main/java/DNPM/services/DefaultFormService.java +++ b/src/main/java/DNPM/services/DefaultFormService.java @@ -2,12 +2,15 @@ package DNPM.services; import DNPM.exceptions.FormException; import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Service; import javax.sql.DataSource; import java.util.List; -@Service +/** + * Standardimplementierung zum Ermitteln von Unter- und Hauptformularen + * + * @since 0.0.2 + */ public class DefaultFormService implements FormService { private final JdbcTemplate jdbcTemplate; diff --git a/src/main/java/DNPM/services/DefaultStudienService.java b/src/main/java/DNPM/services/DefaultStudienService.java index 596a288..1f115cf 100644 --- a/src/main/java/DNPM/services/DefaultStudienService.java +++ b/src/main/java/DNPM/services/DefaultStudienService.java @@ -1,7 +1,6 @@ package DNPM.services; import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.stereotype.Service; import javax.sql.DataSource; import java.util.List; @@ -11,7 +10,6 @@ import java.util.List; * * @since 0.0.2 */ -@Service public class DefaultStudienService implements StudienService { private final JdbcTemplate jdbcTemplate; diff --git a/src/main/java/DNPM/services/DefaultTherapieplanService.java b/src/main/java/DNPM/services/DefaultTherapieplanService.java new file mode 100644 index 0000000..f705ce8 --- /dev/null +++ b/src/main/java/DNPM/services/DefaultTherapieplanService.java @@ -0,0 +1,142 @@ +package DNPM.services; + +import de.itc.onkostar.api.IOnkostarApi; +import de.itc.onkostar.api.Item; +import de.itc.onkostar.api.Procedure; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Objects; + +import static DNPM.services.FormService.hasValue; +import static DNPM.services.FormService.isYes; + +public class DefaultTherapieplanService implements TherapieplanService { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + private final IOnkostarApi onkostarApi; + + private final FormService formService; + + public DefaultTherapieplanService(final IOnkostarApi onkostarApi, final FormService formService) { + this.onkostarApi = onkostarApi; + this.formService = formService; + } + + /** + * Verlinke MTB und Übernahme Datum aus Hauptformular in weiteren Bereichen + * "Humangenetische Beratung" und "Reevaluation" und Unterformularen, wenn erforderlich. + * + * @param procedure Die Prozedur mit Hauptformular + */ + @Override + public void updateRequiredMtbEntries(Procedure procedure) { + this.updateMtbInSections(procedure); + this.updateMtbInSubforms(procedure); + } + + private void updateMtbInSections(Procedure procedure) { + if (!isYes(procedure, "humangenberatung") && !isYes(procedure, "reevaluation")) { + return; + } + + var mtbReference = procedure.getValue("referstemtb").getInt(); + var mtbDate = procedure.getValue("datum").getDate(); + var noUpdateRequired = true; + + if ( + isYes(procedure, "humangenberatung") && ( + !hasValue(procedure, "reftkhumangenber") + || mtbReference != procedure.getValue("reftkhumangenber").getInt() + ) + ) { + procedure.setValue("reftkhumangenber", new Item("ref_tk_humangenber", mtbReference)); + noUpdateRequired = false; + } + + if ( + isYes(procedure, "humangenberatung") && ( + !hasValue(procedure, "datumtkhumangenber") + || !mtbDate.equals(procedure.getValue("datumtkhumangenber").getDate()) + ) + ) { + procedure.setValue("datumtkhumangenber", new Item("datum_tk_humangenber", mtbDate)); + noUpdateRequired = false; + } + + if ( + isYes(procedure, "reevaluation") && ( + !hasValue(procedure, "reftkreevaluation") + || mtbReference != procedure.getValue("reftkreevaluation").getInt() + ) + ) { + procedure.setValue("reftkreevaluation", new Item("ref_tk_reevaluation", mtbReference)); + noUpdateRequired = false; + } + + if ( + isYes(procedure, "reevaluation") && ( + !hasValue(procedure, "datumtkreevaluation") + || !mtbDate.equals(procedure.getValue("datumtkreevaluation").getDate()) + ) + ) { + procedure.setValue("datumtkreevaluation", new Item("datum_tk_reevaluation", mtbDate)); + noUpdateRequired = false; + } + + if (noUpdateRequired) { + return; + } + + try { + onkostarApi.saveProcedure(procedure, false); + } catch (Exception e) { + logger.error("Formular 'DNPM Therapieplan' konnte nicht aktualisiert werden", e); + } + } + + private void updateMtbInSubforms(Procedure procedure) { + if ( + !hasValue(procedure, "referstemtb") || !hasValue(procedure, "datum") + ) { + return; + } + + var mtbReference = procedure.getValue("referstemtb").getInt(); + var mtbDate = procedure.getValue("datum").getDate(); + + formService.getSubFormProcedureIds(procedure.getId()).stream() + .map(onkostarApi::getProcedure) + .filter(Objects::nonNull) + .forEach(subform -> { + if (subform.getFormName().equals("DNPM UF Einzelempfehlung")) { + if (mtbReference != subform.getValue("mtb").getInt() && !mtbDate.equals(subform.getValue("ufeedatum").getDate())) { + subform.setValue("mtb", new Item("ref_tumorkonferenz", mtbReference)); + subform.setValue("ufeedatum", new Item("datum", mtbDate)); + + try { + onkostarApi.saveProcedure(subform, false); + } catch (Exception e) { + logger.error("Formular 'DNPM UF Einzelempfehlung' konnte nicht aktualisiert werden", e); + } + } + } + + if (subform.getFormName().equals("DNPM UF Rebiopsie")) { + if (mtbReference != subform.getValue("reftumorkonferenz").getInt() && !mtbDate.equals(subform.getValue("ufrbdatum").getDate())) { + subform.setValue("reftumorkonferenz", new Item("ref_tumorkonferenz", mtbReference)); + subform.setValue("ufrbdatum", new Item("datum", mtbDate)); + + try { + onkostarApi.saveProcedure(subform, false); + } catch (Exception e) { + logger.error("Formular 'DNPM UF Rebiopsie' konnte nicht aktualisiert werden", e); + } + } + } + }); + } + + +} diff --git a/src/main/java/DNPM/services/FormService.java b/src/main/java/DNPM/services/FormService.java index 824d350..f10d6c3 100644 --- a/src/main/java/DNPM/services/FormService.java +++ b/src/main/java/DNPM/services/FormService.java @@ -1,6 +1,8 @@ package DNPM.services; import DNPM.exceptions.FormException; +import de.itc.onkostar.api.Procedure; +import de.itc.onkostar.api.constants.JaNeinUnbekannt; import java.util.List; @@ -12,7 +14,7 @@ public interface FormService { * * @param procedureId Die Prozedur-ID des Unterformulars * @return Die Prozedur-ID des zugehörigen Hauptformulars - * @throws FormException + * @throws FormException Wird geworfen, wenn ein Fehler auftrat */ int getMainFormProcedureId(int procedureId) throws FormException; @@ -22,8 +24,28 @@ public interface FormService { * * @param procedureId Die Prozedur-ID des Formulars * @return Eine Liste mit Prozedur-IDs der Unterformulare - * @throws FormException */ List getSubFormProcedureIds(int procedureId); + /** + * Prüft, ob ein Formularfeld in der Prozedur einen Wert hat oder null ist + * @param procedure Die zu prüfende Prozedur + * @param fieldName Der Formularfeldname + * @return Gibt true zurück, wenn das Feld einen Wert hat + */ + static boolean hasValue(final Procedure procedure, final String fieldName) { + return null != procedure.getValue(fieldName); + } + + /** + * Prüft, ob ein Formularfeld mit Ja/Nein/Unbekannt den Wert Ja hat + * @param procedure Die zu prüfende Prozedur + * @param fieldName Der Formularfeldname + * @return Gibt true zurück, wenn das Feld den Wert "Ja" hat + */ + static boolean isYes(final Procedure procedure, final String fieldName) { + return hasValue(procedure, fieldName) + && procedure.getValue(fieldName).getString().equals(JaNeinUnbekannt.JA.getCode()); + } + } diff --git a/src/main/java/DNPM/services/MultipleMtbTherapieplanService.java b/src/main/java/DNPM/services/MultipleMtbTherapieplanService.java new file mode 100644 index 0000000..d4eb297 --- /dev/null +++ b/src/main/java/DNPM/services/MultipleMtbTherapieplanService.java @@ -0,0 +1,12 @@ +package DNPM.services; + +import de.itc.onkostar.api.Procedure; + +public class MultipleMtbTherapieplanService implements TherapieplanService { + + @Override + public void updateRequiredMtbEntries(Procedure procedure) { + // No action required + } + +} diff --git a/src/main/java/DNPM/services/TherapieplanService.java b/src/main/java/DNPM/services/TherapieplanService.java new file mode 100644 index 0000000..e47d75e --- /dev/null +++ b/src/main/java/DNPM/services/TherapieplanService.java @@ -0,0 +1,15 @@ +package DNPM.services; + +import de.itc.onkostar.api.Procedure; + +public interface TherapieplanService { + + /** + * Verlinke MTB und Übernahme Datum aus Hauptformular in weiteren Bereichen + * "Humangenetische Beratung" und "Reevaluation" und Unterformularen, wenn erforderlich. + * + * @param procedure Die Prozedur mit Hauptformular + */ + void updateRequiredMtbEntries(Procedure procedure); + +} diff --git a/src/main/resources/de/itc/onkostar/library/moduleContext.xml b/src/main/resources/de/itc/onkostar/library/moduleContext.xml index 0415560..40de642 100644 --- a/src/main/resources/de/itc/onkostar/library/moduleContext.xml +++ b/src/main/resources/de/itc/onkostar/library/moduleContext.xml @@ -15,8 +15,7 @@ - - + \ No newline at end of file diff --git a/src/test/java/DNPM/analyzer/TherapieplanAnalyzerTest.java b/src/test/java/DNPM/analyzer/TherapieplanAnalyzerTest.java index 655c7d6..6196437 100644 --- a/src/test/java/DNPM/analyzer/TherapieplanAnalyzerTest.java +++ b/src/test/java/DNPM/analyzer/TherapieplanAnalyzerTest.java @@ -1,11 +1,9 @@ package DNPM.analyzer; -import DNPM.services.FormService; import DNPM.services.StudienService; +import DNPM.services.TherapieplanService; import de.itc.onkostar.api.IOnkostarApi; -import de.itc.onkostar.api.Item; import de.itc.onkostar.api.Procedure; -import de.itc.onkostar.api.constants.JaNeinUnbekannt; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -13,14 +11,13 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import java.time.Instant; -import java.util.Date; import java.util.HashMap; import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; @ExtendWith(MockitoExtension.class) public class TherapieplanAnalyzerTest { @@ -29,99 +26,23 @@ public class TherapieplanAnalyzerTest { private IOnkostarApi onkostarApi; @Mock - private FormService formService; + private StudienService studienService; @Mock - private StudienService studienService; + private TherapieplanService therapieplanService; private TherapieplanAnalyzer therapieplanAnalyzer; @BeforeEach void setUp() { - this.therapieplanAnalyzer = new TherapieplanAnalyzer(onkostarApi, formService, studienService); + this.therapieplanAnalyzer = new TherapieplanAnalyzer(studienService, therapieplanService); } @Test - void shouldNotUpdateSubformsOrSectionsIfMultipleMtbConfiguration() throws Exception { - doAnswer(invocationOnMock -> { - var settingName = invocationOnMock.getArgument(0, String.class); - if (settingName.equals("mehrere_mtb_in_mtbepisode")) { - return "true"; - } - return null; - }).when(onkostarApi).getGlobalSetting(anyString()); - + void shouldRunServiceMethodsOnAnalyzeCalled() { this.therapieplanAnalyzer.analyze(new Procedure(onkostarApi), null); - verify(onkostarApi, never()).saveProcedure(any(Procedure.class), anyBoolean()); - } - - @Test - void shouldNotUpdateSectionsIfSectionsNotEnabled() throws Exception { - when(onkostarApi.getGlobalSetting(anyString())).thenReturn(null); - - var testProcedure = baseProcedure(onkostarApi); - - // Keine humangenetische Beratung und keine Reevaluation empfohlen - testProcedure.setValue("humangenberatung", new Item("humangen_beratung", JaNeinUnbekannt.NEIN.getCode())); - testProcedure.setValue("reevaluation", new Item("reevaluation", JaNeinUnbekannt.NEIN.getCode())); - - this.therapieplanAnalyzer.analyze(testProcedure, null); - - verify(onkostarApi, never()).saveProcedure(any(Procedure.class), anyBoolean()); - } - - @Test - void shouldUpdateSectionsIfNoReevaluation() throws Exception { - when(onkostarApi.getGlobalSetting(anyString())).thenReturn(null); - - var testProcedure = baseProcedure(onkostarApi); - - // Humangenetische Beratung aber keine Reevaluation - testProcedure.setValue("humangenberatung", new Item("humangen_beratung", JaNeinUnbekannt.JA.getCode())); - testProcedure.setValue("humangenberbegruendung", new Item("humangen_ber_begruendung", "Das ist die Begründung")); - testProcedure.setValue("reevaluation", new Item("reevaluation", JaNeinUnbekannt.NEIN.getCode())); - - this.therapieplanAnalyzer.analyze(testProcedure, null); - - var captor = ArgumentCaptor.forClass(Procedure.class); - verify(onkostarApi, times(1)).saveProcedure(captor.capture(), anyBoolean()); - - var capturedProcedure = captor.getValue(); - - assertThat(capturedProcedure.getValue("reftkreevaluation")).isNull(); - assertThat(capturedProcedure.getValue("datumtkreevaluation")).isNull(); - - assertThat(capturedProcedure.getValue("reftkhumangenber")).isNotNull(); - assertThat(capturedProcedure.getValue("reftkhumangenber").getInt()).isEqualTo(procedureId); - assertThat(capturedProcedure.getValue("datumtkhumangenber")).isNotNull(); - assertThat(capturedProcedure.getValue("datumtkhumangenber").getDate()).isEqualTo(testDate); - } - - @Test - void shouldUpdateSectionsIfNoHumanGenConsultation() throws Exception { - when(onkostarApi.getGlobalSetting(anyString())).thenReturn(null); - - var testProcedure = baseProcedure(onkostarApi); - - // Humangenetische Beratung aber keine Reevaluation - testProcedure.setValue("humangenberatung", new Item("humangen_beratung", JaNeinUnbekannt.NEIN.getCode())); - testProcedure.setValue("reevaluation", new Item("reevaluation", JaNeinUnbekannt.JA.getCode())); - - this.therapieplanAnalyzer.analyze(testProcedure, null); - - var captor = ArgumentCaptor.forClass(Procedure.class); - verify(onkostarApi, times(1)).saveProcedure(captor.capture(), anyBoolean()); - - var capturedProcedure = captor.getValue(); - - assertThat(capturedProcedure.getValue("reftkhumangenber")).isNull(); - assertThat(capturedProcedure.getValue("datumtkhumangenber")).isNull(); - - assertThat(capturedProcedure.getValue("reftkreevaluation")).isNotNull(); - assertThat(capturedProcedure.getValue("reftkreevaluation").getInt()).isEqualTo(procedureId); - assertThat(capturedProcedure.getValue("datumtkreevaluation")).isNotNull(); - assertThat(capturedProcedure.getValue("datumtkreevaluation").getDate()).isEqualTo(testDate); + verify(this.therapieplanService, times(1)).updateRequiredMtbEntries(any(Procedure.class)); } @Test @@ -150,19 +71,4 @@ public class TherapieplanAnalyzerTest { assertThat(captor.getValue()).isEqualTo("NCT-123"); } - - private static final int procedureId = 1234; - private static final Date testDate = Date.from(Instant.parse("2023-03-15T09:43:00Z")); - - private Procedure baseProcedure(final IOnkostarApi onkostarApi) { - var testProcedure = new Procedure(onkostarApi); - testProcedure.setId(1000); - - // Setzen MTB Referenz und Datum MTB - testProcedure.setValue("referstemtb", new Item("ref_tumorkonferenz", procedureId)); - testProcedure.setValue("datum", new Item("datum", testDate)); - - return testProcedure; - } - } diff --git a/src/test/java/DNPM/config/PluginConfigurationTest.java b/src/test/java/DNPM/config/PluginConfigurationTest.java new file mode 100644 index 0000000..811e583 --- /dev/null +++ b/src/test/java/DNPM/config/PluginConfigurationTest.java @@ -0,0 +1,72 @@ +package DNPM.config; + +import DNPM.services.DefaultTherapieplanService; +import DNPM.services.FormService; +import DNPM.services.MultipleMtbTherapieplanService; +import de.itc.onkostar.api.IOnkostarApi; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +public class PluginConfigurationTest { + + @Mock + private IOnkostarApi onkostarApi; + + @Mock + private FormService formService; + + private PluginConfiguration configuration; + + @BeforeEach + void setup() { + this.configuration = new PluginConfiguration(); + } + + @Test + void testShouldReturnDefaultTherapieplanServiceIfSettingIsFalse() { + doAnswer(invocationOnMock -> { + var settingName = invocationOnMock.getArgument(0, String.class); + if (settingName.equals("mehrere_mtb_in_mtbepisode")) { + return "false"; + } + return null; + }).when(onkostarApi).getGlobalSetting(anyString()); + + var actual = this.configuration.therapieplanService(onkostarApi, formService); + + assertThat(actual).isInstanceOf(DefaultTherapieplanService.class); + } + + @Test + void testShouldReturnDefaultTherapieplanServiceIfNoSetting() { + when(onkostarApi.getGlobalSetting(anyString())).thenReturn(null); + + var actual = this.configuration.therapieplanService(onkostarApi, formService); + + assertThat(actual).isInstanceOf(DefaultTherapieplanService.class); + } + + @Test + void testShouldReturnMultipleMtbTherapieplanServiceIfSettingIsTrue() { + doAnswer(invocationOnMock -> { + var settingName = invocationOnMock.getArgument(0, String.class); + if (settingName.equals("mehrere_mtb_in_mtbepisode")) { + return "true"; + } + return null; + }).when(onkostarApi).getGlobalSetting(anyString()); + + var actual = this.configuration.therapieplanService(onkostarApi, formService); + + assertThat(actual).isInstanceOf(MultipleMtbTherapieplanService.class); + } +} diff --git a/src/test/java/DNPM/services/DefaultTherapieplanServiceTest.java b/src/test/java/DNPM/services/DefaultTherapieplanServiceTest.java new file mode 100644 index 0000000..940f6bf --- /dev/null +++ b/src/test/java/DNPM/services/DefaultTherapieplanServiceTest.java @@ -0,0 +1,120 @@ +package DNPM.services; + +import de.itc.onkostar.api.IOnkostarApi; +import de.itc.onkostar.api.Item; +import de.itc.onkostar.api.Procedure; +import de.itc.onkostar.api.constants.JaNeinUnbekannt; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.time.Instant; +import java.util.Date; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +public class DefaultTherapieplanServiceTest { + + @Mock + private IOnkostarApi onkostarApi; + + @Mock + private FormService formService; + + private TherapieplanService service; + + @BeforeEach + void setUp() { + this.service = new DefaultTherapieplanService(onkostarApi, formService); + } + + @Test + void shouldNotUpdateSubformsOrSectionsIfMultipleMtbConfiguration() throws Exception { + this.service.updateRequiredMtbEntries(new Procedure(onkostarApi)); + verify(onkostarApi, never()).saveProcedure(any(Procedure.class), anyBoolean()); + } + + @Test + void shouldNotUpdateSectionsIfSectionsNotEnabled() throws Exception { + var testProcedure = baseProcedure(onkostarApi); + + // Keine humangenetische Beratung und keine Reevaluation empfohlen + testProcedure.setValue("humangenberatung", new Item("humangen_beratung", JaNeinUnbekannt.NEIN.getCode())); + testProcedure.setValue("reevaluation", new Item("reevaluation", JaNeinUnbekannt.NEIN.getCode())); + + this.service.updateRequiredMtbEntries(testProcedure); + + verify(onkostarApi, never()).saveProcedure(any(Procedure.class), anyBoolean()); + } + + @Test + void shouldUpdateSectionsIfNoReevaluation() throws Exception { + var testProcedure = baseProcedure(onkostarApi); + + // Humangenetische Beratung aber keine Reevaluation + testProcedure.setValue("humangenberatung", new Item("humangen_beratung", JaNeinUnbekannt.JA.getCode())); + testProcedure.setValue("humangenberbegruendung", new Item("humangen_ber_begruendung", "Das ist die Begründung")); + testProcedure.setValue("reevaluation", new Item("reevaluation", JaNeinUnbekannt.NEIN.getCode())); + + this.service.updateRequiredMtbEntries(testProcedure); + + var captor = ArgumentCaptor.forClass(Procedure.class); + verify(onkostarApi, times(1)).saveProcedure(captor.capture(), anyBoolean()); + + var capturedProcedure = captor.getValue(); + + assertThat(capturedProcedure.getValue("reftkreevaluation")).isNull(); + assertThat(capturedProcedure.getValue("datumtkreevaluation")).isNull(); + + assertThat(capturedProcedure.getValue("reftkhumangenber")).isNotNull(); + assertThat(capturedProcedure.getValue("reftkhumangenber").getInt()).isEqualTo(procedureId); + assertThat(capturedProcedure.getValue("datumtkhumangenber")).isNotNull(); + assertThat(capturedProcedure.getValue("datumtkhumangenber").getDate()).isEqualTo(testDate); + } + + @Test + void shouldUpdateSectionsIfNoHumanGenConsultation() throws Exception { + var testProcedure = baseProcedure(onkostarApi); + + // Humangenetische Beratung aber keine Reevaluation + testProcedure.setValue("humangenberatung", new Item("humangen_beratung", JaNeinUnbekannt.NEIN.getCode())); + testProcedure.setValue("reevaluation", new Item("reevaluation", JaNeinUnbekannt.JA.getCode())); + + this.service.updateRequiredMtbEntries(testProcedure); + + var captor = ArgumentCaptor.forClass(Procedure.class); + verify(onkostarApi, times(1)).saveProcedure(captor.capture(), anyBoolean()); + + var capturedProcedure = captor.getValue(); + + assertThat(capturedProcedure.getValue("reftkhumangenber")).isNull(); + assertThat(capturedProcedure.getValue("datumtkhumangenber")).isNull(); + + assertThat(capturedProcedure.getValue("reftkreevaluation")).isNotNull(); + assertThat(capturedProcedure.getValue("reftkreevaluation").getInt()).isEqualTo(procedureId); + assertThat(capturedProcedure.getValue("datumtkreevaluation")).isNotNull(); + assertThat(capturedProcedure.getValue("datumtkreevaluation").getDate()).isEqualTo(testDate); + } + + private static final int procedureId = 1234; + private static final Date testDate = Date.from(Instant.parse("2023-03-15T09:43:00Z")); + + private Procedure baseProcedure(final IOnkostarApi onkostarApi) { + var testProcedure = new Procedure(onkostarApi); + testProcedure.setId(1000); + + // Setzen MTB Referenz und Datum MTB + testProcedure.setValue("referstemtb", new Item("ref_tumorkonferenz", procedureId)); + testProcedure.setValue("datum", new Item("datum", testDate)); + + return testProcedure; + } + +}