@@ -314,6 +314,68 @@ def test_start_python_dataflow_with_custom_interpreter(
314
314
self .assertListEqual (sorted (mock_dataflow .call_args [1 ]["cmd" ]),
315
315
sorted (expected_cmd ))
316
316
317
+ @parameterized .expand ([
318
+ (['foo-bar' ], False ),
319
+ (['foo-bar' ], True ),
320
+ ([], True ),
321
+ ])
322
+ @mock .patch (DATAFLOW_STRING .format ('prepare_virtualenv' ))
323
+ @mock .patch (DATAFLOW_STRING .format ('uuid.uuid4' ))
324
+ @mock .patch (DATAFLOW_STRING .format ('_DataflowJobsController' ))
325
+ @mock .patch (DATAFLOW_STRING .format ('_DataflowRunner' ))
326
+ @mock .patch (DATAFLOW_STRING .format ('DataflowHook.get_conn' ))
327
+ def test_start_python_dataflow_with_non_empty_py_requirements_and_without_system_packages (
328
+ self ,
329
+ current_py_requirements ,
330
+ current_py_system_site_packages ,
331
+ mock_conn ,
332
+ mock_dataflow ,
333
+ mock_dataflowjob ,
334
+ mock_uuid ,
335
+ mock_virtualenv ,
336
+ ):
337
+ mock_uuid .return_value = MOCK_UUID
338
+ mock_conn .return_value = None
339
+ dataflow_instance = mock_dataflow .return_value
340
+ dataflow_instance .wait_for_done .return_value = None
341
+ dataflowjob_instance = mock_dataflowjob .return_value
342
+ dataflowjob_instance .wait_for_done .return_value = None
343
+ mock_virtualenv .return_value = '/dummy_dir/bin/python'
344
+ self .dataflow_hook .start_python_dataflow ( # pylint: disable=no-value-for-parameter
345
+ job_name = JOB_NAME , variables = DATAFLOW_VARIABLES_PY ,
346
+ dataflow = PY_FILE , py_options = PY_OPTIONS ,
347
+ py_requirements = current_py_requirements ,
348
+ py_system_site_packages = current_py_system_site_packages
349
+ )
350
+ expected_cmd = ['/dummy_dir/bin/python' , '-m' , PY_FILE ,
351
+ '--region=us-central1' ,
352
+ '--runner=DataflowRunner' , '--project=test' ,
353
+ '--labels=foo=bar' ,
354
+ '--staging_location=gs://test/staging' ,
355
+ '--job_name={}-{}' .format (JOB_NAME , MOCK_UUID )]
356
+ self .assertListEqual (sorted (mock_dataflow .call_args [1 ]["cmd" ]),
357
+ sorted (expected_cmd ))
358
+
359
+ @mock .patch (DATAFLOW_STRING .format ('uuid.uuid4' ))
360
+ @mock .patch (DATAFLOW_STRING .format ('_DataflowJobsController' ))
361
+ @mock .patch (DATAFLOW_STRING .format ('_DataflowRunner' ))
362
+ @mock .patch (DATAFLOW_STRING .format ('DataflowHook.get_conn' ))
363
+ def test_start_python_dataflow_with_empty_py_requirements_and_without_system_packages (
364
+ self , mock_conn , mock_dataflow , mock_dataflowjob , mock_uuid
365
+ ):
366
+ mock_uuid .return_value = MOCK_UUID
367
+ mock_conn .return_value = None
368
+ dataflow_instance = mock_dataflow .return_value
369
+ dataflow_instance .wait_for_done .return_value = None
370
+ dataflowjob_instance = mock_dataflowjob .return_value
371
+ dataflowjob_instance .wait_for_done .return_value = None
372
+ with self .assertRaisesRegex (AirflowException , "Invalid method invocation." ):
373
+ self .dataflow_hook .start_python_dataflow ( # pylint: disable=no-value-for-parameter
374
+ job_name = JOB_NAME , variables = DATAFLOW_VARIABLES_PY ,
375
+ dataflow = PY_FILE , py_options = PY_OPTIONS ,
376
+ py_requirements = []
377
+ )
378
+
317
379
@mock .patch (DATAFLOW_STRING .format ('uuid.uuid4' ))
318
380
@mock .patch (DATAFLOW_STRING .format ('_DataflowJobsController' ))
319
381
@mock .patch (DATAFLOW_STRING .format ('_DataflowRunner' ))
0 commit comments