Enrich administrative profiles from SGU

This commit is contained in:
2026-09-03 12:21:43 -06:00
parent d50a4d9895
commit 403132f869
12 changed files with 609 additions and 22 deletions
@@ -56,6 +56,100 @@ public sealed class SguProfileParserTests
Assert.Null(SguProfileParser.ParseAdministrative(html, "999999"));
}
[Fact]
public void ParsesStructuredAdministrativeNameWithoutReadingOtherPersonalData()
{
const string html = """
<html><body>
<input id="ctl00_contenedor_txtNombre" value="MARÍA DEL CARMEN" />
<input id="ctl00_contenedor_txtApaterno" value="DE LA FUENTE" />
<input id="ctl00_contenedor_txtAmaterno" value="O&#39;CONNOR" />
<input id="ctl00_contenedor_txtCURP" value="DATO-QUE-NO-DEBE-EXTRAERSE" />
<select id="ctl00_contenedor_ddlNacimientoFecha_ddlYear">
<option selected="selected">1990</option>
</select>
</body></html>
""";
InstitutionalProfile? profile = SguProfileParser.ParseAdministrativePersonal(html);
Assert.NotNull(profile);
Assert.Equal("María del Carmen", profile.GivenName);
Assert.Equal("de la Fuente O'Connor", profile.Surname);
Assert.Equal("María del Carmen de la Fuente O'Connor", profile.DisplayName);
Assert.Null(profile.EmployeeNumber);
Assert.Null(profile.Email);
}
[Fact]
public void ParsesAdministrativeAddressFromInputsAndSelectedOptions()
{
const string html = """
<html><body>
<input id='ctl00_contenedor_txtCalle' value='AVENIDA DE LA UNIVERSIDAD' />
<input id='ctl00_contenedor_txtNoExt' value='123' />
<input id='ctl00_contenedor_txtNoInt' value='B-4' />
<input id='ctl00_contenedor_txtCP' value='8500' />
<select id='ctl00_contenedor_ddlEstado'>
<option value='0'>Seleccione...</option>
<option selected='selected' value='9'>CIUDAD DE MÉXICO</option>
</select>
<select id='ctl00_contenedor_ddlLocalidad'>
<option value='1'>AZCAPOTZALCO</option>
<option selected='selected' value='4'>BENITO JUÁREZ</option>
</select>
<select id='ctl00_contenedor_ddlColonia'>
<option value='10'>COLONIA DEL VALLE</option>
</select>
<input id='ctl00_contenedor_txtTelefono' value='5555555555' />
<textarea id='ctl00_contenedor_txtDirEmergencia'>NO EXTRAER</textarea>
</body></html>
""";
InstitutionalProfile? profile = SguProfileParser.ParseAdministrativeLocation(html);
Assert.NotNull(profile);
Assert.Equal(
"Avenida de la Universidad 123, Int. B-4\r\nColonia del Valle",
profile.StreetAddress);
Assert.Equal("Benito Juárez", profile.City);
Assert.Equal("Ciudad de México", profile.State);
Assert.Equal("08500", profile.PostalCode);
Assert.Null(profile.Email);
}
[Fact]
public void AdministrativePagesOverlayTheVerifiedIncidentsProfile()
{
InstitutionalProfile verified = new(
EmployeeNumber: "017045",
DisplayName: "Nombre Anterior",
Email: "persona@lasalle.mx",
JobTitle: "Analista",
Department: "Ingeniería");
InstitutionalProfile personal = new(
DisplayName: "María del Carmen de la Fuente",
GivenName: "María del Carmen",
Surname: "de la Fuente");
InstitutionalProfile location = new(
StreetAddress: "Calle Uno 10",
City: "Ciudad de México",
State: "Ciudad de México",
PostalCode: "01000");
InstitutionalProfile combined = verified.Overlay(personal).Overlay(location);
Assert.Equal("017045", combined.EmployeeNumber);
Assert.Equal("María del Carmen de la Fuente", combined.DisplayName);
Assert.Equal("María del Carmen", combined.GivenName);
Assert.Equal("de la Fuente", combined.Surname);
Assert.Equal("persona@lasalle.mx", combined.Email);
Assert.Equal("Analista", combined.JobTitle);
Assert.Equal("Ingeniería", combined.Department);
Assert.Equal("Calle Uno 10", combined.StreetAddress);
Assert.Equal("01000", combined.PostalCode);
}
[Fact]
public void ParsesTheRequiredStudentIdentityCareerAndAddressFields()
{