Skip to content

Commit

Permalink
Merge pull request #1000 from digitalservicebund/remove-delta
Browse files Browse the repository at this point in the history
remove-delta
  • Loading branch information
malte-laukoetter authored Feb 14, 2025
2 parents 0fb3f98 + f9ec45b commit 62ee256
Show file tree
Hide file tree
Showing 6 changed files with 9 additions and 299 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,13 @@
public class TimeBoundaryController {

private final LoadTimeBoundariesUseCase loadTimeBoundariesUseCase;
private final LoadTimeBoundariesAmendedByUseCase loadTimeBoundariesAmendedByUseCase;
private final UpdateTimeBoundariesUseCase updateTimeBoundariesUseCase;

public TimeBoundaryController(
LoadTimeBoundariesUseCase loadTimeBoundariesUseCase,
LoadTimeBoundariesAmendedByUseCase loadTimeBoundariesAmendedByUseCase,
UpdateTimeBoundariesUseCase updateTimeBoundariesUseCase
) {
this.loadTimeBoundariesUseCase = loadTimeBoundariesUseCase;
this.loadTimeBoundariesAmendedByUseCase = loadTimeBoundariesAmendedByUseCase;
this.updateTimeBoundariesUseCase = updateTimeBoundariesUseCase;
}

Expand All @@ -55,17 +52,8 @@ public ResponseEntity<List<TimeBoundarySchema>> getTimeBoundaries(
@RequestParam final Optional<DokumentExpressionEli> amendedBy
) {
return ResponseEntity.ok(
amendedBy
.map(amendingBy ->
loadTimeBoundariesAmendedByUseCase.loadTimeBoundariesAmendedBy(
new LoadTimeBoundariesAmendedByUseCase.Query(eli, amendingBy)
)
)
.orElseGet(() ->
loadTimeBoundariesUseCase.loadTimeBoundariesFromRegelungstext(
new LoadTimeBoundariesUseCase.Query(eli)
)
)
loadTimeBoundariesUseCase
.loadTimeBoundariesFromRegelungstext(new LoadTimeBoundariesUseCase.Query(eli))
.stream()
.map(TimeBoundaryMapper::fromUseCaseData)
.toList()
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,7 @@
*/
@Service
@Slf4j
public class TimeBoundaryService
implements
LoadTimeBoundariesUseCase, LoadTimeBoundariesAmendedByUseCase, UpdateTimeBoundariesUseCase {
public class TimeBoundaryService implements LoadTimeBoundariesUseCase, UpdateTimeBoundariesUseCase {

private final LoadNormPort loadNormPort;
private final LoadRegelungstextPort loadRegelungstextPort;
Expand Down Expand Up @@ -51,42 +49,6 @@ public List<TimeBoundary> loadTimeBoundariesFromRegelungstext(
.getTimeBoundaries();
}

@Override
public List<TimeBoundary> loadTimeBoundariesAmendedBy(
LoadTimeBoundariesAmendedByUseCase.Query query
) {
final Regelungstext regelungstext = loadRegelungstextPort
.loadRegelungstext(new LoadRegelungstextPort.Command(query.eli()))
.orElseThrow(() -> new RegelungstextNotFoundException(query.eli().toString()));

final List<String> temporalGroupEidAmendedBy = regelungstext
.getMeta()
.getOrCreateAnalysis()
.getPassiveModifications()
.stream()
.filter(f ->
f
.getSourceHref()
.map(href ->
href.getExpressionEli().isPresent() &&
href.getExpressionEli().get().equals(query.amendingLawEli())
)
.orElse(false)
)
.map(m -> m.getForcePeriodEid().orElse(null))
.filter(Objects::nonNull)
.toList();

final List<TemporalGroup> temporalGroups = regelungstext
.getMeta()
.getTemporalData()
.getTemporalGroups()
.stream()
.filter(f -> temporalGroupEidAmendedBy.contains(f.getEid()))
.toList();
return regelungstext.getTimeBoundaries(temporalGroups);
}

/**
* @param query The query containing the ELI (European Legislation Identifier) of the regelungstext.
* @return a List of TimeBoundaries
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,6 @@ class TimeBoundaryControllerTest {
@MockitoBean
private LoadTimeBoundariesUseCase loadTimeBoundariesUseCase;

@MockitoBean
private LoadTimeBoundariesAmendedByUseCase loadTimeBoundariesAmendedByUseCase;

@MockitoBean
private UpdateTimeBoundariesUseCase updateTimeBoundariesUseCase;

Expand Down Expand Up @@ -139,7 +136,7 @@ void getTimeBoundariesAmendedBy() throws Exception {
)
);

when(loadTimeBoundariesAmendedByUseCase.loadTimeBoundariesAmendedBy(any()))
when(loadTimeBoundariesUseCase.loadTimeBoundariesFromRegelungstext(any()))
.thenReturn(timeBoundaries);

// When // Then
Expand All @@ -154,15 +151,12 @@ void getTimeBoundariesAmendedBy() throws Exception {
.andExpect(jsonPath("$[0].eventRefEid", is("meta-1_lebzykl-1_ereignis-2")))
.andExpect(jsonPath("$[0].temporalGroupEid", is("meta-1_geltzeiten-1_geltungszeitgr-1")));

verify(loadTimeBoundariesAmendedByUseCase, times(1))
.loadTimeBoundariesAmendedBy(any(LoadTimeBoundariesAmendedByUseCase.Query.class));
verify(loadTimeBoundariesUseCase, times(1))
.loadTimeBoundariesFromRegelungstext(any(LoadTimeBoundariesUseCase.Query.class));

verify(loadTimeBoundariesAmendedByUseCase, times(1))
.loadTimeBoundariesAmendedBy(
argThat(query ->
Objects.equals(query.eli(), DokumentExpressionEli.fromString(eli)) &&
Objects.equals(query.amendingLawEli(), DokumentExpressionEli.fromString(amendedBy))
)
verify(loadTimeBoundariesUseCase, times(1))
.loadTimeBoundariesFromRegelungstext(
argThat(query -> Objects.equals(query.eli(), DokumentExpressionEli.fromString(eli)))
);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package de.bund.digitalservice.ris.norms.application.service;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.AssertionsForClassTypes.catchThrowable;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.*;
Expand All @@ -10,8 +9,6 @@
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import de.bund.digitalservice.ris.norms.application.exception.RegelungstextNotFoundException;
import de.bund.digitalservice.ris.norms.application.port.input.LoadTimeBoundariesAmendedByUseCase;
import de.bund.digitalservice.ris.norms.application.port.input.LoadTimeBoundariesUseCase;
import de.bund.digitalservice.ris.norms.application.port.input.UpdateTimeBoundariesUseCase;
import de.bund.digitalservice.ris.norms.application.port.output.LoadNormPort;
Expand Down Expand Up @@ -181,124 +178,6 @@ void itCallsLoadTimeBoundariesOfNormAndReturnsTimeBoundariesEmpty() {
}
}

@Nested
class loadTimeBoundariesAmendedBy {

@Test
void itCallsLoadTimeBoundariesAmendedByAndReturnsTimeBoundaries() {
// Given
var eli = DokumentExpressionEli.fromString(
"eli/bund/bgbl-1/1964/s593/1964-08-05/1/deu/regelungstext-1"
);
var amendedBy = DokumentExpressionEli.fromString(
"eli/bund/bgbl-1/2024/81/2024-03-05/1/deu/regelungstext-1"
);

var regelungstext = new Regelungstext(
XmlMapper.toDocument(
"""
<?xml version="1.0" encoding="UTF-8"?>
<?xml-model href="../../../Grammatiken/legalDocML.de.sch" schematypens="http://purl.oclc.org/dsdl/schematron"?>
<akn:akomaNtoso xmlns:akn="http://Inhaltsdaten.LegalDocML.de/1.7.2/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://Metadaten.LegalDocML.de/1.7.2/ ../../../Grammatiken/legalDocML.de-metadaten.xsd http://Inhaltsdaten.LegalDocML.de/1.7.2/ ../../../Grammatiken/legalDocML.de-regelungstextverkuendungsfassung.xsd">
<akn:act name="regelungstext">
<!-- Metadaten -->
<akn:meta eId="meta-1" GUID="82a65581-0ea7-4525-9190-35ff86c977af">
<akn:analysis eId="meta-1_analysis-1" GUID="5a5d264e-431e-4dc1-b971-4bd81af8a0f4" source="attributsemantik-noch-undefiniert">
<akn:passiveModifications eId="meta-1_analysis-1_pasmod-1" GUID="77aae58f-06c9-4189-af80-a5f3ada6432c">
<akn:textualMod eId="meta-1_analysis-1_pasmod-1_textualmod-1" GUID="06fb52c3-fce1-4be8-accc-3035452378ff" type="substitution">
<akn:source eId="meta-1_analysis-1_pasmod-1_textualmod-1_source-1" GUID="5384f580-110b-4f8a-8794-8b85c29aabdf" href="eli/bund/bgbl-1/2024/81/2024-03-05/1/deu/regelungstext-1/art-1_abs-1_untergl-1_listenelem-1_inhalt-1_text-1_ändbefehl-1.xml" />
<akn:destination eId="meta-1_analysis-1_pasmod-1_textualmod-1_destination-1" GUID="2c26512f-fb04-45f2-8283-660274e52fdb" href="#art-9_abs-3" />
<akn:force eId="meta-1_analysis-1_pasmod-1_textualmod-1_gelzeitnachw-1" GUID="45331583-4386-4e3f-b68f-5af327347874" period="#meta-1_geltzeiten-1_geltungszeitgr-2" />
</akn:textualMod>
<akn:textualMod eId="meta-1_analysis-1_pasmod-1_textualmod-2" GUID="26b091d0-1bb9-4c83-b940-f6788b2922f2" type="substitution">
<akn:source eId="meta-1_analysis-1_pasmod-1_textualmod-2_source-1" GUID="a5e43d31-65e1-4d99-a1aa-fb4695a94cf5" href="eli/bund/bgbl-1/2024/81/2024-03-05/1/deu/regelungstext-1/art-1_abs-1_untergl-1_listenelem-2_inhalt-1_text-1_ändbefehl-1.xml" />
<akn:destination eId="meta-1_analysis-1_pasmod-1_textualmod-2_destination-1" GUID="8c0418f1-b6fa-4110-8820-cf0db752c5bd" href="#art-20_abs-1/100-126" />
<akn:force eId="meta-1_analysis-1_pasmod-1_textualmod-2_gelzeitnachw-1" GUID="e5962d3b-9bb8-4eb0-8d8f-131a5114fddb" period="#meta-1_geltzeiten-1_geltungszeitgr-3" />
</akn:textualMod>
<!-- Passive mod from different amending law -->
<akn:textualMod eId="meta-1_analysis-1_pasmod-1_textualmod-2" GUID="26b091d0-1bb9-4c83-b940-f6788b2922f2" type="substitution">
<akn:source eId="meta-1_analysis-1_pasmod-1_textualmod-2_source-1" GUID="a5e43d31-65e1-4d99-a1aa-fb4695a94cf5" href="eli/bund/bgbl-1/2024/120/2024-06-28/1/deu/regelungstext-1/art-1_abs-1_untergl-1_listenelem-2_inhalt-1_text-1_ändbefehl-1.xml" />
<akn:destination eId="meta-1_analysis-1_pasmod-1_textualmod-2_destination-1" GUID="8c0418f1-b6fa-4110-8820-cf0db752c5bd" href="#art-20_abs-1/100-126" />
<akn:force eId="meta-1_analysis-1_pasmod-1_textualmod-2_gelzeitnachw-1" GUID="e5962d3b-9bb8-4eb0-8d8f-131a5114fddb" period="#meta-1_geltzeiten-1_geltungszeitgr-4" />
</akn:textualMod>
</akn:passiveModifications>
</akn:analysis>
<akn:lifecycle eId="meta-1_lebzykl-1" GUID="4b31c2c4-6ecc-4f29-9f79-18149603114b" source="attributsemantik-noch-undefiniert">
<akn:eventRef eId="meta-1_lebzykl-1_ereignis-1" GUID="44e782b4-63ae-4ef0-bb0d-53e42696dd06" date="2023-12-29" source="attributsemantik-noch-undefiniert" type="generation" refersTo="ausfertigung" />
<akn:eventRef eId="meta-1_lebzykl-1_ereignis-2" GUID="176435e5-1324-4718-b09a-ef4b63bcacf0" date="2023-12-30" source="attributsemantik-noch-undefiniert" type="generation" refersTo="inkrafttreten" />
<akn:eventRef eId="meta-1_lebzykl-1_ereignis-3" GUID="4539e3ee-3b35-4921-a249-93a98dbd7339" date="2024-01-01" source="attributsemantik-noch-undefiniert" type="generation" refersTo="inkrafttreten" />
<akn:eventRef eId="meta-1_lebzykl-1_ereignis-4" GUID="4539e3ee-3b35-4921-a249-93a98dbd7339" date="2024-02-28" source="attributsemantik-noch-undefiniert" type="generation" refersTo="inkrafttreten" />
</akn:lifecycle>
<akn:temporalData eId="meta-1_geltzeiten-1" GUID="82854d32-d922-43d7-ac8c-612c07219336" source="attributsemantik-noch-undefiniert">
<akn:temporalGroup eId="meta-1_geltzeiten-1_geltungszeitgr-1" GUID="ac311ee1-33d3-4b9b-a974-776e55a88396">
<akn:timeInterval eId="meta-1_geltzeiten-1_geltungszeitgr-1_gelzeitintervall-1" GUID="ca9f53aa-d374-4bec-aca3-fff4e3485179" refersTo="geltungszeit" start="#meta-1_lebzykl-1_ereignis-2" />
</akn:temporalGroup>
<akn:temporalGroup eId="meta-1_geltzeiten-1_geltungszeitgr-2" GUID="fdfaeef0-0300-4e5b-9e8b-14d2162bfb00">
<akn:timeInterval eId="meta-1_geltzeiten-1_geltungszeitgr-2_gelzeitintervall-1" GUID="8118030a-5fa4-4f9c-a880-b7ba19e5edfb" refersTo="geltungszeit" start="#meta-1_lebzykl-1_ereignis-3" />
</akn:temporalGroup>
<akn:temporalGroup eId="meta-1_geltzeiten-1_geltungszeitgr-3" GUID="fdfaeef0-0300-4e5b-9e8b-14d2162bfb00">
<akn:timeInterval eId="meta-1_geltzeiten-1_geltungszeitgr-3_gelzeitintervall-1" GUID="8118030a-5fa4-4f9c-a880-b7ba19e5edfb" refersTo="geltungszeit" start="#meta-1_lebzykl-1_ereignis-4" />
</akn:temporalGroup>
<akn:temporalGroup eId="meta-1_geltzeiten-1_geltungszeitgr-4" GUID="fdfaeef0-0300-4e5b-9e8b-14d2162bfb00">
<akn:timeInterval eId="meta-1_geltzeiten-1_geltungszeitgr-4_gelzeitintervall-1" GUID="8118030a-5fa4-4f9c-a880-b7ba19e5edfb" refersTo="geltungszeit" start="#meta-1_lebzykl-1_ereignis-4" />
</akn:temporalGroup>
</akn:temporalData>
</akn:meta>
</akn:act>
</akn:akomaNtoso>
"""
)
);
when(loadRegelungstextPort.loadRegelungstext(any())).thenReturn(Optional.of(regelungstext));

// When
var timeBoundaries = service.loadTimeBoundariesAmendedBy(
new LoadTimeBoundariesAmendedByUseCase.Query(eli, amendedBy)
);

// Then
verify(loadRegelungstextPort, times(1))
.loadRegelungstext(argThat(argument -> Objects.equals(argument.eli(), eli)));

assertThat(timeBoundaries).hasSize(2);

assertThat(timeBoundaries.getFirst().getTemporalGroupEid())
.isEqualTo("meta-1_geltzeiten-1_geltungszeitgr-2");
assertThat(timeBoundaries.getFirst().getTimeIntervalEid())
.isEqualTo("meta-1_geltzeiten-1_geltungszeitgr-2_gelzeitintervall-1");
assertThat(timeBoundaries.getFirst().getEventRefEid())
.isEqualTo("meta-1_lebzykl-1_ereignis-3");

assertThat(timeBoundaries.getLast().getTemporalGroupEid())
.isEqualTo("meta-1_geltzeiten-1_geltungszeitgr-3");
assertThat(timeBoundaries.getLast().getTimeIntervalEid())
.isEqualTo("meta-1_geltzeiten-1_geltungszeitgr-3_gelzeitintervall-1");
assertThat(timeBoundaries.getLast().getEventRefEid())
.isEqualTo("meta-1_lebzykl-1_ereignis-4");
}

@Test
void itCallsLoadTimeBoundariesAmendedByAndThrowsNormNotFoundException() {
// Given
var eli = DokumentExpressionEli.fromString(
"eli/bund/bgbl-1/1964/s593/1964-08-05/1/deu/regelungstext-1"
);
var amendedBy = DokumentExpressionEli.fromString(
"eli/bund/bgbl-1/2024/81/2024-03-05/1/deu/regelungstext-1"
);

when(loadRegelungstextPort.loadRegelungstext(any())).thenReturn(Optional.empty());

Throwable thrown = catchThrowable(() ->
service.loadTimeBoundariesAmendedBy(
new LoadTimeBoundariesAmendedByUseCase.Query(eli, amendedBy)
)
);

assertThat(thrown).isInstanceOf(RegelungstextNotFoundException.class);
}
}

@Nested
class updateTimeBoundariesOfRegelungstext {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,90 +103,6 @@ void itCallsGetTimeBoundariesAndReturnsJson() throws Exception {
}
}

@Nested
class GetTimeBoundariesAmendedBy {

@Test
void itCallsGetTimeBoundariesAmendedByAndReturns404() throws Exception {
// Given
final String eli = "eli/bund/bgbl-1/1964/s593/1964-08-05/1/deu/thisEliDoesNotExist";
final String amendedBy = "eli/bund/bgbl-1/1964/s593/1964-08-05/1/deu/not-relevant";

// When // Then
mockMvc
.perform(
get("/api/v1/norms/{eli}/timeBoundaries?amendedBy={amendedBy}", eli, amendedBy)
.accept(MediaType.APPLICATION_JSON)
)
.andExpect(status().isNotFound())
.andExpect(jsonPath("type").value("/errors/regelungstext-not-found"))
.andExpect(jsonPath("title").value("Regelungstext not found"))
.andExpect(jsonPath("status").value(404))
.andExpect(
jsonPath("detail")
.value(
"Regelungstext with eli eli/bund/bgbl-1/1964/s593/1964-08-05/1/deu/thisEliDoesNotExist does not exist"
)
)
.andExpect(
jsonPath("instance")
.value(
"/api/v1/norms/eli/bund/bgbl-1/1964/s593/1964-08-05/1/deu/thisEliDoesNotExist/timeBoundaries"
)
)
.andExpect(
jsonPath("eli").value("eli/bund/bgbl-1/1964/s593/1964-08-05/1/deu/thisEliDoesNotExist")
);
}

@Test
void itCallsGetTimeBoundariesAmendedByAndReturnsEmpty() throws Exception {
// Given
var amendedBy = "eli/bund/bgbl-1/2024/81/2024-03-05/1/deu/non-in-norm";
var eli = "eli/bund/bgbl-1/1964/s593/1964-08-05/1/deu/regelungstext-1";

dokumentRepository.save(
DokumentMapper.mapToDto(
Fixtures.loadRegelungstextFromDisk("NormWithPassiveModifications.xml")
)
);

// When // Then
mockMvc
.perform(
get("/api/v1/norms/{eli}/timeBoundaries?amendedBy={amendedBy}", eli, amendedBy)
.accept(MediaType.APPLICATION_JSON)
)
.andExpect(status().isOk())
.andExpect(jsonPath("$", hasSize(0)));
}

@Test
void itCallsGetTimeBoundariesAmendedByAndReturnsJson() throws Exception {
// Given
var amendedBy = "eli/bund/bgbl-1/2017/s419/2017-03-15/1/deu/regelungstext-1";
var eli = "eli/bund/bgbl-1/1964/s593/1964-08-05/1/deu/regelungstext-1";

dokumentRepository.save(
DokumentMapper.mapToDto(
Fixtures.loadRegelungstextFromDisk("NormWithPassiveModifications.xml")
)
);

// When // Then
mockMvc
.perform(
get("/api/v1/norms/{eli}/timeBoundaries?amendedBy={amendedBy}", eli, amendedBy)
.accept(MediaType.APPLICATION_JSON)
)
.andExpect(status().isOk())
.andExpect(jsonPath("$", hasSize(1)))
.andExpect(jsonPath("$[0].date", is("2017-03-23")))
.andExpect(jsonPath("$[0].eventRefEid", is("meta-1_lebzykl-1_ereignis-4")))
.andExpect(jsonPath("$[0].temporalGroupEid", is("meta-1_geltzeiten-1_geltungszeitgr-2")));
}
}

@Nested
class UpdateTimeBoundaries {

Expand Down

0 comments on commit 62ee256

Please sign in to comment.