|
| 1 | +from bson.binary import Binary |
1 | 2 | from django.db import connections
|
2 | 3 |
|
3 | 4 | from . import models
|
@@ -101,3 +102,36 @@ def test_get_encrypted_fields_all_models(self):
|
101 | 102 | for field in encrypted_fields["fields"]:
|
102 | 103 | field.pop("keyId", None) # Remove dynamic value
|
103 | 104 | self.assertEqual(encrypted_fields, expected)
|
| 105 | + |
| 106 | + def test_key_creation_and_lookup(self): |
| 107 | + """ |
| 108 | + Use _get_encrypted_fields(create_data_keys=True) to |
| 109 | + generate and store a data key in the vault, then |
| 110 | + query the vault with the keyAltName. |
| 111 | + """ |
| 112 | + connection = connections["encrypted"] |
| 113 | + client = connection.connection |
| 114 | + auto_encryption_opts = client._options.auto_encryption_opts |
| 115 | + |
| 116 | + key_vault_db, key_vault_coll = auto_encryption_opts._key_vault_namespace.split(".", 1) |
| 117 | + vault_coll = client[key_vault_db][key_vault_coll] |
| 118 | + |
| 119 | + model_class = models.EncryptedCharTest |
| 120 | + test_key_alt_name = f"{model_class._meta.db_table}.value" |
| 121 | + vault_coll.delete_many({"keyAltNames": test_key_alt_name}) |
| 122 | + |
| 123 | + # Call _get_encrypted_fields with create_data_keys=True |
| 124 | + with connection.schema_editor() as editor: |
| 125 | + encrypted_fields = editor._get_encrypted_fields(model_class, create_data_keys=True) |
| 126 | + |
| 127 | + # Validate schema contains a keyId for our field |
| 128 | + self.assertTrue(encrypted_fields["fields"]) |
| 129 | + field_info = encrypted_fields["fields"][0] |
| 130 | + self.assertEqual(field_info["path"], "value") |
| 131 | + self.assertIsInstance(field_info["keyId"], Binary) |
| 132 | + |
| 133 | + # Lookup in key vault by the keyAltName created |
| 134 | + key_doc = vault_coll.find_one({"keyAltNames": test_key_alt_name}) |
| 135 | + self.assertIsNotNone(key_doc, "Key should exist in vault") |
| 136 | + self.assertEqual(key_doc["_id"], field_info["keyId"]) |
| 137 | + self.assertIn(test_key_alt_name, key_doc["keyAltNames"]) |
0 commit comments