Skip to content

Commit

Permalink
Move maybe_fail_import() to top level test utils (#8840)
Browse files Browse the repository at this point in the history
* Move maybe_fail_import() to top level test utils

* Install local test utils in multiple nox sessions
  • Loading branch information
plamut committed Jul 31, 2019
1 parent ab3179d commit e688b0e
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 27 deletions.
6 changes: 5 additions & 1 deletion bigquery/noxfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")

Expand Down
25 changes: 0 additions & 25 deletions bigquery/tests/unit/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)
2 changes: 1 addition & 1 deletion bigquery/tests/unit/test_magics.py
Original file line number Diff line number Diff line change
Expand Up @@ -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`")
Expand Down
38 changes: 38 additions & 0 deletions test_utils/test_utils/imports.py
Original file line number Diff line number Diff line change
@@ -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)

0 comments on commit e688b0e

Please sign in to comment.