Files
hate_crack/tests/test_asset_path_separation.py
T
Justin Bollinger 55b7f0fc62 fix: separate hcatPath (hashcat dir) from hate_path (asset dir)
hcatPath now exclusively points to the hashcat install directory and is
auto-discovered from PATH when not configured. hate_path is resolved
from the package directory (installed) or repo root (development) with
no auto-discovery. Extracted vendor-assets/clean-vendor Makefile targets
to deduplicate the install logic.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 20:23:12 -05:00

99 lines
3.5 KiB
Python

"""
Test that hashcat-utils assets are correctly loaded from hate_crack repo,
not from hcatPath (which should point to hashcat binary location).
This prevents regression where hcatPath was incorrectly used for utilities.
"""
import os
import json
import tempfile
def test_hashcat_utils_uses_hate_path_not_hcat_path(tmp_path, monkeypatch):
"""
Verify that hashcat-utils is loaded from hate_crack repo, not hcatPath.
This test ensures that even when hcatPath points to a different directory
(like /opt/hashcat), the code correctly uses hate_path for utilities.
"""
# Set HATE_CRACK_SKIP_INIT to prevent initialization checks
monkeypatch.setenv("HATE_CRACK_SKIP_INIT", "1")
# Import after setting env var
from hate_crack import main
# The hate_path should be the hate_crack repository
assert main.hate_path is not None
assert os.path.isdir(main.hate_path)
assert os.path.isdir(os.path.join(main.hate_path, "hashcat-utils"))
# hcatPath is the hashcat install directory, not the hate_crack package directory
assert main.hcatPath is not None
# Key assertion: even if hcatPath != hate_path,
# the code should look for utilities in hate_path
# This is verified by checking the actual code paths used
def test_config_with_explicit_hashcat_path():
"""
Test that when hcatPath is explicitly set to a hashcat directory,
the code still finds utilities in the hate_crack repository.
"""
import os
# Create a temporary config with hcatPath set to a different location
with tempfile.NamedTemporaryFile(mode="w", suffix=".json", delete=False) as f:
test_config = {
"hcatPath": "/opt/hashcat", # Different from hate_crack repo
"hcatBin": "hashcat",
"hcatTuning": "--force",
"hcatWordlists": "./wordlists",
"hcatOptimizedWordlists": "./optimized_wordlists",
"rules_directory": "/opt/hashcat/rules",
"hcatDictionaryWordlist": ["rockyou.txt"],
"hcatCombinationWordlist": ["rockyou.txt"],
"hcatHybridlist": ["rockyou.txt"],
"hcatMiddleBaseList": ["rockyou.txt"],
"hcatMiddleCombList": ["rockyou.txt"],
"hcatExpanderlist": ["rockyou.txt"],
"hcatThoroughBaseList": ["rockyou.txt"],
"hcatThoroughCombList": ["rockyou.txt"],
"hashview_url": "https://localhost:8443",
"hashview_api_key": "",
}
json.dump(test_config, f)
config_path = f.name
try:
# Load the config
with open(config_path) as f:
config = json.load(f)
# Verify that hcatPath is set to /opt/hashcat
assert config["hcatPath"] == "/opt/hashcat"
# This documents the expected behavior:
# - hcatPath = /opt/hashcat (for hashcat binary)
# - hashcat-utils should be found in hate_crack repo, not /opt/hashcat
finally:
os.unlink(config_path)
def test_readme_documents_correct_usage():
"""Verify README correctly explains hcatPath vs asset locations."""
readme_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), "README.md")
with open(readme_path) as f:
readme = f.read()
# Check that README mentions the correct relationship
assert "hcatPath" in readme
assert "repository directory" in readme
assert "hashcat-utils" in readme
# Should NOT suggest putting hashcat-utils in hashcat directory
# (This is a documentation test to prevent confusing users)