diff --git a/shellhist/tests/test_export.py b/shellhist/tests/test_export.py index 7093ada..98d34de 100644 --- a/shellhist/tests/test_export.py +++ b/shellhist/tests/test_export.py @@ -1 +1,187 @@ -bmFtZTogQ0kKCm9uOgogIHB1c2g6CiAgICBicmFuY2hlczogW21haW5dCiAgcHVsbF9yZXF1ZXN0OgogICAgYnJhbmNoZXM6IFttYWluXQoKam9iczogCiAgdGVzdDoKICAgIHJ1bnMtb246IHVidW50dS1sYXRlc3QKICAgIHN0ZXBzOgogICAgICAtIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXQdjNFgKICAgICAgdXNlczogYWN0aW9ucy9zZXR1cC1weXRob25fdjUKICAgICAgd2l0aDoKICAgICAgICBweXRob24tdmVyc2lvbjogJzMuMTEnCiAgICAtIHJ1bjogcGlwIGluc3RhbGwgLWUgIltcImRldlwiXSIKICAgIC0gcnVuOiBweXRlc3QgdGVzdHMvIC12CiAgICAtIHJ1bjogcnVmZiBjaGVjayAu \ No newline at end of file +"""Tests for export functionality.""" + +import os +import tempfile + + +from shellhist.core.export import ( + generate_alias, + generate_alias_name, + generate_script, + generate_script_name, +) +from shellhist.core.patterns import CommandPattern + + +class TestGenerateAlias: + """Test alias generation functionality.""" + + def test_generate_alias_single_command(self): + """Test generating alias for single command.""" + pattern = CommandPattern( + commands=("git status",), + frequency=5, + percentage=10.0, + ) + + alias = generate_alias(pattern) + + assert alias.startswith("alias ") + assert "git status" in alias + + def test_generate_alias_multiple_commands(self): + """Test generating alias for multiple commands.""" + pattern = CommandPattern( + commands=("git add .", "git commit", "git push"), + frequency=3, + percentage=5.0, + ) + + alias = generate_alias(pattern) + + assert "git add ." in alias + assert "git commit" in alias + assert "git push" in alias + + def test_generate_alias_custom_name(self): + """Test generating alias with custom name.""" + pattern = CommandPattern( + commands=("echo test",), + frequency=1, + percentage=1.0, + ) + + alias = generate_alias(pattern, alias_name="mytest") + + assert "mytest" in alias + + +class TestGenerateAliasName: + """Test alias name generation.""" + + def test_alias_name_from_command(self): + """Test generating alias name from command.""" + pattern = CommandPattern( + commands=("git status",), + frequency=1, + percentage=1.0, + ) + + name = generate_alias_name(pattern) + + assert "git" in name.lower() or "status" in name.lower() + + def test_alias_name_from_multiple_commands(self): + """Test generating alias name from multiple commands.""" + pattern = CommandPattern( + commands=("git add .", "git commit", "git push"), + frequency=1, + percentage=1.0, + ) + + name = generate_alias_name(pattern) + + assert len(name) > 0 + + +class TestGenerateScript: + """Test script generation functionality.""" + + def test_generate_script_dry_run(self): + """Test script generation in dry-run mode.""" + pattern = CommandPattern( + commands=("echo hello", "echo world"), + frequency=5, + percentage=10.0, + ) + + path, content = generate_script(pattern, dry_run=True) + + assert "echo hello" in content + assert "echo world" in content + assert "shellhist_" in path + + def test_generate_script_with_custom_name(self): + """Test script generation with custom name.""" + pattern = CommandPattern( + commands=("ls -la",), + frequency=1, + percentage=1.0, + ) + + path, content = generate_script( + pattern, + script_name="my_custom_script", + dry_run=True, + ) + + assert "my_custom_script" in path + + def test_generate_script_actual_write(self): + """Test actual script file creation.""" + pattern = CommandPattern( + commands=("echo test",), + frequency=1, + percentage=1.0, + ) + + with tempfile.TemporaryDirectory() as tmpdir: + path, content = generate_script( + pattern, + output_dir=tmpdir, + dry_run=False, + ) + + assert os.path.exists(path) + + with open(path, "r") as f: + saved_content = f.read() + + assert "echo test" in saved_content + + def test_script_permissions(self): + """Test that generated scripts are executable.""" + pattern = CommandPattern( + commands=("echo test",), + frequency=1, + percentage=1.0, + ) + + with tempfile.TemporaryDirectory() as tmpdir: + path, _ = generate_script( + pattern, + output_dir=tmpdir, + dry_run=False, + ) + + mode = os.stat(path).st_mode + assert mode & 0o111 + + +class TestGenerateScriptName: + """Test script name generation.""" + + def test_script_name_from_commands(self): + """Test generating script name from commands.""" + pattern = CommandPattern( + commands=("git status", "git log"), + frequency=1, + percentage=1.0, + ) + + name = generate_script_name(pattern) + + assert len(name) > 0 + assert name.startswith("shellhist_") + + def test_script_name_sanitization(self): + """Test that script names are sanitized.""" + pattern = CommandPattern( + commands=("ls -la /tmp",), + frequency=1, + percentage=1.0, + ) + + name = generate_script_name(pattern) + + assert "/" not in name