Skip to content

Commit

Permalink
Remove time-machine from element render endpoint
Browse files Browse the repository at this point in the history
RISDEV-0000
  • Loading branch information
malte-laukoetter committed Feb 14, 2025
1 parent 1d055d6 commit c4225ff
Show file tree
Hide file tree
Showing 6 changed files with 6 additions and 260 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,18 +21,15 @@ public class ElementController {

private final LoadElementUseCase loadElementUseCase;
private final LoadElementHtmlUseCase loadElementHtmlUseCase;
private final LoadElementHtmlAtDateUseCase loadElementHtmlAtDateUseCase;
private final LoadElementsByTypeUseCase loadElementsByTypeUseCase;

public ElementController(
LoadElementUseCase loadElementUseCase,
LoadElementHtmlUseCase loadElementHtmlUseCase,
LoadElementHtmlAtDateUseCase loadElementHtmlAtDateUseCase,
LoadElementsByTypeUseCase loadElementsByTypeUseCase
) {
this.loadElementUseCase = loadElementUseCase;
this.loadElementHtmlUseCase = loadElementHtmlUseCase;
this.loadElementHtmlAtDateUseCase = loadElementHtmlAtDateUseCase;
this.loadElementsByTypeUseCase = loadElementsByTypeUseCase;
}

Expand All @@ -52,15 +49,9 @@ public ResponseEntity<String> getElementHtmlPreview(
@PathVariable final String eid,
@RequestParam Optional<Instant> atIsoDate
) {
var elementHtml = atIsoDate
.map(date ->
loadElementHtmlAtDateUseCase.loadElementHtmlAtDate(
new LoadElementHtmlAtDateUseCase.Query(eli, eid, date)
)
)
.orElseGet(() ->
loadElementHtmlUseCase.loadElementHtml(new LoadElementHtmlUseCase.Query(eli, eid))
);
var elementHtml = loadElementHtmlUseCase.loadElementHtml(
new LoadElementHtmlUseCase.Query(eli, eid)
);

return ResponseEntity.ok(elementHtml);
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,10 @@
*/
@Service
public class ElementService
implements
LoadElementUseCase,
LoadElementHtmlUseCase,
LoadElementHtmlAtDateUseCase,
LoadElementsByTypeUseCase {
implements LoadElementUseCase, LoadElementHtmlUseCase, LoadElementsByTypeUseCase {

private final LoadRegelungstextPort loadRegelungstextPort;
private final XsltTransformationService xsltTransformationService;
private final TimeMachineService timeMachineService;

/** The types of elements that can be retrieved from a norm. */
public enum ElementType {
Expand Down Expand Up @@ -81,12 +76,10 @@ public static ElementType fromLabel(String label) {

public ElementService(
LoadRegelungstextPort loadRegelungstextPort,
XsltTransformationService xsltTransformationService,
TimeMachineService timeMachineService
XsltTransformationService xsltTransformationService
) {
this.loadRegelungstextPort = loadRegelungstextPort;
this.xsltTransformationService = xsltTransformationService;
this.timeMachineService = timeMachineService;
}

@Override
Expand All @@ -113,26 +106,6 @@ public String loadElementHtml(final LoadElementHtmlUseCase.Query query) {
);
}

@Override
public String loadElementHtmlAtDate(final LoadElementHtmlAtDateUseCase.Query query) {
var regelungstext = loadRegelungstextPort
.loadRegelungstext(new LoadRegelungstextPort.Command(query.eli()))
.orElseThrow(() -> new RegelungstextNotFoundException(query.eli().toString()));

regelungstext =
timeMachineService.applyPassiveModifications(
new ApplyPassiveModificationsUseCase.Query(regelungstext, query.atDate())
);

final var element = NodeParser
.getElementFromExpression(getXPathForEid(query.eid()), regelungstext.getDocument())
.orElseThrow(() -> new ElementNotFoundException(query.eli().toString(), query.eid()));

return xsltTransformationService.transformLegalDocMlToHtml(
new TransformLegalDocMlToHtmlUseCase.Query(XmlMapper.toString(element), false, false)
);
}

@Override
public List<Node> loadElementsByType(LoadElementsByTypeUseCase.Query query) {
// No need to do anything if no types are requested
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,6 @@ class ElementControllerTest {
@MockitoBean
private LoadElementsByTypeUseCase loadElementsByTypeUseCase;

@MockitoBean
private LoadElementHtmlAtDateUseCase loadElementHtmlAtDateUseCase;

@Nested
class getElementHtmlPreview {

Expand Down Expand Up @@ -75,31 +72,6 @@ void itThrowsXmlProcessingException() throws Exception {
);
}

@Test
void itThrowsXmlProcessingExceptionWithPassedDate() throws Exception {
when(loadElementHtmlAtDateUseCase.loadElementHtmlAtDate(any()))
.thenThrow(new XmlProcessingException("Error message", null));
mockMvc
.perform(
get(
"/api/v1/norms/eli/bund/bgbl-1/2017/s419/2017-03-15/1/deu/regelungstext-1/elements/hauptteil-1_art-1?atIsoDate=2024-04-03T00:00:00.000Z"
)
.accept(MediaType.TEXT_HTML)
)
// then
.andExpect(status().isInternalServerError())
.andExpect(jsonPath("type").value("/errors/xml-processing-error"))
.andExpect(jsonPath("title").value("XML processing error"))
.andExpect(jsonPath("status").value(500))
.andExpect(jsonPath("detail").value("Error message"))
.andExpect(
jsonPath("instance")
.value(
"/api/v1/norms/eli/bund/bgbl-1/2017/s419/2017-03-15/1/deu/regelungstext-1/elements/hauptteil-1_art-1"
)
);
}

@Test
void returnsHtmlRendering() throws Exception {
// given
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
import de.bund.digitalservice.ris.norms.domain.entity.eli.DokumentExpressionEli;
import de.bund.digitalservice.ris.norms.utils.NodeParser;
import de.bund.digitalservice.ris.norms.utils.XmlMapper;
import java.time.Instant;
import java.util.List;
import java.util.Optional;
import org.junit.jupiter.api.Nested;
Expand All @@ -24,12 +23,10 @@ class ElementServiceTest {

final LoadRegelungstextPort loadRegelungstextPort = mock(LoadRegelungstextPort.class);
final XsltTransformationService xsltTransformationService = mock(XsltTransformationService.class);
final TimeMachineService timeMachineService = mock(TimeMachineService.class);

final ElementService service = new ElementService(
loadRegelungstextPort,
xsltTransformationService,
timeMachineService
xsltTransformationService
);

@Nested
Expand Down Expand Up @@ -259,141 +256,6 @@ void itThrowsIfNoElementIsFound() {
}
}

@Nested
class loadElementHtmlAtDateFromNorm {

@Test
void itLoadsTheElementHtmlAtTheDateFromTheNorm() {
// Given
var eli = DokumentExpressionEli.fromString(
"eli/bund/bgbl-1/2000/s1/1970-01-01/1/deu/regelungstext-1"
);
var eid = "meta-1";
var date = Instant.parse("2099-12-31T00:00:00.00Z");

var normXml =
"""
<?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">
<akn:act name="regelungstext">
<!-- Metadaten -->
<akn:meta eId="meta-1" GUID="000">
<akn:identification eId="meta-1_ident-1" GUID="000" source="attributsemantik-noch-undefiniert">
<akn:FRBRExpression eId="meta-1_ident-1_frbrexpression-1" GUID="000">
<akn:FRBRthis
eId="meta-1_ident-1_frbrexpression-1_frbrthis-1"
GUID="000"
value="eli/bund/bgbl-1/2000/s1/1970-01-01/1/deu/regelungstext-1"
/>
</akn:FRBRExpression>
</akn:identification>
</akn:meta>
</akn:act>
</akn:akomaNtoso>
""";

var regelungstext = new Regelungstext(XmlMapper.toDocument(normXml));
when(loadRegelungstextPort.loadRegelungstext(new LoadRegelungstextPort.Command(eli)))
.thenReturn(Optional.of(regelungstext));
when(
timeMachineService.applyPassiveModifications(
new ApplyPassiveModificationsUseCase.Query(regelungstext, date)
)
)
.thenReturn(regelungstext);
when(xsltTransformationService.transformLegalDocMlToHtml(any())).thenReturn("<div></div>");

// When
var html = service.loadElementHtmlAtDate(
new LoadElementHtmlAtDateUseCase.Query(eli, eid, date)
);

// Then
assertThat(html).contains("<div></div>");
verify(loadRegelungstextPort).loadRegelungstext(new LoadRegelungstextPort.Command(eli));
verify(timeMachineService)
.applyPassiveModifications(new ApplyPassiveModificationsUseCase.Query(regelungstext, date));
verify(xsltTransformationService, times(1)).transformLegalDocMlToHtml(any());
}

@Test
void itThrowsIfDokumentIsNotFound() {
// Given
var eli = DokumentExpressionEli.fromString(
"eli/bund/notfound/2000/s1/1970-01-01/1/deu/regelungstext-1"
);
var eid = "meta-1";
var date = Instant.parse("2099-12-31T00:00:00.00Z");
var query = new LoadElementHtmlAtDateUseCase.Query(eli, eid, date);

when(loadRegelungstextPort.loadRegelungstext(new LoadRegelungstextPort.Command(eli)))
.thenReturn(Optional.empty());

// When / Then
assertThatThrownBy(() -> service.loadElementHtmlAtDate(query))
.isInstanceOf(RegelungstextNotFoundException.class);

verify(loadRegelungstextPort).loadRegelungstext(new LoadRegelungstextPort.Command(eli));
}

@Test
void itThrowsIfElementIsNotFound() {
// Given
var eli = DokumentExpressionEli.fromString(
"eli/bund/bgbl-1/2000/s1/1970-01-01/1/deu/regelungstext-1"
);
var eid = "meta-1000";
var date = Instant.parse("2099-12-31T00:00:00.00Z");
var query = new LoadElementHtmlAtDateUseCase.Query(eli, eid, date);

var normXml =
"""
<?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">
<akn:act name="regelungstext">
<!-- Metadaten -->
<akn:meta eId="meta-1" GUID="000">
<akn:identification eId="meta-1_ident-1" GUID="000" source="attributsemantik-noch-undefiniert">
<akn:FRBRExpression eId="meta-1_ident-1_frbrexpression-1" GUID="000">
<akn:FRBRthis
eId="meta-1_ident-1_frbrexpression-1_frbrthis-1"
GUID="000"
value="eli/bund/bgbl-1/2000/s1/1970-01-01/1/deu/regelungstext-1"
/>
</akn:FRBRExpression>
</akn:identification>
</akn:meta>
</akn:act>
</akn:akomaNtoso>
""";

var regelungstext = new Regelungstext(XmlMapper.toDocument(normXml));
when(loadRegelungstextPort.loadRegelungstext(new LoadRegelungstextPort.Command(eli)))
.thenReturn(Optional.of(regelungstext));
when(
timeMachineService.applyPassiveModifications(
new ApplyPassiveModificationsUseCase.Query(regelungstext, date)
)
)
.thenReturn(regelungstext);
when(xsltTransformationService.transformLegalDocMlToHtml(any())).thenReturn("<div></div>");

// When / Then
assertThatThrownBy(() -> service.loadElementHtmlAtDate(query))
.isInstanceOf(ElementNotFoundException.class);

verify(loadRegelungstextPort).loadRegelungstext(new LoadRegelungstextPort.Command(eli));
verify(timeMachineService)
.applyPassiveModifications(new ApplyPassiveModificationsUseCase.Query(regelungstext, date));
}
}

@Nested
class loadElementsByType {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package de.bund.digitalservice.ris.norms.integration.adapter.input.restapi;

import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.not;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

Expand Down Expand Up @@ -128,31 +127,6 @@ void returnsElementRenderedAsHtml() throws Exception {
.andExpect(content().string(containsString("Änderung des Vereinsgesetzes")));
}

@Test
void returnsElementAtGivenIsoDateRenderedAsHtml() throws Exception {
// Given
dokumentRepository.save(
DokumentMapper.mapToDto(Fixtures.loadRegelungstextFromDisk("NormWithMultipleMods.xml"))
);
dokumentRepository.save(
DokumentMapper.mapToDto(
Fixtures.loadRegelungstextFromDisk("NormWithMultiplePassiveModifications.xml")
)
);

// When / Then
mockMvc
.perform(
get(
"/api/v1/norms/eli/bund/bgbl-1/1990/s2954/2022-12-19/1/deu/regelungstext-1/elements/hauptteil-1_art-1?atIsoDate=2017-03-01T00:00:00.000Z"
)
.accept(MediaType.TEXT_HTML)
)
.andExpect(status().isOk())
.andExpect(content().string(containsString("§ 9 Absatz 1 Satz 2, Absatz 2 oder 3")))
.andExpect(content().string(not(containsString("§ 9 Abs. 1 Satz 2, Abs. 2"))));
}

@Test
void returnsBadRequestIfAtIsoDateIsInvalid() throws Exception {
// Given
Expand Down

0 comments on commit c4225ff

Please sign in to comment.