192 lines
5 KiB
PowerShell
Executable file
192 lines
5 KiB
PowerShell
Executable file
#!/usr/bin/env pwsh
|
|
# Unit tests for un.ps1 - tests internal functions without API calls
|
|
|
|
$passed = 0
|
|
$failed = 0
|
|
|
|
function Test-Case {
|
|
param([string]$Name, [scriptblock]$Code)
|
|
|
|
try {
|
|
& $Code
|
|
Write-Host " ✓ $Name"
|
|
$script:passed++
|
|
}
|
|
catch {
|
|
Write-Host " ✗ $Name"
|
|
Write-Host " $_"
|
|
$script:failed++
|
|
}
|
|
}
|
|
|
|
function Assert-Equal {
|
|
param($Actual, $Expected)
|
|
if ($Actual -ne $Expected) {
|
|
throw "Expected '$Expected' but got '$Actual'"
|
|
}
|
|
}
|
|
|
|
function Assert-NotEqual {
|
|
param($A, $B)
|
|
if ($A -eq $B) {
|
|
throw "Expected values to be different but both were '$A'"
|
|
}
|
|
}
|
|
|
|
function Assert-Contains {
|
|
param([string]$Str, [string]$Substr)
|
|
if (-not $Str.Contains($Substr)) {
|
|
throw "Expected '$Str' to contain '$Substr'"
|
|
}
|
|
}
|
|
|
|
function Assert-True {
|
|
param($Val)
|
|
if (-not $Val) {
|
|
throw "Expected true but got false"
|
|
}
|
|
}
|
|
|
|
# Extension mapping
|
|
$ExtMap = @{
|
|
".py" = "python"; ".js" = "javascript"; ".ts" = "typescript"
|
|
".rb" = "ruby"; ".php" = "php"; ".pl" = "perl"; ".lua" = "lua"
|
|
".sh" = "bash"; ".go" = "go"; ".rs" = "rust"; ".c" = "c"
|
|
".cpp" = "cpp"; ".java" = "java"; ".kt" = "kotlin"
|
|
".hs" = "haskell"; ".clj" = "clojure"; ".erl" = "erlang"
|
|
".ex" = "elixir"; ".jl" = "julia"; ".ps1" = "powershell"
|
|
}
|
|
|
|
Write-Host "`n=== Extension Mapping Tests ==="
|
|
|
|
Test-Case "Python extension maps correctly" {
|
|
Assert-Equal $ExtMap[".py"] "python"
|
|
}
|
|
|
|
Test-Case "PowerShell extension maps correctly" {
|
|
Assert-Equal $ExtMap[".ps1"] "powershell"
|
|
}
|
|
|
|
Test-Case "JavaScript extension maps correctly" {
|
|
Assert-Equal $ExtMap[".js"] "javascript"
|
|
}
|
|
|
|
Test-Case "Go extension maps correctly" {
|
|
Assert-Equal $ExtMap[".go"] "go"
|
|
}
|
|
|
|
Test-Case "Ruby extension maps correctly" {
|
|
Assert-Equal $ExtMap[".rb"] "ruby"
|
|
}
|
|
|
|
Write-Host "`n=== HMAC Signature Tests ==="
|
|
|
|
function Get-HmacSha256 {
|
|
param([string]$Secret, [string]$Message)
|
|
|
|
$hmac = New-Object System.Security.Cryptography.HMACSHA256
|
|
$hmac.Key = [System.Text.Encoding]::UTF8.GetBytes($Secret)
|
|
$hash = $hmac.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($Message))
|
|
return [BitConverter]::ToString($hash).Replace("-", "").ToLower()
|
|
}
|
|
|
|
Test-Case "HMAC-SHA256 generates 64 character hex string" {
|
|
$sig = Get-HmacSha256 "test-secret" "test-message"
|
|
Assert-Equal $sig.Length 64
|
|
}
|
|
|
|
Test-Case "Same input produces same signature" {
|
|
$sig1 = Get-HmacSha256 "key" "msg"
|
|
$sig2 = Get-HmacSha256 "key" "msg"
|
|
Assert-Equal $sig1 $sig2
|
|
}
|
|
|
|
Test-Case "Different secrets produce different signatures" {
|
|
$sig1 = Get-HmacSha256 "key1" "msg"
|
|
$sig2 = Get-HmacSha256 "key2" "msg"
|
|
Assert-NotEqual $sig1 $sig2
|
|
}
|
|
|
|
Test-Case "Signature format verification" {
|
|
$timestamp = "1704067200"
|
|
$method = "POST"
|
|
$endpoint = "/execute"
|
|
$body = '{"language":"python"}'
|
|
|
|
$message = "$timestamp`:$method`:$endpoint`:$body"
|
|
|
|
Assert-True $message.StartsWith($timestamp)
|
|
Assert-Contains $message ":POST:"
|
|
Assert-Contains $message ":/execute:"
|
|
}
|
|
|
|
Write-Host "`n=== Language Detection Tests ==="
|
|
|
|
Test-Case "Detect language from .ps1 extension" {
|
|
$filename = "script.ps1"
|
|
$ext = [System.IO.Path]::GetExtension($filename)
|
|
Assert-Equal $ExtMap[$ext] "powershell"
|
|
}
|
|
|
|
Test-Case "Python shebang detection" {
|
|
$content = "#!/usr/bin/env python3`nprint('hello')"
|
|
$firstLine = $content.Split("`n")[0]
|
|
Assert-True $firstLine.StartsWith("#!")
|
|
Assert-Contains $firstLine "python"
|
|
}
|
|
|
|
Write-Host "`n=== Argument Parsing Tests ==="
|
|
|
|
Test-Case "Parse -e KEY=VALUE format" {
|
|
$arg = "DEBUG=1"
|
|
$parts = $arg.Split("=", 2)
|
|
$key = $parts[0]
|
|
$value = $parts[1]
|
|
Assert-Equal $key "DEBUG"
|
|
Assert-Equal $value "1"
|
|
}
|
|
|
|
Test-Case "Parse -e KEY=VALUE with equals in value" {
|
|
$arg = "URL=https://example.com?foo=bar"
|
|
$parts = $arg.Split("=", 2)
|
|
$key = $parts[0]
|
|
$value = $parts[1]
|
|
Assert-Equal $key "URL"
|
|
Assert-Equal $value "https://example.com?foo=bar"
|
|
}
|
|
|
|
Write-Host "`n=== File Operations Tests ==="
|
|
|
|
Test-Case "Base64 encoding/decoding" {
|
|
$content = "print('hello world')"
|
|
$bytes = [System.Text.Encoding]::UTF8.GetBytes($content)
|
|
$encoded = [Convert]::ToBase64String($bytes)
|
|
$decoded = [System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($encoded))
|
|
Assert-Equal $decoded $content
|
|
}
|
|
|
|
Test-Case "Extract file basename" {
|
|
$path = "/home/user/project/script.ps1"
|
|
Assert-Equal ([System.IO.Path]::GetFileName($path)) "script.ps1"
|
|
}
|
|
|
|
Test-Case "Extract file extension" {
|
|
$path = "/home/user/project/script.ps1"
|
|
Assert-Equal ([System.IO.Path]::GetExtension($path)) ".ps1"
|
|
}
|
|
|
|
Write-Host "`n=== API Constants Tests ==="
|
|
|
|
Test-Case "API base URL format" {
|
|
$apiBase = "https://api.unsandbox.com"
|
|
Assert-True $apiBase.StartsWith("https://")
|
|
Assert-Contains $apiBase "unsandbox.com"
|
|
}
|
|
|
|
# Summary
|
|
Write-Host "`n=== Summary ==="
|
|
Write-Host "Passed: $passed"
|
|
Write-Host "Failed: $failed"
|
|
Write-Host "Total: $($passed + $failed)"
|
|
|
|
exit $(if ($failed -gt 0) { 1 } else { 0 })
|