Skip to content

Commit 36a0702

Browse files
authored
Fix sanitize_params to correctly resolve nested columns (#222)
* Add test for sanitize_params in utils * Remove dot character from sanitize_params util * Add tests for filter queries that include special characters in column name * Add missing test for equals operator
1 parent a2cdd3e commit 36a0702

File tree

4 files changed

+62
-1
lines changed

4 files changed

+62
-1
lines changed

postgrest/utils.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def aclose(self) -> None:
1313

1414
def sanitize_param(param: Any) -> str:
1515
param_str = str(param)
16-
reserved_chars = ".,:()"
16+
reserved_chars = ",:()"
1717
if any(char in param_str for char in reserved_chars):
1818
return f'"{param_str}"'
1919
return param_str

tests/_async/test_filter_request_builder.py

+21
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,21 @@ def test_filter(filter_request_builder):
3636
assert builder.params['":col.name"'] == "eq.val"
3737

3838

39+
@pytest.mark.parametrize(
40+
"col_name, expected_query_prefix",
41+
[
42+
("col:name", "%22col%3Aname%22"),
43+
("col.name", "col.name"),
44+
],
45+
)
46+
def test_filter_special_characters(
47+
filter_request_builder, col_name, expected_query_prefix
48+
):
49+
builder = filter_request_builder.filter(col_name, "eq", "val")
50+
51+
assert str(builder.params) == expected_query_prefix + "=eq.val"
52+
53+
3954
def test_multivalued_param(filter_request_builder):
4055
builder = filter_request_builder.lte("x", "a").gte("x", "b")
4156

@@ -47,6 +62,12 @@ def test_match(filter_request_builder):
4762
assert str(builder.params) == "id=eq.1&done=eq.false"
4863

4964

65+
def test_equals(filter_request_builder):
66+
builder = filter_request_builder.eq("x", "a")
67+
68+
assert str(builder.params) == "x=eq.a"
69+
70+
5071
def test_contains(filter_request_builder):
5172
builder = filter_request_builder.contains("x", "a")
5273

tests/_sync/test_filter_request_builder.py

+21
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,21 @@ def test_filter(filter_request_builder):
3636
assert builder.params['":col.name"'] == "eq.val"
3737

3838

39+
@pytest.mark.parametrize(
40+
"col_name, expected_query_prefix",
41+
[
42+
("col:name", "%22col%3Aname%22"),
43+
("col.name", "col.name"),
44+
],
45+
)
46+
def test_filter_special_characters(
47+
filter_request_builder, col_name, expected_query_prefix
48+
):
49+
builder = filter_request_builder.filter(col_name, "eq", "val")
50+
51+
assert str(builder.params) == expected_query_prefix + "=eq.val"
52+
53+
3954
def test_multivalued_param(filter_request_builder):
4055
builder = filter_request_builder.lte("x", "a").gte("x", "b")
4156

@@ -47,6 +62,12 @@ def test_match(filter_request_builder):
4762
assert str(builder.params) == "id=eq.1&done=eq.false"
4863

4964

65+
def test_equals(filter_request_builder):
66+
builder = filter_request_builder.eq("x", "a")
67+
68+
assert str(builder.params) == "x=eq.a"
69+
70+
5071
def test_contains(filter_request_builder):
5172
builder = filter_request_builder.contains("x", "a")
5273

tests/test_utils.py

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import pytest
2+
3+
from postgrest.utils import sanitize_param
4+
5+
6+
@pytest.mark.parametrize(
7+
"value, expected",
8+
[
9+
("param,name", '"param,name"'),
10+
("param:name", '"param:name"'),
11+
("param(name", '"param(name"'),
12+
("param)name", '"param)name"'),
13+
("param,name", '"param,name"'),
14+
("table.column", "table.column"),
15+
("table_column", "table_column"),
16+
],
17+
)
18+
def test_sanitize_params(value, expected):
19+
assert sanitize_param(value) == expected

0 commit comments

Comments
 (0)