Skip to content

Commit 833cfa5

Browse files
committed
Enhancing error handeling
1 parent 2400c07 commit 833cfa5

4 files changed

Lines changed: 53 additions & 47 deletions

File tree

.coverage

0 Bytes
Binary file not shown.

devolv/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
__version__ = "0.2.3"
1+
__version__ = "0.2.4"
22

devolv/drift/report.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import difflib
33
from rich.console import Console
44
from rich.text import Text
5+
import typer
56

67
def clean_policy(policy):
78
"""
@@ -54,6 +55,7 @@ def generate_diff_report(local_policy, aws_policy):
5455
console.print("✅ No drift detected: Policies match.", style="green")
5556
return
5657

58+
console.print("❌ Drift detected — see diff below", style="bold red")
5759
i = 0
5860
while i < len(diff_lines):
5961
line = diff_lines[i]
@@ -98,3 +100,4 @@ def generate_diff_report(local_policy, aws_policy):
98100
else:
99101
console.print(Text(line)) # Fallback for any edge case lines
100102
i += 1
103+
raise typer.Exit(1)

tests/test_drift.py

Lines changed: 49 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -161,32 +161,6 @@ def test_generate_diff_report_no_diff(capsys):
161161
captured = capsys.readouterr()
162162
assert "No drift detected" in captured.out
163163

164-
def test_generate_diff_report_with_diff(capsys):
165-
local = {"A": 1}
166-
aws = {"A": 2}
167-
report.generate_diff_report(local, aws)
168-
captured = capsys.readouterr()
169-
out = captured.out
170-
assert "--- local" in out and "+++ aws" in out
171-
assert re.search(r'-\s+"A":\s*1', out)
172-
assert re.search(r'\+\s+"A":\s*2', out)
173-
174-
def test_generate_diff_report_addition(capsys):
175-
local = {}
176-
aws = {"A": 5}
177-
report.generate_diff_report(local, aws)
178-
captured = capsys.readouterr()
179-
out = captured.out
180-
assert re.search(r'\+\s+"A":\s*5', out)
181-
182-
def test_generate_diff_report_deletion(capsys):
183-
local = {"B": 10}
184-
aws = {}
185-
report.generate_diff_report(local, aws)
186-
captured = capsys.readouterr()
187-
out = captured.out
188-
assert re.search(r'-\s+"B":\s*10', out)
189-
190164
@pytest.fixture
191165
def runner():
192166
app = typer.Typer()
@@ -201,7 +175,7 @@ def test_cli_drift_detected(runner, tmp_path, monkeypatch):
201175
file.write_text(json.dumps(local))
202176
monkeypatch.setattr(aws_fetcher, "get_policy", lambda policy_name=None: aws)
203177
result = runner_obj.invoke(app, ["--policy-name", "test", "--file", str(file)])
204-
assert result.exit_code == 0
178+
assert result.exit_code == 1
205179
assert "--- local" in result.stdout
206180
assert "+++ aws" in result.stdout
207181

@@ -274,21 +248,6 @@ def assume_role(self, RoleArn, RoleSessionName):
274248
assert creds.access_key is None
275249

276250

277-
# Cover report.py fallback diff line
278-
def test_generate_diff_report_odd_lines(capsys):
279-
local = {"A": 1}
280-
aws = {"A": 2}
281-
# Patch difflib to yield weird lines
282-
import difflib
283-
real_diff = difflib.unified_diff
284-
def fake_diff(*args, **kwargs):
285-
return iter(["??? odd line"])
286-
difflib.unified_diff = fake_diff
287-
report.generate_diff_report(local, aws)
288-
captured = capsys.readouterr()
289-
assert "odd line" in captured.out
290-
difflib.unified_diff = real_diff
291-
292251
def test_cli_access_denied_no_because(monkeypatch, tmp_path):
293252
runner = CliRunner()
294253
app = cli.typer.Typer()
@@ -410,10 +369,6 @@ def test_clean_policy_all_empty_statements():
410369
cleaned = report.clean_policy(policy.copy())
411370
assert cleaned["Statement"] == []
412371

413-
def test_generate_diff_report_empty_inputs(capsys):
414-
report.generate_diff_report({}, {})
415-
out = capsys.readouterr().out
416-
assert "No drift detected" in out
417372

418373
def test_get_policy_no_match_final_none(monkeypatch):
419374
class FakeSTS:
@@ -546,3 +501,51 @@ def test_clean_policy_no_statement_key():
546501
policy = {"Effect": "Allow"}
547502
cleaned = report.clean_policy(policy.copy())
548503
assert cleaned == policy
504+
505+
506+
import pytest
507+
import typer
508+
from devolv.drift import report
509+
510+
def test_generate_diff_report_with_diff():
511+
local = {"A": 1}
512+
aws = {"A": 2}
513+
with pytest.raises(typer.Exit) as excinfo:
514+
report.generate_diff_report(local, aws)
515+
assert excinfo.value.exit_code == 1
516+
517+
def test_generate_diff_report_addition():
518+
local = {}
519+
aws = {"A": 5}
520+
with pytest.raises(typer.Exit) as excinfo:
521+
report.generate_diff_report(local, aws)
522+
assert excinfo.value.exit_code == 1
523+
524+
525+
def test_generate_diff_report_deletion():
526+
local = {"B": 10}
527+
aws = {}
528+
with pytest.raises(typer.Exit) as excinfo:
529+
report.generate_diff_report(local, aws)
530+
assert excinfo.value.exit_code == 1
531+
532+
def test_generate_diff_report_no_diff():
533+
local = {"A": 1}
534+
aws = {"A": 1}
535+
# Should not raise exit
536+
report.generate_diff_report(local, aws)
537+
538+
def test_generate_diff_report_odd_lines(monkeypatch):
539+
import difflib
540+
local = {"A": 1}
541+
aws = {"A": 2}
542+
543+
def fake_diff(*args, **kwargs):
544+
return iter(["??? odd line"])
545+
546+
monkeypatch.setattr(difflib, "unified_diff", fake_diff)
547+
548+
with pytest.raises(typer.Exit) as excinfo:
549+
report.generate_diff_report(local, aws)
550+
assert excinfo.value.exit_code == 1
551+

0 commit comments

Comments
 (0)