102 lines
5.0 KiB
PowerShell
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 }
|
|
}
|
|
}
|