From 357567ab45c578b4b4143669e7b6664bbf6b906c Mon Sep 17 00:00:00 2001 From: Bill Prin Date: Fri, 22 May 2015 10:48:07 -0700 Subject: [PATCH 1/6] Adds Regression Test By Mocking Input --- bigquery/requirements.txt | 1 + bigquery/samples/async_query.py | 12 ++++++------ bigquery/samples/utils.py | 3 +++ bigquery/tests/test_async_query.py | 25 +++++++++++++++++++++++-- 4 files changed, 33 insertions(+), 8 deletions(-) diff --git a/bigquery/requirements.txt b/bigquery/requirements.txt index 3487fe93bac..74c91f1442a 100644 --- a/bigquery/requirements.txt +++ b/bigquery/requirements.txt @@ -12,3 +12,4 @@ tox==1.9.0 uritemplate==0.6 virtualenv==12.0.7 wsgiref==0.1.2 +mock==1.0.1 diff --git a/bigquery/samples/async_query.py b/bigquery/samples/async_query.py index 50deb3a4731..b812f5caff7 100644 --- a/bigquery/samples/async_query.py +++ b/bigquery/samples/async_query.py @@ -19,6 +19,7 @@ from bigquery.samples.utils import get_service from bigquery.samples.utils import paging from bigquery.samples.utils import poll_job +from bigquery.samples.utils import get_input # [START async_query] @@ -70,16 +71,15 @@ def run(project_id, query_string, batch, num_retries, interval): # [START main] def main(): - project_id = raw_input("Enter the project ID: ") - query_string = raw_input("Enter the Bigquery SQL Query: ") - batch = raw_input("Run query as batch (y/n)?: ") in ( + project_id = get_input("Enter the project ID: ") + query_string = get_input("Enter the Bigquery SQL Query: ") + batch = get_input("Run query as batch (y/n)?: ") in ( 'True', 'true', 'y', 'Y', 'yes', 'Yes') - num_retries = raw_input( + num_retries = get_input( "Enter number of times to retry in case of 500 error: ") - interval = raw_input( + interval = get_input( "Enter how often to poll the query for completion (seconds): ") - for result in run(project_id, query_string, batch, num_retries, interval): print(result) # [END main] diff --git a/bigquery/samples/utils.py b/bigquery/samples/utils.py index d35d0c94713..e6e753a5876 100644 --- a/bigquery/samples/utils.py +++ b/bigquery/samples/utils.py @@ -48,3 +48,6 @@ def paging(service, request_func, num_retries=5, **kwargs): has_next = False yield response # [END paging] + +def get_input(text): + return input(text) diff --git a/bigquery/tests/test_async_query.py b/bigquery/tests/test_async_query.py index d41c724da0f..703c67768cf 100644 --- a/bigquery/tests/test_async_query.py +++ b/bigquery/tests/test_async_query.py @@ -12,10 +12,12 @@ # limitations under the License. # import json +import os import unittest -from bigquery.samples.async_query import run -from tests import CloudBaseTest +from bigquery.samples.async_query import run, main +from tests import CloudBaseTest, BUCKET_NAME_ENV, PROJECT_ID_ENV +from mock import patch class TestAsyncQuery(CloudBaseTest): @@ -29,5 +31,24 @@ def test_async_query(self): self.assertIsNotNone(json.loads(result)) +class TestAsyncRunner(CloudBaseTest): + + i = 0 + + def mock_get_input(input): + test_bucket_name = os.environ.get(BUCKET_NAME_ENV) + test_project_id = os.environ.get(PROJECT_ID_ENV) + answers = [test_bucket_name, test_project_id, 'n', + '1', '1'] + ret = answers[TestAsyncRunner.i] + TestAsyncRunner.i += 1 + return ret + + + @patch('bigquery.samples.async_query.get_input', new=mock_get_input) + def test_async_query_runner(self): + main() + + if __name__ == '__main__': unittest.main() From 045e6f879e9eedca92f68d2b2c274c07d3f29e90 Mon Sep 17 00:00:00 2001 From: Bill Prin Date: Fri, 22 May 2015 11:21:41 -0700 Subject: [PATCH 2/6] Use context manager to mock raw_input instead of patch --- bigquery/requirements.txt | 1 - bigquery/samples/async_query.py | 12 +++++------- bigquery/samples/utils.py | 2 -- bigquery/tests/test_async_query.py | 28 +++++++++++++--------------- tests/__init__.py | 11 ++++++++++- 5 files changed, 28 insertions(+), 26 deletions(-) diff --git a/bigquery/requirements.txt b/bigquery/requirements.txt index 74c91f1442a..3487fe93bac 100644 --- a/bigquery/requirements.txt +++ b/bigquery/requirements.txt @@ -12,4 +12,3 @@ tox==1.9.0 uritemplate==0.6 virtualenv==12.0.7 wsgiref==0.1.2 -mock==1.0.1 diff --git a/bigquery/samples/async_query.py b/bigquery/samples/async_query.py index b812f5caff7..06571313c2a 100644 --- a/bigquery/samples/async_query.py +++ b/bigquery/samples/async_query.py @@ -19,8 +19,6 @@ from bigquery.samples.utils import get_service from bigquery.samples.utils import paging from bigquery.samples.utils import poll_job -from bigquery.samples.utils import get_input - # [START async_query] def async_query(service, project_id, query, batch=False, num_retries=5): @@ -71,14 +69,14 @@ def run(project_id, query_string, batch, num_retries, interval): # [START main] def main(): - project_id = get_input("Enter the project ID: ") - query_string = get_input("Enter the Bigquery SQL Query: ") - batch = get_input("Run query as batch (y/n)?: ") in ( + project_id = raw_input("Enter the project ID: ") + query_string = raw_input("Enter the Bigquery SQL Query: ") + batch = raw_input("Run query as batch (y/n)?: ") in ( 'True', 'true', 'y', 'Y', 'yes', 'Yes') - num_retries = get_input( + num_retries = raw_input( "Enter number of times to retry in case of 500 error: ") - interval = get_input( + interval = raw_input( "Enter how often to poll the query for completion (seconds): ") for result in run(project_id, query_string, batch, num_retries, interval): print(result) diff --git a/bigquery/samples/utils.py b/bigquery/samples/utils.py index e6e753a5876..d379147e74f 100644 --- a/bigquery/samples/utils.py +++ b/bigquery/samples/utils.py @@ -49,5 +49,3 @@ def paging(service, request_func, num_retries=5, **kwargs): yield response # [END paging] -def get_input(text): - return input(text) diff --git a/bigquery/tests/test_async_query.py b/bigquery/tests/test_async_query.py index 703c67768cf..dcf3211605d 100644 --- a/bigquery/tests/test_async_query.py +++ b/bigquery/tests/test_async_query.py @@ -16,9 +16,7 @@ import unittest from bigquery.samples.async_query import run, main -from tests import CloudBaseTest, BUCKET_NAME_ENV, PROJECT_ID_ENV -from mock import patch - +from tests import CloudBaseTest, mock_raw_input, BUCKET_NAME_ENV, PROJECT_ID_ENV class TestAsyncQuery(CloudBaseTest): @@ -31,23 +29,23 @@ def test_async_query(self): self.assertIsNotNone(json.loads(result)) -class TestAsyncRunner(CloudBaseTest): +def mock_get_input(input): + test_bucket_name = os.environ.get(BUCKET_NAME_ENV) + test_project_id = os.environ.get(PROJECT_ID_ENV) + answers = [test_bucket_name, test_project_id, 'n', + '1', '1'] + ret = answers[TestAsyncRunner.i] + TestAsyncRunner.i += 1 + return ret - i = 0 - def mock_get_input(input): - test_bucket_name = os.environ.get(BUCKET_NAME_ENV) - test_project_id = os.environ.get(PROJECT_ID_ENV) - answers = [test_bucket_name, test_project_id, 'n', - '1', '1'] - ret = answers[TestAsyncRunner.i] - TestAsyncRunner.i += 1 - return ret +class TestAsyncRunner(CloudBaseTest): + i = 0 - @patch('bigquery.samples.async_query.get_input', new=mock_get_input) def test_async_query_runner(self): - main() + with mock_raw_input(mock_get_input): + main() if __name__ == '__main__': diff --git a/tests/__init__.py b/tests/__init__.py index 9f87cf1d518..4d6823a7493 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -18,7 +18,8 @@ import json import os import unittest - +from contextlib import contextmanager +import __builtin__ BUCKET_NAME_ENV = 'TEST_BUCKET_NAME' PROJECT_ID_ENV = 'TEST_PROJECT_ID' @@ -26,6 +27,14 @@ os.path.abspath(os.path.dirname(__file__)), 'resources') +@contextmanager +def mock_raw_input(mock): + original_raw_input = __builtin__.raw_input + __builtin__.raw_input = mock + yield + __builtin__.raw_input = original_raw_input + + class CloudBaseTest(unittest.TestCase): def setUp(self): From 032a4c0f0038f4b2ef274390630cbe3810d34d67 Mon Sep 17 00:00:00 2001 From: Bill Prin Date: Fri, 22 May 2015 11:23:29 -0700 Subject: [PATCH 3/6] Fix unintentional whitespace changes --- bigquery/samples/async_query.py | 2 ++ bigquery/samples/utils.py | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/bigquery/samples/async_query.py b/bigquery/samples/async_query.py index 06571313c2a..50deb3a4731 100644 --- a/bigquery/samples/async_query.py +++ b/bigquery/samples/async_query.py @@ -20,6 +20,7 @@ from bigquery.samples.utils import paging from bigquery.samples.utils import poll_job + # [START async_query] def async_query(service, project_id, query, batch=False, num_retries=5): # Generate a unique job_id so retries @@ -78,6 +79,7 @@ def main(): "Enter number of times to retry in case of 500 error: ") interval = raw_input( "Enter how often to poll the query for completion (seconds): ") + for result in run(project_id, query_string, batch, num_retries, interval): print(result) # [END main] diff --git a/bigquery/samples/utils.py b/bigquery/samples/utils.py index d379147e74f..d35d0c94713 100644 --- a/bigquery/samples/utils.py +++ b/bigquery/samples/utils.py @@ -48,4 +48,3 @@ def paging(service, request_func, num_retries=5, **kwargs): has_next = False yield response # [END paging] - From 8b24b0b6479305c34e939385df5f0aad5767908c Mon Sep 17 00:00:00 2001 From: Bill Prin Date: Fri, 22 May 2015 11:42:36 -0700 Subject: [PATCH 4/6] Change it to list --- bigquery/tests/test_async_query.py | 21 +++++++-------------- tests/__init__.py | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/bigquery/tests/test_async_query.py b/bigquery/tests/test_async_query.py index dcf3211605d..5f897c62f1c 100644 --- a/bigquery/tests/test_async_query.py +++ b/bigquery/tests/test_async_query.py @@ -16,7 +16,8 @@ import unittest from bigquery.samples.async_query import run, main -from tests import CloudBaseTest, mock_raw_input, BUCKET_NAME_ENV, PROJECT_ID_ENV +from tests import CloudBaseTest, mock_raw_input_list, BUCKET_NAME_ENV, \ + PROJECT_ID_ENV class TestAsyncQuery(CloudBaseTest): @@ -29,22 +30,14 @@ def test_async_query(self): self.assertIsNotNone(json.loads(result)) -def mock_get_input(input): - test_bucket_name = os.environ.get(BUCKET_NAME_ENV) - test_project_id = os.environ.get(PROJECT_ID_ENV) - answers = [test_bucket_name, test_project_id, 'n', - '1', '1'] - ret = answers[TestAsyncRunner.i] - TestAsyncRunner.i += 1 - return ret - - class TestAsyncRunner(CloudBaseTest): - i = 0 - def test_async_query_runner(self): - with mock_raw_input(mock_get_input): + test_bucket_name = os.environ.get(BUCKET_NAME_ENV) + test_project_id = os.environ.get(PROJECT_ID_ENV) + answers = [test_bucket_name, test_project_id, 'n', + '1', '1'] + with mock_raw_input_list(answers): main() diff --git a/tests/__init__.py b/tests/__init__.py index 4d6823a7493..57a4406063d 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -27,6 +27,25 @@ os.path.abspath(os.path.dirname(__file__)), 'resources') +class mock_raw_input_list(object): + + def __init__(self, list_): + self.i = 0 + self.list_ = list_ + + def get_next_value(self, question): + ret = self.list_[self.i] + self.i += 1 + return ret + + def __enter__(self): + self.raw_input_cache = __builtin__.raw_input + __builtin__.raw_input = self.get_next_value + + def __exit__(self, exc_type, exc_value, traceback): + __builtin__.raw_input = self.raw_input_cache + + @contextmanager def mock_raw_input(mock): original_raw_input = __builtin__.raw_input From 589fbdd7ee671f94f440dbb6db41f9df9d37f1e6 Mon Sep 17 00:00:00 2001 From: Bill Prin Date: Fri, 22 May 2015 11:44:41 -0700 Subject: [PATCH 5/6] Remove single value use case --- bigquery/tests/test_async_query.py | 4 ++-- tests/__init__.py | 10 +--------- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/bigquery/tests/test_async_query.py b/bigquery/tests/test_async_query.py index 5f897c62f1c..52498d34544 100644 --- a/bigquery/tests/test_async_query.py +++ b/bigquery/tests/test_async_query.py @@ -16,7 +16,7 @@ import unittest from bigquery.samples.async_query import run, main -from tests import CloudBaseTest, mock_raw_input_list, BUCKET_NAME_ENV, \ +from tests import CloudBaseTest, mock_raw_input, BUCKET_NAME_ENV, \ PROJECT_ID_ENV class TestAsyncQuery(CloudBaseTest): @@ -37,7 +37,7 @@ def test_async_query_runner(self): test_project_id = os.environ.get(PROJECT_ID_ENV) answers = [test_bucket_name, test_project_id, 'n', '1', '1'] - with mock_raw_input_list(answers): + with mock_raw_input(answers): main() diff --git a/tests/__init__.py b/tests/__init__.py index 57a4406063d..a7428cec9f6 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -27,7 +27,7 @@ os.path.abspath(os.path.dirname(__file__)), 'resources') -class mock_raw_input_list(object): +class mock_raw_input(object): def __init__(self, list_): self.i = 0 @@ -46,14 +46,6 @@ def __exit__(self, exc_type, exc_value, traceback): __builtin__.raw_input = self.raw_input_cache -@contextmanager -def mock_raw_input(mock): - original_raw_input = __builtin__.raw_input - __builtin__.raw_input = mock - yield - __builtin__.raw_input = original_raw_input - - class CloudBaseTest(unittest.TestCase): def setUp(self): From 09961a7cae1866fb2f697ed7581b14004c61335d Mon Sep 17 00:00:00 2001 From: Bill Prin Date: Fri, 22 May 2015 11:45:23 -0700 Subject: [PATCH 6/6] Remove unused import --- tests/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/__init__.py b/tests/__init__.py index a7428cec9f6..e006de633f0 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -18,7 +18,6 @@ import json import os import unittest -from contextlib import contextmanager import __builtin__ BUCKET_NAME_ENV = 'TEST_BUCKET_NAME'