diff --git a/impl/src/main/java/fr/insee/rmes/metadata/Metadata.java b/impl/src/main/java/fr/insee/rmes/metadata/Metadata.java index 414cfd657..fcede5a3a 100644 --- a/impl/src/main/java/fr/insee/rmes/metadata/Metadata.java +++ b/impl/src/main/java/fr/insee/rmes/metadata/Metadata.java @@ -3,7 +3,6 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import java.time.Instant; @SpringBootApplication public class Metadata { diff --git a/impl/src/main/java/fr/insee/rmes/metadata/api/GeoAireDAttractionDesVillesEndpoints.java b/impl/src/main/java/fr/insee/rmes/metadata/api/GeoAireDAttractionDesVillesEndpoints.java index eb438887e..a085c5e0a 100644 --- a/impl/src/main/java/fr/insee/rmes/metadata/api/GeoAireDAttractionDesVillesEndpoints.java +++ b/impl/src/main/java/fr/insee/rmes/metadata/api/GeoAireDAttractionDesVillesEndpoints.java @@ -2,7 +2,6 @@ import fr.insee.rmes.metadata.api.requestprocessor.RequestProcessor; import fr.insee.rmes.metadata.model.AireDAttractionDesVilles2020; -import fr.insee.rmes.metadata.model.Pays; import fr.insee.rmes.metadata.model.TerritoireTousAttributs; import fr.insee.rmes.metadata.model.TypeEnumDescendantsAireDAttractionDesVilles; import fr.insee.rmes.metadata.queries.parameters.AscendantsDescendantsRequestParametizer; diff --git a/impl/src/main/java/fr/insee/rmes/metadata/api/GeoDepartementEndpoints.java b/impl/src/main/java/fr/insee/rmes/metadata/api/GeoDepartementEndpoints.java index 6e87abb3b..7aa99514d 100644 --- a/impl/src/main/java/fr/insee/rmes/metadata/api/GeoDepartementEndpoints.java +++ b/impl/src/main/java/fr/insee/rmes/metadata/api/GeoDepartementEndpoints.java @@ -1,9 +1,5 @@ package fr.insee.rmes.metadata.api; -import fr.insee.rmes.metadata.queries.parameters.AscendantsDescendantsRequestParametizer; -import fr.insee.rmes.metadata.queries.parameters.PrecedentsSuivantsRequestParametizer; -import fr.insee.rmes.metadata.queries.parameters.ProjetesRequestParametizer; -import fr.insee.rmes.metadata.queries.parameters.TerritoireRequestParametizer; import fr.insee.rmes.metadata.api.requestprocessor.RequestProcessor; import fr.insee.rmes.metadata.model.*; import fr.insee.rmes.metadata.queries.parameters.*; diff --git a/impl/src/main/java/fr/insee/rmes/metadata/api/GeoIrisEndpoints.java b/impl/src/main/java/fr/insee/rmes/metadata/api/GeoIrisEndpoints.java index cc6032515..2c59a0009 100644 --- a/impl/src/main/java/fr/insee/rmes/metadata/api/GeoIrisEndpoints.java +++ b/impl/src/main/java/fr/insee/rmes/metadata/api/GeoIrisEndpoints.java @@ -4,8 +4,8 @@ import fr.insee.rmes.metadata.model.Commune; import fr.insee.rmes.metadata.model.Iris; import fr.insee.rmes.metadata.model.TerritoireTousAttributs; -import fr.insee.rmes.metadata.queries.parameters.IrisListRequestParametizer; import fr.insee.rmes.metadata.queries.parameters.TerritoireRequestParametizer; +import fr.insee.rmes.metadata.utils.EndpointsUtils; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; @@ -24,39 +24,44 @@ public GeoIrisEndpoints(RequestProcessor requestProcessor) { @Override public ResponseEntity getcogiris(String code, LocalDate date) { - //cf carte https://github.com/orgs/InseeFr/projects/9/views/5?filterQuery=-application%3AColectica+-scope%3Atechnique+iris&pane=issue&itemId=49451501&issue=InseeFr%7CMetadata-API%7C103 - String code_commune=code.substring(0, 5); -// RequestProcessor.ListResult types = requestProcessor.queryforFindIrisDescendantsCommune() -// .with(new TerritoireRequestParametizer(code_commune, Commune.class)) -// .executeQuery().listResult(String.class); - - // Exécuter la requête et obtenir le résultat - RequestProcessor.ListeResultatsIris types = requestProcessor.queryforFindIrisDescendantsCommune() - .with(new TerritoireRequestParametizer(code_commune, Commune.class)) - .executeQuery() - .listeResultatsIris(String.class); -//plante à la méthode unmarshallAll' - - // Obtenir la liste des résultats - List typeList = types.getList(); - -//condition à mettre : si l'un des types de la liste finit par "#Iris\r\n", cf https://github.com/InseeFr/Metadata-API/blob/main/src/main/java/fr/insee/rmes/utils/IrisUtils.java#L8 - boolean containsIris = typeList.contains("http://rdf.insee.fr/def/geo#Iris"); + String codeCommune = code.substring(0, 5); + boolean comHasIrisDescendant = requestProcessor.queryToFindIrisDescendantsCommune() + .with(new TerritoireRequestParametizer(codeCommune, date)) + .executeAskQuery(); + if (comHasIrisDescendant){ -//bloc de fin pour que ça compile mais à revoir - return requestProcessor.queryforFindIris() - .with(new TerritoireRequestParametizer(code, date, Iris.class, "none")) - .executeQuery() - .singleResult(Iris.class) - .toResponseEntity(); + if (!code.endsWith("0000")) { + Iris iris = requestProcessor.queryToFindIrisAndFauxIris() + .with(new TerritoireRequestParametizer(code, date)) + .executeQuery() + .singleResult(Iris.class).result(); + return EndpointsUtils.toResponseEntity(iris); + } else { + return ResponseEntity.notFound().build(); + } + } + else { //it is a false-Iris + if (!code.endsWith("0000")) { + return ResponseEntity.notFound().build(); + } + else {//return the COMMUNE + Iris iris = requestProcessor.queryforFindTerritoire() + .with(new TerritoireRequestParametizer(codeCommune, date, Commune.class, "none")) + .executeQuery() + .singleResult(Iris.class).result(); + iris.setCode(code); //modify code property to have in output the Iris code and not the commune code + return EndpointsUtils.toResponseEntity(iris); + } + } } + @Override public ResponseEntity> getcogirislist (LocalDate date, Boolean com) { boolean finalcom = (com != null) && com; return requestProcessor.queryToFindIrisList() - .with(new IrisListRequestParametizer(date, finalcom)) + .with(new TerritoireRequestParametizer(date, finalcom)) .executeQuery() .listResult(TerritoireTousAttributs.class) .toResponseEntity(); diff --git a/impl/src/main/java/fr/insee/rmes/metadata/api/requestprocessor/RequestProcessor.java b/impl/src/main/java/fr/insee/rmes/metadata/api/requestprocessor/RequestProcessor.java index 2d3368cff..2969843a3 100644 --- a/impl/src/main/java/fr/insee/rmes/metadata/api/requestprocessor/RequestProcessor.java +++ b/impl/src/main/java/fr/insee/rmes/metadata/api/requestprocessor/RequestProcessor.java @@ -45,8 +45,8 @@ public RequestProcessor.QueryBuilder queryforFindTerritoire() { return new RequestProcessor.QueryBuilder(TERRITOIRE, this); } - public RequestProcessor.QueryBuilder queryforFindIris() { - return new RequestProcessor.QueryBuilder(IRIS, this); + public RequestProcessor.QueryBuilder queryToFindIrisAndFauxIris() { + return new RequestProcessor.QueryBuilder(IRIS_FAUX_IRIS, this); } public RequestProcessor.QueryBuilder queryToFindIrisList() { @@ -61,7 +61,7 @@ public RequestProcessor.QueryBuilder queryToFindCommunesOfCanton() { return new RequestProcessor.QueryBuilder(CANTON_COMMUNES, this); } - public RequestProcessor.QueryBuilder queryforFindIrisDescendantsCommune() { + public RequestProcessor.QueryBuilder queryToFindIrisDescendantsCommune() { return new RequestProcessor.QueryBuilder(LIEN_COMMUNE_IRIS, this); } @@ -116,9 +116,6 @@ public ExecutableQuery with(ProjetesRequestParametizer projetesRequestParametize return new ExecutableQuery(requestProcessor.queryBuilder().build(projetesRequestParametizer.toParameters(), queryPath), requestProcessor); } - - public ExecutableQuery with(IrisListRequestParametizer irisListRequestParametizer) { - return new ExecutableQuery(requestProcessor.queryBuilder().build(irisListRequestParametizer.toParameters(), queryPath), requestProcessor);} } @@ -128,10 +125,11 @@ public QueryResult executeQuery() { return new QueryResult(requestProcessor.queryExecutor().execute(query), requestProcessor); } + public Boolean executeAskQuery() { + return requestProcessor.queryExecutor().executeAskQuery(query); + } } - - public record QueryResult(Csv csv, RequestProcessor requestProcessor) { public ListResult listResult(Class clazz) { return new ListResult<>(requestProcessor.unmarshaller().unmarshalList(csv, clazz)); @@ -141,11 +139,6 @@ public SingleResult singleResult(Class clazz) { return new SingleResult<>(requestProcessor.unmarshaller().unmarshalOrNull(csv, clazz)); } - public ListeResultatsIris listeResultatsIris(Class clazz) { - List list = requestProcessor.unmarshaller().unmarshalList(csv, clazz); - return new ListeResultatsIris<>(list); - } - } @@ -157,26 +150,10 @@ public ResponseEntity> toResponseEntity() { } public record SingleResult(E result) { - // public ResponseEntity toResponseEntity() {return new ResponseEntity<>(result, HttpStatus.OK);} public ResponseEntity toResponseEntity() { return EndpointsUtils.toResponseEntity(result); } } - public record ListeResultatsIris(List result) { - public boolean contains(String value) { - return result.stream().anyMatch(item -> item.toString().equals(value)); - } - - public ListeResultatsIris(List result) { - this.result = result; - } - - public List getList() { - return result; - } - - } - } diff --git a/impl/src/main/java/fr/insee/rmes/metadata/config/MetadataConfig.java b/impl/src/main/java/fr/insee/rmes/metadata/config/MetadataConfig.java index f14ab6c47..d7fa7421a 100644 --- a/impl/src/main/java/fr/insee/rmes/metadata/config/MetadataConfig.java +++ b/impl/src/main/java/fr/insee/rmes/metadata/config/MetadataConfig.java @@ -1,7 +1,6 @@ package fr.insee.rmes.metadata.config; import freemarker.cache.ClassTemplateLoader; -import freemarker.cache.FileTemplateLoader; import freemarker.cache.MultiTemplateLoader; import freemarker.cache.TemplateLoader; import freemarker.template.Configuration; @@ -11,10 +10,8 @@ import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.context.annotation.Bean; -import java.io.File; import java.io.IOException; import java.net.URISyntaxException; -import java.net.URL; import java.util.Locale; @org.springframework.context.annotation.Configuration diff --git a/impl/src/main/java/fr/insee/rmes/metadata/queries/QueryBuilder.java b/impl/src/main/java/fr/insee/rmes/metadata/queries/QueryBuilder.java index bd81f7e52..b462ebf30 100644 --- a/impl/src/main/java/fr/insee/rmes/metadata/queries/QueryBuilder.java +++ b/impl/src/main/java/fr/insee/rmes/metadata/queries/QueryBuilder.java @@ -24,8 +24,7 @@ public record QueryBuilder(Configuration freemarkerConfiguration) { public static final String CANTON_COMMUNES = "geographie/getCantonCommunesByCodeDate.ftlh"; public static final String PRECEDENTS = "geographie/getPreviousOrNextByCodeTypeDate.ftlh"; public static final String PROJETES = "geographie/getProjectionByCodeTypeDate.ftlh"; - // public static final String IRIS = "geographie/getIrisByCodeDate.ftlh"; - public static final String IRIS = "geographie/getTerritoireByCodeDateNomCommune.ftlh"; + public static final String IRIS_FAUX_IRIS = "geographie/getIrisByCodeDate.ftlh"; public static final String IRIS_LIST = "geographie/getIrisList.ftlh"; public static final String LIEN_COMMUNE_IRIS = "geographie/hasIrisDescendant.ftlh"; public static final String LIEN_PAYS = "geographie/getPays.ftlh"; diff --git a/impl/src/main/java/fr/insee/rmes/metadata/queries/parameters/IrisListRequestParametizer.java b/impl/src/main/java/fr/insee/rmes/metadata/queries/parameters/IrisListRequestParametizer.java deleted file mode 100644 index d3444bbc5..000000000 --- a/impl/src/main/java/fr/insee/rmes/metadata/queries/parameters/IrisListRequestParametizer.java +++ /dev/null @@ -1,19 +0,0 @@ -package fr.insee.rmes.metadata.queries.parameters; - -import java.lang.reflect.RecordComponent; -import java.time.LocalDate; - -public record IrisListRequestParametizer (LocalDate date, - boolean com) implements ParametersForQuery{ - - @Override - public ParameterValueDecoder findParameterValueDecoder(RecordComponent recordComponent) { - return ParametersForQuery.super.findParameterValueDecoder(recordComponent); - } - - -} - - - - diff --git a/impl/src/main/java/fr/insee/rmes/metadata/queries/parameters/TerritoireEtoileRequestParametizer.java b/impl/src/main/java/fr/insee/rmes/metadata/queries/parameters/TerritoireEtoileRequestParametizer.java index 7e8dad287..b858f5bdd 100644 --- a/impl/src/main/java/fr/insee/rmes/metadata/queries/parameters/TerritoireEtoileRequestParametizer.java +++ b/impl/src/main/java/fr/insee/rmes/metadata/queries/parameters/TerritoireEtoileRequestParametizer.java @@ -2,7 +2,6 @@ import java.lang.reflect.RecordComponent; -import java.time.LocalDate; public record TerritoireEtoileRequestParametizer(String code, String date, diff --git a/impl/src/main/java/fr/insee/rmes/metadata/queries/parameters/TerritoireRequestParametizer.java b/impl/src/main/java/fr/insee/rmes/metadata/queries/parameters/TerritoireRequestParametizer.java index 8f56cc560..0a8893a2c 100644 --- a/impl/src/main/java/fr/insee/rmes/metadata/queries/parameters/TerritoireRequestParametizer.java +++ b/impl/src/main/java/fr/insee/rmes/metadata/queries/parameters/TerritoireRequestParametizer.java @@ -1,5 +1,7 @@ package fr.insee.rmes.metadata.queries.parameters; +import fr.insee.rmes.metadata.model.Iris; + import java.lang.reflect.RecordComponent; import java.time.LocalDate; @@ -26,14 +28,17 @@ public TerritoireRequestParametizer(LocalDate date, this("none", date, typeOrigine, "*", chefLieu, com); } - //for geo/communes and geo/bassinsDeVie2022 before date * developments : unused ? -// public TerritoireRequestParametizer(LocalDate date, -// Class typeOrigine, -// String filtreNom, -// String chefLieu, -// boolean com) { -// this("none", date, typeOrigine, filtreNom, chefLieu, com); -// } + //for geo/iris + public TerritoireRequestParametizer(LocalDate date, + boolean com) { + this("none", date, Iris.class , "*", "*", com);//regardless of the values of typeOrigine, filtreNom et chefLieu + } + + //for geo/iris/{code} + public TerritoireRequestParametizer(String code, LocalDate date) { + this(code, date, Iris.class, "*", "*", true); + //regardless of the values of typeOrigine, filtreNom, chefLieu and com, + date for hasIrisDescendant + } //for geo/arrondissements, geo/aireDAttractionDesVilles2020, etc public TerritoireRequestParametizer(LocalDate date, diff --git a/impl/src/main/java/fr/insee/rmes/metadata/queryexecutor/QueryExecutor.java b/impl/src/main/java/fr/insee/rmes/metadata/queryexecutor/QueryExecutor.java index 4fc853d32..74bd90a59 100644 --- a/impl/src/main/java/fr/insee/rmes/metadata/queryexecutor/QueryExecutor.java +++ b/impl/src/main/java/fr/insee/rmes/metadata/queryexecutor/QueryExecutor.java @@ -1,5 +1,7 @@ package fr.insee.rmes.metadata.queryexecutor; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import fr.insee.rmes.metadata.queries.Query; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; @@ -12,6 +14,8 @@ import org.springframework.stereotype.Component; import org.springframework.web.client.RestClient; +import java.io.IOException; + @Slf4j @Component public record QueryExecutor(RestClient restClient, String urlTemplate) { @@ -56,4 +60,49 @@ public Csv execute(@NonNull Query query) { .body(String.class)); } +public Boolean executeAskQuery(@NonNull Query query) { + String prefixedQuery = PREFIXES + query.value(); + log.debug("Executing SPARQL ASK query: {}", prefixedQuery); + + try { + String response = restClient.get() + .uri(urlTemplate, prefixedQuery) + .header("Accept", "application/sparql-results+json") // Format standard pour les résultats SPARQL + .retrieve() + .onStatus(HttpStatusCode::is4xxClientError, (request, reponse) -> { + String errorMessage = "SPARQL ASK query failed: " + request.getURI(); + try { + String body = new String(reponse.getBody().readAllBytes()); + errorMessage += " - Response: " + body; + } catch (IOException e) { + errorMessage += " - Error reading response body: " + e.getMessage(); + } + log.error(errorMessage); + throw new RuntimeException("SPARQL query error: " + reponse.getStatusText()); + }) + .body(String.class); + + log.debug("SPARQL ASK response: {}", response); + + // Parse the Json response to extract the boolean + return parseAskResponse(response); + } catch (Exception e) { + log.error("Unexpected error while executing SPARQL ASK query: {}", e.getMessage(), e); + throw new RuntimeException("Failed to execute SPARQL ASK query", e); + } +} + + // Method to parse the JSON response of a SPARQL ASK request + private Boolean parseAskResponse(String jsonResponse) { + try { + // Example of a Json response for an ASK request : + // {"head":{},"boolean":true} + JsonNode rootNode = new ObjectMapper().readTree(jsonResponse); + return rootNode.path("boolean").asBoolean(); + } catch (Exception e) { + log.error("Failed to parse SPARQL ASK response: {}", jsonResponse, e); + throw new RuntimeException("Invalid SPARQL ASK response format", e); + } + } + } diff --git a/impl/src/main/java/fr/insee/rmes/metadata/utils/ConceptDTO.java b/impl/src/main/java/fr/insee/rmes/metadata/utils/ConceptDTO.java index 0e88bbce4..c2d7c6b90 100644 --- a/impl/src/main/java/fr/insee/rmes/metadata/utils/ConceptDTO.java +++ b/impl/src/main/java/fr/insee/rmes/metadata/utils/ConceptDTO.java @@ -5,7 +5,6 @@ import java.net.URI; import java.time.Instant; -import java.time.LocalDate; import java.time.format.DateTimeParseException; import java.util.ArrayList; import java.util.List; diff --git a/impl/src/main/java/fr/insee/rmes/metadata/utils/TypeEnumDescendantsRegionConverter.java b/impl/src/main/java/fr/insee/rmes/metadata/utils/TypeEnumDescendantsRegionConverter.java index 50be02be1..1489006b5 100644 --- a/impl/src/main/java/fr/insee/rmes/metadata/utils/TypeEnumDescendantsRegionConverter.java +++ b/impl/src/main/java/fr/insee/rmes/metadata/utils/TypeEnumDescendantsRegionConverter.java @@ -1,6 +1,5 @@ package fr.insee.rmes.metadata.utils; -import fr.insee.rmes.metadata.model.TypeEnumDescendantsIntercommunalite; import fr.insee.rmes.metadata.model.TypeEnumDescendantsRegion; import org.springframework.core.convert.converter.Converter; import org.springframework.stereotype.Component; diff --git a/impl/src/main/resources/request/geographie/hasIrisDescendant.ftlh b/impl/src/main/resources/request/geographie/hasIrisDescendant.ftlh index 449c200e1..1cecc8dac 100644 --- a/impl/src/main/resources/request/geographie/hasIrisDescendant.ftlh +++ b/impl/src/main/resources/request/geographie/hasIrisDescendant.ftlh @@ -1,16 +1,15 @@ -SELECT DISTINCT ?type -FROM +ASK FROM WHERE { - { - ?origine a igeo:Commune ; - igeo:codeINSEE '${code}' . - } - UNION - { - ?origine a igeo:ArrondissementMunicipal ; - igeo:codeINSEE '${code}' . - } - ?uri igeo:subdivisionDirecteDe+ ?origine . - ?uri a ?type . -} -ORDER BY ?type \ No newline at end of file + { + ?origine a igeo:Commune ; + igeo:codeINSEE '${code}' . + } + UNION + { + ?origine a igeo:ArrondissementMunicipal ; + igeo:codeINSEE '${code}' . + } + ?uri igeo:subdivisionDirecteDe+ ?origine . + ?uri a ?type . + FILTER(STRENDS(STR(?type), "#Iris")) +} \ No newline at end of file diff --git a/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/ConceptsQueriesTest.java b/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/ConceptsQueriesTest.java index 802ef341f..f49374fb7 100644 --- a/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/ConceptsQueriesTest.java +++ b/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/ConceptsQueriesTest.java @@ -135,14 +135,14 @@ void should_return_404_when_ConceptsDefinitionCode_codec1000() throws Exception{ // geo/concepts/definitions @Test - void should_return_1230_concepts_when_ConceptsDefinitions_libelleNull() { + void should_return_1232_concepts_when_ConceptsDefinitions_libelleNull() { var response = endpoints.getconceptsliste(""); var result = response.getBody(); Assertions.assertNotNull(result); var resultItem1= result.getFirst(); assertAll( - () -> assertEquals(1230, result.size()), + () -> assertEquals(1232, result.size()), () -> assertEquals("c1601", resultItem1.getId()), () -> assertEquals(URI.create("http://id.insee.fr/concepts/definition/c1601"), resultItem1.getUri()), () -> assertEquals("ADSL", resultItem1.getIntitule()) diff --git a/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/GeoArrondissementQueriesTest.java b/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/GeoArrondissementQueriesTest.java index a4ec31adf..a13243eb4 100644 --- a/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/GeoArrondissementQueriesTest.java +++ b/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/GeoArrondissementQueriesTest.java @@ -155,7 +155,7 @@ void should_return_748_arrondissements_when_Arrondissements_dateEtoile() { var response = endpoints.getcogarrliste("*"); var result = response.getBody(); var resultItem1 = result.getFirst(); - assertEquals(748, result.size()); // Remplacez 350 par le nombre réel attendu + assertEquals(748, result.size()); assertEquals("011", resultItem1.getCode()); assertEquals("http://id.insee.fr/geo/arrondissement/d693d3ca-5851-4c40-a19e-dba1d750bfcf", resultItem1.getUri()); assertEquals(Arrondissement.TypeEnum.ARRONDISSEMENT, resultItem1.getType()); diff --git a/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/GeoBassinDeVieQueriesTest.java b/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/GeoBassinDeVieQueriesTest.java index 754e50d09..08eab48b9 100644 --- a/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/GeoBassinDeVieQueriesTest.java +++ b/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/GeoBassinDeVieQueriesTest.java @@ -108,7 +108,7 @@ void should_return_1_bassinDeVie2022_when_BassinsDeVie2022_date20250904_filtreNo var resultItem1 = result.getFirst(); // Vérification du nombre total de bassins de vie - assertEquals(1, result.size()); // Remplacez 1254 par le nombre réel attendu + assertEquals(1, result.size()); assertEquals("01004", resultItem1.getCode()); assertEquals("http://id.insee.fr/geo/bassinDeVie2022/0e5bcc78-f043-404d-92af-d3d660772675", resultItem1.getUri()); diff --git a/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/GeoCantonQueriesTest.java b/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/GeoCantonQueriesTest.java index 4019a31a0..5e9a55c10 100644 --- a/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/GeoCantonQueriesTest.java +++ b/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/GeoCantonQueriesTest.java @@ -2,7 +2,6 @@ import fr.insee.rmes.metadata.api.GeoCantonEndpoints; import fr.insee.rmes.metadata.model.Canton; -import fr.insee.rmes.metadata.model.TerritoireBase; import fr.insee.rmes.metadata.model.TerritoireTousAttributs; import fr.insee.rmes.metadata.model.TypeEnumAscendantsCanton; import org.junit.jupiter.api.Tag; diff --git a/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/GeoDepartementQueriesTest.java b/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/GeoDepartementQueriesTest.java index e35147fac..83b80d9d4 100644 --- a/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/GeoDepartementQueriesTest.java +++ b/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/GeoDepartementQueriesTest.java @@ -191,7 +191,7 @@ void should_return_1_departement_when_DepartementCodePrecedents_code22_date20250 // geo/departement/21/precedents?date=2025-09-04 @Test - //le département 21 n'a pas de départments précédents + //département 21 has no départments précédents void should_return_404_when_DepartementCodePrecedents_code21_date20250904() throws Exception{ mockMvc.perform(get("/geo/departement/21/precedents") .param("date", "2025-09-01")) diff --git a/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/GeoDistrictQueriesTest.java b/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/GeoDistrictQueriesTest.java index 9b6c0b79e..5c6c7056b 100644 --- a/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/GeoDistrictQueriesTest.java +++ b/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/GeoDistrictQueriesTest.java @@ -1,6 +1,5 @@ package fr.insee.rmes.metadata.api.testcontainers.queries; -import fr.insee.rmes.metadata.api.GeoCommuneDelegueeEndpoints; import fr.insee.rmes.metadata.api.GeoDistrictEndpoints; import fr.insee.rmes.metadata.model.*; import org.junit.Assert; diff --git a/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/GeoIrisQueriesTest.java b/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/GeoIrisQueriesTest.java index 980a3bf0e..4a44543f8 100644 --- a/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/GeoIrisQueriesTest.java +++ b/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/GeoIrisQueriesTest.java @@ -1,7 +1,7 @@ package fr.insee.rmes.metadata.api.testcontainers.queries; -import fr.insee.rmes.metadata.api.GeoIntercommunaliteEndpoints; import fr.insee.rmes.metadata.api.GeoIrisEndpoints; +import fr.insee.rmes.metadata.model.Iris; import fr.insee.rmes.metadata.model.TerritoireTousAttributs; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @@ -14,6 +14,8 @@ import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @SpringBootTest @AutoConfigureMockMvc @@ -26,6 +28,51 @@ public class GeoIrisQueriesTest extends TestcontainerTest { @Autowired private MockMvc mockMvc; + //////////////////////////////////////////////////////////////////// + /// geo/iris/{code} /// + //////////////////////////////////////////////////////////////////// + +// geo/iris/010040101?date=2025-09-04 (hasIrisDescendant = true, does not end with 0000) + @Test + void should_return_irisCode_010040101_when_code010040101_date20250904() { + var response = endpoints.getcogiris("010040101", LocalDate.of(2025, 9, 4)); + var result = response.getBody(); + assertAll( + () -> assertEquals("010040101", result.getCode()), + () -> assertEquals("http://id.insee.fr/geo/iris/b8c772de-9551-4f13-81c5-eca5bb0f2f7d", result.getUri()), + () -> assertEquals(Iris.TypeEnum.IRIS, result.getType()), + () -> assertEquals(LocalDate.of(2008,1,1), result.getDateCreation()), + () -> assertEquals("H", result.getTypeDIris()), + () -> assertEquals("Pérouses-Triangle d'Activités", result.getIntituleSansArticle()), + () -> assertEquals(Iris.TypeArticleEnum._4, result.getTypeArticle()), + () -> assertEquals("Les Pérouses-Triangle d'Activités", result.getIntitule()) + ); + } + +// geo/iris/010020000?date=2025-09-04 (hasIrisDescendant = false, ends with 0000) + @Test + void should_return_irisCode_010020000_when_code010020000_date20250904() { + var response = endpoints.getcogiris("010020000", LocalDate.of(2025, 9, 4)); + var result = response.getBody(); + assertAll( + () -> assertEquals("010020000", result.getCode()), + () -> assertEquals("http://id.insee.fr/geo/commune/43018c68-c278-433a-b285-3531e8d5347e", result.getUri()), + () -> assertEquals(Iris.TypeEnum.COMMUNE, result.getType()), + () -> assertEquals(LocalDate.of(1943,1,1), result.getDateCreation()), + () -> assertEquals("Abergement-de-Varey", result.getIntituleSansArticle()), + () -> assertEquals(Iris.TypeArticleEnum._5, result.getTypeArticle()), + () -> assertEquals("L'Abergement-de-Varey", result.getIntitule()) + ); + } + +// geo/iris/010040000?date=2025-09-04 (hasIrisDescendant = true, ends with 0000) + @Test + void should_return_404_when_code010040000_date20250904() throws Exception { + mockMvc.perform(get("/geo/iris/010040000") + .param("date", "2025-09-01")) + .andExpect(status().isNotFound()); + } + //////////////////////////////////////////////////////////////////// /// geo/iris /// //////////////////////////////////////////////////////////////////// diff --git a/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/GeoUniteUrbaineQueriesTest.java b/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/GeoUniteUrbaineQueriesTest.java index 06b371003..62592546a 100644 --- a/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/GeoUniteUrbaineQueriesTest.java +++ b/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/GeoUniteUrbaineQueriesTest.java @@ -1,7 +1,6 @@ package fr.insee.rmes.metadata.api.testcontainers.queries; import fr.insee.rmes.metadata.api.GeoUniteUrbaineEndpoints; -import fr.insee.rmes.metadata.model.Region; import fr.insee.rmes.metadata.model.TerritoireTousAttributs; import fr.insee.rmes.metadata.model.TypeEnumDescendantsUniteUrbaine; import fr.insee.rmes.metadata.model.UniteUrbaine2020; diff --git a/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/TestcontainerTest.java b/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/TestcontainerTest.java index a85171964..eae5d5a8e 100644 --- a/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/TestcontainerTest.java +++ b/impl/src/test/java/fr/insee/rmes/metadata/api/testcontainers/queries/TestcontainerTest.java @@ -3,7 +3,6 @@ import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Disabled; import org.springframework.test.context.DynamicPropertyRegistry; import org.springframework.test.context.DynamicPropertySource; diff --git a/oas/src/main/resources/openapi.yaml b/oas/src/main/resources/openapi.yaml index cf0b22f48..8eb6c6314 100644 --- a/oas/src/main/resources/openapi.yaml +++ b/oas/src/main/resources/openapi.yaml @@ -6839,7 +6839,7 @@ components: CodeIris: description: 'Code d''une Iris' - pattern: '([0-9]{9})' + pattern: '[0-9][0-9AB][0-9]{7}' type: string xml: attribute: true