mirror of
https://github.com/langflow-ai/langflow.git
synced 2026-07-25 20:20:08 +08:00
Replaces four separate scripts (upload_strings, upload_backend_strings, download_translations, download_backend_translations) with two unified entry points: upload.py and download.py, each taking --target frontend|backend. Updates gp-upload.yml to a single workflow with two jobs, updates gp-download.yml run lines, and removes the now-redundant gp-backend-upload.yml workflow.
149 lines
5.6 KiB
Python
149 lines
5.6 KiB
Python
"""Tests for upload.py."""
|
|
|
|
import json
|
|
from unittest.mock import patch
|
|
|
|
import pytest
|
|
import upload as upload_mod
|
|
|
|
|
|
def _run_frontend(source_path: str):
|
|
with patch("sys.argv", ["upload.py", "--target", "frontend", "--source", source_path]):
|
|
upload_mod.main()
|
|
|
|
|
|
def _run_backend(source_path: str):
|
|
with patch("sys.argv", ["upload.py", "--target", "backend", "--source", source_path]):
|
|
upload_mod.main()
|
|
|
|
|
|
class TestUploadFrontend:
|
|
def test_uploads_strings_when_bundle_exists(self, tmp_path):
|
|
source = tmp_path / "en.json"
|
|
source.write_text(json.dumps({"hello": "Hello", "bye": "Bye"}), encoding="utf-8")
|
|
|
|
with (
|
|
patch.object(upload_mod, "list_bundles", return_value={"bundleIds": ["langflow-ui"]}),
|
|
patch.object(upload_mod, "create_bundle") as mock_create,
|
|
patch.object(upload_mod, "upload_strings") as mock_upload,
|
|
patch.object(upload_mod, "GP_BUNDLE", "langflow-ui"),
|
|
):
|
|
_run_frontend(str(source))
|
|
|
|
mock_create.assert_not_called()
|
|
mock_upload.assert_called_once_with({"hello": "Hello", "bye": "Bye"})
|
|
|
|
def test_creates_bundle_when_missing_then_uploads(self, tmp_path):
|
|
source = tmp_path / "en.json"
|
|
source.write_text(json.dumps({"hello": "Hello"}), encoding="utf-8")
|
|
|
|
with (
|
|
patch.object(upload_mod, "list_bundles", return_value={"bundleIds": []}),
|
|
patch.object(upload_mod, "create_bundle") as mock_create,
|
|
patch.object(upload_mod, "upload_strings") as mock_upload,
|
|
patch.object(upload_mod, "GP_BUNDLE", "langflow-ui"),
|
|
):
|
|
_run_frontend(str(source))
|
|
|
|
mock_create.assert_called_once()
|
|
mock_upload.assert_called_once_with({"hello": "Hello"})
|
|
|
|
def test_empty_json_file_uploads_empty_dict(self, tmp_path):
|
|
source = tmp_path / "en.json"
|
|
source.write_text("{}", encoding="utf-8")
|
|
|
|
with (
|
|
patch.object(upload_mod, "list_bundles", return_value={"bundleIds": ["langflow-ui"]}),
|
|
patch.object(upload_mod, "create_bundle"),
|
|
patch.object(upload_mod, "upload_strings") as mock_upload,
|
|
patch.object(upload_mod, "GP_BUNDLE", "langflow-ui"),
|
|
):
|
|
_run_frontend(str(source))
|
|
|
|
mock_upload.assert_called_once_with({})
|
|
|
|
def test_raises_when_source_file_missing(self, tmp_path):
|
|
missing = str(tmp_path / "missing.json")
|
|
|
|
with (
|
|
patch.object(upload_mod, "list_bundles", return_value={"bundleIds": []}),
|
|
patch.object(upload_mod, "create_bundle"),
|
|
patch.object(upload_mod, "upload_strings"),
|
|
pytest.raises(SystemExit) as exc_info,
|
|
):
|
|
_run_frontend(missing)
|
|
|
|
assert exc_info.value.code == 1
|
|
|
|
|
|
class TestUploadBackend:
|
|
def test_uploads_when_bundle_exists(self, tmp_path):
|
|
source = tmp_path / "en.json"
|
|
strings = {"components.ChatInput.display_name": "Chat Input"}
|
|
source.write_text(json.dumps(strings), encoding="utf-8")
|
|
|
|
with (
|
|
patch.object(upload_mod, "list_bundles", return_value={"bundleIds": ["langflow-backend"]}),
|
|
patch.object(upload_mod, "create_backend_bundle") as mock_create,
|
|
patch.object(upload_mod, "upload_backend_strings") as mock_upload,
|
|
patch.object(upload_mod, "GP_BACKEND_BUNDLE", "langflow-backend"),
|
|
):
|
|
_run_backend(str(source))
|
|
|
|
mock_create.assert_not_called()
|
|
mock_upload.assert_called_once_with(strings)
|
|
|
|
def test_creates_bundle_when_missing_then_uploads(self, tmp_path):
|
|
source = tmp_path / "en.json"
|
|
strings = {"components.ChatInput.display_name": "Chat Input"}
|
|
source.write_text(json.dumps(strings), encoding="utf-8")
|
|
|
|
with (
|
|
patch.object(upload_mod, "list_bundles", return_value={"bundleIds": []}),
|
|
patch.object(upload_mod, "create_backend_bundle") as mock_create,
|
|
patch.object(upload_mod, "upload_backend_strings") as mock_upload,
|
|
patch.object(upload_mod, "GP_BACKEND_BUNDLE", "langflow-backend"),
|
|
):
|
|
_run_backend(str(source))
|
|
|
|
mock_create.assert_called_once()
|
|
mock_upload.assert_called_once_with(strings)
|
|
|
|
def test_exits_when_source_file_missing(self, tmp_path):
|
|
missing = str(tmp_path / "missing.json")
|
|
|
|
with (
|
|
patch.object(upload_mod, "list_bundles", return_value={"bundleIds": []}),
|
|
patch.object(upload_mod, "create_backend_bundle"),
|
|
patch.object(upload_mod, "upload_backend_strings"),
|
|
pytest.raises(SystemExit) as exc_info,
|
|
):
|
|
_run_backend(missing)
|
|
|
|
assert exc_info.value.code == 1
|
|
|
|
def test_uploads_all_strings_from_file(self, tmp_path):
|
|
source = tmp_path / "en.json"
|
|
strings = {
|
|
"components.ChatInput.display_name": "Chat Input",
|
|
"components.ChatInput.description": "Get chat inputs.",
|
|
"components.ChatInput.inputs.message.display_name": "Message",
|
|
}
|
|
source.write_text(json.dumps(strings), encoding="utf-8")
|
|
|
|
captured = {}
|
|
|
|
def _capture_upload(s):
|
|
captured.update(s)
|
|
return {}
|
|
|
|
with (
|
|
patch.object(upload_mod, "list_bundles", return_value={"bundleIds": ["langflow-backend"]}),
|
|
patch.object(upload_mod, "create_backend_bundle"),
|
|
patch.object(upload_mod, "upload_backend_strings", side_effect=_capture_upload),
|
|
patch.object(upload_mod, "GP_BACKEND_BUNDLE", "langflow-backend"),
|
|
):
|
|
_run_backend(str(source))
|
|
|
|
assert captured == strings
|