File: test_3800_typehandler.py

package info (click to toggle)
python-cx-oracle 8.3.0-3
  • links: PTS, VCS
  • area: contrib
  • in suites: bookworm, sid
  • size: 3,276 kB
  • sloc: ansic: 10,406; python: 9,358; sql: 1,724; makefile: 31
file content (133 lines) | stat: -rw-r--r-- 6,001 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#------------------------------------------------------------------------------
#Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
#------------------------------------------------------------------------------

"""
3800 - Module for testing the input and output type handlers.
"""

import json

import cx_Oracle as oracledb
import test_env

class Building(object):

    def __init__(self, building_id, description, num_floors):
        self.building_id = building_id
        self.description = description
        self.num_floors = num_floors

    def __repr__(self):
        return "<Building %s: %s>" % (self.building_id, self.description)

    def __eq__(self, other):
        if isinstance(other, Building):
            return other.building_id == self.building_id \
                    and other.description == self.description \
                    and other.num_floors == self.num_floors
        return NotImplemented

    def to_json(self):
        return json.dumps(self.__dict__)

    @classmethod
    def from_json(cls, value):
        result = json.loads(value)
        return cls(**result)


class TestCase(test_env.BaseTestCase):

    def building_in_converter(self, value):
        return value.to_json()

    def input_type_handler(self, cursor, value, num_elements):
        if isinstance(value, Building):
            return cursor.var(oracledb.STRING, arraysize=num_elements,
                              inconverter=self.building_in_converter)

    def output_type_handler(self, cursor, name, default_type, size, precision,
                            scale):
        if default_type == oracledb.STRING:
            return cursor.var(default_type, arraysize=cursor.arraysize,
                              outconverter=Building.from_json)

    def test_3800(self):
        "3800 - binding unsupported python object without input type handler"
        self.cursor.execute("truncate table TestTempTable")
        sql = "insert into TestTempTable (IntCol, StringCol) values (:1, :2)"
        building = Building(1, "The First Building", 5)
        self.assertRaises(oracledb.NotSupportedError, self.cursor.execute, sql,
                          (building.building_id, building))

    def test_3801(self):
        "3801 - not callable input type handler"
        self.cursor.execute("truncate table TestTempTable")
        building = Building(1, "The First Building", 5)
        sql = "insert into TestTempTable (IntCol, StringCol) values (:1, :2)"
        self.cursor.inputtypehandler = 5
        self.assertRaises(TypeError, self.cursor.execute, sql,
                          (building.building_id, building))

    def test_3802(self):
        "3802 - binding unsupported python object with input type handler"
        self.cursor.execute("truncate table TestTempTable")
        building = Building(1, "The First Building", 5)
        sql = "insert into TestTempTable (IntCol, StringCol) values (:1, :2)"
        self.cursor.inputtypehandler = self.input_type_handler
        self.cursor.execute(sql, (building.building_id, building))
        self.connection.commit()
        self.cursor.execute("select IntCol, StringCol from TestTempTable")
        self.assertEqual(self.cursor.fetchall(),
                         [(building.building_id, building.to_json())])

    def test_3803(self):
        "3803 - input type handler and output type handler on cursor level"
        self.cursor.execute("truncate table TestTempTable")
        building_one = Building(1, "The First Building", 5)
        building_two = Building(2, "The Second Building", 87)
        sql = "insert into TestTempTable (IntCol, StringCol) values (:1, :2)"
        cursor_one = self.connection.cursor()
        cursor_two = self.connection.cursor()
        cursor_one.inputtypehandler = self.input_type_handler
        cursor_one.execute(sql, (building_one.building_id, building_one))
        self.connection.commit()
        cursor_one.execute("select IntCol, StringCol from TestTempTable")
        self.assertEqual(cursor_one.fetchall(),
                         [(building_one.building_id, building_one.to_json())])
        self.assertRaises(oracledb.NotSupportedError, cursor_two.execute,
                          sql, (building_two.building_id, building_two))
        cursor_two.outputtypehandler = self.output_type_handler
        cursor_two.execute("select IntCol, StringCol from TestTempTable")
        self.assertEqual(cursor_two.fetchall(),
                         [(building_one.building_id, building_one)])

    def test_3804(self):
        "3804 - input type handler and output type handler on connection level"
        self.cursor.execute("truncate table TestTempTable")
        building_one = Building(1, "The First Building", 5)
        building_two = Building(2, "The Second Building", 87)
        sql = "insert into TestTempTable (IntCol, StringCol) values (:1, :2)"
        connection = test_env.get_connection()
        connection.inputtypehandler = self.input_type_handler
        cursor_one = connection.cursor()
        cursor_two = connection.cursor()
        cursor_one.execute(sql, (building_one.building_id, building_one))
        cursor_two.execute(sql, (building_two.building_id, building_two))
        connection.commit()
        expected_data = [
            (building_one.building_id, building_one),
            (building_two.building_id, building_two)
        ]
        connection.outputtypehandler = self.output_type_handler
        cursor_one.execute("select IntCol, StringCol from TestTempTable")
        self.assertEqual(cursor_one.fetchall(), expected_data)
        cursor_two.execute("select IntCol, StringCol from TestTempTable")
        self.assertEqual(cursor_two.fetchall(), expected_data)
        other_cursor = self.connection.cursor()
        self.assertRaises(oracledb.NotSupportedError, other_cursor.execute,
                          sql, (building_one.building_id, building_one))

if __name__ == "__main__":
    test_env.run_test_cases()