"""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")