using SGU.AuthBroker.Core.Profiles;
using Xunit;
namespace SGU.AuthBroker.Core.Tests;
public sealed class SguProfileParserTests
{
[Fact]
public void ParsesOnlyTheRequiredAdministrativeFieldsFromTheInitialResponse()
{
const string html = """
017045 - JESÚS ALEJANDRO ROSALES GONZÁLEZ
SINDICALIZADO QUINCENAL (ACTIVO)
persona@lasalle.mx
ANALISTA DE PROYECTOS
FACULTAD DE INGENIERÍA
ESTE CAMPO NO DEBE EXTRAERSE
""";
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 = """
017045 - PERSONA INCORRECTA
incorrecta@lasalle.mx
""";
Assert.Null(SguProfileParser.ParseAdministrative(html, "999999"));
}
[Fact]
public void ParsesStructuredAdministrativeNameWithoutReadingOtherPersonalData()
{
const string html = """
1990
""";
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 = """
Seleccione...
CIUDAD DE MÉXICO
AZCAPOTZALCO
BENITO JUÁREZ
COLONIA DEL VALLE
""";
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()
{
const string html = """
123456
MARÍA DEL CARMEN
DE LA FUENTE
O'CONNOR
ALUMNA@LASALLE.MX
DATO-SENSIBLE-QUE-NO-DEBE-EXTRAERSE
AVENIDA DE LA UNIVERSIDAD 123
COLONIA DEL VALLE
CIUDAD DE MÉXICO
CIUDAD DE MÉXICO
ALCALDÍA BENITO JUÁREZ
8500
""";
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 = """
123456
PERSONA INCORRECTA
incorrecta@lasalle.mx
""";
Assert.Null(SguProfileParser.ParseStudent(html, "654321"));
}
[Fact]
public void UsesMunicipalityAsStudentCityWhenThePortalCityIsMissing()
{
const string html = """
123456
SAN PEDRO CHOLULA
72760
""";
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 = """
MARÍA & JOSÉ
""";
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(
$"{source} ");
Assert.NotNull(profile);
Assert.Equal(expected, profile.DisplayName);
}
[Fact]
public void RejectsReplacementCharactersInsteadOfWritingCorruptMetadata()
{
const string html = """
017045 - JES�S ROSALES
ANALISTA DE INMERSI�N
""";
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("Portal SGU"));
Assert.Null(SguProfileParser.ParseAdministrative(
"Portal SGU",
"017045"));
}
}