1
1
import asyncio
2
2
import datetime
3
3
import decimal
4
+ import enum
4
5
import functools
5
6
import gc
6
7
import itertools
@@ -55,6 +56,47 @@ def process_result_value(self, value, dialect):
55
56
sqlalchemy .Column ("published" , sqlalchemy .DateTime ),
56
57
)
57
58
59
+ # Used to test Date
60
+ events = sqlalchemy .Table (
61
+ "events" ,
62
+ metadata ,
63
+ sqlalchemy .Column ("id" , sqlalchemy .Integer , primary_key = True ),
64
+ sqlalchemy .Column ("date" , sqlalchemy .Date ),
65
+ )
66
+
67
+
68
+ # Used to test Time
69
+ daily_schedule = sqlalchemy .Table (
70
+ "daily_schedule" ,
71
+ metadata ,
72
+ sqlalchemy .Column ("id" , sqlalchemy .Integer , primary_key = True ),
73
+ sqlalchemy .Column ("time" , sqlalchemy .Time ),
74
+ )
75
+
76
+
77
+ class TshirtSize (enum .Enum ):
78
+ SMALL = "SMALL"
79
+ MEDIUM = "MEDIUM"
80
+ LARGE = "LARGE"
81
+ XL = "XL"
82
+
83
+
84
+ class TshirtColor (enum .Enum ):
85
+ BLUE = 0
86
+ GREEN = 1
87
+ YELLOW = 2
88
+ RED = 3
89
+
90
+
91
+ # Used to test Enum
92
+ tshirt_size = sqlalchemy .Table (
93
+ "tshirt_size" ,
94
+ metadata ,
95
+ sqlalchemy .Column ("id" , sqlalchemy .Integer , primary_key = True ),
96
+ sqlalchemy .Column ("size" , sqlalchemy .Enum (TshirtSize )),
97
+ sqlalchemy .Column ("color" , sqlalchemy .Enum (TshirtColor )),
98
+ )
99
+
58
100
# Used to test JSON
59
101
session = sqlalchemy .Table (
60
102
"session" ,
@@ -928,6 +970,52 @@ async def test_datetime_field(database_url):
928
970
assert results [0 ]["published" ] == now
929
971
930
972
973
+ @pytest .mark .parametrize ("database_url" , DATABASE_URLS )
974
+ @async_adapter
975
+ async def test_date_field (database_url ):
976
+ """
977
+ Test Date columns, to ensure records are coerced to/from proper Python types.
978
+ """
979
+
980
+ async with Database (database_url ) as database :
981
+ async with database .transaction (force_rollback = True ):
982
+ now = datetime .date .today ()
983
+
984
+ # execute()
985
+ query = events .insert ()
986
+ values = {"date" : now }
987
+ await database .execute (query , values )
988
+
989
+ # fetch_all()
990
+ query = events .select ()
991
+ results = await database .fetch_all (query = query )
992
+ assert len (results ) == 1
993
+ assert results [0 ]["date" ] == now
994
+
995
+
996
+ @pytest .mark .parametrize ("database_url" , DATABASE_URLS )
997
+ @async_adapter
998
+ async def test_time_field (database_url ):
999
+ """
1000
+ Test Time columns, to ensure records are coerced to/from proper Python types.
1001
+ """
1002
+
1003
+ async with Database (database_url ) as database :
1004
+ async with database .transaction (force_rollback = True ):
1005
+ now = datetime .datetime .now ().time ().replace (microsecond = 0 )
1006
+
1007
+ # execute()
1008
+ query = daily_schedule .insert ()
1009
+ values = {"time" : now }
1010
+ await database .execute (query , values )
1011
+
1012
+ # fetch_all()
1013
+ query = daily_schedule .select ()
1014
+ results = await database .fetch_all (query = query )
1015
+ assert len (results ) == 1
1016
+ assert results [0 ]["time" ] == now
1017
+
1018
+
931
1019
@pytest .mark .parametrize ("database_url" , DATABASE_URLS )
932
1020
@async_adapter
933
1021
async def test_decimal_field (database_url ):
@@ -957,7 +1045,32 @@ async def test_decimal_field(database_url):
957
1045
958
1046
@pytest .mark .parametrize ("database_url" , DATABASE_URLS )
959
1047
@async_adapter
960
- async def test_json_field (database_url ):
1048
+ async def test_enum_field (database_url ):
1049
+ """
1050
+ Test enum columns, to ensure correct cross-database support.
1051
+ """
1052
+
1053
+ async with Database (database_url ) as database :
1054
+ async with database .transaction (force_rollback = True ):
1055
+ # execute()
1056
+ size = TshirtSize .SMALL
1057
+ color = TshirtColor .GREEN
1058
+ values = {"size" : size , "color" : color }
1059
+ query = tshirt_size .insert ()
1060
+ await database .execute (query , values )
1061
+
1062
+ # fetch_all()
1063
+ query = tshirt_size .select ()
1064
+ results = await database .fetch_all (query = query )
1065
+
1066
+ assert len (results ) == 1
1067
+ assert results [0 ]["size" ] == size
1068
+ assert results [0 ]["color" ] == color
1069
+
1070
+
1071
+ @pytest .mark .parametrize ("database_url" , DATABASE_URLS )
1072
+ @async_adapter
1073
+ async def test_json_dict_field (database_url ):
961
1074
"""
962
1075
Test JSON columns, to ensure correct cross-database support.
963
1076
"""
@@ -978,6 +1091,29 @@ async def test_json_field(database_url):
978
1091
assert results [0 ]["data" ] == {"text" : "hello" , "boolean" : True , "int" : 1 }
979
1092
980
1093
1094
+ @pytest .mark .parametrize ("database_url" , DATABASE_URLS )
1095
+ @async_adapter
1096
+ async def test_json_list_field (database_url ):
1097
+ """
1098
+ Test JSON columns, to ensure correct cross-database support.
1099
+ """
1100
+
1101
+ async with Database (database_url ) as database :
1102
+ async with database .transaction (force_rollback = True ):
1103
+ # execute()
1104
+ data = ["lemon" , "raspberry" , "lime" , "pumice" ]
1105
+ values = {"data" : data }
1106
+ query = session .insert ()
1107
+ await database .execute (query , values )
1108
+
1109
+ # fetch_all()
1110
+ query = session .select ()
1111
+ results = await database .fetch_all (query = query )
1112
+
1113
+ assert len (results ) == 1
1114
+ assert results [0 ]["data" ] == ["lemon" , "raspberry" , "lime" , "pumice" ]
1115
+
1116
+
981
1117
@pytest .mark .parametrize ("database_url" , DATABASE_URLS )
982
1118
@async_adapter
983
1119
async def test_custom_field (database_url ):
0 commit comments