un-inception/clients/ruby/sync/test/test_new_functions.rb
russell@unturf.com 6e746ace44 feat: full feature parity for all 42 SDKs + comprehensive tests
All SDKs now implement 58+ functions matching C reference (un.h):
- Execution (8): execute, execute_async, wait_job, get_job, cancel_job, list_jobs, get_languages, detect_language
- Sessions (9): list, get, create, destroy, freeze, unfreeze, boost, unboost, execute
- Services (17): list, get, create, destroy, freeze, unfreeze, lock, unlock, set_unfreeze_on_demand, redeploy, logs, execute, env_get/set/delete/export, resize
- Snapshots (9): list, get, session, service, restore, delete, lock, unlock, clone
- Images (13): list, get, publish, delete, lock, unlock, set_visibility, grant/revoke_access, list_trusted, transfer, spawn, clone
- PaaS Logs (2): fetch, stream
- Utilities (5): validate_keys, hmac_sign, health_check, version, last_error

Test suites created for all SDKs with unit, integration, and functional tests.

Languages: AWK, Bash, C++, C#, Clojure, COBOL, Crystal, D, Dart, .NET, Elixir, Erlang, F#, Forth, Fortran, Go, Groovy, Haskell, Java, JavaScript, Julia, Kotlin, Lisp, Lua, Nim, Objective-C, OCaml, Perl, PHP, PowerShell, Prolog, Python, R, Raku, Ruby, Rust, Scheme, Swift, Tcl, TypeScript, V, Zig
2026-02-05 16:45:02 -05:00

246 lines
7.4 KiB
Ruby

# frozen_string_literal: true
require_relative 'test_helper'
class TestNewFunctions < Minitest::Test
# =========================================================================
# Utility Functions Tests
# =========================================================================
def test_version_returns_string
v = Un.version
assert_instance_of String, v
refute_empty v
end
def test_version_is_semantic_format
v = Un.version
parts = v.split('.')
assert parts.length >= 2, "Version should be semantic: #{v}"
end
def test_hmac_sign_returns_64_hex_chars
signature = Un.hmac_sign('secret_key', 'message_to_sign')
assert_instance_of String, signature
assert_equal 64, signature.length
assert_match(/\A[0-9a-f]+\z/, signature)
end
def test_hmac_sign_is_deterministic
sig1 = Un.hmac_sign('secret', 'message')
sig2 = Un.hmac_sign('secret', 'message')
assert_equal sig1, sig2
end
def test_hmac_sign_different_secrets_different_signatures
sig1 = Un.hmac_sign('secret1', 'message')
sig2 = Un.hmac_sign('secret2', 'message')
refute_equal sig1, sig2
end
def test_hmac_sign_different_messages_different_signatures
sig1 = Un.hmac_sign('secret', 'message1')
sig2 = Un.hmac_sign('secret', 'message2')
refute_equal sig1, sig2
end
def test_hmac_sign_matches_openssl
secret = 'test_secret'
message = '1234567890:POST:/execute:'
signature = Un.hmac_sign(secret, message)
expected = OpenSSL::HMAC.hexdigest('SHA256', secret, message)
assert_equal expected, signature
end
def test_last_error_returns_nil_or_string
error = Un.last_error
assert error.nil? || error.is_a?(String)
end
# =========================================================================
# Function Exports Tests
# =========================================================================
def test_execution_functions_defined
# 8 execution functions
assert Un.respond_to?(:execute_code)
assert Un.respond_to?(:execute_async)
assert Un.respond_to?(:get_job)
assert Un.respond_to?(:wait_for_job)
assert Un.respond_to?(:cancel_job)
assert Un.respond_to?(:list_jobs)
assert Un.respond_to?(:get_languages)
assert Un.respond_to?(:detect_language)
end
def test_session_functions_defined
# 9 session functions
assert Un.respond_to?(:list_sessions)
assert Un.respond_to?(:get_session)
assert Un.respond_to?(:create_session)
assert Un.respond_to?(:delete_session)
assert Un.respond_to?(:freeze_session)
assert Un.respond_to?(:unfreeze_session)
assert Un.respond_to?(:boost_session)
assert Un.respond_to?(:unboost_session)
assert Un.respond_to?(:shell_session)
end
def test_service_functions_defined
# 17 service functions
assert Un.respond_to?(:list_services)
assert Un.respond_to?(:create_service)
assert Un.respond_to?(:get_service)
assert Un.respond_to?(:update_service)
assert Un.respond_to?(:delete_service)
assert Un.respond_to?(:freeze_service)
assert Un.respond_to?(:unfreeze_service)
assert Un.respond_to?(:lock_service)
assert Un.respond_to?(:unlock_service)
assert Un.respond_to?(:set_unfreeze_on_demand)
assert Un.respond_to?(:get_service_logs)
assert Un.respond_to?(:get_service_env)
assert Un.respond_to?(:set_service_env)
assert Un.respond_to?(:delete_service_env)
assert Un.respond_to?(:export_service_env)
assert Un.respond_to?(:redeploy_service)
assert Un.respond_to?(:execute_in_service)
assert Un.respond_to?(:resize_service), 'resize_service should be defined (NEW)'
end
def test_snapshot_functions_defined
# 9 snapshot functions
assert Un.respond_to?(:session_snapshot)
assert Un.respond_to?(:service_snapshot)
assert Un.respond_to?(:list_snapshots)
assert Un.respond_to?(:get_snapshot), 'get_snapshot should be defined (NEW)'
assert Un.respond_to?(:restore_snapshot)
assert Un.respond_to?(:delete_snapshot)
assert Un.respond_to?(:lock_snapshot)
assert Un.respond_to?(:unlock_snapshot)
assert Un.respond_to?(:clone_snapshot)
end
def test_image_functions_defined
# 13 image functions
assert Un.respond_to?(:image_publish)
assert Un.respond_to?(:list_images)
assert Un.respond_to?(:get_image)
assert Un.respond_to?(:delete_image)
assert Un.respond_to?(:lock_image)
assert Un.respond_to?(:unlock_image)
assert Un.respond_to?(:set_image_visibility)
assert Un.respond_to?(:grant_image_access)
assert Un.respond_to?(:revoke_image_access)
assert Un.respond_to?(:list_image_trusted)
assert Un.respond_to?(:transfer_image)
assert Un.respond_to?(:spawn_from_image)
assert Un.respond_to?(:clone_image)
end
def test_logs_functions_defined
# 2 PaaS logs functions (NEW)
assert Un.respond_to?(:logs_fetch), 'logs_fetch should be defined (NEW)'
assert Un.respond_to?(:logs_stream), 'logs_stream should be defined (NEW)'
end
def test_utility_functions_defined
assert Un.respond_to?(:validate_keys)
assert Un.respond_to?(:version), 'version should be defined (NEW)'
assert Un.respond_to?(:health_check), 'health_check should be defined (NEW)'
assert Un.respond_to?(:last_error), 'last_error should be defined (NEW)'
assert Un.respond_to?(:hmac_sign), 'hmac_sign should be defined (NEW)'
end
# =========================================================================
# Language Detection Tests
# =========================================================================
def test_detect_language_python
assert_equal 'python', Un.detect_language('test.py')
end
def test_detect_language_javascript
assert_equal 'javascript', Un.detect_language('test.js')
end
def test_detect_language_typescript
assert_equal 'typescript', Un.detect_language('test.ts')
end
def test_detect_language_ruby
assert_equal 'ruby', Un.detect_language('test.rb')
end
def test_detect_language_go
assert_equal 'go', Un.detect_language('test.go')
end
def test_detect_language_rust
assert_equal 'rust', Un.detect_language('test.rs')
end
def test_detect_language_unknown_returns_nil
assert_nil Un.detect_language('test.unknown')
end
end
# Functional tests require API credentials
class TestFunctionalAPI < Minitest::Test
def setup
skip 'UNSANDBOX_PUBLIC_KEY and UNSANDBOX_SECRET_KEY required' unless credentials_available?
WebMock.allow_net_connect!
end
def teardown
WebMock.disable_net_connect!
end
def test_health_check
result = Un.health_check
assert [true, false].include?(result)
end
def test_validate_keys
result = Un.validate_keys
assert result.is_a?(Hash)
end
def test_get_languages
languages = Un.get_languages
assert languages.is_a?(Array)
assert languages.include?('python')
end
def test_list_sessions
sessions = Un.list_sessions
assert sessions.is_a?(Array)
end
def test_list_services
services = Un.list_services
assert services.is_a?(Array)
end
def test_list_snapshots
snapshots = Un.list_snapshots
assert snapshots.is_a?(Array)
end
def test_list_images
images = Un.list_images
assert images.is_a?(Array)
end
def test_execute_code
result = Un.execute_code('python', 'print("hello")')
assert result.is_a?(Hash)
assert %w[completed pending].include?(result['status'])
end
private
def credentials_available?
ENV['UNSANDBOX_PUBLIC_KEY'] && ENV['UNSANDBOX_SECRET_KEY']
end
end