|
| 1 | +import os |
| 2 | + |
| 3 | +from airflow import DAG |
| 4 | +from airflow.models import DagBag, Variable |
| 5 | +from airflow.timetables.trigger import CronTriggerTimetable |
| 6 | + |
| 7 | +from ted_sws import DAG_MATERIALIZED_VIEW_UPDATE_DEFAULT_TIMETABLE |
| 8 | + |
| 9 | + |
| 10 | +def test_daily_materialised_view_change_timetable_from_airflow_variable_after_reparse(dag_bag: DagBag, |
| 11 | + dag_materialised_view_update_schedule_variable_name: str, |
| 12 | + daily_materialised_views_dag_id: str, |
| 13 | + example_dag_cron_table: CronTriggerTimetable, |
| 14 | + airflow_timetable_import_error_name: str): |
| 15 | + daily_materialised_view_dag: DAG = dag_bag.get_dag(dag_id=daily_materialised_views_dag_id) |
| 16 | + assert daily_materialised_view_dag is not None |
| 17 | + assert daily_materialised_view_dag.schedule_interval != example_dag_cron_table._expression |
| 18 | + |
| 19 | + Variable.set(key=dag_materialised_view_update_schedule_variable_name, value=example_dag_cron_table._expression) |
| 20 | + dag_bag.collect_dags(only_if_updated=False) |
| 21 | + |
| 22 | + daily_materialised_view_dag: DAG = dag_bag.get_dag(dag_id=daily_materialised_views_dag_id) |
| 23 | + assert daily_materialised_view_dag is not None |
| 24 | + assert daily_materialised_view_dag.schedule_interval == example_dag_cron_table._expression |
| 25 | + |
| 26 | + assert all(airflow_timetable_import_error_name not in error for error in dag_bag.import_errors.values()) |
| 27 | + |
| 28 | + |
| 29 | +def test_daily_materialised_view_change_timetable_from_env_variable_after_reparse(dag_bag: DagBag, |
| 30 | + dag_materialised_view_update_schedule_variable_name: str, |
| 31 | + daily_materialised_views_dag_id: str, |
| 32 | + example_dag_cron_table: CronTriggerTimetable, |
| 33 | + airflow_timetable_import_error_name: str): |
| 34 | + fetcher_dag: DAG = dag_bag.get_dag(dag_id=daily_materialised_views_dag_id) |
| 35 | + assert fetcher_dag is not None |
| 36 | + assert fetcher_dag.schedule_interval != example_dag_cron_table._expression |
| 37 | + |
| 38 | + os.environ[dag_materialised_view_update_schedule_variable_name] = example_dag_cron_table._expression |
| 39 | + dag_bag.collect_dags(only_if_updated=False) |
| 40 | + |
| 41 | + fetcher_dag: DAG = dag_bag.get_dag(dag_id=daily_materialised_views_dag_id) |
| 42 | + assert fetcher_dag is not None |
| 43 | + assert fetcher_dag.schedule_interval == example_dag_cron_table._expression |
| 44 | + |
| 45 | + assert all(airflow_timetable_import_error_name not in error for error in dag_bag.import_errors.values()) |
| 46 | + del os.environ[dag_materialised_view_update_schedule_variable_name] |
| 47 | + |
| 48 | + |
| 49 | +def test_daily_materialised_view_has_default_timetable_if_no_variable_is_set_after_reparse(dag_bag: DagBag, |
| 50 | + dag_materialised_view_update_schedule_variable_name: str, |
| 51 | + daily_materialised_views_dag_id: str, |
| 52 | + airflow_timetable_import_error_name: str): |
| 53 | + env_var_value = os.getenv(dag_materialised_view_update_schedule_variable_name) |
| 54 | + is_env_var_set: bool = True if env_var_value is not None else False |
| 55 | + if is_env_var_set: |
| 56 | + del os.environ[dag_materialised_view_update_schedule_variable_name] |
| 57 | + airflow_var_value = Variable.get(key=dag_materialised_view_update_schedule_variable_name, default_var=None) |
| 58 | + is_airflow_var_set: bool = True if airflow_var_value is not None else False |
| 59 | + if is_airflow_var_set: |
| 60 | + Variable.delete(key=dag_materialised_view_update_schedule_variable_name) |
| 61 | + |
| 62 | + dag_bag.collect_dags() |
| 63 | + fetcher_dag: DAG = dag_bag.get_dag(dag_id=daily_materialised_views_dag_id) |
| 64 | + assert fetcher_dag is not None |
| 65 | + assert fetcher_dag.schedule_interval == DAG_MATERIALIZED_VIEW_UPDATE_DEFAULT_TIMETABLE |
| 66 | + assert all(airflow_timetable_import_error_name not in error for error in dag_bag.import_errors.values()) |
| 67 | + |
| 68 | + if is_env_var_set: |
| 69 | + os.environ[dag_materialised_view_update_schedule_variable_name] = env_var_value |
| 70 | + if is_airflow_var_set: |
| 71 | + Variable.set(key=dag_materialised_view_update_schedule_variable_name, value=airflow_var_value) |
| 72 | + |
| 73 | + |
| 74 | +def test_daily_materialised_view_gets_incorrect_timetable_after_reparse(dag_bag: DagBag, |
| 75 | + dag_materialised_view_update_schedule_variable_name: str, |
| 76 | + daily_materialised_views_dag_id: str, |
| 77 | + example_wrong_cron_table: str, |
| 78 | + airflow_timetable_import_error_name: str): |
| 79 | + fetcher_dag: DAG = dag_bag.get_dag(dag_id=daily_materialised_views_dag_id) |
| 80 | + assert fetcher_dag is not None |
| 81 | + |
| 82 | + Variable.set(key=dag_materialised_view_update_schedule_variable_name, value=example_wrong_cron_table) |
| 83 | + dag_bag.collect_dags(only_if_updated=False) |
| 84 | + |
| 85 | + assert any(airflow_timetable_import_error_name in error for error in dag_bag.import_errors.values()) |
0 commit comments