feat: 优化打包产物与历史筛选
This commit is contained in:
@@ -167,3 +167,48 @@ def test_cancel_task(mock_queue, client, tmp_config):
|
||||
# 验证状态已更新
|
||||
task = client.get(f"/api/tasks/{task_id}").json()
|
||||
assert task["status"] == "cancelled"
|
||||
|
||||
|
||||
def test_delete_completed_task_removes_remote_artifacts(client, tmp_config):
|
||||
from backend.database import SessionLocal
|
||||
from backend.models import Task
|
||||
|
||||
task = Task(
|
||||
id="completed-task", app_id="1", app_name="测试App", build_type="Ad_Hoc",
|
||||
scheme_id="1", scheme_name="readoor31", branch="main", status="completed",
|
||||
oss_url="https://files.example.com/test/iOS/1_2_0_0_0_main.html",
|
||||
config_json=json.dumps({"APPID": "1", "VERSION": "2.0.0.0", "SOURCE_BRANCH": "main", "BUILD_TYPE": "Ad_Hoc", "OSS_FLODER": "test"}),
|
||||
)
|
||||
db = SessionLocal()
|
||||
db.add(task)
|
||||
db.commit()
|
||||
db.close()
|
||||
|
||||
with patch("backend.services.distribution.delete_published_artifacts") as delete:
|
||||
resp = client.delete("/api/tasks/completed-task/delete")
|
||||
|
||||
assert resp.status_code == 200
|
||||
delete.assert_called_once()
|
||||
assert client.get("/api/tasks/completed-task").status_code == 404
|
||||
|
||||
|
||||
def test_delete_task_keeps_shared_remote_artifact(client, tmp_config):
|
||||
from backend.database import SessionLocal
|
||||
from backend.models import Task
|
||||
|
||||
db = SessionLocal()
|
||||
for task_id in ("old-task", "new-task"):
|
||||
db.add(Task(
|
||||
id=task_id, app_id="1", app_name="测试App", build_type="Ad_Hoc",
|
||||
scheme_id="1", scheme_name="readoor31", branch="main", status="completed",
|
||||
oss_url="https://files.example.com/test/iOS/1_2_0_0_0_main.html",
|
||||
))
|
||||
db.commit()
|
||||
db.close()
|
||||
|
||||
with patch("backend.services.distribution.delete_published_artifacts") as delete:
|
||||
resp = client.delete("/api/tasks/old-task/delete")
|
||||
|
||||
assert resp.status_code == 200
|
||||
assert "仍被其他记录引用" in resp.json()["message"]
|
||||
delete.assert_not_called()
|
||||
|
||||
@@ -3,6 +3,8 @@ import plistlib
|
||||
from unittest.mock import patch
|
||||
|
||||
from backend.services.distribution import (
|
||||
_artifact_stem,
|
||||
delete_published_artifacts,
|
||||
_write_distribution_files,
|
||||
_write_download_page,
|
||||
_write_manifest,
|
||||
@@ -10,6 +12,11 @@ from backend.services.distribution import (
|
||||
)
|
||||
|
||||
|
||||
def test_distribution_artifact_name_contains_sanitized_branch():
|
||||
assert _artifact_stem({"APPID": "100", "VERSION": "2.0.0.0", "SOURCE_BRANCH": "feature/pay-v2", "BUILD_TYPE": "Ad_Hoc"}) == "100_2_0_0_0_feature_pay-v2_adhoc"
|
||||
assert _artifact_stem({"APPID": "100", "VERSION": "2.0.0.0"}) == "100_2_0_0_0"
|
||||
|
||||
|
||||
def test_distribution_files_use_current_service_config(tmp_path):
|
||||
ipa = tmp_path / "source.ipa"
|
||||
ipa.write_bytes(b"ipa")
|
||||
@@ -35,20 +42,21 @@ def test_app_store_distribution_uploads_only_ipa(tmp_path):
|
||||
"APPID": "100",
|
||||
"VERSION": "2.0.0",
|
||||
"BUILD_TYPE": "App_Store",
|
||||
"SOURCE_BRANCH": "main",
|
||||
"OSS_FLODER": "readoor",
|
||||
"_upload_config": {"mode": "oss", "oss": {}},
|
||||
}
|
||||
|
||||
with patch(
|
||||
"backend.services.distribution._upload_oss",
|
||||
return_value={".ipa": "https://files.example.com/readoor/iOS/100_2_0_0.ipa"},
|
||||
return_value={".ipa": "https://files.example.com/readoor/iOS/100_2_0_0_main_appstore.ipa"},
|
||||
) as upload:
|
||||
download_url, qr_path = publish_ipa(config, ipa, tmp_path / "build")
|
||||
|
||||
uploaded_files = upload.call_args.args[1]
|
||||
assert len(uploaded_files) == 1
|
||||
assert uploaded_files[0][0].suffix == ".ipa"
|
||||
assert download_url.endswith("100_2_0_0.ipa")
|
||||
assert download_url.endswith("100_2_0_0_main_appstore.ipa")
|
||||
assert qr_path == ""
|
||||
|
||||
|
||||
@@ -59,6 +67,7 @@ def test_adhoc_distribution_uploads_qrcode(tmp_path):
|
||||
"APPID": "100",
|
||||
"VERSION": "2.0.0",
|
||||
"BUILD_TYPE": "Ad_Hoc",
|
||||
"SOURCE_BRANCH": "dev",
|
||||
"OSS_FLODER": "readoor",
|
||||
"_upload_config": {"mode": "oss", "oss": {}},
|
||||
}
|
||||
@@ -70,8 +79,21 @@ def test_adhoc_distribution_uploads_qrcode(tmp_path):
|
||||
with patch("backend.services.distribution._upload_oss", side_effect=upload_files) as upload:
|
||||
download_url, qr_url = publish_ipa(config, ipa, tmp_path / "build")
|
||||
|
||||
assert download_url.endswith("100_2_0_0.html")
|
||||
assert qr_url.endswith("100_2_0_0.png")
|
||||
assert download_url.endswith("100_2_0_0_dev_adhoc.html")
|
||||
assert qr_url.endswith("100_2_0_0_dev_adhoc.png")
|
||||
assert [call.args[1][0][0].suffix for call in upload.call_args_list] == [
|
||||
".ipa", ".plist", ".html", ".png",
|
||||
]
|
||||
|
||||
|
||||
def test_delete_adhoc_artifacts_deletes_all_remote_files():
|
||||
config = {"APPID": "100", "VERSION": "2.0.0.0", "SOURCE_BRANCH": "main", "BUILD_TYPE": "Ad_Hoc", "OSS_FLODER": "readoor"}
|
||||
with patch("backend.services.distribution._delete_oss") as delete:
|
||||
delete_published_artifacts(config, {"mode": "oss", "oss": {}})
|
||||
|
||||
assert delete.call_args.args[1] == [
|
||||
"readoor/iOS/100_2_0_0_0_main_adhoc.ipa",
|
||||
"readoor/iOS/100_2_0_0_0_main_adhoc.plist",
|
||||
"readoor/iOS/100_2_0_0_0_main_adhoc.html",
|
||||
"readoor/iOS/100_2_0_0_0_main_adhoc.png",
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user