test: use sqlite3 session in test_remote_retrieval (#38748)

This commit is contained in:
Asuka Minato 2026-07-13 16:25:38 +09:00 committed by GitHub
parent 57f325df27
commit 0cea67e72d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1,12 +1,21 @@
from collections.abc import Iterator
from unittest.mock import MagicMock, patch from unittest.mock import MagicMock, patch
import pytest import pytest
from flask import Flask from flask import Flask
from sqlalchemy import Engine
from sqlalchemy.orm import Session
from services.recommend_app.recommend_app_type import RecommendAppType from services.recommend_app.recommend_app_type import RecommendAppType
from services.recommend_app.remote.remote_retrieval import RemoteRecommendAppRetrieval from services.recommend_app.remote.remote_retrieval import RemoteRecommendAppRetrieval
@pytest.fixture
def empty_sqlite_session(sqlite_engine: Engine) -> Iterator[Session]:
with Session(sqlite_engine) as session:
yield session
class TestRemoteRecommendAppRetrieval: class TestRemoteRecommendAppRetrieval:
def test_get_type(self): def test_get_type(self):
assert RemoteRecommendAppRetrieval().get_type() == RecommendAppType.REMOTE assert RemoteRecommendAppRetrieval().get_type() == RecommendAppType.REMOTE
@ -16,10 +25,11 @@ class TestRemoteRecommendAppRetrieval:
"fetch_recommended_app_detail_from_dify_official", "fetch_recommended_app_detail_from_dify_official",
return_value={"id": "app-1"}, return_value={"id": "app-1"},
) )
def test_get_recommend_app_detail_success(self, mock_fetch): def test_get_recommend_app_detail_success(self, mock_fetch, empty_sqlite_session: Session):
result = RemoteRecommendAppRetrieval().get_recommend_app_detail("app-1", session=MagicMock()) result = RemoteRecommendAppRetrieval().get_recommend_app_detail("app-1", session=empty_sqlite_session)
assert result == {"id": "app-1"} assert result == {"id": "app-1"}
mock_fetch.assert_called_once_with("app-1") mock_fetch.assert_called_once_with("app-1")
assert not empty_sqlite_session.in_transaction()
@patch( @patch(
"services.recommend_app.remote.remote_retrieval" "services.recommend_app.remote.remote_retrieval"
@ -31,19 +41,25 @@ class TestRemoteRecommendAppRetrieval:
"fetch_recommended_app_detail_from_dify_official", "fetch_recommended_app_detail_from_dify_official",
side_effect=ConnectionError("timeout"), side_effect=ConnectionError("timeout"),
) )
def test_get_recommend_app_detail_falls_back_on_error(self, mock_fetch, mock_builtin): def test_get_recommend_app_detail_falls_back_on_error(
result = RemoteRecommendAppRetrieval().get_recommend_app_detail("app-1", session=MagicMock()) self, mock_fetch, mock_builtin, empty_sqlite_session: Session
):
result = RemoteRecommendAppRetrieval().get_recommend_app_detail("app-1", session=empty_sqlite_session)
assert result == {"id": "fallback"} assert result == {"id": "fallback"}
mock_builtin.assert_called_once_with("app-1") mock_builtin.assert_called_once_with("app-1")
assert not empty_sqlite_session.in_transaction()
@patch.object( @patch.object(
RemoteRecommendAppRetrieval, RemoteRecommendAppRetrieval,
"fetch_recommended_apps_from_dify_official", "fetch_recommended_apps_from_dify_official",
return_value={"recommended_apps": [], "categories": []}, return_value={"recommended_apps": [], "categories": []},
) )
def test_get_recommended_apps_success(self, mock_fetch): def test_get_recommended_apps_success(self, mock_fetch, empty_sqlite_session: Session):
result = RemoteRecommendAppRetrieval().get_recommended_apps_and_categories("en-US", session=MagicMock()) result = RemoteRecommendAppRetrieval().get_recommended_apps_and_categories(
"en-US", session=empty_sqlite_session
)
assert result == {"recommended_apps": [], "categories": []} assert result == {"recommended_apps": [], "categories": []}
assert not empty_sqlite_session.in_transaction()
@patch( @patch(
"services.recommend_app.remote.remote_retrieval" "services.recommend_app.remote.remote_retrieval"
@ -55,20 +71,24 @@ class TestRemoteRecommendAppRetrieval:
"fetch_recommended_apps_from_dify_official", "fetch_recommended_apps_from_dify_official",
side_effect=ValueError("server error"), side_effect=ValueError("server error"),
) )
def test_get_recommended_apps_falls_back_on_error(self, mock_fetch, mock_builtin): def test_get_recommended_apps_falls_back_on_error(self, mock_fetch, mock_builtin, empty_sqlite_session: Session):
result = RemoteRecommendAppRetrieval().get_recommended_apps_and_categories("en-US", session=MagicMock()) result = RemoteRecommendAppRetrieval().get_recommended_apps_and_categories(
"en-US", session=empty_sqlite_session
)
assert result == {"recommended_apps": [{"id": "builtin"}]} assert result == {"recommended_apps": [{"id": "builtin"}]}
assert not empty_sqlite_session.in_transaction()
@patch.object( @patch.object(
RemoteRecommendAppRetrieval, RemoteRecommendAppRetrieval,
"fetch_learn_dify_apps_from_dify_official", "fetch_learn_dify_apps_from_dify_official",
return_value={"recommended_apps": [{"id": "learn-dify-app"}]}, return_value={"recommended_apps": [{"id": "learn-dify-app"}]},
) )
def test_get_learn_dify_apps_success(self, mock_fetch): def test_get_learn_dify_apps_success(self, mock_fetch, empty_sqlite_session: Session):
result = RemoteRecommendAppRetrieval().get_learn_dify_apps("en-US", session=MagicMock()) result = RemoteRecommendAppRetrieval().get_learn_dify_apps("en-US", session=empty_sqlite_session)
assert result == {"recommended_apps": [{"id": "learn-dify-app"}]} assert result == {"recommended_apps": [{"id": "learn-dify-app"}]}
mock_fetch.assert_called_once_with("en-US") mock_fetch.assert_called_once_with("en-US")
assert not empty_sqlite_session.in_transaction()
@patch( @patch(
"services.recommend_app.remote.remote_retrieval.DatabaseRecommendAppRetrieval.fetch_learn_dify_apps_from_db", "services.recommend_app.remote.remote_retrieval.DatabaseRecommendAppRetrieval.fetch_learn_dify_apps_from_db",
@ -79,13 +99,14 @@ class TestRemoteRecommendAppRetrieval:
"fetch_learn_dify_apps_from_dify_official", "fetch_learn_dify_apps_from_dify_official",
side_effect=ValueError("server error"), side_effect=ValueError("server error"),
) )
def test_get_learn_dify_apps_falls_back_to_database_on_error(self, mock_fetch, mock_database): def test_get_learn_dify_apps_falls_back_to_database_on_error(
session = MagicMock() self, mock_fetch, mock_database, empty_sqlite_session: Session
):
result = RemoteRecommendAppRetrieval().get_learn_dify_apps("en-US", session=session) result = RemoteRecommendAppRetrieval().get_learn_dify_apps("en-US", session=empty_sqlite_session)
assert result == {"recommended_apps": [{"id": "db-fallback"}]} assert result == {"recommended_apps": [{"id": "db-fallback"}]}
mock_database.assert_called_once_with("en-US", session=session) mock_database.assert_called_once_with("en-US", session=empty_sqlite_session)
assert not empty_sqlite_session.in_transaction()
class TestFetchFromDifyOfficial: class TestFetchFromDifyOfficial: