Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 83 additions & 29 deletions tests/aio/test_types.py
Original file line number Diff line number Diff line change
@@ -1,49 +1,103 @@
import pytest
import ydb
import datetime

from datetime import date, datetime, timedelta
from decimal import Decimal
from uuid import uuid4

@pytest.mark.parametrize("enabled", [False, True])

@pytest.mark.parametrize(
"value,ydb_type",
[
(True, "Bool"),
(-125, "Int8"),
(None, "Int8?"),
(-32766, "Int16"),
(-1123, "Int32"),
(-2157583648, "Int64"),
(255, "UInt8"),
(65534, "UInt16"),
(5555, "UInt32"),
(2157583649, "UInt64"),
(3.1415, "Double"),
(".31415926535e1", "DyNumber"),
(Decimal("3.1415926535"), "Decimal(28, 10)"),
(b"Hello, YDB!", "String"),
("Hello, 🐍!", "Utf8"),
('{"foo": "bar"}', "Json"),
(b'{"foo"="bar"}', "Yson"),
('{"foo":"bar"}', "JsonDocument"),
(uuid4(), "Uuid"),
([1, 2, 3], "List<Int8>"),
# ({1, 2, 3}, "Set<Int8>"), # FIXME: AttributeError: 'set' object has no attribute 'items'
([b"a", b"b", b"c"], "List<String>"),
({"a": 1001, "b": 1002}, "Dict<Utf8, Int32>"),
(("a", 1001), "Tuple<Utf8, Int32>"),
({"foo": True, "bar": None}, "Struct<foo:Bool?, bar:Int32?>"),
(100, "Date"),
(100, "Datetime"),
(-100, "Interval"),
(100, "Timestamp"),
(1511789040123456, "Timestamp"),
],
)
@pytest.mark.asyncio
async def test_interval(driver, database, enabled):
client = ydb.TableClient(
driver, ydb.TableClientSettings().with_native_interval_in_result_sets(enabled)
)
session = await client.session().create()
async def test_types(driver, database, value, ydb_type):
session = await driver.table_client.session().create()
prepared = await session.prepare(
"DECLARE $param as Interval;\n SELECT $param as value",
f"DECLARE $param as {ydb_type}; SELECT $param as value"
)

param = datetime.timedelta(microseconds=-100) if enabled else -100
result = await session.transaction().execute(
prepared, {"$param": param}, commit_tx=True
prepared, {"$param": value}, commit_tx=True
)
assert result[0].rows[0].value == param
assert result[0].rows[0].value == value


test_td = timedelta(microseconds=-100)
test_now = datetime.utcnow()
test_today = date.today()
test_dt_today = datetime.today()


@pytest.mark.parametrize("enabled", [False, True])
@pytest.mark.parametrize(
"value,ydb_type,result_value",
[
# FIXME: TypeError: 'datetime.date'/'datetime.datetime' object cannot be interpreted as an integer
# (test_today, 'Date', test_today),
# (test_dt_today, "Datetime", test_dt_today),
(365, "Date", date(1971, 1, 1)),
(3600 * 24 * 365, "Datetime", datetime(1971, 1, 1, 0, 0)),
(test_td, "Interval", test_td),
(test_now, "Timestamp", test_now),
(
1511789040123456,
"Timestamp",
datetime.fromisoformat("2017-11-27 13:24:00.123456"),
),
('{"foo": "bar"}', "Json", {"foo": "bar"}),
('{"foo": "bar"}', "JsonDocument", {"foo": "bar"}),
],
)
@pytest.mark.asyncio
async def test_timestamp(driver, database, enabled):
client = ydb.TableClient(
driver, ydb.TableClientSettings().with_native_timestamp_in_result_sets(enabled)
async def test_types_native(driver, database, value, ydb_type, result_value):
settings = (
ydb.TableClientSettings()
.with_native_date_in_result_sets(True)
.with_native_datetime_in_result_sets(True)
.with_native_timestamp_in_result_sets(True)
.with_native_interval_in_result_sets(True)
.with_native_json_in_result_sets(True)
)

client = ydb.TableClient(driver, settings)
session = await client.session().create()
prepared = await session.prepare(
"DECLARE $param as Timestamp;\n SELECT $param as value",
)

param = datetime.datetime.utcnow() if enabled else 100
result = await session.transaction().execute(
prepared, {"$param": param}, commit_tx=True
prepared = await session.prepare(
f"DECLARE $param as {ydb_type}; SELECT $param as value"
)
assert result[0].rows[0].value == param

result = await session.transaction().execute(
prepared, {"$param": 1511789040123456}, commit_tx=True
prepared, {"$param": value}, commit_tx=True
)
if enabled:
assert result[0].rows[0].value == datetime.datetime.fromisoformat(
"2017-11-27 13:24:00.123456"
)
else:
assert result[0].rows[0].value == 1511789040123456
assert result[0].rows[0].value == result_value