1010import gc
1111import pickle
1212import sys
13- import unittest
1413
1514from asyncpg import _testbase as tb
1615from asyncpg .protocol .protocol import _create_record as Record
@@ -37,10 +36,6 @@ def checkref(self, *objs):
3736 self .fail ('refcounts differ for {!r}: {:+}' .format (
3837 objs [i ], after - before ))
3938
40- def test_record_zero_length (self ):
41- with self .assertRaises (SystemError ):
42- Record ({}, ())
43-
4439 def test_record_gc (self ):
4540 elem = object ()
4641 mapping = {}
@@ -153,10 +148,7 @@ def test_record_keys(self):
153148 r = Record (R_AB , (42 , 43 ))
154149 vv = r .keys ()
155150 self .assertEqual (tuple (vv ), ('a' , 'b' ))
156-
157- # test invalid record
158- with self .assertRaisesRegex (TypeError , 'not iterable' ):
159- Record (None , (42 , 43 )).keys ()
151+ self .assertEqual (list (Record (None , (42 , 43 )).keys ()), [])
160152
161153 def test_record_items (self ):
162154 r = Record (R_AB , (42 , 43 ))
@@ -188,9 +180,12 @@ def test_record_items(self):
188180 self .assertEqual (list (r .items ()), [('a' , 42 )])
189181 r = Record (R_AB , (42 ,))
190182 self .assertEqual (list (r .items ()), [('a' , 42 )])
191- r = Record (None , (42 , 43 ))
192- with self .assertRaises (TypeError ):
193- list (r .items ())
183+
184+ # Try to iterate over exhausted items() iterator
185+ r = Record (R_A , (42 , 43 ))
186+ it = r .items ()
187+ list (it )
188+ list (it )
194189
195190 def test_record_hash (self ):
196191 AB = collections .namedtuple ('AB' , ('a' , 'b' ))
@@ -220,8 +215,7 @@ def test_record_contains(self):
220215 self .assertNotIn ('z' , r )
221216
222217 r = Record (None , (42 , 43 ))
223- with self .assertRaises (TypeError ):
224- self .assertIn ('a' , r )
218+ self .assertNotIn ('a' , r )
225219
226220 with self .assertRaises (TypeError ):
227221 type (r ).__contains__ (None , 'a' )
@@ -281,6 +275,21 @@ def test_record_not_pickleable(self):
281275 with self .assertRaises (Exception ):
282276 pickle .dumps (r )
283277
278+ def test_record_empty (self ):
279+ r = Record (None , ())
280+ self .assertEqual (r , ())
281+ self .assertLess (r , (1 ,))
282+ self .assertEqual (len (r ), 0 )
283+ self .assertFalse (r )
284+ self .assertNotIn ('a' , r )
285+ self .assertEqual (repr (r ), '<Record>' )
286+ self .assertEqual (str (r ), '<Record>' )
287+ with self .assertRaisesRegex (KeyError , 'aaa' ):
288+ r ['aaa' ]
289+ self .assertEqual (dict (r .items ()), {})
290+ self .assertEqual (list (r .keys ()), [])
291+ self .assertEqual (list (r .values ()), [])
292+
284293 async def test_record_duplicate_colnames (self ):
285294 """Test that Record handles duplicate column names."""
286295 r = await self .con .fetchrow ('SELECT 1 as a, 2 as a' )
0 commit comments