address copilot review followups (#96)
This commit is contained in:
committed by
GitHub
parent
ee7c15ce4b
commit
181b43bff9
@@ -173,7 +173,8 @@ class TestAdminApiKeySetting:
|
||||
|
||||
|
||||
class TestLogtoSettings:
|
||||
def test_ssl_verification_is_enabled_by_default(self):
|
||||
def test_ssl_verification_is_enabled_by_default(self, monkeypatch):
|
||||
monkeypatch.delenv("LOGTO_SKIP_SSL_VERIFY", raising=False)
|
||||
settings = Settings()
|
||||
|
||||
assert settings.LOGTO_SKIP_SSL_VERIFY is False
|
||||
|
||||
@@ -13,6 +13,8 @@ from unittest.mock import AsyncMock, patch
|
||||
import pytest
|
||||
from fastapi.testclient import TestClient
|
||||
|
||||
from app.api.api_v1.endpoints import domains as domains_endpoint
|
||||
from app.models.domain import Domain
|
||||
from app.services.dns_resolver import DomainDNSResult
|
||||
from app.services.report_store import ReportStore
|
||||
|
||||
@@ -290,6 +292,50 @@ def test_summary_dns_failure_defaults_false(client: TestClient):
|
||||
assert domain["dkim_status"] is False
|
||||
|
||||
|
||||
def test_summary_endpoint_uses_manual_selectors(client: TestClient):
|
||||
"""Manually configured selectors are forwarded by the summary endpoint."""
|
||||
client.post(f"/api/v1/domains/{DOMAIN}/selectors", json={"selector": "manualsel"})
|
||||
captured_selectors = []
|
||||
|
||||
async def _fake_check_domain(domain, selectors=None):
|
||||
captured_selectors.extend(selectors or [])
|
||||
return MOCK_DNS_RESULT
|
||||
|
||||
with patch(
|
||||
"app.api.api_v1.endpoints.domains.get_default_provider",
|
||||
return_value=AsyncMock(check_domain=_fake_check_domain),
|
||||
):
|
||||
response = client.get("/api/v1/domains/summary")
|
||||
|
||||
assert response.status_code == 200
|
||||
assert "manualsel" in captured_selectors
|
||||
assert "google" in captured_selectors
|
||||
|
||||
|
||||
def test_selector_map_lookup_chunks_domain_names(db_session, monkeypatch):
|
||||
"""Large summary batches are split to avoid database parameter limits."""
|
||||
monkeypatch.setattr(domains_endpoint, "DOMAIN_SELECTOR_LOOKUP_CHUNK_SIZE", 2)
|
||||
db_session.add_all(
|
||||
[
|
||||
Domain(name="one.example", dkim_selectors="a,b"),
|
||||
Domain(name="two.example", dkim_selectors="c"),
|
||||
Domain(name="three.example", dkim_selectors="d"),
|
||||
]
|
||||
)
|
||||
db_session.commit()
|
||||
|
||||
selectors = domains_endpoint._get_domain_selectors_map_from_db(
|
||||
db_session,
|
||||
["one.example", "two.example", "three.example", "one.example"],
|
||||
)
|
||||
|
||||
assert selectors == {
|
||||
"one.example": ["a", "b"],
|
||||
"two.example": ["c"],
|
||||
"three.example": ["d"],
|
||||
}
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# GET /api/v1/domains/{domain_id}/sources (PTR + fix hints)
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
@@ -21,9 +21,9 @@ class TestNextSleepSeconds:
|
||||
def test_respects_min_sleep(self):
|
||||
from app.main import _next_sleep_seconds
|
||||
|
||||
source = SimpleNamespace(polling_interval=0)
|
||||
source = SimpleNamespace(polling_interval=1)
|
||||
|
||||
assert _next_sleep_seconds(min_sleep=120, enabled_sources=[source]) == 3600
|
||||
assert _next_sleep_seconds(min_sleep=120, enabled_sources=[source]) == 120
|
||||
|
||||
def test_queries_database_when_sources_not_supplied(self):
|
||||
from app.main import _next_sleep_seconds
|
||||
|
||||
@@ -9,6 +9,7 @@ from fastapi.testclient import TestClient
|
||||
|
||||
from app.api.api_v1.endpoints.setup import setup_status
|
||||
from app.core.security import _api_keys, add_api_key
|
||||
from app.models.setting import Setting
|
||||
|
||||
|
||||
@pytest.fixture(autouse=True)
|
||||
@@ -42,6 +43,38 @@ class TestSetupStatus:
|
||||
assert data["is_setup_complete"] is True
|
||||
assert data["app_name"] == "MyApp"
|
||||
|
||||
def test_status_reads_persisted_setup_state_after_memory_reset(
|
||||
self, client: TestClient, db_session
|
||||
):
|
||||
db_session.add(
|
||||
Setting(
|
||||
key="setup.is_complete",
|
||||
value="true",
|
||||
description="Whether initial setup has been completed",
|
||||
value_type="boolean",
|
||||
category="setup",
|
||||
)
|
||||
)
|
||||
db_session.add(
|
||||
Setting(
|
||||
key="general.app_name",
|
||||
value="Persisted DMARQ",
|
||||
description="Application display name shown in the UI",
|
||||
value_type="string",
|
||||
category="general",
|
||||
)
|
||||
)
|
||||
db_session.commit()
|
||||
setup_status["is_setup_complete"] = False
|
||||
setup_status["app_name"] = "DMARQ"
|
||||
|
||||
response = client.get("/api/v1/setup/status")
|
||||
|
||||
assert response.status_code == 200
|
||||
data = response.json()
|
||||
assert data["is_setup_complete"] is True
|
||||
assert data["app_name"] == "Persisted DMARQ"
|
||||
|
||||
|
||||
class TestSetupAdmin:
|
||||
"""Tests for POST /api/v1/setup/admin"""
|
||||
@@ -137,6 +170,23 @@ class TestSetupSystem:
|
||||
|
||||
assert response.status_code == 401
|
||||
|
||||
def test_system_setup_requires_auth_if_persisted_complete_after_restart(
|
||||
self, client: TestClient
|
||||
):
|
||||
first_response = client.post(
|
||||
"/api/v1/setup/system",
|
||||
json={"app_name": "DMARQ", "base_url": "https://example.com"},
|
||||
)
|
||||
assert first_response.status_code == 200
|
||||
setup_status["is_setup_complete"] = False
|
||||
|
||||
response = client.post(
|
||||
"/api/v1/setup/system",
|
||||
json={"app_name": "Changed", "base_url": "https://changed.example.com"},
|
||||
)
|
||||
|
||||
assert response.status_code == 401
|
||||
|
||||
def test_system_setup_allows_authenticated_updates_after_complete(self, client: TestClient):
|
||||
setup_status["is_setup_complete"] = True
|
||||
api_key = "b" * 64
|
||||
|
||||
Reference in New Issue
Block a user