diff --git a/gcloud/bigquery/client.py b/gcloud/bigquery/client.py index 282d26ab76ba..0870837bdde8 100644 --- a/gcloud/bigquery/client.py +++ b/gcloud/bigquery/client.py @@ -159,7 +159,7 @@ def list_jobs(self, max_results=None, page_token=None, all_users=None, retrieved with another call, passing that value as ``page_token``). """ - params = {} + params = {'projection': 'full'} if max_results is not None: params['maxResults'] = max_results diff --git a/gcloud/bigquery/job.py b/gcloud/bigquery/job.py index d0feb2dd489d..31fe68bbdd79 100644 --- a/gcloud/bigquery/job.py +++ b/gcloud/bigquery/job.py @@ -615,7 +615,7 @@ def from_api_repr(cls, resource, client): dest_config = config['destinationTable'] dataset = Dataset(dest_config['datasetId'], client) destination = Table(dest_config['tableId'], dataset) - source_urls = config['sourceUris'] + source_urls = config.get('sourceUris', ()) job = cls(name, destination, source_urls, client=client) job._set_properties(resource) return job diff --git a/gcloud/bigquery/test_client.py b/gcloud/bigquery/test_client.py index 017e780292a6..b9c0605bf634 100644 --- a/gcloud/bigquery/test_client.py +++ b/gcloud/bigquery/test_client.py @@ -260,7 +260,59 @@ def test_list_jobs_defaults(self): req = conn._requested[0] self.assertEqual(req['method'], 'GET') self.assertEqual(req['path'], '/%s' % PATH) - self.assertEqual(req['query_params'], {}) + self.assertEqual(req['query_params'], {'projection': 'full'}) + + def test_list_jobs_load_job_wo_sourceUris(self): + from gcloud.bigquery.job import LoadTableFromStorageJob + PROJECT = 'PROJECT' + DATASET = 'test_dataset' + SOURCE_TABLE = 'source_table' + JOB_TYPES = { + 'load_job': LoadTableFromStorageJob, + } + PATH = 'projects/%s/jobs' % PROJECT + TOKEN = 'TOKEN' + LOAD_DATA = { + 'id': '%s:%s' % (PROJECT, 'load_job'), + 'jobReference': { + 'projectId': PROJECT, + 'jobId': 'load_job', + }, + 'state': 'DONE', + 'configuration': { + 'load': { + 'destinationTable': { + 'projectId': PROJECT, + 'datasetId': DATASET, + 'tableId': SOURCE_TABLE, + }, + } + }, + } + DATA = { + 'nextPageToken': TOKEN, + 'jobs': [ + LOAD_DATA, + ] + } + creds = _Credentials() + client = self._makeOne(PROJECT, creds) + conn = client.connection = _Connection(DATA) + + jobs, token = client.list_jobs() + + self.assertEqual(len(jobs), len(DATA['jobs'])) + for found, expected in zip(jobs, DATA['jobs']): + name = expected['jobReference']['jobId'] + self.assertTrue(isinstance(found, JOB_TYPES[name])) + self.assertEqual(found.job_id, expected['id']) + self.assertEqual(token, TOKEN) + + self.assertEqual(len(conn._requested), 1) + req = conn._requested[0] + self.assertEqual(req['method'], 'GET') + self.assertEqual(req['path'], '/%s' % PATH) + self.assertEqual(req['query_params'], {'projection': 'full'}) def test_list_jobs_explicit_empty(self): PROJECT = 'PROJECT' @@ -282,7 +334,8 @@ def test_list_jobs_explicit_empty(self): self.assertEqual(req['method'], 'GET') self.assertEqual(req['path'], '/%s' % PATH) self.assertEqual(req['query_params'], - {'maxResults': 1000, + {'projection': 'full', + 'maxResults': 1000, 'pageToken': TOKEN, 'allUsers': True, 'stateFilter': 'done'})