vscode-adapter icon indicating copy to clipboard operation
vscode-adapter copied to clipboard

Template placeholders not expanded the same way as in pester itself

Open csandfeld opened this issue 11 months ago • 2 comments

There is a mismatch between how

As an example these tests ...

Template.tests.ps1

BeforeDiscovery {
    $arrayOfHashtables = @(
        @{ Emoji = '🌵' ; Description = 'cactus' }
        @{ Emoji = '🦒' ; Description = 'giraffe' }
        @{ Emoji = '🍎' ; Description = 'apple' }
        @{ Emoji = '🐧' ; Description = 'penguin' }
        @{ Emoji = '😊' ; Description = 'smiling face with smiling eyes' }
    )

    $arrayOfObjects = @(
        [pscustomobject]@{ Emoji = '🌵' ; Description = 'cactus' }
        [pscustomobject]@{ Emoji = '🦒' ; Description = 'giraffe' }
        [pscustomobject]@{ Emoji = '🍎' ; Description = 'apple' }
        [pscustomobject]@{ Emoji = '🐧' ; Description = 'penguin' }
        [pscustomobject]@{ Emoji = '😊' ; Description = 'smiling face with smiling eyes' }
    )
}


Describe 'Template expansion' {
    Context 'Array of hashtables' {
        It 'Using PropertyName:   Returns <Emoji> (<Description>)' -ForEach $arrayOfHashtables {}
        It 'Using _.PropertyName: Returns <_.Emoji> (<_.Description>)' -ForEach $arrayOfHashtables {}
    }

    Context 'Array of objects' {
        It 'Using PropertyName:   Returns <Emoji> (<Description>)' -ForEach $arrayOfObjects {}
        It 'Using _.PropertyName: Returns <_.Emoji> (<_.Description>)' -ForEach $arrayOfObjects {}
    }
}

... are expanded and rendered like this by the "Pester Tests" extension:

image

... whereas they are expanded and rendered like this by Pester:

image

PowerShell version (tested with PS5 as well)

$PSVersionTable

Name                           Value
----                           -----
PSVersion                      7.4.1
PSEdition                      Core
GitCommitId                    7.4.1
OS                             Microsoft Windows 10.0.22631
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

Pester Tests Extension version

Published
2023-07-31, 06:15:27
Last released
2023-08-01, 17:24:12
Last updated
2023-10-19, 19:25:47
Identifier
pspester.pester-test

Pester version

Get-Module -Name Pester

ModuleType Version    PreRelease Name                                ExportedCommands
---------- -------    ---------- ----                                ----------------
Script     5.5.0                 Pester                              ...

csandfeld avatar Mar 15 '24 13:03 csandfeld

It uses the same name processing as Pester, but using hooks it occurs prior to final output for performance, so there may be an issue here especially with that referencing of a property rather than a direct object.

Thanks for the note! I'll see if I can sort this but in the meantime look in the tests directly for tested/supported name cases. https://github.com/pester/vscode-adapter/blob/main/sample/Tests/Basic.Tests.ps1

JustinGrote avatar Mar 15 '24 15:03 JustinGrote

I also had some good success with just creating a HashTable manually, so that it could parse directly from a template in the meantime Previously, I was trying to use } -ForEach $AllAccountsT2 and Context "<_.GivenName> <_.SurName>-<_.SamAccountName>" {, but it was not populating any of the templates since they relied on Properties off the template.

To work around that I just created a HashTable from each returned case, then fed that Array of HashTables to the next block, and everything worked well for me and the templates filled in.

Describe "Tier 2 Accounts" {
    BeforeDiscovery -Scriptblock {
        $AllAccountsT2 = Get-ADUser -SearchBase 'OU=Tier 2,DC=CompanyDom,DC=org' -Filter * -Properties *
        $AllAccountsT2HashT = $AllAccountsT2 | Foreach {
            @{
                GivenName       = $_.GivenName
                SurName         = $_.SurName
                SamAccountName  = $_.SamAccountName
                CurrAdUserObj   = $_
            }
        }
    }
    Context "<GivenName> <SurName> - <SamAccountName> " {
        IT "tests" {} 
    } -ForEach $AllAccountsT2HashT
}

I'm passing $CurrAdUserObj so that I can be lazy inside my tests and just call for other attributes like $CurrAdUserObj.MemberOf or $CurrAdUserObj.DisplayName without having them declared in the "full" hashtable passed in.

Before, with the properties, these were just $_.MemberOf and $_.DisplayName, but it isn't much trouble with the $CurrAdUserObj to use

PsychoData avatar Aug 15 '24 18:08 PsychoData