217 lines
6.4 KiB
Text
217 lines
6.4 KiB
Text
|
|
#!/usr/bin/env nu
|
||
|
|
|
||
|
|
# UpCloud provider server lifecycle integration tests (with mocks)
|
||
|
|
|
||
|
|
# Mock API responses loader
|
||
|
|
def load-mock-responses []: nothing -> record {
|
||
|
|
let mocks = (open ../../tests/mocks/mock_api_responses.json)
|
||
|
|
$mocks
|
||
|
|
}
|
||
|
|
|
||
|
|
# Mock: list servers
|
||
|
|
def mock-list-servers []: nothing -> list {
|
||
|
|
let mocks = (load-mock-responses)
|
||
|
|
$mocks.servers_list.servers
|
||
|
|
}
|
||
|
|
|
||
|
|
# Mock: get server info
|
||
|
|
def mock-server-info [hostname: string]: nothing -> record {
|
||
|
|
let mocks = (load-mock-responses)
|
||
|
|
# For testing, return first server if exists
|
||
|
|
if ($hostname == "test-server-1") {
|
||
|
|
$mocks.server_info.server
|
||
|
|
} else {
|
||
|
|
error make {msg: $"Server not found: ($hostname)"}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
# Mock: create server
|
||
|
|
def mock-create-server [name: string]: nothing -> record {
|
||
|
|
let mocks = (load-mock-responses)
|
||
|
|
$mocks.server_create_success.server
|
||
|
|
}
|
||
|
|
|
||
|
|
# Test framework
|
||
|
|
def test-result [name: string, passed: bool]: nothing -> record {
|
||
|
|
if $passed {
|
||
|
|
print $"✓ ($name)"
|
||
|
|
} else {
|
||
|
|
print $"✗ ($name)"
|
||
|
|
}
|
||
|
|
{name: $name, passed: $passed}
|
||
|
|
}
|
||
|
|
|
||
|
|
# Test: List servers
|
||
|
|
def test_list_servers []: nothing -> record {
|
||
|
|
let result = (do {
|
||
|
|
let servers = (mock-list-servers)
|
||
|
|
($servers | length) > 0
|
||
|
|
} | complete)
|
||
|
|
|
||
|
|
let passed = ($result.exit_code == 0 and $result.stdout)
|
||
|
|
test-result "list_servers: returns list" $passed
|
||
|
|
}
|
||
|
|
|
||
|
|
# Test: Server info structure
|
||
|
|
def test_server_info_structure []: nothing -> record {
|
||
|
|
let result = (do {
|
||
|
|
let server = (mock-server-info "test-server-1")
|
||
|
|
($server | has uuid) and ($server | has hostname) and ($server | has state)
|
||
|
|
} | complete)
|
||
|
|
|
||
|
|
let passed = ($result.exit_code == 0 and $result.stdout)
|
||
|
|
test-result "server_info: has required fields" $passed
|
||
|
|
}
|
||
|
|
|
||
|
|
# Test: Server hostname field
|
||
|
|
def test_server_hostname_field []: nothing -> record {
|
||
|
|
let result = (do {
|
||
|
|
let server = (mock-server-info "test-server-1")
|
||
|
|
$server.hostname
|
||
|
|
} | complete)
|
||
|
|
|
||
|
|
let passed = ($result.exit_code == 0 and $result.stdout == "test-server-1")
|
||
|
|
test-result "server_info: hostname matches request" $passed
|
||
|
|
}
|
||
|
|
|
||
|
|
# Test: Server state field
|
||
|
|
def test_server_state_field []: nothing -> record {
|
||
|
|
let result = (do {
|
||
|
|
let server = (mock-server-info "test-server-1")
|
||
|
|
$server.state
|
||
|
|
} | complete)
|
||
|
|
|
||
|
|
let passed = ($result.exit_code == 0 and $result.stdout == "started")
|
||
|
|
test-result "server_info: state is started" $passed
|
||
|
|
}
|
||
|
|
|
||
|
|
# Test: Server public IPs
|
||
|
|
def test_server_public_ips []: nothing -> record {
|
||
|
|
let result = (do {
|
||
|
|
let server = (mock-server-info "test-server-1")
|
||
|
|
{
|
||
|
|
has_interfaces: ($server | has networking)
|
||
|
|
has_interfaces_data: ($server.networking.interfaces? | default [] | length) > 0
|
||
|
|
}
|
||
|
|
} | complete)
|
||
|
|
|
||
|
|
let passed = ($result.exit_code == 0)
|
||
|
|
test-result "server_info: public IPs present" $passed
|
||
|
|
}
|
||
|
|
|
||
|
|
# Test: Server plan information
|
||
|
|
def test_server_plan_info []: nothing -> record {
|
||
|
|
let result = (do {
|
||
|
|
let server = (mock-server-info "test-server-1")
|
||
|
|
{
|
||
|
|
name: ($server.plan | default "")
|
||
|
|
cores: ($server.cpu_count | default 0)
|
||
|
|
memory: ($server.memory_amount | default 0)
|
||
|
|
}
|
||
|
|
} | complete)
|
||
|
|
|
||
|
|
let passed = ($result.exit_code == 0)
|
||
|
|
test-result "server_info: plan details available" $passed
|
||
|
|
}
|
||
|
|
|
||
|
|
# Test: Create server response structure
|
||
|
|
def test_create_server_response []: nothing -> record {
|
||
|
|
let result = (do {
|
||
|
|
let server = (mock-create-server "new-test-server")
|
||
|
|
{
|
||
|
|
has_uuid: ($server | has uuid)
|
||
|
|
has_hostname: ($server | has hostname)
|
||
|
|
has_state: ($server | has state)
|
||
|
|
}
|
||
|
|
} | complete)
|
||
|
|
|
||
|
|
let passed = ($result.exit_code == 0 and
|
||
|
|
$result.stdout.has_uuid and
|
||
|
|
$result.stdout.has_hostname and
|
||
|
|
$result.stdout.has_state)
|
||
|
|
test-result "create_server: response has required fields" $passed
|
||
|
|
}
|
||
|
|
|
||
|
|
# Test: Server not found error
|
||
|
|
def test_server_not_found_error []: nothing -> record {
|
||
|
|
let result = (do { mock-server-info "nonexistent-server" } | complete)
|
||
|
|
let passed = ($result.exit_code != 0)
|
||
|
|
test-result "server_info: error on nonexistent server" $passed
|
||
|
|
}
|
||
|
|
|
||
|
|
# Test: List servers count
|
||
|
|
def test_list_servers_count []: nothing -> record {
|
||
|
|
let result = (do {
|
||
|
|
let servers = (mock-list-servers)
|
||
|
|
$servers | length
|
||
|
|
} | complete)
|
||
|
|
|
||
|
|
let passed = ($result.exit_code == 0 and $result.stdout > 0)
|
||
|
|
test-result "list_servers: contains servers" $passed
|
||
|
|
}
|
||
|
|
|
||
|
|
# Test: Server zone information
|
||
|
|
def test_server_zone_info []: nothing -> record {
|
||
|
|
let result = (do {
|
||
|
|
let server = (mock-server-info "test-server-1")
|
||
|
|
{
|
||
|
|
has_zone: ($server | has zone)
|
||
|
|
zone_value: ($server.zone? | default "")
|
||
|
|
}
|
||
|
|
} | complete)
|
||
|
|
|
||
|
|
let passed = ($result.exit_code == 0 and
|
||
|
|
$result.stdout.has_zone and
|
||
|
|
($result.stdout.zone_value | str length) > 0)
|
||
|
|
test-result "server_info: zone data complete" $passed
|
||
|
|
}
|
||
|
|
|
||
|
|
# Test: Storage device information
|
||
|
|
def test_server_storage_info []: nothing -> record {
|
||
|
|
let result = (do {
|
||
|
|
let server = (mock-server-info "test-server-1")
|
||
|
|
{
|
||
|
|
has_storage: ($server | has storage_devices)
|
||
|
|
storage_count: ($server.storage_devices? | default [] | length)
|
||
|
|
}
|
||
|
|
} | complete)
|
||
|
|
|
||
|
|
let passed = ($result.exit_code == 0 and
|
||
|
|
$result.stdout.has_storage and
|
||
|
|
$result.stdout.storage_count >= 0)
|
||
|
|
test-result "server_info: storage devices present" $passed
|
||
|
|
}
|
||
|
|
|
||
|
|
# Main test runner
|
||
|
|
def main []: nothing -> record {
|
||
|
|
print "=== UpCloud Provider Server Lifecycle Tests (Mock Mode) ==="
|
||
|
|
print ""
|
||
|
|
|
||
|
|
let results = [
|
||
|
|
(test_list_servers)
|
||
|
|
(test_server_info_structure)
|
||
|
|
(test_server_hostname_field)
|
||
|
|
(test_server_state_field)
|
||
|
|
(test_server_public_ips)
|
||
|
|
(test_server_plan_info)
|
||
|
|
(test_create_server_response)
|
||
|
|
(test_server_not_found_error)
|
||
|
|
(test_list_servers_count)
|
||
|
|
(test_server_zone_info)
|
||
|
|
(test_server_storage_info)
|
||
|
|
]
|
||
|
|
|
||
|
|
print ""
|
||
|
|
print "Test Summary:"
|
||
|
|
print "============="
|
||
|
|
|
||
|
|
let passed = ($results | where {|r| $r.passed} | length)
|
||
|
|
let failed = ($results | where {|r| not $r.passed} | length)
|
||
|
|
let total = ($results | length)
|
||
|
|
|
||
|
|
print $"Passed: ($passed)/$total"
|
||
|
|
print $"Failed: ($failed)/$total"
|
||
|
|
|
||
|
|
{passed: $passed, failed: $failed, total: $total}
|
||
|
|
}
|