From 0e6767c4f5769b41aeaec6ce21b5695f2ef2ac89 Mon Sep 17 00:00:00 2001 From: Peter Lamut Date: Wed, 31 Jul 2019 12:25:34 +0200 Subject: [PATCH 1/2] Move maybe_fail_import() to top level test utils --- bigquery/noxfile.py | 1 + bigquery/tests/unit/helpers.py | 25 -------------------- bigquery/tests/unit/test_magics.py | 2 +- test_utils/test_utils/imports.py | 38 ++++++++++++++++++++++++++++++ 4 files changed, 40 insertions(+), 26 deletions(-) create mode 100644 test_utils/test_utils/imports.py diff --git a/bigquery/noxfile.py b/bigquery/noxfile.py index 9cfe5cc856dd..65087808df70 100644 --- a/bigquery/noxfile.py +++ b/bigquery/noxfile.py @@ -40,6 +40,7 @@ def default(session): dev_install = ".[all]" session.install("-e", dev_install) + session.install("-e", os.path.join("..", "test_utils")) # IPython does not support Python 2 after version 5.x if session.python == "2.7": diff --git a/bigquery/tests/unit/helpers.py b/bigquery/tests/unit/helpers.py index 673aa8ac5f02..5b731a763a99 100644 --- a/bigquery/tests/unit/helpers.py +++ b/bigquery/tests/unit/helpers.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import mock -import six - def make_connection(*responses): import google.cloud.bigquery._http @@ -25,25 +22,3 @@ def make_connection(*responses): mock_conn.user_agent = "testing 1.2.3" mock_conn.api_request.side_effect = list(responses) + [NotFound("miss")] return mock_conn - - -def maybe_fail_import(predicate): - """Create and return a patcher that conditionally makes an import fail. - - Args: - predicate (Callable[[...], bool]): A callable that, if it returns `True`, - triggers an `ImportError`. It must accept the same arguments as the - built-in `__import__` function. - https://docs.python.org/3/library/functions.html#__import__ - - Returns: - A mock patcher object that can be used to enable patched import behavior. - """ - orig_import = six.moves.builtins.__import__ - - def custom_import(name, globals=None, locals=None, fromlist=(), level=0): - if predicate(name, globals, locals, fromlist, level): - raise ImportError - return orig_import(name, globals, locals, fromlist, level) - - return mock.patch.object(six.moves.builtins, "__import__", new=custom_import) diff --git a/bigquery/tests/unit/test_magics.py b/bigquery/tests/unit/test_magics.py index 760b6ccf568d..82b7eb6a3892 100644 --- a/bigquery/tests/unit/test_magics.py +++ b/bigquery/tests/unit/test_magics.py @@ -42,7 +42,7 @@ from google.cloud.bigquery import table from google.cloud.bigquery import magics from tests.unit.helpers import make_connection -from tests.unit.helpers import maybe_fail_import +from test_utils.imports import maybe_fail_import pytestmark = pytest.mark.skipif(IPython is None, reason="Requires `ipython`") diff --git a/test_utils/test_utils/imports.py b/test_utils/test_utils/imports.py new file mode 100644 index 000000000000..5991af7fc465 --- /dev/null +++ b/test_utils/test_utils/imports.py @@ -0,0 +1,38 @@ +# Copyright 2019 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import mock +import six + + +def maybe_fail_import(predicate): + """Create and return a patcher that conditionally makes an import fail. + + Args: + predicate (Callable[[...], bool]): A callable that, if it returns `True`, + triggers an `ImportError`. It must accept the same arguments as the + built-in `__import__` function. + https://docs.python.org/3/library/functions.html#__import__ + + Returns: + A mock patcher object that can be used to enable patched import behavior. + """ + orig_import = six.moves.builtins.__import__ + + def custom_import(name, globals=None, locals=None, fromlist=(), level=0): + if predicate(name, globals, locals, fromlist, level): + raise ImportError + return orig_import(name, globals, locals, fromlist, level) + + return mock.patch.object(six.moves.builtins, "__import__", new=custom_import) From bc546962fcfba1d36e5fa8a25d6415bdeaad2b1e Mon Sep 17 00:00:00 2001 From: Peter Lamut Date: Wed, 31 Jul 2019 20:44:13 +0200 Subject: [PATCH 2/2] Install local test utils in multiple nox sessions --- bigquery/noxfile.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/bigquery/noxfile.py b/bigquery/noxfile.py index 65087808df70..37611a5ce296 100644 --- a/bigquery/noxfile.py +++ b/bigquery/noxfile.py @@ -20,7 +20,11 @@ import nox -LOCAL_DEPS = (os.path.join("..", "api_core[grpc]"), os.path.join("..", "core")) +LOCAL_DEPS = ( + os.path.join("..", "api_core[grpc]"), + os.path.join("..", "core"), + os.path.join("..", "test_utils"), +) BLACK_PATHS = ("docs", "google", "samples", "tests", "noxfile.py", "setup.py") @@ -40,7 +44,6 @@ def default(session): dev_install = ".[all]" session.install("-e", dev_install) - session.install("-e", os.path.join("..", "test_utils")) # IPython does not support Python 2 after version 5.x if session.python == "2.7":