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
DATOS NO REQUERIDOS
"""; 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 ParsesTheRequiredStudentIdentityCareerAndAddressFields() { const string html = """
123456 MARÍA DEL CARMEN DE LA FUENTE O'CONNOR ALUMNA@LASALLE.MX DATO-SENSIBLE-QUE-NO-DEBE-EXTRAERSE
LICENCIATURA EN INGENIERÍA CIBERNÉTICA Y SISTEMAS COMPUTACIO NALES
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")); } }