1+ import pytest
2+
3+ import ydb
4+
5+ from datetime import date , datetime , timedelta , timezone
6+
7+ @pytest .fixture
8+ def settings_on ():
9+ settings = (
10+ ydb .QueryClientSettings ()
11+ .with_native_date_in_result_sets (True )
12+ .with_native_datetime_in_result_sets (True )
13+ .with_native_timestamp_in_result_sets (True )
14+ .with_native_interval_in_result_sets (True )
15+ .with_native_json_in_result_sets (True )
16+ )
17+ return settings
18+
19+ @pytest .fixture
20+ def settings_off ():
21+ settings = (
22+ ydb .QueryClientSettings ()
23+ .with_native_date_in_result_sets (False )
24+ .with_native_datetime_in_result_sets (False )
25+ .with_native_timestamp_in_result_sets (False )
26+ .with_native_interval_in_result_sets (False )
27+ .with_native_json_in_result_sets (False )
28+ )
29+ return settings
30+
31+
32+ test_td = timedelta (microseconds = - 100 )
33+ test_now = datetime .utcnow ()
34+ test_today = test_now .date ()
35+ test_dt_today = datetime .today ()
36+ tz4h = timezone (timedelta (hours = 4 ))
37+
38+ pt = ydb .PrimitiveType
39+
40+ # params = pytest.mark.parametrize(
41+ # "value,ydb_type,expected_result",
42+ # [
43+ # # FIXME: TypeError: 'datetime.datetime' object cannot be interpreted as an integer
44+ # # (test_dt_today, "Datetime", test_dt_today),
45+ # (test_today, "Date", pt.Date, test_today),
46+ # (365, "Date", pt.Date, date(1971, 1, 1)),
47+ # (3600 * 24 * 365, "Datetime", pt.Datetime,datetime(1971, 1, 1, 0, 0)),
48+ # (datetime(1970, 1, 1, 4, 0, tzinfo=tz4h), "Timestamp", pt.Timestamp, datetime(1970, 1, 1, 0, 0)),
49+ # (test_td, "Interval", pt.Interval, test_td),
50+ # (test_now, "Timestamp", pt.Timestamp, test_now),
51+ # (
52+ # 1511789040123456,
53+ # "Timestamp",
54+ # pt.Timestamp,
55+ # datetime.fromisoformat("2017-11-27 13:24:00.123456"),
56+ # ),
57+ # ('{"foo": "bar"}', "Json", pt.Json, {"foo": "bar"}),
58+ # ('{"foo": "bar"}', "JsonDocument", pt.JsonDocument, {"foo": "bar"}),
59+ # ],
60+ # )
61+
62+ params = pytest .mark .parametrize (
63+ "value,ydb_type,casted_result,uncasted_type" ,
64+ [
65+ (test_today , "Date" , test_today , int ),
66+ (365 , "Date" , date (1971 , 1 , 1 ), int ),
67+ (3600 * 24 * 365 , "Datetime" , datetime (1971 , 1 , 1 , 0 , 0 ), int ),
68+ (datetime (1970 , 1 , 1 , 4 , 0 , tzinfo = tz4h ), "Timestamp" , datetime (1970 , 1 , 1 , 0 , 0 ), int ),
69+ (test_td , "Interval" , test_td , int ),
70+ (test_now , "Timestamp" , test_now , int ),
71+ (
72+ 1511789040123456 ,
73+ "Timestamp" ,
74+ datetime .fromisoformat ("2017-11-27 13:24:00.123456" ),
75+ int ,
76+ ),
77+ ('{"foo": "bar"}' , "Json" , {"foo" : "bar" }, str ),
78+ ('{"foo": "bar"}' , "JsonDocument" , {"foo" : "bar" }, str ),
79+ ],
80+ )
81+
82+ class TestQueryClientSettings :
83+ @params
84+ def test_driver_turn_on (self , driver_sync , settings_on , value , ydb_type , casted_result , uncasted_type ):
85+ driver_sync ._driver_config .query_client_settings = settings_on
86+ pool = ydb .QuerySessionPool (driver_sync )
87+ result = pool .execute_with_retries (
88+ f"DECLARE $param as { ydb_type } ; SELECT $param as value" ,
89+ {"$param" : (value , getattr (ydb .PrimitiveType , ydb_type ))}
90+ )
91+ assert result [0 ].rows [0 ].value == casted_result
92+
93+ @params
94+ def test_driver_turn_off (self , driver_sync , settings_off , value , ydb_type , casted_result , uncasted_type ):
95+ driver_sync ._driver_config .query_client_settings = settings_off
96+ pool = ydb .QuerySessionPool (driver_sync )
97+ result = pool .execute_with_retries (
98+ f"DECLARE $param as { ydb_type } ; SELECT $param as value" ,
99+ {"$param" : (value , getattr (ydb .PrimitiveType , ydb_type ))}
100+ )
101+ assert type (result [0 ].rows [0 ].value ) == uncasted_type
102+
103+ @params
104+ def test_session_pool_turn_on (self , driver_sync , settings_on , value , ydb_type , casted_result , uncasted_type ):
105+ pool = ydb .QuerySessionPool (driver_sync , query_client_settings = settings_on )
106+ result = pool .execute_with_retries (
107+ f"DECLARE $param as { ydb_type } ; SELECT $param as value" ,
108+ {"$param" : (value , getattr (ydb .PrimitiveType , ydb_type ))}
109+ )
110+ assert result [0 ].rows [0 ].value == casted_result
111+
112+ @params
113+ def test_session_pool_turn_off (self , driver_sync , settings_off , value , ydb_type , casted_result , uncasted_type ):
114+ pool = ydb .QuerySessionPool (driver_sync , query_client_settings = settings_off )
115+ result = pool .execute_with_retries (
116+ f"DECLARE $param as { ydb_type } ; SELECT $param as value" ,
117+ {"$param" : (value , getattr (ydb .PrimitiveType , ydb_type ))}
118+ )
119+ assert type (result [0 ].rows [0 ].value ) == uncasted_type
120+
121+ @pytest .mark .asyncio
122+ @params
123+ async def test_driver_async_turn_on (self , driver , settings_on , value , ydb_type , casted_result , uncasted_type ):
124+ driver ._driver_config .query_client_settings = settings_on
125+ pool = ydb .aio .QuerySessionPool (driver )
126+ result = await pool .execute_with_retries (
127+ f"DECLARE $param as { ydb_type } ; SELECT $param as value" ,
128+ {"$param" : (value , getattr (ydb .PrimitiveType , ydb_type ))}
129+ )
130+ assert result [0 ].rows [0 ].value == casted_result
131+
132+ @pytest .mark .asyncio
133+ @params
134+ async def test_driver_async_turn_off (self , driver , settings_off , value , ydb_type , casted_result , uncasted_type ):
135+ driver ._driver_config .query_client_settings = settings_off
136+ pool = ydb .aio .QuerySessionPool (driver )
137+ result = await pool .execute_with_retries (
138+ f"DECLARE $param as { ydb_type } ; SELECT $param as value" ,
139+ {"$param" : (value , getattr (ydb .PrimitiveType , ydb_type ))}
140+ )
141+ assert type (result [0 ].rows [0 ].value ) == uncasted_type
142+
143+ @pytest .mark .asyncio
144+ @params
145+ async def test_session_pool_async_turn_on (self , driver , settings_on , value , ydb_type , casted_result , uncasted_type ):
146+ pool = ydb .aio .QuerySessionPool (driver , query_client_settings = settings_on )
147+ result = await pool .execute_with_retries (
148+ f"DECLARE $param as { ydb_type } ; SELECT $param as value" ,
149+ {"$param" : (value , getattr (ydb .PrimitiveType , ydb_type ))}
150+ )
151+ assert result [0 ].rows [0 ].value == casted_result
152+
153+ @pytest .mark .asyncio
154+ @params
155+ async def test_session_pool_async_turn_off (self , driver , settings_off , value , ydb_type , casted_result , uncasted_type ):
156+ pool = ydb .aio .QuerySessionPool (driver , query_client_settings = settings_off )
157+ result = await pool .execute_with_retries (
158+ f"DECLARE $param as { ydb_type } ; SELECT $param as value" ,
159+ {"$param" : (value , getattr (ydb .PrimitiveType , ydb_type ))}
160+ )
161+ assert type (result [0 ].rows [0 ].value ) == uncasted_type
0 commit comments