From 1c97d33efc39233378d8ca64e07869ccbf5c2787 Mon Sep 17 00:00:00 2001 From: 7000pctAUTO Date: Mon, 2 Feb 2026 20:50:59 +0000 Subject: [PATCH] Initial upload: Code Privacy Shield v0.1.0 --- tests/test_cli.py | 122 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 tests/test_cli.py diff --git a/tests/test_cli.py b/tests/test_cli.py new file mode 100644 index 0000000..0fb0b73 --- /dev/null +++ b/tests/test_cli.py @@ -0,0 +1,122 @@ +import pytest +from click.testing import CliRunner +from code_privacy_shield.cli import main, redact, preview, check, init_config, config_locations +from code_privacy_shield import __version__ + + +class TestCLI: + def setup_method(self): + self.runner = CliRunner() + + def test_main_version(self): + result = self.runner.invoke(main, ["--version"]) + assert result.exit_code == 0 + assert __version__ in result.output + + def test_redact_help(self): + result = self.runner.invoke(main, ["redact", "--help"]) + assert result.exit_code == 0 + assert "preview" in result.output.lower() + + def test_preview_help(self): + result = self.runner.invoke(main, ["preview", "--help"]) + assert result.exit_code == 0 + assert "path" in result.output.lower() + + def test_check_help(self): + result = self.runner.invoke(main, ["check", "--help"]) + assert result.exit_code == 0 + assert "path" in result.output.lower() + + def test_init_config_help(self): + result = self.runner.invoke(main, ["init-config", "--help"]) + assert result.exit_code == 0 + assert "init-config" in result.output + + def test_config_locations(self): + result = self.runner.invoke(main, ["config-locations"]) + assert result.exit_code == 0 + assert "Project config" in result.output + assert "User config" in result.output + + def test_redact_stdin(self): + input_data = "api_key = 'sk-abc123def456ghi789jklmno'" + result = self.runner.invoke(redact, [], input=input_data, obj={"config_path": None, "quiet": False}) + assert result.exit_code == 0 + assert "sk-abc123" not in result.output + + def test_redact_stdin_with_preview(self): + input_data = "email = 'test@example.com'" + result = self.runner.invoke(redact, ["--preview"], input=input_data, obj={"config_path": None, "quiet": False}) + assert result.exit_code == 0 + assert "test@example.com" in result.output + + def test_redact_file(self, tmp_path): + test_file = tmp_path / "test.py" + test_file.write_text("api_key = 'sk-abc123def456ghi789jklmno'") + result = self.runner.invoke(redact, [str(test_file)], obj={"config_path": None, "quiet": False}) + assert result.exit_code == 0 + assert "sk-abc123" not in result.output + + def test_redact_file_preview(self, tmp_path): + test_file = tmp_path / "test.py" + test_file.write_text("email = 'test@example.com'") + result = self.runner.invoke(redact, ["--preview", str(test_file)], obj={"config_path": None, "quiet": False}) + assert result.exit_code == 0 + assert "test@example.com" in result.output + + def test_redact_json_format(self, tmp_path): + test_file = tmp_path / "test.py" + test_file.write_text("api_key = 'sk-abc123def456ghi789jklmno'") + result = self.runner.invoke(redact, ["--preview", "--format", "json", str(test_file)], obj={"config_path": None, "quiet": False}) + assert result.exit_code == 0 + assert "api_keys" in result.output + + def test_redact_nonexistent_file(self): + result = self.runner.invoke(redact, ["/nonexistent/file.py"]) + assert result.exit_code != 0 + + def test_check_no_secrets(self, tmp_path): + test_file = tmp_path / "clean.py" + test_file.write_text("x = 1 + 2") + result = self.runner.invoke(check, [str(test_file)], obj={"config_path": None}) + assert result.exit_code == 0 + assert "No sensitive data" in result.output + + def test_check_with_secrets(self, tmp_path): + test_file = tmp_path / "secret.py" + test_file.write_text("api_key = 'sk-abc123def456ghi789jklmno'") + result = self.runner.invoke(check, [str(test_file)], obj={"config_path": None}) + assert result.exit_code == 1 + assert "Found" in result.output + + def test_init_config(self, tmp_path): + config_path = tmp_path / "config.toml" + result = self.runner.invoke(init_config, [str(config_path)]) + assert result.exit_code == 0 + assert "Created" in result.output + + def test_config_show(self): + result = self.runner.invoke(main, ["config", "show"]) + assert result.exit_code == 0 + + def test_redact_quiet_mode(self, tmp_path): + test_file = tmp_path / "test.py" + test_file.write_text("email = 'test@example.com'") + result = self.runner.invoke(main, ["--quiet", "redact", str(test_file)]) + assert result.exit_code == 0 + + def test_redact_with_config_option(self, tmp_path): + config_file = tmp_path / "config.toml" + config_file.write_text("[general]\nquiet = true") + test_file = tmp_path / "test.py" + test_file.write_text("email = 'test@example.com'") + result = self.runner.invoke(main, ["--config", str(config_file), "redact", str(test_file)]) + assert result.exit_code == 0 + + def test_preview_command_alias(self, tmp_path): + test_file = tmp_path / "test.py" + test_file.write_text("email = 'test@example.com'") + result = self.runner.invoke(preview, [str(test_file)], obj={"config_path": None, "quiet": False}) + assert result.exit_code == 0 + assert "test@example.com" in result.output