Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions task-sdk/tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import os
from pathlib import Path
from typing import TYPE_CHECKING, Any, NoReturn, Protocol
from unittest.mock import patch

import pytest

Expand Down Expand Up @@ -266,3 +267,12 @@ def _make_context_dict(
return context.model_dump(exclude_unset=True, mode="json")

return _make_context_dict


@pytest.fixture(autouse=True)
def set_secrets_masker():
from airflow.sdk.execution_time.secrets_masker import SecretsMasker

secrets_masker = SecretsMasker()
with patch("airflow.sdk.execution_time.secrets_masker._secrets_masker", return_value=secrets_masker):
yield secrets_masker
34 changes: 13 additions & 21 deletions task-sdk/tests/task_sdk/definitions/test_secrets_masker.py
Original file line number Diff line number Diff line change
Expand Up @@ -432,14 +432,10 @@ def lineno():


class TestRedactedIO:
@pytest.fixture(scope="class", autouse=True)
def reset_secrets_masker(self):
self.secrets_masker = SecretsMasker()
with patch(
"airflow.sdk.execution_time.secrets_masker._secrets_masker", return_value=self.secrets_masker
):
mask_secret(p)
yield
@pytest.fixture(autouse=True)
def reset_secrets_masker(self, set_secrets_masker):
mask_secret(p)
return

def test_redacts_from_print(self, capsys):
# Without redacting, password is printed.
Expand Down Expand Up @@ -472,33 +468,29 @@ def test_input_builtin(self, monkeypatch):

class TestMaskSecretAdapter:
@pytest.fixture(autouse=True)
def reset_secrets_masker_and_skip_escape(self):
self.secrets_masker = SecretsMasker()
with patch(
"airflow.sdk.execution_time.secrets_masker._secrets_masker", return_value=self.secrets_masker
):
with patch("airflow.sdk.execution_time.secrets_masker.re.escape", lambda x: x):
yield
def patched_escape(self, set_secrets_masker):
with patch("airflow.sdk.execution_time.secrets_masker.re.escape", lambda x: x):
yield set_secrets_masker

def test_calling_mask_secret_adds_adaptations_for_returned_str(self):
def test_calling_mask_secret_adds_adaptations_for_returned_str(self, patched_escape):
with conf_vars({("logging", "secret_mask_adapter"): "urllib.parse.quote"}):
mask_secret("secret<>&", None)

assert self.secrets_masker.patterns == {"secret%3C%3E%26", "secret<>&"}
assert patched_escape.patterns == {"secret%3C%3E%26", "secret<>&"}

def test_calling_mask_secret_adds_adaptations_for_returned_iterable(self):
def test_calling_mask_secret_adds_adaptations_for_returned_iterable(self, patched_escape):
with conf_vars({("logging", "secret_mask_adapter"): "urllib.parse.urlparse"}):
mask_secret("https://airflow.apache.org/docs/apache-airflow/stable", "password")

assert self.secrets_masker.patterns == {
assert patched_escape.patterns == {
"https",
"airflow.apache.org",
"/docs/apache-airflow/stable",
"https://airflow.apache.org/docs/apache-airflow/stable",
}

def test_calling_mask_secret_not_set(self):
def test_calling_mask_secret_not_set(self, patched_escape):
with conf_vars({("logging", "secret_mask_adapter"): None}):
mask_secret("a secret")

assert self.secrets_masker.patterns == {"a secret"}
assert patched_escape.patterns == {"a secret"}