From fbd9566ff306535c1fe35d715777baf82b995cfb Mon Sep 17 00:00:00 2001 From: Pedro Date: Tue, 15 Sep 2026 12:20:41 +0200 Subject: [PATCH] Cambio en ApiOPE, datos vacios o nulos se devuelven con guiones --- .../ApiOPE.Tests/OpeFieldMapperTests.cs | 35 ++++++++++++++----- .../ApiOPE/Postman/INSTRUCCIONES-PRUEBA.txt | 1 + Antifraude.Net/ApiOPE/README.md | 6 ++-- .../ApiOPE/Services/OpeFieldMapper.cs | 7 +++- 4 files changed, 37 insertions(+), 12 deletions(-) diff --git a/Antifraude.Net/ApiOPE.Tests/OpeFieldMapperTests.cs b/Antifraude.Net/ApiOPE.Tests/OpeFieldMapperTests.cs index 4df4f61..e5e89ce 100644 --- a/Antifraude.Net/ApiOPE.Tests/OpeFieldMapperTests.cs +++ b/Antifraude.Net/ApiOPE.Tests/OpeFieldMapperTests.cs @@ -21,7 +21,7 @@ public sealed class OpeFieldMapperTests } [Fact] - public void MapBlock_MapsSecondBlockAndLeavesLastTwoFieldsEmpty() + public void MapBlock_MapsSecondBlockAndUsesHyphenForReservedFields() { var mapper = CreateMapper(); var source = CreateBlockSource(); @@ -30,12 +30,12 @@ public sealed class OpeFieldMapperTests Assert.Equal("Ayuntamiento", result.Data["FIELD_0"].Value); Assert.Equal("Comentarios", result.Data["FIELD_7"].Value); - Assert.Equal(string.Empty, result.Data["FIELD_8"].Value); - Assert.Equal(string.Empty, result.Data["FIELD_9"].Value); + Assert.Equal("-", result.Data["FIELD_8"].Value); + Assert.Equal("-", result.Data["FIELD_9"].Value); } [Fact] - public void MapBlock_ReturnsNoAndEmptyFieldsForUnknownExpedient() + public void MapBlock_ReturnsNoAndHyphensForUnknownExpedient() { var mapper = CreateMapper(); @@ -43,12 +43,12 @@ public sealed class OpeFieldMapperTests var secondBlock = mapper.MapBlock(null, 2, belongsToComplaintsChannel: false); Assert.Equal("NO", firstBlock.Data["FIELD_0"].Value); - Assert.All(firstBlock.Data.Where(field => field.Key != "FIELD_0"), field => Assert.Empty(field.Value.Value)); - Assert.All(secondBlock.Data, field => Assert.Empty(field.Value.Value)); + Assert.All(firstBlock.Data.Where(field => field.Key != "FIELD_0"), field => Assert.Equal("-", field.Value.Value)); + Assert.All(secondBlock.Data, field => Assert.Equal("-", field.Value.Value)); } [Fact] - public void MapBlock_ReturnsYesAndEmptyDataForPurgedChannelExpedient() + public void MapBlock_ReturnsYesAndHyphensForPurgedChannelExpedient() { var mapper = CreateMapper(); @@ -56,8 +56,25 @@ public sealed class OpeFieldMapperTests var secondBlock = mapper.MapBlock(null, 2, belongsToComplaintsChannel: true); Assert.Equal("SI", firstBlock.Data["FIELD_0"].Value); - Assert.All(firstBlock.Data.Where(field => field.Key != "FIELD_0"), field => Assert.Empty(field.Value.Value)); - Assert.All(secondBlock.Data, field => Assert.Empty(field.Value.Value)); + Assert.All(firstBlock.Data.Where(field => field.Key != "FIELD_0"), field => Assert.Equal("-", field.Value.Value)); + Assert.All(secondBlock.Data, field => Assert.Equal("-", field.Value.Value)); + } + + [Fact] + public void MapBlock_UsesHyphenForMissingOrWhitespaceSourceValues() + { + var mapper = CreateMapper(); + var source = new InternalGestionaFieldsResponse(new Dictionary + { + ["fechaDenuncia"] = new("STRING", " "), + ["numeroDenunciaCanal"] = new("STRING", null!) + }); + + var result = mapper.MapBlock(source, 1, belongsToComplaintsChannel: true); + + Assert.Equal("-", result.Data["FIELD_1"].Value); + Assert.Equal("-", result.Data["FIELD_2"].Value); + Assert.Equal("-", result.Data["FIELD_3"].Value); } [Theory] diff --git a/Antifraude.Net/ApiOPE/Postman/INSTRUCCIONES-PRUEBA.txt b/Antifraude.Net/ApiOPE/Postman/INSTRUCCIONES-PRUEBA.txt index b18739f..749ff3e 100644 --- a/Antifraude.Net/ApiOPE/Postman/INSTRUCCIONES-PRUEBA.txt +++ b/Antifraude.Net/ApiOPE/Postman/INSTRUCCIONES-PRUEBA.txt @@ -40,5 +40,6 @@ Resultado esperado - Las tres respuestas devuelven HTTP 200. - Los tests de Postman aparecen en verde. - La tercera respuesta contiene siempre FIELD_0 a FIELD_9 para el bloque solicitado. +- Los datos no informados se devuelven con el valor "-", nunca como una cadena vacia. Si la peticion no llega al servidor, comprobar que el equipo resuelve gesbuzpre.antifraudeandalucia.es y tiene acceso al puerto 7094. diff --git a/Antifraude.Net/ApiOPE/README.md b/Antifraude.Net/ApiOPE/README.md index 20ee4e7..3bae9c4 100644 --- a/Antifraude.Net/ApiOPE/README.md +++ b/Antifraude.Net/ApiOPE/README.md @@ -99,10 +99,12 @@ La operacion siempre devuelve `FIELD_0` a `FIELD_9` como valores `STRING`. numero de denuncia, sexo, preferencias de notificacion y ambito. `FIELD_1=2` solicita el segundo bloque: denunciado, detalle, resumen, proteccion, lugar, fecha de los hechos, autorizacion de remision y comentarios; sus dos ultimas -posiciones quedan vacias. +posiciones contienen `-` al estar reservadas. Si el expediente no pertenece al canal, el primer bloque devuelve `NO` y el -resto vacio. Para el segundo bloque se devuelven los diez campos vacios. +resto con `-`. Para el segundo bloque se devuelven los diez campos con `-`. +Cualquier dato ausente, nulo, vacio o compuesto solo por espacios se devuelve +como `-`; nunca se envian cadenas vacias en los campos de salida. ## Publicacion diff --git a/Antifraude.Net/ApiOPE/Services/OpeFieldMapper.cs b/Antifraude.Net/ApiOPE/Services/OpeFieldMapper.cs index fcb163b..e3aaaa6 100644 --- a/Antifraude.Net/ApiOPE/Services/OpeFieldMapper.cs +++ b/Antifraude.Net/ApiOPE/Services/OpeFieldMapper.cs @@ -4,6 +4,8 @@ namespace ApiOPE.Services; public sealed class OpeFieldMapper { + private const string EmptyValue = "-"; + public OpeDataEnvelope MapBlock( InternalGestionaFieldsResponse? source, int block, @@ -65,9 +67,12 @@ public sealed class OpeFieldMapper { output[$"FIELD_{index}"] = new OpeFieldValue( "STRING", - index < values.Length ? values[index] : string.Empty); + NormalizeOutputValue(index < values.Length ? values[index] : string.Empty)); } return new OpeDataEnvelope(output); } + + private static string NormalizeOutputValue(string? value) + => string.IsNullOrWhiteSpace(value) ? EmptyValue : value.Trim(); }