Cambio en ApiOPE, datos vacios o nulos se devuelven con guiones

This commit is contained in:
2026-09-15 12:20:41 +02:00
parent 7f3780497f
commit fbd9566ff3
4 changed files with 37 additions and 12 deletions

View File

@@ -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<string, OpeFieldValue>
{
["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]

View File

@@ -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.

View File

@@ -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

View File

@@ -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();
}