Skip to content
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,10 @@
# under the License.
from __future__ import annotations

from datetime import datetime

from pydantic import Field, SecretStr

from airflow.api_fastapi.common.types import UtcDateTime
from airflow.api_fastapi.core_api.base import BaseModel, StrictBaseModel
from airflow.providers.fab.auth_manager.api_fastapi.datamodels.roles import Role

Expand Down Expand Up @@ -54,11 +55,11 @@ class UserResponse(BaseModel):
last_name: str
roles: list[Role] | None = None
active: bool | None = None
last_login: UtcDateTime | None = None
last_login: datetime | None = None
login_count: int | None = None
fail_login_count: int | None = None
created_on: UtcDateTime | None = None
changed_on: UtcDateTime | None = None
created_on: datetime | None = None
changed_on: datetime | None = None


class UserCollectionResponse(BaseModel):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,22 +99,22 @@ def test_userbody_password_is_required(self):
}
)

def test_userresponse_coerces_naive_datetimes_to_utc(self):
utc_created = datetime(2025, 1, 2, 3, 4, 5, tzinfo=timezone.utc)
def test_userresponse_accepts_naive_datetimes(self):
naive_created = datetime(2025, 1, 2, 3, 4, 5)
resp = UserResponse.model_validate(
{
"username": "alice",
"email": "alice@example.com",
"first_name": "Alice",
"last_name": "Liddell",
"created_on": utc_created,
"created_on": naive_created,
}
)
assert resp.created_on is not None
assert resp.created_on.utcoffset() == timedelta(0)
assert resp.created_on.replace(tzinfo=None) == utc_created.replace(tzinfo=None)
assert resp.created_on.tzinfo is None
assert resp.created_on == naive_created

def test_userresponse_preserves_aware_datetimes(self):
def test_userresponse_accepts_aware_datetimes(self):
aware = datetime(2024, 12, 1, 9, 30, tzinfo=timezone(timedelta(hours=9)))
resp = UserResponse.model_validate(
{
Expand All @@ -125,9 +125,7 @@ def test_userresponse_preserves_aware_datetimes(self):
"changed_on": aware,
}
)
expected_utc = aware.astimezone(timezone.utc)
assert resp.changed_on.utcoffset() == timedelta(0)
assert resp.changed_on.timestamp() == expected_utc.timestamp()
assert resp.changed_on == aware

def test_userresponse_model_validate_from_simple_namespace(self):
obj = types.SimpleNamespace(
Expand Down