Files
kompas3d-mcp/tools/tests/KompasMcpBootstrap.Tests.ps1
T

102 lines
5.0 KiB
PowerShell

BeforeAll {
Import-Module (Join-Path $PSScriptRoot '..' '..' 'plugin' 'scripts' 'KompasMcpBootstrap.psm1') -Force
function New-TempRoot {
$root = Join-Path ([System.IO.Path]::GetTempPath()) ("kompasmcp_" + [guid]::NewGuid().ToString('N'))
New-Item -ItemType Directory -Path $root -Force | Out-Null
return $root
}
# Готовит zip с «сервером» и возвращает лок с настоящим SHA256.
function New-FakeRelease([string] $Root, [string] $Version) {
$payload = Join-Path $Root 'payload'
New-Item -ItemType Directory -Path $payload -Force | Out-Null
Set-Content -LiteralPath (Join-Path $payload 'kompas-mcp.exe') -Value 'not-a-real-exe' -Encoding ascii
$zip = Join-Path $Root 'release.zip'
Compress-Archive -Path (Join-Path $payload '*') -DestinationPath $zip -Force
Remove-Item -LiteralPath $payload -Recurse -Force
$sha = (Get-FileHash -LiteralPath $zip -Algorithm SHA256).Hash.ToLowerInvariant()
return [pscustomobject]@{
Zip = $zip
Lock = [pscustomobject]@{ version = $Version; sourceSha = 'deadbeef'; url = "file:///$zip"; sha256 = $sha }
}
}
}
Describe 'Install-KompasMcpServer' {
It 'ставит сервер, пишет маркер и возвращает путь к каталогу версии' {
$root = New-TempRoot
try {
$rel = New-FakeRelease -Root $root -Version '1.0.0'
$installRoot = Join-Path $root 'install'
$dir = Install-KompasMcpServer -Lock $rel.Lock -InstallRoot $installRoot -Downloader {
param($Url, $Destination) Copy-Item -LiteralPath $rel.Zip -Destination $Destination -Force
}
$dir | Should -Be (Join-Path $installRoot '1.0.0')
Test-Path -LiteralPath (Join-Path $dir 'kompas-mcp.exe') | Should -BeTrue
(Get-Content -LiteralPath (Join-Path $dir 'install.json') -Raw | ConvertFrom-Json).sha256 |
Should -Be $rel.Lock.sha256
} finally { Remove-Item -LiteralPath $root -Recurse -Force -ErrorAction SilentlyContinue }
}
It 'отказывается ставить при несовпадении SHA256 и не оставляет каталог версии' {
$root = New-TempRoot
try {
$rel = New-FakeRelease -Root $root -Version '1.0.0'
$rel.Lock.sha256 = '0' * 64
$installRoot = Join-Path $root 'install'
{ Install-KompasMcpServer -Lock $rel.Lock -InstallRoot $installRoot -Downloader {
param($Url, $Destination) Copy-Item -LiteralPath $rel.Zip -Destination $Destination -Force
} } | Should -Throw '*SHA256*'
Test-Path -LiteralPath (Join-Path $installRoot '1.0.0') | Should -BeFalse
} finally { Remove-Item -LiteralPath $root -Recurse -Force -ErrorAction SilentlyContinue }
}
It 'не скачивает повторно, если установка уже годная' {
$root = New-TempRoot
try {
$rel = New-FakeRelease -Root $root -Version '1.0.0'
$installRoot = Join-Path $root 'install'
$script:calls = 0
$downloader = { param($Url, $Destination) $script:calls++; Copy-Item -LiteralPath $rel.Zip -Destination $Destination -Force }
Install-KompasMcpServer -Lock $rel.Lock -InstallRoot $installRoot -Downloader $downloader | Out-Null
Install-KompasMcpServer -Lock $rel.Lock -InstallRoot $installRoot -Downloader $downloader | Out-Null
$script:calls | Should -Be 1
} finally { Remove-Item -LiteralPath $root -Recurse -Force -ErrorAction SilentlyContinue }
}
It 'считает установку негодной, если маркер не совпадает с локом' {
$root = New-TempRoot
try {
$rel = New-FakeRelease -Root $root -Version '1.0.0'
$installRoot = Join-Path $root 'install'
$dir = Install-KompasMcpServer -Lock $rel.Lock -InstallRoot $installRoot -Downloader {
param($Url, $Destination) Copy-Item -LiteralPath $rel.Zip -Destination $Destination -Force
}
Set-Content -LiteralPath (Join-Path $dir 'install.json') -Value '{"version":"1.0.0","sha256":"нечто"}' -Encoding utf8
Test-KompasMcpInstall -Directory $dir -Lock $rel.Lock | Should -BeFalse
} finally { Remove-Item -LiteralPath $root -Recurse -Force -ErrorAction SilentlyContinue }
}
}
Describe 'Read-KompasMcpLock' {
It 'падает внятно, когда релиза ещё нет' {
$root = New-TempRoot
try {
$path = Join-Path $root 'server.lock.json'
Set-Content -LiteralPath $path -Value '{"version":"0.0.0","sourceSha":"","url":"","sha256":""}' -Encoding utf8
{ Read-KompasMcpLock -Path $path } | Should -Throw '*релиз*'
} finally { Remove-Item -LiteralPath $root -Recurse -Force -ErrorAction SilentlyContinue }
}
}