$repositoryRoot = (Resolve-Path (Join-Path $PSScriptRoot '..')).Path $wallpaperScript = Join-Path $repositoryRoot 'scripts\Set-SguWelcomeWallpaper.ps1' $source = Get-Content -LiteralPath $wallpaperScript -Raw $tokens = $null $parseErrors = $null $ast = [Management.Automation.Language.Parser]::ParseFile($wallpaperScript, [ref]$tokens, [ref]$parseErrors) if ($parseErrors.Count) { throw ($parseErrors -join [Environment]::NewLine) } $lookup = $ast.Find({ param($node) $node -is [Management.Automation.Language.FunctionDefinitionAst] -and $node.Name -eq 'Get-DirectoryWelcomeMetadata' }, $true) function Invoke-WelcomeFixture { param( $DirectoryGender, [string]$ExplicitGender, [string]$DirectoryLocation = 'Sala de pruebas', [string]$DirectoryOu = 'Laboratorio', [string]$MachineLocation, [string]$MachineOu ) # Replace only the external directory lookup. Execute the actual script, # including its validated parameters, metadata assignment and JPEG renderer. $fixtureJson = [pscustomobject]@{ DisplayName = 'Usuario de prueba' Gender = $DirectoryGender Location = $DirectoryLocation OrganizationalUnit = $DirectoryOu } | ConvertTo-Json -Compress $fixtureFunction = 'function Get-DirectoryWelcomeMetadata { param($UserName, $MachineName); ConvertFrom-Json ''' + $fixtureJson.Replace("'", "''") + ''' }' $fixtureSource = $source.Remove($lookup.Extent.StartOffset, $lookup.Extent.EndOffset - $lookup.Extent.StartOffset). Insert($lookup.Extent.StartOffset, $fixtureFunction) $testScript = Join-Path $TestDrive ('wallpaper-' + [Guid]::NewGuid().ToString('N') + '.ps1') [IO.File]::WriteAllText($testScript, $fixtureSource, [Text.UTF8Encoding]::new($false)) $parameters = @{ BaseImagePath = Join-Path $repositoryRoot 'assets\branding\darkblue.jpg' FontsPath = Join-Path $repositoryRoot 'assets\branding\fonts' OutputPath = Join-Path $TestDrive ([IO.Path]::GetFileNameWithoutExtension($testScript) + '.jpg') CanvasWidth = 640 CanvasHeight = 480 SkipApply = $true } if ($ExplicitGender) { $parameters.Gender = $ExplicitGender } $previousLocalAppData = $env:LOCALAPPDATA $previousMachineLocation = $env:SGU_WELCOME_LOCATION $previousMachineOu = $env:SGU_WELCOME_ORGANIZATIONAL_UNIT try { $env:LOCALAPPDATA = $TestDrive $env:SGU_WELCOME_LOCATION = $MachineLocation $env:SGU_WELCOME_ORGANIZATIONAL_UNIT = $MachineOu & $testScript @parameters } finally { $env:LOCALAPPDATA = $previousLocalAppData $env:SGU_WELCOME_LOCATION = $previousMachineLocation $env:SGU_WELCOME_ORGANIZATIONAL_UNIT = $previousMachineOu } } Describe 'Welcome wallpaper with AD metadata' { It 'renders a neutral JPEG when AD has no gender' { $result = Invoke-WelcomeFixture -DirectoryGender $null $result.WelcomeHeading | Should Be 'Te damos la bienvenida,' $result.Applied | Should Be $false $bitmap = [Drawing.Image]::FromFile($result.OutputPath) try { $bitmap.Width | Should Be 640; $bitmap.Height | Should Be 480 } finally { $bitmap.Dispose() } } It 'uses neutral wording for empty or unrecognized metadata' { foreach ($value in @('', 'Unknown')) { (Invoke-WelcomeFixture -DirectoryGender $value).WelcomeHeading | Should Be 'Te damos la bienvenida,' } } It 'keeps the gendered greetings for recognized directory values' { (Invoke-WelcomeFixture -DirectoryGender 'Female').WelcomeHeading | Should Be 'Bienvenida,' (Invoke-WelcomeFixture -DirectoryGender 'Male').WelcomeHeading | Should Be 'Bienvenido,' } It 'honors an explicit gender over directory metadata' { (Invoke-WelcomeFixture -DirectoryGender 'Female' -ExplicitGender 'Male').WelcomeHeading | Should Be 'Bienvenido,' } It 'renders the flexible classroom and immediate OU as an access label' { $result = Invoke-WelcomeFixture -DirectoryGender $null ` -DirectoryLocation 'Aula Flexible' ` -DirectoryOu 'Centro de Experiencia Digital' $result.LocationText | Should Be "Acceso al Aula Flexible`ndel Centro de Experiencia Digital." $result.LocationPrimaryText | Should Be 'Acceso al Aula Flexible' $result.LocationSecondaryText | Should Be 'del Centro de Experiencia Digital.' } It 'uses the requested neutral, masculine and feminine location wording' { $neutral = Invoke-WelcomeFixture -DirectoryGender $null ` -DirectoryLocation 'Sala de Aplicaciones' ` -DirectoryOu 'Laboratorio de Cómputo de Ingeniería' $neutral.LocationPrimaryText | Should Be 'Acceso a la Sala de Aplicaciones' $neutral.LocationSecondaryText | Should Be 'del Laboratorio de Cómputo de Ingeniería.' $male = Invoke-WelcomeFixture -DirectoryGender 'Male' ` -DirectoryLocation 'Aula Flexible' ` -DirectoryOu 'Centro de Experiencia Digital' $male.LocationPrimaryText | Should Be 'Estás ubicado en el Aula Flexible' $male.LocationSecondaryText | Should Be 'del Centro de Experiencia Digital.' $female = Invoke-WelcomeFixture -DirectoryGender 'Female' ` -DirectoryLocation 'Sala de Redes' ` -DirectoryOu 'Laboratorio de Cómputo de Ingeniería' $female.LocationPrimaryText | Should Be 'Estás ubicada en la Sala de Redes' $female.LocationSecondaryText | Should Be 'del Laboratorio de Cómputo de Ingeniería.' } It 'keeps machine location metadata when the GPO command has no location arguments' { $result = Invoke-WelcomeFixture -DirectoryGender $null ` -DirectoryLocation 'Sala de pruebas' ` -DirectoryOu 'Laboratorio' ` -MachineLocation 'Aula Flexible' ` -MachineOu 'Centro de Experiencia Digital' $result.LocationText | Should Be "Acceso al Aula Flexible`ndel Centro de Experiencia Digital." } It 'ships the logo inside the base image instead of compositing it at runtime' { $source | Should Not Match 'lasalle-logo-blanco|DrawImage.*logo|composite.*logo' $bitmap = [Drawing.Bitmap]::FromFile((Join-Path $repositoryRoot 'assets\branding\darkblue.jpg')) try { $whitePixels = 0 for ($x = 60; $x -lt 390; $x += 2) { for ($y = 45; $y -lt 175; $y += 2) { $pixel = $bitmap.GetPixel($x, $y) if ($pixel.R -gt 220 -and $pixel.G -gt 220 -and $pixel.B -gt 220) { $whitePixels++ } } } ($whitePixels -gt 250) | Should Be $true } finally { $bitmap.Dispose() } } }