un-inception/clients/python/sync/tests/test_credentials.py

138 lines
4.4 KiB
Python

# This is free software for the public good of a permacomputer hosted at
# permacomputer.com, an always-on computer by the people, for the people.
# One which is durable, easy to repair, & distributed like tap water
# for machine learning intelligence.
#
# The permacomputer is community-owned infrastructure optimized around
# four values:
#
# TRUTH First principles, math & science, open source code freely distributed
# FREEDOM Voluntary partnerships, freedom from tyranny & corporate control
# HARMONY Minimal waste, self-renewing systems with diverse thriving connections
# LOVE Be yourself without hurting others, cooperation through natural law
#
# This software contributes to that vision by enabling code execution across 42+ programming languages through a unified interface, accessible to all.
# Code is seeds to sprout on any abandoned technology.
"""Tests for credential resolution in unsandbox SDK"""
import os
import tempfile
from pathlib import Path
import pytest
from un import CredentialsError
def test_credentials_from_function_args():
"""Test that function arguments take priority"""
from un import _resolve_credentials
pk, sk = _resolve_credentials("func_pk", "func_sk")
assert pk == "func_pk"
assert sk == "func_sk"
def test_credentials_from_environment():
"""Test that environment variables are used when args are missing"""
from un import _resolve_credentials
# Save original values
orig_pk = os.environ.get("UNSANDBOX_PUBLIC_KEY")
orig_sk = os.environ.get("UNSANDBOX_SECRET_KEY")
try:
os.environ["UNSANDBOX_PUBLIC_KEY"] = "env_pk"
os.environ["UNSANDBOX_SECRET_KEY"] = "env_sk"
pk, sk = _resolve_credentials()
assert pk == "env_pk"
assert sk == "env_sk"
finally:
# Restore original values
if orig_pk is not None:
os.environ["UNSANDBOX_PUBLIC_KEY"] = orig_pk
else:
os.environ.pop("UNSANDBOX_PUBLIC_KEY", None)
if orig_sk is not None:
os.environ["UNSANDBOX_SECRET_KEY"] = orig_sk
else:
os.environ.pop("UNSANDBOX_SECRET_KEY", None)
def test_credentials_from_csv_file():
"""Test loading credentials from CSV file"""
from un import _load_credentials_from_csv
with tempfile.NamedTemporaryFile(mode="w", suffix=".csv", delete=False) as f:
f.write("pk1,sk1\n")
f.write("pk2,sk2\n")
temp_path = f.name
try:
# Load first account
pk, sk = _load_credentials_from_csv(Path(temp_path), 0)
assert pk == "pk1"
assert sk == "sk1"
# Load second account
pk, sk = _load_credentials_from_csv(Path(temp_path), 1)
assert pk == "pk2"
assert sk == "sk2"
finally:
os.unlink(temp_path)
def test_credentials_csv_with_comments():
"""Test that CSV loader ignores comments"""
from un import _load_credentials_from_csv
with tempfile.NamedTemporaryFile(mode="w", suffix=".csv", delete=False) as f:
f.write("# Comment line\n")
f.write("pk1,sk1\n")
f.write("\n") # Empty line
f.write("pk2,sk2\n")
temp_path = f.name
try:
pk, sk = _load_credentials_from_csv(Path(temp_path), 0)
assert pk == "pk1"
assert sk == "sk1"
finally:
os.unlink(temp_path)
def test_credentials_csv_nonexistent_file():
"""Test that nonexistent CSV returns None"""
from un import _load_credentials_from_csv
result = _load_credentials_from_csv(Path("/nonexistent/file.csv"))
assert result is None
def test_credentials_missing_all():
"""Test that CredentialsError is raised when no credentials available"""
from un import _resolve_credentials
# Save original values
orig_pk = os.environ.get("UNSANDBOX_PUBLIC_KEY")
orig_sk = os.environ.get("UNSANDBOX_SECRET_KEY")
try:
os.environ.pop("UNSANDBOX_PUBLIC_KEY", None)
os.environ.pop("UNSANDBOX_SECRET_KEY", None)
# This should raise because we're not providing args and env vars don't exist
# (and we don't have test CSV files)
with pytest.raises(CredentialsError):
_resolve_credentials()
finally:
if orig_pk is not None:
os.environ["UNSANDBOX_PUBLIC_KEY"] = orig_pk
else:
os.environ.pop("UNSANDBOX_PUBLIC_KEY", None)
if orig_sk is not None:
os.environ["UNSANDBOX_SECRET_KEY"] = orig_sk
else:
os.environ.pop("UNSANDBOX_SECRET_KEY", None)