Skip to content

Commit 36b04a5

Browse files
authored
test: added unit test for parse_query (#81)
1 parent 4b88969 commit 36b04a5

File tree

1 file changed

+97
-1
lines changed

1 file changed

+97
-1
lines changed

src/gitingest/tests/test_parse_query.py

Lines changed: 97 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import pytest
22

33
from gitingest.ignore_patterns import DEFAULT_IGNORE_PATTERNS
4-
from gitingest.parse_query import _parse_url, parse_query
4+
from gitingest.parse_query import _parse_patterns, _parse_url, parse_query
55

66

77
def test_parse_url_valid() -> None:
@@ -44,3 +44,99 @@ def test_parse_query_invalid_pattern() -> None:
4444
url = "https://github.com/user/repo"
4545
with pytest.raises(ValueError, match="Pattern.*contains invalid characters"):
4646
parse_query(url, max_file_size=50, from_web=True, include_patterns="*.py;rm -rf")
47+
48+
49+
def test_parse_url_with_subpaths() -> None:
50+
url = "https://github.com/user/repo/tree/main/subdir/file"
51+
result = _parse_url(url)
52+
assert result["user_name"] == "user"
53+
assert result["repo_name"] == "repo"
54+
assert result["branch"] == "main"
55+
assert result["subpath"] == "/subdir/file"
56+
57+
58+
def test_parse_url_invalid_repo_structure() -> None:
59+
url = "https://github.com/user"
60+
with pytest.raises(ValueError, match="Invalid repository URL"):
61+
_parse_url(url)
62+
63+
64+
def test_parse_patterns_valid() -> None:
65+
patterns = "*.py, *.md, docs/*"
66+
result = _parse_patterns(patterns)
67+
assert result == ["*.py", "*.md", "docs/*"]
68+
69+
70+
def test_parse_patterns_invalid_characters() -> None:
71+
patterns = "*.py;rm -rf"
72+
with pytest.raises(ValueError, match="Pattern.*contains invalid characters"):
73+
_parse_patterns(patterns)
74+
75+
76+
def test_parse_query_with_large_file_size() -> None:
77+
url = "https://github.com/user/repo"
78+
result = parse_query(url, max_file_size=10**9, from_web=True)
79+
assert result["max_file_size"] == 10**9
80+
assert result["ignore_patterns"] == DEFAULT_IGNORE_PATTERNS
81+
82+
83+
def test_parse_query_empty_patterns() -> None:
84+
url = "https://github.com/user/repo"
85+
result = parse_query(url, max_file_size=50, from_web=True, include_patterns="", ignore_patterns="")
86+
assert result["include_patterns"] is None
87+
assert result["ignore_patterns"] == DEFAULT_IGNORE_PATTERNS
88+
89+
90+
def test_parse_query_include_and_ignore_overlap() -> None:
91+
url = "https://github.com/user/repo"
92+
result = parse_query(
93+
url,
94+
max_file_size=50,
95+
from_web=True,
96+
include_patterns="*.py",
97+
ignore_patterns=["*.py", "*.txt"],
98+
)
99+
assert result["include_patterns"] == ["*.py"]
100+
assert "*.py" not in result["ignore_patterns"]
101+
assert "*.txt" in result["ignore_patterns"]
102+
103+
104+
def test_parse_query_local_path() -> None:
105+
path = "/home/user/project"
106+
result = parse_query(path, max_file_size=100, from_web=False)
107+
assert result["local_path"] == "/home/user/project"
108+
assert result["id"] is not None
109+
assert result["slug"] == "user/project"
110+
111+
112+
def test_parse_query_relative_path() -> None:
113+
path = "./project"
114+
result = parse_query(path, max_file_size=100, from_web=False)
115+
assert result["local_path"].endswith("project")
116+
assert result["slug"].endswith("project")
117+
118+
119+
def test_parse_query_empty_source() -> None:
120+
with pytest.raises(ValueError, match="Invalid repository URL"):
121+
parse_query("", max_file_size=100, from_web=True)
122+
123+
124+
def test_parse_url_branch_and_commit_distinction() -> None:
125+
url_branch = "https://github.com/user/repo/tree/main"
126+
url_commit = "https://github.com/user/repo/tree/abcd1234abcd1234abcd1234abcd1234abcd1234"
127+
128+
result_branch = _parse_url(url_branch)
129+
result_commit = _parse_url(url_commit)
130+
131+
assert result_branch["branch"] == "main"
132+
assert result_branch["commit"] is None
133+
134+
assert result_commit["branch"] is None
135+
assert result_commit["commit"] == "abcd1234abcd1234abcd1234abcd1234abcd1234"
136+
137+
138+
def test_parse_query_uuid_uniqueness() -> None:
139+
path = "/home/user/project"
140+
result1 = parse_query(path, max_file_size=100, from_web=False)
141+
result2 = parse_query(path, max_file_size=100, from_web=False)
142+
assert result1["id"] != result2["id"]

0 commit comments

Comments
 (0)