Skip to content

Commit 762031a

Browse files
authored
Add unit tests for Python to Engine format conversion (#315)
* Add unit tests for Python to Engine format conversion * Refactor date/time tests and add tuple support
1 parent 79072fb commit 762031a

File tree

3 files changed

+73
-0
lines changed

3 files changed

+73
-0
lines changed

pyproject.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,6 @@ bindings = "pyo3"
1818
python-source = "python"
1919
module-name = "cocoindex._engine"
2020
features = ["pyo3/extension-module"]
21+
22+
[project.optional-dependencies]
23+
test = ["pytest"]

python/cocoindex/tests/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import dataclasses
2+
import uuid
3+
import datetime
4+
from dataclasses import dataclass
5+
import pytest
6+
from cocoindex.convert import to_engine_value
7+
8+
@dataclass
9+
class Order:
10+
order_id: str
11+
name: str
12+
price: float
13+
14+
@dataclass
15+
class Basket:
16+
items: list
17+
18+
@dataclass
19+
class Customer:
20+
name: str
21+
order: Order
22+
23+
def test_to_engine_value_basic_types():
24+
assert to_engine_value(123) == 123
25+
assert to_engine_value(3.14) == 3.14
26+
assert to_engine_value("hello") == "hello"
27+
assert to_engine_value(True) is True
28+
29+
def test_to_engine_value_uuid():
30+
u = uuid.uuid4()
31+
assert to_engine_value(u) == u.bytes
32+
33+
def test_to_engine_value_date_time_types():
34+
d = datetime.date(2024, 1, 1)
35+
assert to_engine_value(d) == d
36+
t = datetime.time(12, 30)
37+
assert to_engine_value(t) == t
38+
dt = datetime.datetime(2024, 1, 1, 12, 30)
39+
assert to_engine_value(dt) == dt
40+
41+
def test_to_engine_value_struct():
42+
order = Order(order_id="O123", name="mixed nuts", price=25.0)
43+
assert to_engine_value(order) == ["O123", "mixed nuts", 25.0]
44+
45+
def test_to_engine_value_list_of_structs():
46+
orders = [Order("O1", "item1", 10.0), Order("O2", "item2", 20.0)]
47+
assert to_engine_value(orders) == [["O1", "item1", 10.0], ["O2", "item2", 20.0]]
48+
49+
def test_to_engine_value_struct_with_list():
50+
basket = Basket(items=["apple", "banana"])
51+
assert to_engine_value(basket) == [["apple", "banana"]]
52+
53+
def test_to_engine_value_nested_struct():
54+
customer = Customer(name="Alice", order=Order("O1", "item1", 10.0))
55+
assert to_engine_value(customer) == ["Alice", ["O1", "item1", 10.0]]
56+
57+
def test_to_engine_value_empty_list():
58+
assert to_engine_value([]) == []
59+
assert to_engine_value([[]]) == [[]]
60+
61+
def test_to_engine_value_tuple():
62+
assert to_engine_value(()) == []
63+
assert to_engine_value((1, 2, 3)) == [1, 2, 3]
64+
assert to_engine_value(((1, 2), (3, 4))) == [[1, 2], [3, 4]]
65+
assert to_engine_value(([],)) == [[]]
66+
assert to_engine_value(((),)) == [[]]
67+
68+
def test_to_engine_value_none():
69+
assert to_engine_value(None) is None

0 commit comments

Comments
 (0)