296 lines
11 KiB
PowerShell
296 lines
11 KiB
PowerShell
Describe "run-sleep.ps1 runner" {
|
|
BeforeAll {
|
|
$script = Join-Path $PSScriptRoot "..\plugins\run-sleep.ps1"
|
|
$tempDir = [System.IO.Path]::GetTempFileName()
|
|
Remove-Item $tempDir
|
|
New-Item -ItemType Directory -Path $tempDir | Out-Null
|
|
|
|
# Detect a working python to bypass Windows Store alias issues
|
|
if (-not $env:SKILLOPT_SLEEP_PYTHON) {
|
|
if (Test-Path "C:\Python314\python.exe") {
|
|
$env:SKILLOPT_SLEEP_PYTHON = "C:\Python314\python.exe"
|
|
} elseif (Test-Path "C:\Python313\python.exe") {
|
|
$env:SKILLOPT_SLEEP_PYTHON = "C:\Python313\python.exe"
|
|
} elseif (Test-Path "C:\Python312\python.exe") {
|
|
$env:SKILLOPT_SLEEP_PYTHON = "C:\Python312\python.exe"
|
|
} elseif (Test-Path "C:\Python311\python.exe") {
|
|
$env:SKILLOPT_SLEEP_PYTHON = "C:\Python311\python.exe"
|
|
} elseif (Test-Path "C:\Python310\python.exe") {
|
|
$env:SKILLOPT_SLEEP_PYTHON = "C:\Python310\python.exe"
|
|
}
|
|
}
|
|
}
|
|
|
|
AfterAll {
|
|
if (Test-Path $tempDir) {
|
|
Remove-Item -Recurse -Force $tempDir
|
|
}
|
|
}
|
|
|
|
It "runs successfully in source checkout mode" {
|
|
$env:SKILLOPT_SLEEP_REPO = Resolve-Path (Join-Path $PSScriptRoot "..")
|
|
# Run help
|
|
$result = powershell -File $script "--help" 2>&1
|
|
$LASTEXITCODE | Should Be 0
|
|
$result | Out-String | Should Match "skillopt_sleep"
|
|
}
|
|
|
|
It "falls back to CLI on PATH" {
|
|
# Create a temp dir for isolated testing
|
|
$sandbox = Join-Path $tempDir "cli_fallback"
|
|
New-Item -ItemType Directory -Path $sandbox | Out-Null
|
|
$scriptCopy = Join-Path $sandbox "run-sleep.ps1"
|
|
Copy-Item $script $scriptCopy
|
|
|
|
# Create fake CLI
|
|
$binDir = Join-Path $sandbox "bin"
|
|
New-Item -ItemType Directory -Path $binDir | Out-Null
|
|
$fakeCli = Join-Path $binDir "skillopt-sleep.cmd"
|
|
"@echo off`r`necho fake-cli invoked %*`r`nexit /b 0" | Out-File -FilePath $fakeCli -Encoding ascii
|
|
|
|
# Save existing env vars
|
|
$oldPath = $env:PATH
|
|
$oldRepo = $env:SKILLOPT_SLEEP_REPO
|
|
$oldPlugin = $env:CLAUDE_PLUGIN_ROOT
|
|
|
|
$env:PATH = "$binDir;$oldPath"
|
|
$env:SKILLOPT_SLEEP_REPO = $null
|
|
$env:CLAUDE_PLUGIN_ROOT = $null
|
|
|
|
$oldLocation = Get-Location
|
|
Set-Location $sandbox
|
|
try {
|
|
$result = powershell -File $scriptCopy "status" 2>&1
|
|
$LASTEXITCODE | Should Be 0
|
|
$result | Out-String | Should Match "fake-cli invoked status"
|
|
}
|
|
finally {
|
|
Set-Location $oldLocation
|
|
$env:PATH = $oldPath
|
|
$env:SKILLOPT_SLEEP_REPO = $oldRepo
|
|
$env:CLAUDE_PLUGIN_ROOT = $oldPlugin
|
|
}
|
|
}
|
|
|
|
It "propagates exit code on failure" {
|
|
$env:SKILLOPT_SLEEP_REPO = Resolve-Path (Join-Path $PSScriptRoot "..")
|
|
# Run a non-existent command to trigger python module failure
|
|
$result = powershell -File $script "non-existent-subcommand" 2>&1
|
|
$LASTEXITCODE | Should Not Be 0
|
|
}
|
|
|
|
It "handles paths containing spaces correctly" {
|
|
# Create path containing spaces
|
|
$spaceDir = Join-Path $tempDir "path with spaces"
|
|
New-Item -ItemType Directory -Path $spaceDir | Out-Null
|
|
$scriptCopy = Join-Path $spaceDir "run-sleep.ps1"
|
|
Copy-Item $script $scriptCopy
|
|
|
|
# Create fake CLI
|
|
$binDir = Join-Path $spaceDir "bin"
|
|
New-Item -ItemType Directory -Path $binDir | Out-Null
|
|
$fakeCli = Join-Path $binDir "skillopt-sleep.cmd"
|
|
"@echo off`r`necho fake-cli invoked %*`r`nexit /b 0" | Out-File -FilePath $fakeCli -Encoding ascii
|
|
|
|
# Save env
|
|
$oldPath = $env:PATH
|
|
$oldRepo = $env:SKILLOPT_SLEEP_REPO
|
|
$oldPlugin = $env:CLAUDE_PLUGIN_ROOT
|
|
|
|
$env:PATH = "$binDir;$oldPath"
|
|
$env:SKILLOPT_SLEEP_REPO = $null
|
|
$env:CLAUDE_PLUGIN_ROOT = $null
|
|
|
|
$oldLocation = Get-Location
|
|
Set-Location $spaceDir
|
|
try {
|
|
$result = powershell -File $scriptCopy "status" 2>&1
|
|
$LASTEXITCODE | Should Be 0
|
|
$result | Out-String | Should Match "fake-cli invoked status"
|
|
}
|
|
finally {
|
|
Set-Location $oldLocation
|
|
$env:PATH = $oldPath
|
|
$env:SKILLOPT_SLEEP_REPO = $oldRepo
|
|
$env:CLAUDE_PLUGIN_ROOT = $oldPlugin
|
|
}
|
|
}
|
|
}
|
|
|
|
Describe "run-sleep.cmd runner" {
|
|
BeforeAll {
|
|
$script = Join-Path $PSScriptRoot "..\plugins\run-sleep.cmd"
|
|
$tempDir = [System.IO.Path]::GetTempFileName()
|
|
Remove-Item $tempDir
|
|
New-Item -ItemType Directory -Path $tempDir | Out-Null
|
|
|
|
# Detect a working python to bypass Windows Store alias issues
|
|
if (-not $env:SKILLOPT_SLEEP_PYTHON) {
|
|
if (Test-Path "C:\Python314\python.exe") {
|
|
$env:SKILLOPT_SLEEP_PYTHON = "C:\Python314\python.exe"
|
|
} elseif (Test-Path "C:\Python313\python.exe") {
|
|
$env:SKILLOPT_SLEEP_PYTHON = "C:\Python313\python.exe"
|
|
} elseif (Test-Path "C:\Python312\python.exe") {
|
|
$env:SKILLOPT_SLEEP_PYTHON = "C:\Python312\python.exe"
|
|
} elseif (Test-Path "C:\Python311\python.exe") {
|
|
$env:SKILLOPT_SLEEP_PYTHON = "C:\Python311\python.exe"
|
|
} elseif (Test-Path "C:\Python310\python.exe") {
|
|
$env:SKILLOPT_SLEEP_PYTHON = "C:\Python310\python.exe"
|
|
}
|
|
}
|
|
}
|
|
|
|
AfterAll {
|
|
if (Test-Path $tempDir) {
|
|
Remove-Item -Recurse -Force $tempDir
|
|
}
|
|
}
|
|
|
|
It "runs successfully in source checkout mode" {
|
|
$env:SKILLOPT_SLEEP_REPO = Resolve-Path (Join-Path $PSScriptRoot "..")
|
|
# Run help
|
|
$result = cmd.exe /c $script "--help" 2>&1
|
|
$LASTEXITCODE | Should Be 0
|
|
$result | Out-String | Should Match "skillopt_sleep"
|
|
}
|
|
|
|
It "falls back to CLI on PATH" {
|
|
# Create a temp dir for isolated testing
|
|
$sandbox = Join-Path $tempDir "cmd_cli_fallback"
|
|
New-Item -ItemType Directory -Path $sandbox | Out-Null
|
|
$scriptCopy = Join-Path $sandbox "run-sleep.cmd"
|
|
Copy-Item $script $scriptCopy
|
|
|
|
# Create fake CLI
|
|
$binDir = Join-Path $sandbox "bin"
|
|
New-Item -ItemType Directory -Path $binDir | Out-Null
|
|
$fakeCli = Join-Path $binDir "skillopt-sleep.cmd"
|
|
"@echo off`r`necho fake-cli invoked %*`r`nexit /b 0" | Out-File -FilePath $fakeCli -Encoding ascii
|
|
|
|
# Save existing env vars
|
|
$oldPath = $env:PATH
|
|
$oldRepo = $env:SKILLOPT_SLEEP_REPO
|
|
$oldPlugin = $env:CLAUDE_PLUGIN_ROOT
|
|
|
|
$env:PATH = "$binDir;$oldPath"
|
|
$env:SKILLOPT_SLEEP_REPO = $null
|
|
$env:CLAUDE_PLUGIN_ROOT = $null
|
|
|
|
$oldLocation = Get-Location
|
|
Set-Location $sandbox
|
|
try {
|
|
$result = cmd.exe /c $scriptCopy "status" 2>&1
|
|
$LASTEXITCODE | Should Be 0
|
|
$result | Out-String | Should Match "fake-cli invoked status"
|
|
}
|
|
finally {
|
|
Set-Location $oldLocation
|
|
$env:PATH = $oldPath
|
|
$env:SKILLOPT_SLEEP_REPO = $oldRepo
|
|
$env:CLAUDE_PLUGIN_ROOT = $oldPlugin
|
|
}
|
|
}
|
|
|
|
It "falls back to importable module" {
|
|
$sandbox = Join-Path $tempDir "cmd_module_fallback"
|
|
New-Item -ItemType Directory -Path $sandbox | Out-Null
|
|
$scriptCopy = Join-Path $sandbox "run-sleep.cmd"
|
|
Copy-Item $script $scriptCopy
|
|
|
|
$oldRepo = $env:SKILLOPT_SLEEP_REPO
|
|
$oldPlugin = $env:CLAUDE_PLUGIN_ROOT
|
|
|
|
$env:SKILLOPT_SLEEP_REPO = $null
|
|
$env:CLAUDE_PLUGIN_ROOT = $null
|
|
|
|
$oldPythonPath = $env:PYTHONPATH
|
|
$env:PYTHONPATH = Resolve-Path (Join-Path $PSScriptRoot "..")
|
|
|
|
$oldLocation = Get-Location
|
|
Set-Location $sandbox
|
|
try {
|
|
$result = cmd.exe /c $scriptCopy "--help" 2>&1
|
|
$LASTEXITCODE | Should Be 0
|
|
$result | Out-String | Should Match "skillopt_sleep"
|
|
}
|
|
finally {
|
|
Set-Location $oldLocation
|
|
$env:SKILLOPT_SLEEP_REPO = $oldRepo
|
|
$env:CLAUDE_PLUGIN_ROOT = $oldPlugin
|
|
$env:PYTHONPATH = $oldPythonPath
|
|
}
|
|
}
|
|
|
|
It "fails when nothing is found" {
|
|
$sandbox = Join-Path $tempDir "cmd_failure"
|
|
New-Item -ItemType Directory -Path $sandbox | Out-Null
|
|
$scriptCopy = Join-Path $sandbox "run-sleep.cmd"
|
|
Copy-Item $script $scriptCopy
|
|
|
|
$oldRepo = $env:SKILLOPT_SLEEP_REPO
|
|
$oldPlugin = $env:CLAUDE_PLUGIN_ROOT
|
|
$oldPath = $env:PATH
|
|
|
|
$env:SKILLOPT_SLEEP_REPO = $null
|
|
$env:CLAUDE_PLUGIN_ROOT = $null
|
|
|
|
$emptyBin = Join-Path $sandbox "empty_bin"
|
|
New-Item -ItemType Directory -Path $emptyBin | Out-Null
|
|
$env:PATH = $emptyBin
|
|
|
|
$oldLocation = Get-Location
|
|
Set-Location $sandbox
|
|
try {
|
|
$result = cmd.exe /c $scriptCopy "status" 2>&1
|
|
$LASTEXITCODE | Should Not Be 0
|
|
$result | Out-String | Should Match "could not locate the skillopt_sleep package"
|
|
}
|
|
finally {
|
|
Set-Location $oldLocation
|
|
$env:SKILLOPT_SLEEP_REPO = $oldRepo
|
|
$env:CLAUDE_PLUGIN_ROOT = $oldPlugin
|
|
$env:PATH = $oldPath
|
|
}
|
|
}
|
|
|
|
It "propagates exit code on failure" {
|
|
$env:SKILLOPT_SLEEP_REPO = Resolve-Path (Join-Path $PSScriptRoot "..")
|
|
$result = cmd.exe /c $script "non-existent-subcommand" 2>&1
|
|
$LASTEXITCODE | Should Not Be 0
|
|
}
|
|
|
|
It "handles paths containing spaces correctly" {
|
|
$spaceDir = Join-Path $tempDir "cmd path with spaces"
|
|
New-Item -ItemType Directory -Path $spaceDir | Out-Null
|
|
$scriptCopy = Join-Path $spaceDir "run-sleep.cmd"
|
|
Copy-Item $script $scriptCopy
|
|
|
|
$binDir = Join-Path $spaceDir "bin"
|
|
New-Item -ItemType Directory -Path $binDir | Out-Null
|
|
$fakeCli = Join-Path $binDir "skillopt-sleep.cmd"
|
|
"@echo off`r`necho fake-cli invoked %*`r`nexit /b 0" | Out-File -FilePath $fakeCli -Encoding ascii
|
|
|
|
$oldPath = $env:PATH
|
|
$oldRepo = $env:SKILLOPT_SLEEP_REPO
|
|
$oldPlugin = $env:CLAUDE_PLUGIN_ROOT
|
|
|
|
$env:PATH = "$binDir;$oldPath"
|
|
$env:SKILLOPT_SLEEP_REPO = $null
|
|
$env:CLAUDE_PLUGIN_ROOT = $null
|
|
|
|
$oldLocation = Get-Location
|
|
Set-Location $spaceDir
|
|
try {
|
|
$result = cmd.exe /c $scriptCopy "status" 2>&1
|
|
$LASTEXITCODE | Should Be 0
|
|
$result | Out-String | Should Match "fake-cli invoked status"
|
|
}
|
|
finally {
|
|
Set-Location $oldLocation
|
|
$env:PATH = $oldPath
|
|
$env:SKILLOPT_SLEEP_REPO = $oldRepo
|
|
$env:CLAUDE_PLUGIN_ROOT = $oldPlugin
|
|
}
|
|
}
|
|
}
|