import textwrap
import pytest
PLACEHOLDER = "<redacted value>"
def parse_env(text):
out = {}
for line in text.splitlines():
line = line.strip()
if not line or line.startswith("#"):
continue
key, _, value = line.partition("=")
out[key.strip()] = value.strip().strip('"').strip("'")
return out
def expected_env_redaction(original_text):
keys = parse_env(original_text).keys()
return "".join(f'{key}="{PLACEHOLDER}"\n' for key in keys)
def expected_key_redaction(original_text):
lines = original_text.splitlines()
return f"{lines[0]}\n{PLACEHOLDER}\n{lines[-1]}\n"
def test_exit_code_propagates(airgap):
assert airgap("sh", "-c", "exit 7").returncode == 7
def test_stdout_passthrough(airgap):
result = airgap("echo", "hello-world")
assert result.returncode == 0
assert "hello-world" in result.stdout
def test_plain_file_untouched(airgap):
result = airgap("cat", "notes.txt")
assert result.returncode == 0
assert result.stdout == (airgap.workdir / "notes.txt").read_text()
def test_env_read_is_exactly_redacted(airgap):
expected = expected_env_redaction((airgap.workdir / ".env").read_text())
result = airgap("cat", ".env")
assert result.returncode == 0
assert result.stdout == expected
NEST = textwrap.dedent(
"""
import sys, subprocess
depth, script = int(sys.argv[1]), sys.argv[2]
if depth > 0:
sys.exit(subprocess.run(
[sys.executable, "-c", script, str(depth - 1), script]
).returncode)
sys.stdout.write(open(".env").read())
"""
)
def test_deeply_nested_child_sees_redaction(airgap):
expected = expected_env_redaction((airgap.workdir / ".env").read_text())
result = airgap("python3", "-c", NEST, "8", NEST)
assert result.returncode == 0, result.stderr
assert result.stdout == expected
def test_env_edit_persists(airgap):
script = textwrap.dedent(
"""
lines = open('.env').read().splitlines()
out = ['DEBUG=false' if l.startswith('DEBUG=') else l for l in lines]
open('.env', 'w').write('\\n'.join(out) + '\\n')
"""
)
result = airgap("python3", "-c", script)
assert result.returncode == 0, result.stderr
persisted = parse_env((airgap.workdir / ".env").read_text())
assert persisted["DEBUG"] == "false"
assert "s3cr3t_pw" in persisted["DATABASE_URL"]
def test_env_add_persists(airgap):
script = textwrap.dedent(
"""
with open('.env', 'a') as f:
f.write('NEW_TOKEN=added-by-agent\\n')
"""
)
result = airgap("python3", "-c", script)
assert result.returncode == 0, result.stderr
persisted = parse_env((airgap.workdir / ".env").read_text())
assert persisted.get("NEW_TOKEN") == "added-by-agent"
assert "s3cr3t_pw" in persisted["DATABASE_URL"]
def test_env_delete_persists(airgap):
script = textwrap.dedent(
"""
lines = open('.env').read().splitlines()
out = [l for l in lines if not l.startswith('API_KEY=')]
open('.env', 'w').write('\\n'.join(out) + '\\n')
"""
)
result = airgap("python3", "-c", script)
assert result.returncode == 0, result.stderr
persisted = parse_env((airgap.workdir / ".env").read_text())
assert "API_KEY" not in persisted
assert "DATABASE_URL" in persisted
@pytest.mark.parametrize("path", ["id_rsa", "id_ed25519", "secret.asc"])
def test_private_key_redacted(airgap, path):
expected = expected_key_redaction((airgap.workdir / path).read_text())
result = airgap("cat", path)
assert result.returncode == 0
assert result.stdout == expected