Skip to content

Commit 44bfe46

Browse files
authored
test: fix unit tests for handling drive access issues (#352)
* test: fix unit tests for handling drive access issues * refactor test logic * adapt new create_bigquery_session in one failing test
1 parent 93835ef commit 44bfe46

File tree

3 files changed

+42
-16
lines changed

3 files changed

+42
-16
lines changed

tests/unit/resources.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
import datetime
1516
from typing import Dict, List, Optional
1617
import unittest.mock as mock
1718

@@ -49,14 +50,21 @@ def create_bigquery_session(
4950
"test_dataset",
5051
)
5152

52-
query_job = mock.create_autospec(google.cloud.bigquery.QueryJob)
53-
type(query_job).destination = mock.PropertyMock(
54-
return_value=anonymous_dataset.table("test_table"),
55-
)
56-
type(query_job).session_info = google.cloud.bigquery.SessionInfo(
57-
{"sessionInfo": {"sessionId": session_id}},
58-
)
59-
bqclient.query.return_value = query_job
53+
def query_mock(query, *args, **kwargs):
54+
query_job = mock.create_autospec(google.cloud.bigquery.QueryJob)
55+
type(query_job).destination = mock.PropertyMock(
56+
return_value=anonymous_dataset.table("test_table"),
57+
)
58+
type(query_job).session_info = google.cloud.bigquery.SessionInfo(
59+
{"sessionInfo": {"sessionId": session_id}},
60+
)
61+
62+
if query.startswith("SELECT CURRENT_TIMESTAMP()"):
63+
query_job.result = mock.MagicMock(return_value=[[datetime.datetime.now()]])
64+
65+
return query_job
66+
67+
bqclient.query = query_mock
6068

6169
clients_provider = mock.create_autospec(bigframes.session.clients.ClientsProvider)
6270
type(clients_provider).bqclient = mock.PropertyMock(return_value=bqclient)

tests/unit/session/test_session.py

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,31 @@ def test_read_gbq_not_found_tables(not_found_table_id):
6363
],
6464
)
6565
def test_read_gbq_external_table_no_drive_access(api_name, query_or_table):
66-
bqclient = mock.create_autospec(google.cloud.bigquery.Client, instance=True)
67-
bqclient.project = "test-project"
68-
bqclient.get_table.side_effect = google.api_core.exceptions.Forbidden(
69-
"Access Denied: BigQuery BigQuery: Permission denied while getting Drive credentials."
70-
)
71-
session = resources.create_bigquery_session(bqclient=bqclient)
66+
session = resources.create_bigquery_session()
67+
session_query_mock = session.bqclient.query
68+
69+
def query_mock(query, *args, **kwargs):
70+
if query.lstrip().startswith("SELECT *"):
71+
raise google.api_core.exceptions.Forbidden(
72+
"Access Denied: BigQuery BigQuery: Permission denied while getting Drive credentials."
73+
)
74+
75+
return session_query_mock(query, *args, **kwargs)
76+
77+
session.bqclient.query = query_mock
78+
79+
def get_table_mock(dataset_ref):
80+
dataset = google.cloud.bigquery.Dataset(dataset_ref)
81+
dataset.location = session._location
82+
return dataset
83+
84+
session.bqclient.get_table = get_table_mock
7285

7386
api = getattr(session, api_name)
74-
with pytest.raises(google.api_core.exceptions.Forbidden):
87+
with pytest.raises(
88+
google.api_core.exceptions.Forbidden,
89+
match="Check https://cloud.google.com/bigquery/docs/query-drive-data#Google_Drive_permissions.",
90+
):
7591
api(query_or_table)
7692

7793

tests/unit/test_compute_options.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,17 @@
1111
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
14+
from unittest import mock
15+
1416
import bigframes as bf
1517

1618
from . import resources
1719

1820

1921
def test_maximum_bytes_option():
2022
session = resources.create_bigquery_session()
23+
session.bqclient.query = mock.MagicMock()
2124
with bf.option_context("compute.maximum_bytes_billed", 10000):
22-
session.bqclient.query.reset_mock()
2325
session._start_query("query")
2426
call = session.bqclient.query.call_args
2527
assert call.kwargs["job_config"].maximum_bytes_billed == 10000

0 commit comments

Comments
 (0)