Files

68 lines
2.7 KiB
Python

"""Tests for the secret generation, in particular its behaviour on a repeated run."""
import logging
import os
import sys
import pytest
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
import alakazam
from alakazam import generate_all_secrets
# what 'abra app secret generate -a' reports when every secret is already on the server, exiting 1
NOTHING_LEFT = RuntimeError(
"abra -o app secret generate -a login.a.org -m \n STDOUT: \n \n STDERR: "
"WARN login_a_org_db_password_v1 already exists\nWARN no secrets generated"
)
class FakeAbra:
def __init__(self, stored, generate_error=None):
self.stored = stored
self.generate_error = generate_error
self.generated = False
def __call__(self, *args, **kwargs):
if args[:3] == ("app", "secret", "ls"):
return [{"name": name, "created on server": str(created).lower()}
for name, created in self.stored.items()]
if args[:3] == ("app", "secret", "generate"):
self.generated = True
if self.generate_error:
raise self.generate_error
return [{"name": "db_password", "value": "s3cret"}]
raise AssertionError(f"unexpected abra call: {args}")
class TestGenerateAllSecrets:
def test_nothing_runs_when_every_secret_exists(self, monkeypatch):
abra = FakeAbra({"db_password": True, "email_pass": True})
monkeypatch.setattr(alakazam, "abra", abra)
generate_all_secrets("login.a.org")
assert not abra.generated
def test_missing_secrets_are_generated(self, monkeypatch, capsys):
abra = FakeAbra({"db_password": False})
monkeypatch.setattr(alakazam, "abra", abra)
generate_all_secrets("login.a.org")
assert abra.generated
assert "db_password: s3cret" in capsys.readouterr().out
def test_an_empty_generate_run_is_not_a_failure(self, monkeypatch, caplog):
"""A retry after a half finished run finds every secret in place, abra still exits 1."""
abra = FakeAbra({"db_password": False}, generate_error=NOTHING_LEFT)
monkeypatch.setattr(alakazam, "abra", abra)
with caplog.at_level(logging.WARNING):
generate_all_secrets("login.a.org")
assert "generated no secrets" in caplog.text
def test_a_real_failure_still_propagates(self, monkeypatch):
"""Only the 'nothing to do' case is tolerated, an unreachable server is not."""
abra = FakeAbra({"db_password": False},
generate_error=RuntimeError("STDERR: error during connect: no route to host"))
monkeypatch.setattr(alakazam, "abra", abra)
with pytest.raises(RuntimeError):
generate_all_secrets("login.a.org")