68 lines
2.7 KiB
Python
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")
|