|
1 | 1 | from __future__ import annotations |
2 | 2 |
|
| 3 | +import builtins |
3 | 4 | import json |
4 | 5 | from typing import TYPE_CHECKING |
5 | 6 |
|
@@ -84,6 +85,62 @@ def test_to_json_python_param_with_empty_nested_list(conn_db_empty: ConnDB) -> N |
84 | 85 | assert response_data == data |
85 | 86 |
|
86 | 87 |
|
| 88 | +def test_to_json_python_param_with_mixed_nested_list(conn_db_empty: ConnDB) -> None: |
| 89 | + conn, _ = conn_db_empty |
| 90 | + conn.execute(""" |
| 91 | + INSTALL json; |
| 92 | + LOAD json; |
| 93 | + CREATE NODE TABLE User (id SERIAL PRIMARY KEY, meta JSON); |
| 94 | + """) |
| 95 | + |
| 96 | + data = { |
| 97 | + "@context": [ |
| 98 | + "entry1", |
| 99 | + "entry2", |
| 100 | + {"key": "value"}, |
| 101 | + ], |
| 102 | + } |
| 103 | + |
| 104 | + response = conn.execute( |
| 105 | + """ |
| 106 | + CREATE (n:User {meta: to_json($meta)}) |
| 107 | + RETURN n.id as id, cast(n.meta AS STRING) as meta; |
| 108 | + """, |
| 109 | + parameters={"meta": data}, |
| 110 | + ) |
| 111 | + |
| 112 | + response_data = json.loads(response.rows_as_dict().get_all()[0]["meta"]) |
| 113 | + assert response_data == data |
| 114 | + |
| 115 | + |
| 116 | +def test_to_json_mixed_nested_list_normalization_does_not_import_numpy( |
| 117 | + conn_db_empty: ConnDB, |
| 118 | + monkeypatch, |
| 119 | +) -> None: |
| 120 | + conn, _ = conn_db_empty |
| 121 | + query = "CREATE (n:User {meta: to_json($meta)})" |
| 122 | + data = {"@context": ["entry1", "entry2", {"key": "value"}]} |
| 123 | + parameters = {"meta": data} |
| 124 | + |
| 125 | + real_import = builtins.__import__ |
| 126 | + |
| 127 | + def guarded_import(name, *args, **kwargs): |
| 128 | + if name == "numpy" or name.startswith("numpy."): |
| 129 | + msg = "JSON parameter normalization should not import NumPy" |
| 130 | + raise AssertionError(msg) |
| 131 | + return real_import(name, *args, **kwargs) |
| 132 | + |
| 133 | + monkeypatch.setattr(builtins, "__import__", guarded_import) |
| 134 | + |
| 135 | + normalized_query, normalized_parameters = conn._normalize_parameters_for_pybind( |
| 136 | + query, |
| 137 | + parameters, |
| 138 | + ) |
| 139 | + assert normalized_query.startswith("CREATE (n:User {meta: CAST(") |
| 140 | + assert normalized_query.endswith(" AS JSON)})") |
| 141 | + assert normalized_parameters == {} |
| 142 | + |
| 143 | + |
87 | 144 | def test_to_json_python_param_with_homogeneous_list_uses_typed_binding( |
88 | 145 | conn_db_empty: ConnDB, |
89 | 146 | ) -> None: |
|
0 commit comments