File fix-tests-SQLAlchemy-140.patch of Package python-PyKMIP

From 01307c08937890db38b9ae6135c5b8d5f720e595 Mon Sep 17 00:00:00 2001
From: Tim Burke <tim.burke@gmail.com>
Date: Tue, 21 Sep 2021 18:16:09 -0700
Subject: [PATCH] Fix tests to pass with SQLAlchemy>=1.4.0

I'm not *entirely* sure what's going on here, but it seems that when we
do something like

    obj = OpaqueObject(...)
    Session = sessionmaker(...)
    session = Session()
    ...
    session.add(obj)
    session.commit()

the primary key (and maybe some foreign relations?) aren't automatically
populated on `obj` following the commit, and will attempt to lazy-load
on next reference. Since expire_on_commit defaults to True, the session
attached to `obj` (which is no longer the `session` in locals!) is closed
out when we later do

    session = Session()
    get_obj = session.query(OpaqueObject).filter(
        ManagedObject.unique_identifier == obj.unique_identifier).one()

leading to a DetachedInstanceError.

There seem to be a few different ways we can fix this:

* Set expire_on_commit=False so the old session is still useful for the
  lazy-loading.
* Re-use the same session instead of creating a new one.
* Explicitly refresh added objects post-commit.

Generally prefer the first one; there's some prior art to follow in
services/server/test_engine.py. Curiously, that same file runs into
trouble despite already setting expire_on_commit=False -- so do the
explicit refresh, on the assumption that there was a reason we went to
the trouble of creating a fresh session.

Closes #649
---
 kmip/tests/unit/pie/objects/test_opaque_object.py  | 14 +++++++-------
 kmip/tests/unit/pie/objects/test_private_key.py    | 14 +++++++-------
 kmip/tests/unit/pie/objects/test_public_key.py     | 14 +++++++-------
 kmip/tests/unit/pie/objects/test_secret_data.py    | 14 +++++++-------
 kmip/tests/unit/pie/objects/test_split_key.py      |  3 ++-
 kmip/tests/unit/pie/objects/test_symmetric_key.py  | 14 +++++++-------
 .../unit/pie/objects/test_x509_certificate.py      | 14 +++++++-------
 kmip/tests/unit/services/server/test_engine.py     |  3 +++
 8 files changed, 47 insertions(+), 43 deletions(-)

diff --git a/kmip/tests/unit/pie/objects/test_opaque_object.py b/kmip/tests/unit/pie/objects/test_opaque_object.py
index c742a17e..f41f1b0e 100644
--- a/kmip/tests/unit/pie/objects/test_opaque_object.py
+++ b/kmip/tests/unit/pie/objects/test_opaque_object.py
@@ -224,7 +224,7 @@ def test_get(self):
         test_name = 'bowser'
         obj = OpaqueObject(
             self.bytes_a, enums.OpaqueDataType.NONE, name=test_name)
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(obj)
         session.commit()
@@ -259,7 +259,7 @@ def test_add_multiple_names(self):
             expected_mo_names.append(sqltypes.ManagedObjectName(name, i))
         self.assertEquals(expected_mo_names, obj._names)
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(obj)
         session.commit()
@@ -295,7 +295,7 @@ def test_remove_name(self):
         self.assertEquals(expected_names, obj.names)
         self.assertEquals(expected_mo_names, obj._names)
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(obj)
         session.commit()
@@ -334,7 +334,7 @@ def test_remove_and_add_name(self):
         self.assertEquals(expected_names, obj.names)
         self.assertEquals(expected_mo_names, obj._names)
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(obj)
         session.commit()
@@ -362,7 +362,7 @@ def test_update_with_add_name(self):
         first_name = 'bowser'
         obj = OpaqueObject(
             self.bytes_a, enums.OpaqueDataType.NONE, name=first_name)
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(obj)
         session.commit()
@@ -402,7 +402,7 @@ def test_update_with_remove_name(self):
         obj.names.append(names[1])
         obj.names.append(names[2])
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(obj)
         session.commit()
@@ -444,7 +444,7 @@ def test_update_with_remove_and_add_name(self):
         obj.names.append(names[1])
         obj.names.append(names[2])
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(obj)
         session.commit()
diff --git a/kmip/tests/unit/pie/objects/test_private_key.py b/kmip/tests/unit/pie/objects/test_private_key.py
index c58daf83..0ad425f4 100644
--- a/kmip/tests/unit/pie/objects/test_private_key.py
+++ b/kmip/tests/unit/pie/objects/test_private_key.py
@@ -563,7 +563,7 @@ def test_get(self):
         key = PrivateKey(
             enums.CryptographicAlgorithm.RSA, 2048, self.bytes_2048,
             enums.KeyFormatType.PKCS_1, masks=masks, name=test_name)
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(key)
         session.commit()
@@ -603,7 +603,7 @@ def test_add_multiple_names(self):
             expected_mo_names.append(sqltypes.ManagedObjectName(name, i))
         self.assertEquals(expected_mo_names, key._names)
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(key)
         session.commit()
@@ -640,7 +640,7 @@ def test_remove_name(self):
         self.assertEquals(expected_names, key.names)
         self.assertEquals(expected_mo_names, key._names)
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(key)
         session.commit()
@@ -680,7 +680,7 @@ def test_remove_and_add_name(self):
         self.assertEquals(expected_names, key.names)
         self.assertEquals(expected_mo_names, key._names)
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(key)
         session.commit()
@@ -709,7 +709,7 @@ def test_update_with_add_name(self):
         key = PrivateKey(
             enums.CryptographicAlgorithm.RSA, 2048, self.bytes_2048,
             enums.KeyFormatType.PKCS_1, name=first_name)
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(key)
         session.commit()
@@ -750,7 +750,7 @@ def test_update_with_remove_name(self):
         key.names.append(names[1])
         key.names.append(names[2])
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(key)
         session.commit()
@@ -793,7 +793,7 @@ def test_update_with_remove_and_add_name(self):
         key.names.append(names[1])
         key.names.append(names[2])
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(key)
         session.commit()
diff --git a/kmip/tests/unit/pie/objects/test_public_key.py b/kmip/tests/unit/pie/objects/test_public_key.py
index f0571913..cf71833b 100644
--- a/kmip/tests/unit/pie/objects/test_public_key.py
+++ b/kmip/tests/unit/pie/objects/test_public_key.py
@@ -461,7 +461,7 @@ def test_get(self):
         key = PublicKey(
             enums.CryptographicAlgorithm.RSA, 2048, self.bytes_2048,
             enums.KeyFormatType.PKCS_1, masks=masks, name=test_name)
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(key)
         session.commit()
@@ -501,7 +501,7 @@ def test_add_multiple_names(self):
             expected_mo_names.append(sqltypes.ManagedObjectName(name, i))
         self.assertEquals(expected_mo_names, key._names)
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(key)
         session.commit()
@@ -538,7 +538,7 @@ def test_remove_name(self):
         self.assertEquals(expected_names, key.names)
         self.assertEquals(expected_mo_names, key._names)
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(key)
         session.commit()
@@ -578,7 +578,7 @@ def test_remove_and_add_name(self):
         self.assertEquals(expected_names, key.names)
         self.assertEquals(expected_mo_names, key._names)
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(key)
         session.commit()
@@ -607,7 +607,7 @@ def test_update_with_add_name(self):
         key = PublicKey(
             enums.CryptographicAlgorithm.RSA, 2048, self.bytes_2048,
             enums.KeyFormatType.PKCS_1, name=first_name)
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(key)
         session.commit()
@@ -648,7 +648,7 @@ def test_update_with_remove_name(self):
         key.names.append(names[1])
         key.names.append(names[2])
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(key)
         session.commit()
@@ -691,7 +691,7 @@ def test_update_with_remove_and_add_name(self):
         key.names.append(names[1])
         key.names.append(names[2])
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(key)
         session.commit()
diff --git a/kmip/tests/unit/pie/objects/test_secret_data.py b/kmip/tests/unit/pie/objects/test_secret_data.py
index 5a12132d..1cfe075d 100644
--- a/kmip/tests/unit/pie/objects/test_secret_data.py
+++ b/kmip/tests/unit/pie/objects/test_secret_data.py
@@ -243,7 +243,7 @@ def test_get(self):
         test_name = 'bowser'
         obj = SecretData(self.bytes_a, enums.SecretDataType.PASSWORD,
                          name=test_name)
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(obj)
         session.commit()
@@ -278,7 +278,7 @@ def test_add_multiple_names(self):
             expected_mo_names.append(sqltypes.ManagedObjectName(name, i))
         self.assertEquals(expected_mo_names, obj._names)
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(obj)
         session.commit()
@@ -314,7 +314,7 @@ def test_remove_name(self):
         self.assertEquals(expected_names, obj.names)
         self.assertEquals(expected_mo_names, obj._names)
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(obj)
         session.commit()
@@ -353,7 +353,7 @@ def test_remove_and_add_name(self):
         self.assertEquals(expected_names, obj.names)
         self.assertEquals(expected_mo_names, obj._names)
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(obj)
         session.commit()
@@ -381,7 +381,7 @@ def test_update_with_add_name(self):
         first_name = 'bowser'
         obj = SecretData(self.bytes_a, enums.SecretDataType.PASSWORD,
                          name=first_name)
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(obj)
         session.commit()
@@ -421,7 +421,7 @@ def test_update_with_remove_name(self):
         obj.names.append(names[1])
         obj.names.append(names[2])
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(obj)
         session.commit()
@@ -463,7 +463,7 @@ def test_update_with_remove_and_add_name(self):
         obj.names.append(names[1])
         obj.names.append(names[2])
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(obj)
         session.commit()
diff --git a/kmip/tests/unit/pie/objects/test_split_key.py b/kmip/tests/unit/pie/objects/test_split_key.py
index a81c304d..755d7bc8 100644
--- a/kmip/tests/unit/pie/objects/test_split_key.py
+++ b/kmip/tests/unit/pie/objects/test_split_key.py
@@ -595,7 +595,8 @@ def test_get(self):
             prime_field_size=104729
         )
 
-        session = sqlalchemy.orm.sessionmaker(bind=self.engine)()
+        session = sqlalchemy.orm.sessionmaker(
+            bind=self.engine, expire_on_commit=False)()
         session.add(split_key)
         session.commit()
 
diff --git a/kmip/tests/unit/pie/objects/test_symmetric_key.py b/kmip/tests/unit/pie/objects/test_symmetric_key.py
index ccc4cdfa..cf7f5dff 100644
--- a/kmip/tests/unit/pie/objects/test_symmetric_key.py
+++ b/kmip/tests/unit/pie/objects/test_symmetric_key.py
@@ -408,7 +408,7 @@ def test_get(self):
             enums.CryptographicAlgorithm.AES, 128, self.bytes_128a,
             masks=masks,
             name=test_name)
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(key)
         session.commit()
@@ -448,7 +448,7 @@ def test_add_multiple_names(self):
             expected_mo_names.append(sqltypes.ManagedObjectName(name, i))
         self.assertEquals(expected_mo_names, key._names)
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(key)
         session.commit()
@@ -485,7 +485,7 @@ def test_remove_name(self):
         self.assertEquals(expected_names, key.names)
         self.assertEquals(expected_mo_names, key._names)
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(key)
         session.commit()
@@ -525,7 +525,7 @@ def test_remove_and_add_name(self):
         self.assertEquals(expected_names, key.names)
         self.assertEquals(expected_mo_names, key._names)
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(key)
         session.commit()
@@ -554,7 +554,7 @@ def test_update_with_add_name(self):
         key = SymmetricKey(
             enums.CryptographicAlgorithm.AES, 128, self.bytes_128a,
             name=first_name)
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(key)
         session.commit()
@@ -595,7 +595,7 @@ def test_update_with_remove_name(self):
         key.names.append(names[1])
         key.names.append(names[2])
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(key)
         session.commit()
@@ -638,7 +638,7 @@ def test_update_with_remove_and_add_name(self):
         key.names.append(names[1])
         key.names.append(names[2])
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(key)
         session.commit()
diff --git a/kmip/tests/unit/pie/objects/test_x509_certificate.py b/kmip/tests/unit/pie/objects/test_x509_certificate.py
index 43d66ca4..f4d76ada 100644
--- a/kmip/tests/unit/pie/objects/test_x509_certificate.py
+++ b/kmip/tests/unit/pie/objects/test_x509_certificate.py
@@ -320,7 +320,7 @@ def test_get(self):
         masks = [enums.CryptographicUsageMask.ENCRYPT,
                  enums.CryptographicUsageMask.WRAP_KEY]
         cert = X509Certificate(self.bytes_a, masks=masks, name=test_name)
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(cert)
         session.commit()
@@ -354,7 +354,7 @@ def test_add_multiple_names(self):
             expected_mo_names.append(sqltypes.ManagedObjectName(name, i))
         self.assertEquals(expected_mo_names, cert._names)
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(cert)
         session.commit()
@@ -389,7 +389,7 @@ def test_remove_name(self):
         self.assertEquals(expected_names, cert.names)
         self.assertEquals(expected_mo_names, cert._names)
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(cert)
         session.commit()
@@ -427,7 +427,7 @@ def test_remove_and_add_name(self):
         self.assertEquals(expected_names, cert.names)
         self.assertEquals(expected_mo_names, cert._names)
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(cert)
         session.commit()
@@ -454,7 +454,7 @@ def test_update_with_add_name(self):
         """
         first_name = 'bowser'
         cert = X509Certificate(self.bytes_a, name=first_name)
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(cert)
         session.commit()
@@ -493,7 +493,7 @@ def test_update_with_remove_name(self):
         cert.names.append(names[1])
         cert.names.append(names[2])
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(cert)
         session.commit()
@@ -534,7 +534,7 @@ def test_update_with_remove_and_add_name(self):
         cert.names.append(names[1])
         cert.names.append(names[2])
 
-        Session = sessionmaker(bind=self.engine)
+        Session = sessionmaker(bind=self.engine, expire_on_commit=False)
         session = Session()
         session.add(cert)
         session.commit()
diff --git a/kmip/tests/unit/services/server/test_engine.py b/kmip/tests/unit/services/server/test_engine.py
index 617fcc1b..ad596dfe 100644
--- a/kmip/tests/unit/services/server/test_engine.py
+++ b/kmip/tests/unit/services/server/test_engine.py
@@ -1386,6 +1386,7 @@ def test_get_attribute_from_managed_object(self):
         e._data_session.add(certificate)
         e._data_session.add(opaque_object)
         e._data_session.commit()
+        e._data_session.refresh(symmetric_key)
         e._data_session = e._data_store_session_factory()
 
         result = e._get_attribute_from_managed_object(
@@ -1660,6 +1661,7 @@ def test_get_attribute_index_from_managed_object(self):
         e._data_session.add(symmetric_key)
         e._data_session.add(certificate)
         e._data_session.commit()
+        e._data_session.refresh(symmetric_key)
         e._data_session = e._data_store_session_factory()
 
         e._set_attribute_on_managed_object(
@@ -2302,6 +2304,7 @@ def test_set_attribute_on_managed_object_by_index(self):
 
         e._data_session.add(symmetric_key)
         e._data_session.commit()
+        e._data_session.refresh(symmetric_key)
         e._data_session = e._data_store_session_factory()
 
         e._set_attribute_on_managed_object(
openSUSE Build Service is sponsored by