mirror of
				https://github.com/psycopg/psycopg2.git
				synced 2025-11-04 01:37:31 +03:00 
			
		
		
		
	Added wishful test suite for jsonb type
This commit is contained in:
		
							parent
							
								
									f434d87ef1
								
							
						
					
					
						commit
						ba1409d419
					
				| 
						 | 
					@ -1058,6 +1058,97 @@ class JsonTestCase(ConnectingTestCase):
 | 
				
			||||||
        self.assertEqual(data['b'], None)
 | 
					        self.assertEqual(data['b'], None)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def skip_if_no_jsonb_type(f):
 | 
				
			||||||
 | 
					    return skip_before_postgres(9, 4)(f)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class JsonbTestCase(ConnectingTestCase):
 | 
				
			||||||
 | 
					    @staticmethod
 | 
				
			||||||
 | 
					    def myloads(s):
 | 
				
			||||||
 | 
					        import json
 | 
				
			||||||
 | 
					        rv = json.loads(s)
 | 
				
			||||||
 | 
					        rv['test'] = 1
 | 
				
			||||||
 | 
					        return rv
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_default_cast(self):
 | 
				
			||||||
 | 
					        curs = self.conn.cursor()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        curs.execute("""select '{"a": 100.0, "b": null}'::jsonb""")
 | 
				
			||||||
 | 
					        self.assertEqual(curs.fetchone()[0], {'a': 100.0, 'b': None})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        curs.execute("""select array['{"a": 100.0, "b": null}']::jsonb[]""")
 | 
				
			||||||
 | 
					        self.assertEqual(curs.fetchone()[0], [{'a': 100.0, 'b': None}])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_register_on_connection(self):
 | 
				
			||||||
 | 
					        psycopg2.extras.register_json(self.conn, loads=self.myloads, name='jsonb')
 | 
				
			||||||
 | 
					        curs = self.conn.cursor()
 | 
				
			||||||
 | 
					        curs.execute("""select '{"a": 100.0, "b": null}'::jsonb""")
 | 
				
			||||||
 | 
					        self.assertEqual(curs.fetchone()[0], {'a': 100.0, 'b': None, 'test': 1})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_register_on_cursor(self):
 | 
				
			||||||
 | 
					        curs = self.conn.cursor()
 | 
				
			||||||
 | 
					        psycopg2.extras.register_json(curs, loads=self.myloads, name='jsonb')
 | 
				
			||||||
 | 
					        curs.execute("""select '{"a": 100.0, "b": null}'::jsonb""")
 | 
				
			||||||
 | 
					        self.assertEqual(curs.fetchone()[0], {'a': 100.0, 'b': None, 'test': 1})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_register_globally(self):
 | 
				
			||||||
 | 
					        old = psycopg2.extensions.string_types.get(3802)
 | 
				
			||||||
 | 
					        olda = psycopg2.extensions.string_types.get(3807)
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            new, newa = psycopg2.extras.register_json(self.conn,
 | 
				
			||||||
 | 
					                loads=self.myloads, globally=True, name='jsonb')
 | 
				
			||||||
 | 
					            curs = self.conn.cursor()
 | 
				
			||||||
 | 
					            curs.execute("""select '{"a": 100.0, "b": null}'::jsonb""")
 | 
				
			||||||
 | 
					            self.assertEqual(curs.fetchone()[0], {'a': 100.0, 'b': None, 'test': 1})
 | 
				
			||||||
 | 
					        finally:
 | 
				
			||||||
 | 
					            psycopg2.extensions.string_types.pop(new.values[0])
 | 
				
			||||||
 | 
					            psycopg2.extensions.string_types.pop(newa.values[0])
 | 
				
			||||||
 | 
					            if old:
 | 
				
			||||||
 | 
					                psycopg2.extensions.register_type(old)
 | 
				
			||||||
 | 
					            if olda:
 | 
				
			||||||
 | 
					                psycopg2.extensions.register_type(olda)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_loads(self):
 | 
				
			||||||
 | 
					        json = psycopg2.extras.json
 | 
				
			||||||
 | 
					        loads = lambda x: json.loads(x, parse_float=Decimal)
 | 
				
			||||||
 | 
					        psycopg2.extras.register_json(self.conn, loads=loads, name='jsonb')
 | 
				
			||||||
 | 
					        curs = self.conn.cursor()
 | 
				
			||||||
 | 
					        curs.execute("""select '{"a": 100.0, "b": null}'::jsonb""")
 | 
				
			||||||
 | 
					        data = curs.fetchone()[0]
 | 
				
			||||||
 | 
					        self.assert_(isinstance(data['a'], Decimal))
 | 
				
			||||||
 | 
					        self.assertEqual(data['a'], Decimal('100.0'))
 | 
				
			||||||
 | 
					        # sure we are not manling json too?
 | 
				
			||||||
 | 
					        curs.execute("""select '{"a": 100.0, "b": null}'::json""")
 | 
				
			||||||
 | 
					        data = curs.fetchone()[0]
 | 
				
			||||||
 | 
					        self.assert_(isinstance(data['a'], float))
 | 
				
			||||||
 | 
					        self.assertEqual(data['a'], 100.0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_register_default(self):
 | 
				
			||||||
 | 
					        curs = self.conn.cursor()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        loads = lambda x: psycopg2.extras.json.loads(x, parse_float=Decimal)
 | 
				
			||||||
 | 
					        psycopg2.extras.register_default_jsonb(curs, loads=loads)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        curs.execute("""select '{"a": 100.0, "b": null}'::jsonb""")
 | 
				
			||||||
 | 
					        data = curs.fetchone()[0]
 | 
				
			||||||
 | 
					        self.assert_(isinstance(data['a'], Decimal))
 | 
				
			||||||
 | 
					        self.assertEqual(data['a'], Decimal('100.0'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        curs.execute("""select array['{"a": 100.0, "b": null}']::jsonb[]""")
 | 
				
			||||||
 | 
					        data = curs.fetchone()[0]
 | 
				
			||||||
 | 
					        self.assert_(isinstance(data[0]['a'], Decimal))
 | 
				
			||||||
 | 
					        self.assertEqual(data[0]['a'], Decimal('100.0'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_null(self):
 | 
				
			||||||
 | 
					        curs = self.conn.cursor()
 | 
				
			||||||
 | 
					        curs.execute("""select NULL::jsonb""")
 | 
				
			||||||
 | 
					        self.assertEqual(curs.fetchone()[0], None)
 | 
				
			||||||
 | 
					        curs.execute("""select NULL::jsonb[]""")
 | 
				
			||||||
 | 
					        self.assertEqual(curs.fetchone()[0], None)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					decorate_all_tests(JsonbTestCase, skip_if_no_json_module)
 | 
				
			||||||
 | 
					decorate_all_tests(JsonbTestCase, skip_if_no_jsonb_type)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class RangeTestCase(unittest.TestCase):
 | 
					class RangeTestCase(unittest.TestCase):
 | 
				
			||||||
    def test_noparam(self):
 | 
					    def test_noparam(self):
 | 
				
			||||||
        from psycopg2.extras import Range
 | 
					        from psycopg2.extras import Range
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user