Files
SmartUp/backend/test_custom_pages_autofill.py
2026-06-02 19:25:20 +08:00

173 lines
5.2 KiB
Python

import sys
from pathlib import Path
import pytest
from sqlalchemy import create_engine, text
from sqlalchemy.orm import sessionmaker
from sqlalchemy.pool import StaticPool
sys.path.insert(0, str(Path(__file__).resolve().parent))
from app import database as database_module
from app.database import Base
from app.models.custom_page import CustomPage
from app.routers import custom_pages
@pytest.fixture()
def db_session():
engine = create_engine(
"sqlite://",
connect_args={"check_same_thread": False},
poolclass=StaticPool,
)
Base.metadata.create_all(bind=engine)
TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
db = TestingSessionLocal()
try:
yield db
finally:
db.close()
Base.metadata.drop_all(bind=engine)
def test_create_page_auto_enables_autofill_when_credentials_are_saved(db_session):
response = custom_pages.create_page(
custom_pages.CustomPageCreate(
name="Login page",
url="https://example.test/login",
access_mode="direct",
login_username="alice",
login_password="secret",
),
db_session,
object(),
)
assert response.login_autofill_enabled is True
assert response.login_password_configured is True
def test_create_page_respects_explicit_autofill_disable(db_session):
response = custom_pages.create_page(
custom_pages.CustomPageCreate(
name="Login page",
url="https://example.test/login",
access_mode="direct",
login_username="alice",
login_password="secret",
login_autofill_enabled=False,
),
db_session,
object(),
)
assert response.login_autofill_enabled is False
def test_update_page_auto_enables_autofill_when_new_password_is_saved(db_session):
page = CustomPage(
name="Login page",
url="https://example.test/login",
access_mode="direct",
login_username="alice",
login_password="old-secret",
login_autofill_enabled=False,
)
db_session.add(page)
db_session.commit()
db_session.refresh(page)
response = custom_pages.update_page(
page.id,
custom_pages.CustomPageUpdate(
login_username="alice@example.test",
login_password="new-secret",
),
db_session,
object(),
)
assert response.login_autofill_enabled is True
def test_update_page_keeps_autofill_disabled_when_existing_password_is_kept(db_session):
page = CustomPage(
name="Login page",
url="https://example.test/login",
access_mode="direct",
login_username="alice",
login_password="secret",
login_autofill_enabled=False,
)
db_session.add(page)
db_session.commit()
db_session.refresh(page)
response = custom_pages.update_page(
page.id,
custom_pages.CustomPageUpdate(login_username="alice@example.test"),
db_session,
object(),
)
assert response.login_autofill_enabled is False
def test_update_page_respects_explicit_autofill_disable(db_session):
page = CustomPage(
name="Login page",
url="https://example.test/login",
access_mode="direct",
login_username="alice",
login_password="secret",
login_autofill_enabled=False,
)
db_session.add(page)
db_session.commit()
db_session.refresh(page)
response = custom_pages.update_page(
page.id,
custom_pages.CustomPageUpdate(
login_username="alice@example.test",
login_autofill_enabled=False,
),
db_session,
object(),
)
assert response.login_autofill_enabled is False
def test_custom_page_migration_backfills_autofill_once(monkeypatch):
engine = create_engine(
"sqlite://",
connect_args={"check_same_thread": False},
poolclass=StaticPool,
)
monkeypatch.setattr(database_module, "engine", engine)
Base.metadata.create_all(bind=engine)
with engine.begin() as conn:
conn.execute(text("ALTER TABLE custom_pages DROP COLUMN login_autofill_backfilled_at"))
conn.execute(text(
"INSERT INTO custom_pages "
"(name, url, icon, sort_order, enabled, use_proxy, access_mode, login_username, login_password, login_autofill_enabled, created_at, updated_at) "
"VALUES ('Login page', 'https://example.test/login', 'Link', 0, 1, 0, 'direct', 'alice', 'secret', 0, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)"
))
database_module._migrate_custom_pages()
with engine.begin() as conn:
row = conn.execute(text(
"SELECT login_autofill_enabled, login_autofill_backfilled_at FROM custom_pages WHERE name = 'Login page'"
)).one()
assert row.login_autofill_enabled == 1
assert row.login_autofill_backfilled_at is not None
conn.execute(text("UPDATE custom_pages SET login_autofill_enabled = 0"))
database_module._migrate_custom_pages()
with engine.begin() as conn:
row = conn.execute(text("SELECT login_autofill_enabled FROM custom_pages WHERE name = 'Login page'")).one()
assert row.login_autofill_enabled == 0