Skip to content

Commit bc36a60

Browse files
Further test improvements.
1 parent b1adaf9 commit bc36a60

File tree

6 files changed

+114
-15
lines changed

6 files changed

+114
-15
lines changed

tests/test_1100_connection.py

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,8 @@ def test_1105_bad_connect_string(self):
149149
self.assertRaisesRegex(oracledb.DatabaseError, "^DPY-4000:|^DPY-4001:",
150150
oracledb.connect, test_env.get_main_user() + \
151151
"@" + test_env.get_connect_string())
152-
errors = "^DPY-4000:|^DPY-4001:|^DPY-4017:|^ORA-12154:|^ORA-12521:"
152+
errors = "^DPY-4000:|^DPY-4001:|^DPY-4017:|^ORA-12154:|^ORA-12521:|" \
153+
"^ORA-12262:"
153154
self.assertRaisesRegex(oracledb.DatabaseError, errors,
154155
oracledb.connect, test_env.get_main_user() + \
155156
"@" + test_env.get_connect_string() + "/" + \
@@ -629,5 +630,29 @@ def test_1141_deprecations(self):
629630
self.assertEqual(conn.maxBytesPerCharacter, 4)
630631
self.assertEqual(conn.tnsentry, conn.dsn)
631632

633+
@unittest.skipIf(test_env.get_server_version() < (23, 0) or \
634+
test_env.get_client_version() < (23, 0),
635+
"unsupported client/server")
636+
def test_1142_max_length_password(self):
637+
"1142 - test maximum allowed length for password"
638+
connection = test_env.get_connection()
639+
if self.is_on_oracle_cloud(connection):
640+
self.skipTest("passwords on Oracle Cloud are strictly controlled")
641+
642+
orig_password = test_env.get_main_password()
643+
new_password_32 = 'a' * 32
644+
connection.changepassword(orig_password, new_password_32)
645+
connection = test_env.get_connection(password=new_password_32)
646+
647+
new_password_1024 = 'a' * 1024
648+
connection.changepassword(new_password_32, new_password_1024)
649+
connection = test_env.get_connection(password=new_password_1024)
650+
connection.changepassword(new_password_1024, orig_password)
651+
652+
new_password_1025 = 'a' * 1025
653+
self.assertRaisesRegex(oracledb.DatabaseError, "^ORA-28218:",
654+
connection.changepassword, orig_password,
655+
new_password_1025)
656+
632657
if __name__ == "__main__":
633658
test_env.run_test_cases()

tests/test_2300_object_var.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,7 @@ def test_2307_round_trip_object(self):
373373

374374
def test_2308_invalid_type_object(self):
375375
"2308 - test trying to find an object type that does not exist"
376+
self.assertRaises(TypeError, self.connection.gettype, 2)
376377
self.assertRaisesRegex(oracledb.DatabaseError, "^DPY-2035:",
377378
self.connection.gettype,
378379
"A TYPE THAT DOES NOT EXIST")

tests/test_3000_subscription.py

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ def _process_message(self, message):
8181
"thin mode doesn't support subscriptions")
8282
class TestCase(test_env.BaseTestCase):
8383

84-
@unittest.skip("FIXME: threaded mode fails on close of connection?")
84+
@unittest.skipIf(test_env.get_client_version() < (23, 1),
85+
"crashes in older clients")
8586
def test_3000_dml_subscription(self):
8687
"3000 - test subscription for insert, update, delete and truncate"
8788

@@ -181,7 +182,8 @@ def test_3001_deprecations(self):
181182
self.connection.subscribe,
182183
client_initiated=True, clientInitiated=True)
183184

184-
@unittest.skip("multiple subscriptions cannot be created simultaneously")
185+
@unittest.skipIf(test_env.get_client_version() < (23, 1),
186+
"crashes in older clients")
185187
def test_3002_aq_subscription(self):
186188
"3002 - test subscription for AQ"
187189

@@ -206,7 +208,8 @@ def test_3002_aq_subscription(self):
206208
# wait for all messages to be sent
207209
data.wait_for_messages()
208210

209-
@unittest.skip("FIXME: threaded mode fails on close of connection?")
211+
@unittest.skipIf(test_env.get_client_version() < (23, 1),
212+
"crashes in older clients")
210213
def test_3003_registerquery_returns(self):
211214
"3003 - test verifying what registerquery returns"
212215
data = DMLSubscriptionData(5)
@@ -230,5 +233,26 @@ def test_3003_registerquery_returns(self):
230233
connection.unsubscribe(sub)
231234
connection.close()
232235

236+
def test_3004_repr(self):
237+
"3004 - test Subscription repr()"
238+
data = DMLSubscriptionData(5)
239+
with test_env.get_connection(events=True) as conn:
240+
sub = conn.subscribe(callback=data.callback_handler)
241+
self.assertEqual(repr(sub), f"<oracledb.Subscription on {conn}>")
242+
conn.unsubscribe(sub)
243+
244+
@unittest.skipIf(test_env.get_client_version() < (23, 1),
245+
"crashes in older clients")
246+
def test_3005_registerquery_negative(self):
247+
"3005 - test registerquery with invalid parameters"
248+
data = DMLSubscriptionData(5)
249+
connection = test_env.get_connection(events=True)
250+
sub = connection.subscribe(callback=data.callback_handler)
251+
self.assertRaises(TypeError, sub.registerquery,
252+
"select * from TestTempTable", "invalid args")
253+
self.assertRaisesRegex(oracledb.DatabaseError, "^ORA-00942",
254+
sub.registerquery, "select * from Nonexistent")
255+
connection.unsubscribe(sub)
256+
233257
if __name__ == "__main__":
234258
test_env.run_test_cases()

tests/test_3400_soda_collection.py

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,20 @@
3636
"unsupported client/server combination")
3737
class TestCase(test_env.BaseTestCase):
3838

39+
def __normalize_docs(self, docs):
40+
"""
41+
Remove the embedded OID added in Oracle Database 23c, if found, in
42+
order to ease comparison.
43+
"""
44+
for doc in docs:
45+
if doc is not None and "_id" in doc:
46+
del doc["_id"]
47+
3948
def __test_skip(self, coll, num_to_skip, expected_content):
4049
filter_spec = {'$orderby': [{'path': 'name', 'order': 'desc'}]}
4150
doc = coll.find().filter(filter_spec).skip(num_to_skip).getOne()
4251
content = doc.getContent() if doc is not None else None
52+
self.__normalize_docs([content])
4353
self.assertEqual(content, expected_content)
4454

4555
def test_3400_invalid_json(self):
@@ -70,8 +80,9 @@ def test_3401_insert_documents(self):
7080
self.connection.commit()
7181
self.assertEqual(coll.find().count(), len(values_to_insert))
7282
for key, value in zip(inserted_keys, values_to_insert):
73-
doc = coll.find().key(key).getOne()
74-
self.assertEqual(doc.getContent(), value)
83+
doc = coll.find().key(key).getOne().getContent()
84+
self.__normalize_docs([doc])
85+
self.assertEqual(doc, value)
7586
coll.drop()
7687

7788
def test_3402_skip_documents(self):
@@ -104,8 +115,9 @@ def test_3403_replace_document(self):
104115
new_content = {'name': 'John', 'address': {'city':'Melbourne'}}
105116
coll.find().key(doc.key).replaceOne(new_content)
106117
self.connection.commit()
107-
self.assertEqual(coll.find().key(doc.key).getOne().getContent(),
108-
new_content)
118+
doc = coll.find().key(doc.key).getOne().getContent()
119+
self.__normalize_docs([doc])
120+
self.assertEqual(doc, new_content)
109121
coll.drop()
110122

111123
def test_3404_search_documents_with_content(self):
@@ -260,15 +272,17 @@ def test_3410_document_version(self):
260272
inserted_doc = coll.insertOneAndGet(content)
261273
key = inserted_doc.key
262274
version = inserted_doc.version
263-
doc = coll.find().key(key).version(version).getOne()
264-
self.assertEqual(doc.getContent(), content)
275+
doc = coll.find().key(key).version(version).getOne().getContent()
276+
self.__normalize_docs([doc])
277+
self.assertEqual(doc, content)
265278
new_content = {'name': 'James', 'address': {'city': 'Delhi'}}
266279
replacedDoc = coll.find().key(key).replaceOneAndGet(new_content)
267280
new_version = replacedDoc.version
268281
doc = coll.find().key(key).version(version).getOne()
269282
self.assertEqual(doc, None)
270-
doc = coll.find().key(key).version(new_version).getOne()
271-
self.assertEqual(doc.getContent(), new_content)
283+
doc = coll.find().key(key).version(new_version).getOne().getContent()
284+
self.__normalize_docs([doc])
285+
self.assertEqual(doc, new_content)
272286
self.assertEqual(coll.find().key(key).version(version).remove(), 0)
273287
self.assertEqual(coll.find().key(key).version(new_version).remove(), 1)
274288
self.assertEqual(coll.find().count(), 0)
@@ -473,6 +487,8 @@ def test_3420_save_and_get(self):
473487
def test_3421_insert_many_and_get(self):
474488
"3421 - test insert many and get"
475489
soda_db = self.get_soda_database(minclient=(18, 5))
490+
for name in soda_db.getCollectionNames():
491+
soda_db.openCollection(name).drop()
476492
coll = soda_db.createCollection("TestInsertManyAndGet")
477493
values_to_insert = [
478494
dict(name="George", age=25),
@@ -485,8 +501,9 @@ def test_3421_insert_many_and_get(self):
485501
for key, expected_doc in zip(inserted_keys, values_to_insert):
486502
if isinstance(expected_doc, dict):
487503
expected_doc = soda_db.createDocument(expected_doc)
488-
doc = coll.find().key(key).getOne()
489-
self.assertEqual(doc.getContent(), expected_doc.getContent())
504+
doc = coll.find().key(key).getOne().getContent()
505+
self.__normalize_docs([doc])
506+
self.assertEqual(doc, expected_doc.getContent())
490507
coll.drop()
491508

492509
def test_3422_close_cursor(self):
@@ -540,6 +557,7 @@ def test_3425_map_mode(self):
540557
coll = soda_db.createCollection("TestSodaMapMode", mapMode=mapMode)
541558
coll.insertMany(data)
542559
fetched_data = list(d.getContent() for d in coll.find().getDocuments())
560+
self.__normalize_docs(fetched_data)
543561
self.assertEqual(fetched_data, expected_data)
544562
self.assertRaisesRegex(oracledb.DatabaseError, "^ORA-40626",
545563
coll.drop)
@@ -615,6 +633,8 @@ def test_3429_getting_indexes(self):
615633
"3429 - test getting indexes on a collection"
616634
soda_db = self.get_soda_database()
617635
coll = soda_db.createCollection("TestSodaGetIndexes")
636+
coll.drop()
637+
coll = soda_db.createCollection("TestSodaGetIndexes")
618638
index_1 = {
619639
'name': 'ix_3428-1',
620640
'fields': [

tests/test_4400_tpc.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,5 +220,34 @@ def test_4408_tpc_recover_read_only(self):
220220
recovers = self.connection.tpc_recover()
221221
self.assertEqual(len(recovers), 0)
222222

223+
def test_4409_tpc_commit_one_phase(self):
224+
"4409 - test tpc_commit() with one_phase parameter"
225+
self.cursor.execute("truncate table TestTempTable")
226+
xid = self.connection.xid(4409, "txn4409", "branch1")
227+
self.connection.tpc_begin(xid)
228+
values = (1, 'test4409')
229+
self.cursor.execute("""
230+
insert into TestTempTable (IntCol, StringCol1)
231+
values (:1, :2)""", values)
232+
self.cursor.execute("select IntCol, StringCol1 from TestTempTable")
233+
self.connection.tpc_commit(xid, one_phase=True)
234+
self.assertEqual(self.cursor.fetchall(), [values])
235+
236+
def test_4410_tpc_commit_one_phase_negative(self):
237+
"4410 - test negative cases for tpc_commit()"
238+
self.cursor.execute("truncate table TestTempTable")
239+
xid = self.connection.xid(4410, "txn4410", "branch1")
240+
self.connection.tpc_begin(xid)
241+
self.cursor.execute("""
242+
insert into TestTempTable (IntCol, StringCol1)
243+
values (1, 'test4410')""")
244+
self.assertRaises(TypeError, self.connection.tpc_commit, "invalid xid")
245+
self.connection.tpc_prepare(xid)
246+
self.assertRaisesRegex(oracledb.DatabaseError, "^ORA-02053:",
247+
self.connection.tpc_commit, xid, one_phase=True)
248+
self.assertRaisesRegex(oracledb.DatabaseError, "^ORA-24756:",
249+
self.connection.tpc_commit, xid)
250+
self.connection.tpc_rollback(xid)
251+
223252
if __name__ == "__main__":
224253
test_env.run_test_cases()

tests/test_env.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ def get_client_version():
131131
value = PARAMETERS.get(name)
132132
if value is None:
133133
if get_is_thin():
134-
value = (21, 3)
134+
value = (23, 2)
135135
else:
136136
value = oracledb.clientversion()[:2]
137137
PARAMETERS[name] = value

0 commit comments

Comments
 (0)