functions/_newExtensionLockEntry.Tests.ps1

# <copyright file="_newExtensionLockEntry.Tests.ps1" company="Endjin Limited">
# Copyright (c) Endjin Limited. All rights reserved.
# </copyright>

BeforeAll {
    # sut
    . $PSCommandPath.Replace('.Tests.ps1','.ps1')

    Set-StrictMode -Version Latest
}

Describe '_newExtensionLockEntry' {

    Context 'A directly requested extension' {
        BeforeAll {
            $result = _newExtensionLockEntry -SourceType 'git' `
                                             -Source @{ repository = 'https://example.com/repo.git'; folderPath = 'module' } `
                                             -Requested 'main'
        }

        It 'Records the source, with the type first and the other details in a consistent order' {
            @($result.source.Keys) | Should -Be @('type', 'folderPath', 'repository')
            $result.source.type | Should -Be 'git'
            $result.source.repository | Should -Be 'https://example.com/repo.git'
            $result.source.folderPath | Should -Be 'module'
        }

        It 'Records the requested version' {
            $result.requested | Should -Be 'main'
        }

        It 'Has no resolved version yet' {
            $result.Contains('resolved') | Should -Be $true
            $result.resolved | Should -BeNullOrEmpty
        }

        It 'Records that the extension is a direct dependency' {
            $result.direct | Should -Be $true
            $result.requiredBy.Count | Should -Be 0
        }

        It 'Uses a consistent key order' {
            @($result.Keys) | Should -Be @('source', 'requested', 'resolved', 'direct', 'requiredBy')
        }
    }

    Context 'A dependency of another extension' {
        It 'Records which extension requires it' {
            $result = _newExtensionLockEntry -SourceType 'psrepository' -Source @{ repository = 'PSGallery' } -RequiredBy 'ZeroFailed.Build.DotNet'

            $result.direct | Should -Be $false
            $result.requiredBy | Should -Be @('ZeroFailed.Build.DotNet')
        }
    }

    Context 'No requested version' {
        It 'Records the requested version as null' {
            $result = _newExtensionLockEntry -SourceType 'psrepository' -Source @{ repository = 'PSGallery' } -Requested $null

            $result.requested | Should -BeNullOrEmpty
            $null -eq $result.requested | Should -Be $true
        }
    }

    Context 'Invalid source type' {
        It 'Throws an error' {
            { _newExtensionLockEntry -SourceType 'oci' -Source @{} } | Should -Throw
        }
    }
}