Files
SGU-CredentialProvider/tests/SGU.AuthBroker.Core.Tests/SguProfileParserTests.cs
T

209 lines
8.5 KiB
C#

using SGU.AuthBroker.Core.Profiles;
using Xunit;
namespace SGU.AuthBroker.Core.Tests;
public sealed class SguProfileParserTests
{
[Fact]
public void ParsesOnlyTheRequiredAdministrativeFieldsFromTheInitialResponse()
{
const string html = """
<html><body>
<span id="ctl00_contenedor_decEncabezado_lblNombre">
017045 - JESÚS&nbsp;ALEJANDRO ROSALES GONZÁLEZ
</span>
<span id="ctl00_contenedor_decEncabezado_lblIndicadorValue">
SINDICALIZADO QUINCENAL (ACTIVO)
</span>
<span id="ctl00_contenedor_decEncabezado_lblCorreo">
<a href="mailto:persona@lasalle.mx">persona@lasalle.mx</a>
</span>
<div style="display:none">
<span id="ctl00_contenedor_decEncabezado_lblPuesto">
ANALISTA DE PROYECTOS
</span>
<span id="ctl00_contenedor_decEncabezado_lblDependencia">
FACULTAD DE INGENIERÍA
</span>
<span id="ctl00_contenedor_decEncabezado_lblJefeNombre">
ESTE CAMPO NO DEBE EXTRAERSE
</span>
</div>
<table id="incidencias"><tr><td>DATOS NO REQUERIDOS</td></tr></table>
</body></html>
""";
InstitutionalProfile? profile = SguProfileParser.ParseAdministrative(html, "017045");
Assert.NotNull(profile);
Assert.Equal("017045", profile.EmployeeNumber);
Assert.Equal("Jesús Alejandro Rosales González", profile.DisplayName);
Assert.Equal("persona@lasalle.mx", profile.Email);
Assert.Equal("Sindicalizado quincenal (activo)", profile.EmployeeType);
Assert.Equal("Analista de Proyectos", profile.JobTitle);
Assert.Equal("Facultad de Ingeniería", profile.Department);
}
[Fact]
public void RejectsAdministrativeMetadataForADifferentEmployeeNumber()
{
const string html = """
<span id='ctl00_contenedor_decEncabezado_lblNombre'>017045 - PERSONA INCORRECTA</span>
<span id='ctl00_contenedor_decEncabezado_lblCorreo'>incorrecta@lasalle.mx</span>
""";
Assert.Null(SguProfileParser.ParseAdministrative(html, "999999"));
}
[Fact]
public void ParsesTheRequiredStudentIdentityCareerAndAddressFields()
{
const string html = """
<html><body>
<div id="ctl00_contenedor_HistorialAlumno1_div1">
<span id="ctl00_contenedor_HistorialAlumno1_lblClaveAlumnoHP">123456</span>
<span id="ctl00_contenedor_HistorialAlumno1_lblNombreAlumnoHP">MARÍA DEL CARMEN</span>
<span id="ctl00_contenedor_HistorialAlumno1_lblApPatAlumnoHP">DE LA FUENTE</span>
<span id="ctl00_contenedor_HistorialAlumno1_lblApMatAlumnoHP">O'CONNOR</span>
<span id="ctl00_contenedor_HistorialAlumno1_lblCorreoAlumnoHP">
<a href="mailto:alumna@lasalle.mx">ALUMNA@LASALLE.MX</a>
</span>
<span id="ctl00_contenedor_HistorialAlumno1_lblCURPAlumnoHP">
DATO-SENSIBLE-QUE-NO-DEBE-EXTRAERSE
</span>
</div>
<span id="ctl00_contenedor_HistorialAlumno1_Header1_lblCarrera">
LICENCIATURA EN INGENIERÍA CIBERNÉTICA Y SISTEMAS COMPUTACIO NALES
</span>
<div id="ctl00_contenedor_HistorialAlumno1_div2">
<span id="ctl00_contenedor_HistorialAlumno1_lblDomicilioAlumnoHP">
AVENIDA DE LA UNIVERSIDAD 123
</span>
<span id="ctl00_contenedor_HistorialAlumno1_lblColoniaAlumnoHP">
COLONIA DEL VALLE
</span>
<span id="ctl00_contenedor_HistorialAlumno1_lblEstadoAlumnoHP">
CIUDAD DE MÉXICO
</span>
<span id="ctl00_contenedor_HistorialAlumno1_lblCiudadAlumnoHP">
CIUDAD DE MÉXICO
</span>
<span id="ctl00_contenedor_HistorialAlumno1_lblDeloMunAlumnoHP">
ALCALDÍA BENITO JUÁREZ
</span>
<span id="ctl00_contenedor_HistorialAlumno1_lblCPAlumnoHP">8500</span>
</div>
</body></html>
""";
InstitutionalProfile? profile = SguProfileParser.ParseStudent(html, "123456");
Assert.NotNull(profile);
Assert.Equal("123456", profile.EmployeeNumber);
Assert.Equal("María del Carmen de la Fuente O'Connor", profile.DisplayName);
Assert.Equal("María del Carmen", profile.GivenName);
Assert.Equal("de la Fuente O'Connor", profile.Surname);
Assert.Equal("alumna@lasalle.mx", profile.Email);
Assert.Equal("Alumno", profile.EmployeeType);
Assert.Equal(
"Estudiante de Ingeniería Cibernética y Sistemas Computacionales",
profile.JobTitle);
Assert.Null(profile.Department);
Assert.Equal(
"Avenida de la Universidad 123\r\nColonia del Valle\r\nAlcaldía Benito Juárez",
profile.StreetAddress);
Assert.Equal("Ciudad de México", profile.City);
Assert.Equal("Ciudad de México", profile.State);
Assert.Equal("08500", profile.PostalCode);
}
[Fact]
public void RejectsStudentMetadataForADifferentStudentNumber()
{
const string html = """
<span id="ctl00_contenedor_HistorialAlumno1_lblClaveAlumnoHP">123456</span>
<span id="ctl00_contenedor_HistorialAlumno1_lblNombreAlumnoHP">PERSONA INCORRECTA</span>
<span id="ctl00_contenedor_HistorialAlumno1_lblCorreoAlumnoHP">incorrecta@lasalle.mx</span>
""";
Assert.Null(SguProfileParser.ParseStudent(html, "654321"));
}
[Fact]
public void UsesMunicipalityAsStudentCityWhenThePortalCityIsMissing()
{
const string html = """
<span id="ctl00_contenedor_HistorialAlumno1_lblClaveAlumnoHP">123456</span>
<span id="ctl00_contenedor_HistorialAlumno1_lblDeloMunAlumnoHP">SAN PEDRO CHOLULA</span>
<span id="ctl00_contenedor_HistorialAlumno1_lblCPAlumnoHP">72760</span>
""";
InstitutionalProfile? profile = SguProfileParser.ParseStudent(html, "123456");
Assert.NotNull(profile);
Assert.Equal("San Pedro Cholula", profile.City);
Assert.Equal("San Pedro Cholula", profile.StreetAddress);
Assert.Equal("72760", profile.PostalCode);
}
[Fact]
public void ParsesTheMenuNameAsAConservativeFallback()
{
const string html = """
<span class="usuario" id="ctl00_lblNombreUsuario">
MARÍA&nbsp;&amp;&nbsp;JOSÉ
</span>
""";
InstitutionalProfile? profile = SguProfileParser.ParseMenu(html);
Assert.NotNull(profile);
Assert.Equal("María & José", profile.DisplayName);
Assert.Null(profile.Email);
Assert.Null(profile.JobTitle);
Assert.Null(profile.Department);
}
[Theory]
[InlineData("MARÍA DEL CARMEN", "María del Carmen")]
[InlineData("MIGUEL DE CERVANTES", "Miguel de Cervantes")]
[InlineData("CARLOS DE LA FUENTE", "Carlos de la Fuente")]
[InlineData("MARÍA-JOSÉ O'CONNOR", "María-José O'Connor")]
public void PreservesSpanishNameParticlesAndAccents(string source, string expected)
{
const string marker = "ctl00_lblNombreUsuario";
InstitutionalProfile? profile = SguProfileParser.ParseMenu(
$"<span id=\"{marker}\">{source}</span>");
Assert.NotNull(profile);
Assert.Equal(expected, profile.DisplayName);
}
[Fact]
public void RejectsReplacementCharactersInsteadOfWritingCorruptMetadata()
{
const string html = """
<span id="ctl00_contenedor_decEncabezado_lblNombre">017045 - JESS ROSALES</span>
<span id="ctl00_contenedor_decEncabezado_lblPuesto">ANALISTA DE INMERSIN</span>
""";
InstitutionalProfile? profile = SguProfileParser.ParseAdministrative(html, "017045");
Assert.NotNull(profile);
Assert.Null(profile.DisplayName);
Assert.Null(profile.JobTitle);
Assert.Equal("017045", profile.EmployeeNumber);
}
[Fact]
public void MissingKnownFieldsProducesNoProfile()
{
Assert.Null(SguProfileParser.ParseMenu("<html><body>Portal SGU</body></html>"));
Assert.Null(SguProfileParser.ParseAdministrative(
"<html><body>Portal SGU</body></html>",
"017045"));
}
}