You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by po...@apache.org on 2021/10/09 08:51:45 UTC

[airflow] branch main updated: Fixing tests that leave traces (users) (#18690)

This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new b9517f3  Fixing tests that leave traces (users) (#18690)
b9517f3 is described below

commit b9517f376788f08c5c297b273ced9489cefbf8b1
Author: Khalid Mammadov <xm...@hotmail.com>
AuthorDate: Sat Oct 9 09:51:07 2021 +0100

    Fixing tests that leave traces (users) (#18690)
---
 tests/test_utils/api_connexion_utils.py | 30 +++++++++++----
 tests/www/views/test_views_acl.py       | 67 ++++++++++++++++++---------------
 2 files changed, 60 insertions(+), 37 deletions(-)

diff --git a/tests/test_utils/api_connexion_utils.py b/tests/test_utils/api_connexion_utils.py
index e15d288..fd75ec4 100644
--- a/tests/test_utils/api_connexion_utils.py
+++ b/tests/test_utils/api_connexion_utils.py
@@ -14,26 +14,42 @@
 # KIND, either express or implied.  See the License for the
 # specific language governing permissions and limitations
 # under the License.
+from contextlib import contextmanager
+
 from airflow.api_connexion.exceptions import EXCEPTIONS_LINK_MAP
 from airflow.www.security import EXISTING_ROLES
 
 
-def create_user(app, *, username, role_name, email=None, permissions=None):
+@contextmanager
+def create_user_scope(app, username, **kwargs):
+    """
+    Helper function designed to be used with pytest fixture mainly.
+    It will create a user and provide it for the fixture via YIELD (generator)
+    then will tidy up once test is complete
+    """
+    test_user = create_user(app, username, **kwargs)
+
+    try:
+        yield test_user
+    finally:
+        delete_user(app, username)
+
+
+def create_user(app, username, role_name=None, email=None, permissions=None):
     appbuilder = app.appbuilder
 
     # Removes user and role so each test has isolated test data.
     delete_user(app, username)
-    delete_role(app, role_name)
-    role = create_role(app, role_name, permissions)
-
-    if email is None:
-        email = f"{username}@example.org"
+    role = None
+    if role_name:
+        delete_role(app, role_name)
+        role = create_role(app, role_name, permissions)
 
     return appbuilder.sm.add_user(
         username=username,
         first_name=username,
         last_name=username,
-        email=email,
+        email=email or f"{username}@example.org",
         role=role,
         password=username,
     )
diff --git a/tests/www/views/test_views_acl.py b/tests/www/views/test_views_acl.py
index de5a281..9402ee4 100644
--- a/tests/www/views/test_views_acl.py
+++ b/tests/www/views/test_views_acl.py
@@ -28,7 +28,7 @@ from airflow.utils.session import create_session
 from airflow.utils.state import State
 from airflow.utils.types import DagRunType
 from airflow.www.views import FILTER_STATUS_COOKIE
-from tests.test_utils.api_connexion_utils import create_user
+from tests.test_utils.api_connexion_utils import create_user_scope
 from tests.test_utils.db import clear_db_runs
 from tests.test_utils.www import check_content_in_response, check_content_not_in_response, client_with_login
 
@@ -186,7 +186,7 @@ def all_dag_user_client(acl_app):
 
 @pytest.fixture(scope="module")
 def user_edit_one_dag(acl_app):
-    return create_user(
+    with create_user_scope(
         acl_app,
         username="user_edit_one_dag",
         role_name="role_edit_one_dag",
@@ -194,7 +194,8 @@ def user_edit_one_dag(acl_app):
             (permissions.ACTION_CAN_READ, 'DAG:example_bash_operator'),
             (permissions.ACTION_CAN_EDIT, 'DAG:example_bash_operator'),
         ],
-    )
+    ) as user:
+        yield user
 
 
 @pytest.mark.usefixtures("user_edit_one_dag")
@@ -219,7 +220,7 @@ def test_role_permission_associate(acl_app):
 
 @pytest.fixture(scope="module")
 def user_all_dags(acl_app):
-    return create_user(
+    with create_user_scope(
         acl_app,
         username="user_all_dags",
         role_name="role_all_dags",
@@ -227,7 +228,8 @@ def user_all_dags(acl_app):
             (permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG),
             (permissions.ACTION_CAN_READ, permissions.RESOURCE_WEBSITE),
         ],
-    )
+    ) as user:
+        yield user
 
 
 @pytest.fixture()
@@ -310,7 +312,7 @@ def test_dag_autocomplete_status(client_all_dags, status, expected, unexpected):
 
 @pytest.fixture(scope="module")
 def user_all_dags_dagruns(acl_app):
-    return create_user(
+    with create_user_scope(
         acl_app,
         username="user_all_dags_dagruns",
         role_name="role_all_dags_dagruns",
@@ -319,7 +321,8 @@ def user_all_dags_dagruns(acl_app):
             (permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG_RUN),
             (permissions.ACTION_CAN_READ, permissions.RESOURCE_WEBSITE),
         ],
-    )
+    ) as user:
+        yield user
 
 
 @pytest.fixture()
@@ -350,7 +353,7 @@ def test_dag_stats_success_for_all_dag_user(client_all_dags_dagruns):
 
 @pytest.fixture(scope="module")
 def user_all_dags_dagruns_tis(acl_app):
-    return create_user(
+    with create_user_scope(
         acl_app,
         username="user_all_dags_dagruns_tis",
         role_name="role_all_dags_dagruns_tis",
@@ -360,7 +363,8 @@ def user_all_dags_dagruns_tis(acl_app):
             (permissions.ACTION_CAN_READ, permissions.RESOURCE_TASK_INSTANCE),
             (permissions.ACTION_CAN_READ, permissions.RESOURCE_WEBSITE),
         ],
-    )
+    ) as user:
+        yield user
 
 
 @pytest.fixture()
@@ -410,7 +414,7 @@ def test_task_stats_success(
 
 @pytest.fixture(scope="module")
 def user_all_dags_codes(acl_app):
-    return create_user(
+    with create_user_scope(
         acl_app,
         username="user_all_dags_codes",
         role_name="role_all_dags_codes",
@@ -419,7 +423,8 @@ def user_all_dags_codes(acl_app):
             (permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG_CODE),
             (permissions.ACTION_CAN_READ, permissions.RESOURCE_WEBSITE),
         ],
-    )
+    ) as user:
+        yield user
 
 
 @pytest.fixture()
@@ -478,7 +483,7 @@ def test_dag_details_success_for_all_dag_user(client_all_dags_dagruns, dag_id):
 
 @pytest.fixture(scope="module")
 def user_all_dags_tis(acl_app):
-    return create_user(
+    with create_user_scope(
         acl_app,
         username="user_all_dags_tis",
         role_name="role_all_dags_tis",
@@ -487,7 +492,8 @@ def user_all_dags_tis(acl_app):
             (permissions.ACTION_CAN_READ, permissions.RESOURCE_TASK_INSTANCE),
             (permissions.ACTION_CAN_READ, permissions.RESOURCE_WEBSITE),
         ],
-    )
+    ) as user:
+        yield user
 
 
 @pytest.fixture()
@@ -501,7 +507,7 @@ def client_all_dags_tis(acl_app, user_all_dags_tis):
 
 @pytest.fixture(scope="module")
 def user_all_dags_tis_xcom(acl_app):
-    return create_user(
+    with create_user_scope(
         acl_app,
         username="user_all_dags_tis_xcom",
         role_name="role_all_dags_tis_xcom",
@@ -511,7 +517,8 @@ def user_all_dags_tis_xcom(acl_app):
             (permissions.ACTION_CAN_READ, permissions.RESOURCE_XCOM),
             (permissions.ACTION_CAN_READ, permissions.RESOURCE_WEBSITE),
         ],
-    )
+    ) as user:
+        yield user
 
 
 @pytest.fixture()
@@ -525,7 +532,7 @@ def client_all_dags_tis_xcom(acl_app, user_all_dags_tis_xcom):
 
 @pytest.fixture(scope="module")
 def user_dags_tis_logs(acl_app):
-    return create_user(
+    with create_user_scope(
         acl_app,
         username="user_dags_tis_logs",
         role_name="role_dags_tis_logs",
@@ -535,7 +542,8 @@ def user_dags_tis_logs(acl_app):
             (permissions.ACTION_CAN_READ, permissions.RESOURCE_TASK_LOG),
             (permissions.ACTION_CAN_READ, permissions.RESOURCE_WEBSITE),
         ],
-    )
+    ) as user:
+        yield user
 
 
 @pytest.fixture()
@@ -692,7 +700,7 @@ def test_blocked_success_when_selecting_dags(
 
 @pytest.fixture(scope="module")
 def user_all_dags_edit_tis(acl_app):
-    return create_user(
+    with create_user_scope(
         acl_app,
         username="user_all_dags_edit_tis",
         role_name="role_all_dags_edit_tis",
@@ -701,7 +709,8 @@ def user_all_dags_edit_tis(acl_app):
             (permissions.ACTION_CAN_EDIT, permissions.RESOURCE_TASK_INSTANCE),
             (permissions.ACTION_CAN_READ, permissions.RESOURCE_WEBSITE),
         ],
-    )
+    ) as user:
+        yield user
 
 
 @pytest.fixture()
@@ -734,7 +743,7 @@ def test_paused_post_success(dag_test_client):
 
 @pytest.fixture(scope="module")
 def user_only_dags_tis(acl_app):
-    return create_user(
+    with create_user_scope(
         acl_app,
         username="user_only_dags_tis",
         role_name="role_only_dags_tis",
@@ -742,7 +751,8 @@ def user_only_dags_tis(acl_app):
             (permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG),
             (permissions.ACTION_CAN_READ, permissions.RESOURCE_TASK_INSTANCE),
         ],
-    )
+    ) as user:
+        yield user
 
 
 @pytest.fixture()
@@ -796,13 +806,9 @@ def test_get_logs_with_metadata_failure(dag_faker_client):
 
 @pytest.fixture(scope="module")
 def user_no_roles(acl_app):
-    user = create_user(
-        acl_app,
-        username="no_roles_user",
-        role_name="no_roles_user_role",
-    )
-    user.roles = []
-    return user
+    with create_user_scope(acl_app, username="no_roles_user", role_name="no_roles_user_role") as user:
+        user.roles = []
+        yield user
 
 
 @pytest.fixture()
@@ -816,11 +822,12 @@ def client_no_roles(acl_app, user_no_roles):
 
 @pytest.fixture(scope="module")
 def user_no_permissions(acl_app):
-    return create_user(
+    with create_user_scope(
         acl_app,
         username="no_permissions_user",
         role_name="no_permissions_role",
-    )
+    ) as user:
+        yield user
 
 
 @pytest.fixture()