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

ephraimanierobi pushed a commit to branch v2-8-test
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit 7937cba0dc7e2d6db80209cfaf80aafe1d3b1a4c
Author: Riyas P K <16943217+rp...@users.noreply.github.com>
AuthorDate: Wed Nov 22 06:08:45 2023 +0530

    Add missing docker test_exceptions.py (#35674)
    
    * test case for docker exceptions
    
    * removed docker test exception
    
    * re-wrote test case based on feedback
---
 tests/always/test_project_structure.py    |  1 -
 tests/providers/docker/test_exceptions.py | 80 +++++++++++++++++++++++++++++++
 2 files changed, 80 insertions(+), 1 deletion(-)

diff --git a/tests/always/test_project_structure.py 
b/tests/always/test_project_structure.py
index a58f33d755..967c3ecbb5 100644
--- a/tests/always/test_project_structure.py
+++ b/tests/always/test_project_structure.py
@@ -108,7 +108,6 @@ class TestProjectStructure:
             "tests/providers/cncf/kubernetes/utils/test_xcom_sidecar.py",
             "tests/providers/daskexecutor/executors/test_dask_executor.py",
             "tests/providers/databricks/hooks/test_databricks_base.py",
-            "tests/providers/docker/test_exceptions.py",
             "tests/providers/google/cloud/fs/test_gcs.py",
             "tests/providers/google/cloud/links/test_automl.py",
             "tests/providers/google/cloud/links/test_base.py",
diff --git a/tests/providers/docker/test_exceptions.py 
b/tests/providers/docker/test_exceptions.py
new file mode 100644
index 0000000000..1f3653c39d
--- /dev/null
+++ b/tests/providers/docker/test_exceptions.py
@@ -0,0 +1,80 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+"""Test for Exceptions used by Docker provider."""
+
+from __future__ import annotations
+
+from unittest import mock
+
+import pytest
+from docker import APIClient
+
+from airflow.providers.docker.exceptions import (
+    DockerContainerFailedException,
+    DockerContainerFailedSkipException,
+)
+from airflow.providers.docker.operators.docker import DockerOperator
+
+FAILED_MESSAGE = {"StatusCode": 1}
+FAILED_LOGS = ["unicode container log 😁   ", b"byte string container log"]
+EXPECTED_MESSAGE = f"Docker container failed: {FAILED_MESSAGE}"
+FAILED_SKIP_MESSAGE = {"StatusCode": 2}
+SKIP_ON_EXIT_CODE = 2
+EXPECTED_SKIP_MESSAGE = f"Docker container returned exit code 
{[SKIP_ON_EXIT_CODE]}. Skipping."
+
+
+@pytest.mark.parametrize(
+    "failed_msg, log_line, expected_message, skip_on_exit_code",
+    [
+        (FAILED_MESSAGE, FAILED_LOGS, EXPECTED_MESSAGE, None),
+        (FAILED_SKIP_MESSAGE, FAILED_LOGS, EXPECTED_SKIP_MESSAGE, 
SKIP_ON_EXIT_CODE),
+    ],
+)
+class TestDockerContainerExceptions:
+    @pytest.fixture(autouse=True, scope="function")
+    def setup_patchers(self, docker_api_client_patcher):
+        self.client_mock = mock.MagicMock(spec=APIClient)
+        self.client_mock.wait.return_value = {"StatusCode": 0}
+        self.log_messages = ["container log  😁   ", b"byte string container 
log"]
+        self.client_mock.attach.return_value = self.log_messages
+
+        self.client_mock.logs.side_effect = (
+            lambda **kwargs: iter(self.log_messages[-kwargs["tail"] :])
+            if "tail" in kwargs
+            else iter(self.log_messages)
+        )
+
+        docker_api_client_patcher.return_value = self.client_mock
+
+    def test_docker_failed_exception(self, failed_msg, log_line, 
expected_message, skip_on_exit_code):
+        self.client_mock.attach.return_value = log_line
+        self.client_mock.wait.return_value = failed_msg
+
+        operator = DockerOperator(
+            image="ubuntu", owner="unittest", task_id="unittest", 
skip_on_exit_code=skip_on_exit_code
+        )
+
+        if skip_on_exit_code:
+            with pytest.raises(DockerContainerFailedSkipException) as 
raised_exception:
+                operator.execute(None)
+        else:
+            with pytest.raises(DockerContainerFailedException) as 
raised_exception:
+                operator.execute(None)
+
+        assert str(raised_exception.value) == expected_message
+        assert raised_exception.value.logs == [log_line[0].strip(), 
log_line[1].decode("utf-8")]

Reply via email to