From 290d9df3eb6491f22a8feea0f2e9e909bc94b621 Mon Sep 17 00:00:00 2001 From: Nuno Rodrigues Date: Fri, 12 Jul 2019 13:33:19 +0100 Subject: [PATCH 1/5] Set default database when using mongomock. When passing host `mongomock://localhost/some-default-database` to `connect` the default database was `"test"` instead of `"some-default-database"`. Fixes: #2130 --- mongoengine/connection.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/mongoengine/connection.py b/mongoengine/connection.py index 8aa95daa..01e9a7af 100644 --- a/mongoengine/connection.py +++ b/mongoengine/connection.py @@ -103,7 +103,13 @@ def _get_connection_settings( if entity.startswith("mongomock://"): conn_settings["is_mock"] = True # `mongomock://` is not a valid url prefix and must be replaced by `mongodb://` - resolved_hosts.append(entity.replace("mongomock://", "mongodb://", 1)) + new_entity = entity.replace("mongomock://", "mongodb://", 1) + resolved_hosts.append(new_entity) + + uri_dict = uri_parser.parse_uri(new_entity) + + if uri_dict.get("database"): + conn_settings["name"] = uri_dict.get("database") # Handle URI style connections, only updating connection params which # were explicitly specified in the URI. From 2d02551d0a41405664dc26604e90669f6e65aca6 Mon Sep 17 00:00:00 2001 From: Nuno Rodrigues Date: Mon, 15 Jul 2019 16:53:24 +0000 Subject: [PATCH 2/5] Add test --- tests/test_connection.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/test_connection.py b/tests/test_connection.py index f9c9d098..78f7e52f 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -4,6 +4,8 @@ from pymongo import MongoClient from pymongo.errors import OperationFailure, InvalidName from pymongo import ReadPreference +from mongoengine import Document + try: import unittest2 as unittest except ImportError: @@ -269,6 +271,14 @@ class ConnectionTest(unittest.TestCase): conn = get_connection("testdb7") self.assertIsInstance(conn, mongomock.MongoClient) + disconnect_all() + class SomeDocument(Document): pass + conn = connect(host="mongomock://localhost:27017/mongoenginetest8") + some_document = SomeDocument() + some_document.save() + self.assertEqual(conn.get_default_database().name, "mongoenginetest8") + self.assertEqual(conn.database_names()[0], "mongoenginetest8") + def test_connect_with_host_list(self): """Ensure that the connect() method works when host is a list From 2424ece0c52e2253fbfec45a3b11cbda9e4a5b45 Mon Sep 17 00:00:00 2001 From: Nuno Rodrigues Date: Tue, 16 Jul 2019 13:40:46 +0000 Subject: [PATCH 3/5] Fix a linting error --- tests/test_connection.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/test_connection.py b/tests/test_connection.py index 78f7e52f..57141958 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -272,7 +272,10 @@ class ConnectionTest(unittest.TestCase): self.assertIsInstance(conn, mongomock.MongoClient) disconnect_all() - class SomeDocument(Document): pass + + class SomeDocument(Document): + pass + conn = connect(host="mongomock://localhost:27017/mongoenginetest8") some_document = SomeDocument() some_document.save() From 05a22d5a54b8bd7a6a411732db90464fbbb29371 Mon Sep 17 00:00:00 2001 From: Nuno Rodrigues Date: Mon, 22 Jul 2019 08:42:17 +0000 Subject: [PATCH 4/5] Extract test to its own method --- tests/test_connection.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/tests/test_connection.py b/tests/test_connection.py index 57141958..b7dc9268 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -271,16 +271,25 @@ class ConnectionTest(unittest.TestCase): conn = get_connection("testdb7") self.assertIsInstance(conn, mongomock.MongoClient) + def test_default_database_with_mocking(self): + """Ensure that the default database is correctly set when using mongomock. + """ + try: + import mongomock + except ImportError: + raise SkipTest("you need mongomock installed to run this testcase") + disconnect_all() class SomeDocument(Document): pass - conn = connect(host="mongomock://localhost:27017/mongoenginetest8") + conn = connect(host="mongomock://localhost:27017/mongoenginetest") some_document = SomeDocument() + # database won't exist until we save a document some_document.save() - self.assertEqual(conn.get_default_database().name, "mongoenginetest8") - self.assertEqual(conn.database_names()[0], "mongoenginetest8") + self.assertEqual(conn.get_default_database().name, "mongoenginetest") + self.assertEqual(conn.database_names()[0], "mongoenginetest") def test_connect_with_host_list(self): """Ensure that the connect() method works when host is a list From f4a06ad65d4bcec40384391d1f3fcf94a70f5111 Mon Sep 17 00:00:00 2001 From: Nuno Rodrigues Date: Mon, 22 Jul 2019 08:45:35 +0000 Subject: [PATCH 5/5] Optimize database name getter calls --- mongoengine/connection.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/mongoengine/connection.py b/mongoengine/connection.py index 01e9a7af..4e0c60b0 100644 --- a/mongoengine/connection.py +++ b/mongoengine/connection.py @@ -108,8 +108,9 @@ def _get_connection_settings( uri_dict = uri_parser.parse_uri(new_entity) - if uri_dict.get("database"): - conn_settings["name"] = uri_dict.get("database") + database = uri_dict.get("database") + if database: + conn_settings["name"] = database # Handle URI style connections, only updating connection params which # were explicitly specified in the URI. @@ -117,8 +118,9 @@ def _get_connection_settings( uri_dict = uri_parser.parse_uri(entity) resolved_hosts.append(entity) - if uri_dict.get("database"): - conn_settings["name"] = uri_dict.get("database") + database = uri_dict.get("database") + if database: + conn_settings["name"] = database for param in ("read_preference", "username", "password"): if uri_dict.get(param):